LNK2001 and LNK2019 errors with template class
This is a multi-part message in MIME format.
------=_NextPart_000_00BB_01C695ED.3958DA70
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
I have a smart pointer class that uses template functions that works =
fine under VC6 but it not linking under VS2005.
1>TestGridToolkitView.obj : error LNK2019: unresolved external symbol =
"void __cdecl PrismGCSmartPointer(class CPrismSmartPointer<class =
CDialog> &)" =
(?PrismGCSmartPointer@@YAXAAV?$CPrismSmartPointer@VCDialog@@@@@Z) =
referenced in function "protected: __thiscall =
CTestGridToolkitView::CTestGridToolkitView(void)" =
(??0CTestGridToolkitView@@IAE@XZ)
1>E:\PrismDevelopment\VS2005\TestGridToolkit\Debug\TestGridToolkit.exe : =
fatal error LNK1120: 1 unresolved externals
I've found several articles about this but the solutions they suggest =
don't work. Any thought. I've posted the header file below. There =
isn't much in the .cpp file since the functions are inline.
template <class DataT>
class CPrismSmartPointer
{
private:
class CData
{
public:
CData(DataT* pDataT): m_dwRefCount(0), m_pDataT(pDataT)
{
AddRef();
}
~CData()
{
Release();
}
void AddRef()
{
m_dwRefCount++;
}
DataT* Get()
{
return m_pDataT;
}
void Release()
{
if (!m_dwRefCount)
return;
if (--m_dwRefCount == 0)
{
if (m_pDataT)
{
delete m_pDataT;
m_pDataT = NULL;
}
delete this;
}
}
DataT* m_pDataT;
DWORD m_dwRefCount;
};
CData* m_pData;
public:
CPrismSmartPointer(): m_pData(NULL)
{
}
CPrismSmartPointer(bool bNew): m_pData( bNew ? new CData(new DataT) =
: NULL)
{
}
CPrismSmartPointer(int nNew): m_pData(nNew ? new CData(new DataT) : =
NULL)
{
}
CPrismSmartPointer(DataT* pDataT): m_pData(new CData(pDataT))
{
}
~CPrismSmartPointer()
{
if (m_pData)
m_pData->Release();
}
CPrismSmartPointer(const DataT*& pDataT): m_pData(new CData(pDataT))
{
}
CPrismSmartPointer(const CPrismSmartPointer<DataT>& other)
{
m_pData = other.m_pData;
if (m_pData)
m_pData->AddRef();
}
CPrismSmartPointer& operator=(const CPrismSmartPointer& other)
{
if (&other == this)
return *this;
if (m_pData)
m_pData->Release();
m_pData = other.m_pData;
if (m_pData)
m_pData->AddRef();
return *this;
}
CPrismSmartPointer& operator=(DataT* pDataT)
{
if (m_pData)
{
if (m_pData->m_pDataT == pDataT)
return *this;
}
if (m_pData)
m_pData->Release();
m_pData = pDataT ? new CData(pDataT) : NULL;
return *this;
}
DataT& operator*() const
{
return *Get();
}
DataT* operator->() const
{
return Get();
}
DataT* Get() const
{
if (!m_pData)
return NULL;
return m_pData->m_pDataT;
}
operator DataT*()
{
return Get();
}
operator bool()
{
if (m_pData && m_pData->m_pDataT)
return true;
return false;
}
bool operator !()
{
return !operator bool();
}
friend bool operator==(const CPrismSmartPointer<DataT>& =
lhs,const CPrismSmartPointer<DataT>& rhs);
friend bool operator==(const CPrismSmartPointer<DataT>& other, =
const DataT* pRhsT);
friend bool operator==(const CPrismSmartPointer<DataT>& lhs, int =
nRhs);
friend void PrismGCSmartPointer(CPrismSmartPointer<DataT>& pSP);
};
template<class DataT> inline bool operator==(const =
CPrismSmartPointer<DataT>& lhs, const CPrismSmartPointer<DataT>& rhs)
{
if (lhs.m_pData && rhs.m_pData)
return (lhs.m_pData->m_pDataT == rhs.m_pData->m_pDataT);
return false;
}
template<class DataT> inline bool operator==(const =
CPrismSmartPointer<DataT>& lhs, const DataT* pRhsT)
{
if (lhs->m_pData)
return (lhs->m_pData->m_pDataT == pRhsT);
return false;
}
template<class DataT> inline bool operator==(const =
CPrismSmartPointer<DataT>& lhs, int nRhs)
{
int nTemp = 0;
if (lhs.m_pData)
{
if (lhs.m_pData->m_pDataT)
nTemp = (int) (lhs.m_pData->m_pDataT);
}
return (nTemp == nRhs);
}
template<class DataT> inline void =
PrismGCSmartPointer(CPrismSmartPointer<DataT>& pSP)
{
pSP = NULL;
}
------=_NextPart_000_00BB_01C695ED.3958DA70
Content-Type: text/html;
charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; =
charset=iso-8859-1">
<META content="MSHTML 6.00.3790.2666" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY>
<DIV><FONT size=2>I have a smart pointer class that uses template =
functions that
works fine under VC6 but it not linking under VS2005.</FONT></DIV>
<DIV><FONT size=2></FONT> </DIV>
<DIV><FONT size=2>1>TestGridToolkitView.obj : error LNK2019: =
unresolved
external symbol "void __cdecl PrismGCSmartPointer(class
CPrismSmartPointer<class CDialog> &)"
(?PrismGCSmartPointer@@YAXAAV?$CPrismSmartPointer@VCDialog@@@@@Z) =
referenced in
function "protected: __thiscall
CTestGridToolkitView::CTestGridToolkitView(void)"
(??0CTestGridToolkitView@@IAE@XZ)</FONT></DIV>
<DIV>
<P><FONT
size=2>1>E:\PrismDevelopment\VS2005\TestGridToolkit\Debug\TestGridTo=
olkit.exe
: fatal error LNK1120: 1 unresolved externals</FONT></P></DIV>
<DIV><FONT size=2>I've found several articles about this but the =
solutions they
suggest don't work. Any thought. I've =
posted the
header file below. There isn't much in the .cpp file since =
the
functions are inline.</FONT></DIV>
<DIV><FONT size=2></FONT> </DIV>
<DIV><FONT size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>template <class =
DataT></FONT></DIV>
<DIV><FONT face="Courier New" size=2>class =
CPrismSmartPointer</FONT></DIV>
<DIV><FONT face="Courier New" size=2>{</FONT></DIV>
<DIV><FONT face="Courier New" size=2>private:</FONT></DIV>
<DIV><FONT face="Courier New" size=2> class =
CData</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
public:</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
CData(</FONT><FONT face="Courier New" size=2>DataT* =
pDataT)</FONT><FONT
face="Courier New" size=2>: m_dwRefCount(0), </FONT><FONT =
face="Courier New"
size=2>m_pDataT(pDataT)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
AddRef();</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> =
~CData()</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
Release();</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> =
void
AddRef()</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
m_dwRefCount++;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> =
DataT* Get()</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return m_pDataT;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> =
void
Release()</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if (!m_dwRefCount)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
=
return;</FONT></DIV>
<DIV><FONT face="Courier New" =
size=2>
</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if (--m_dwRefCount == 0)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if (m_pDataT)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
delete
m_pDataT;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
m_pDataT =
NULL;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New"
size=2> &nbs=
p;
</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
delete this;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> =
DataT* m_pDataT;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
DWORD
m_dwRefCount;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
};</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> CData*
m_pData;</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>public:</FONT></DIV>
<DIV><FONT face="Courier New" size=2>
CPrismSmartPointer()</FONT><FONT face="Courier New" size=2>:
m_pData(NULL)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>
CPrismSmartPointer(</FONT><FONT face="Courier New" size=2>bool =
bNew)</FONT><FONT
face="Courier New" size=2>: m_pData( bNew ? new CData(new DataT) :
NULL)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>
CPrismSmartPointer(</FONT><FONT face="Courier New" size=2>int =
nNew)</FONT><FONT
face="Courier New" size=2>: m_pData(nNew ? new CData(new DataT) :
NULL)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>
CPrismSmartPointer(</FONT><FONT face="Courier New" size=2>DataT*
pDataT)</FONT><FONT face="Courier New" size=2>: m_pData(new
CData(pDataT))</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>
~CPrismSmartPointer()</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if
(m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
m_pData->Release();</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>
CPrismSmartPointer(c</FONT><FONT face="Courier New" size=2>onst =
DataT*&
pDataT)</FONT><FONT face="Courier New" size=2>: m_pData(new
CData(pDataT))</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>
CPrismSmartPointer(</FONT><FONT face="Courier New" size=2>const
CPrismSmartPointer<DataT>& other)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
m_pData = other.m_pData;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if
(m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
m_pData->AddRef();</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> =
CPrismSmartPointer&
operator=(</FONT><FONT face="Courier New" size=2>const =
CPrismSmartPointer&
other)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if
(&other == this)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return *this;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if
(m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
m_pData->Release();</FONT></DIV>
<DIV><FONT face="Courier New"
size=2> m_pData =
other.m_pData;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if
(m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
m_pData->AddRef();</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return *this;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> =
CPrismSmartPointer&
operator=(</FONT><FONT face="Courier New" size=2>DataT* =
pDataT)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if
(m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if (m_pData->m_pDataT == pDataT)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return *this;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if
(m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
m_pData->Release();</FONT></DIV>
<DIV><FONT face="Courier New"
size=2> m_pData = =
pDataT ? new
CData(pDataT) : NULL;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return *this;</FONT></DIV>
<DIV><FONT face="Courier New" =
size=2> }</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> DataT& =
operator*()
const</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return *Get();</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> DataT* =
operator->()
const</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{
</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return Get();</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> DataT* Get() =
const</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if
(!m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return NULL;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return m_pData->m_pDataT;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> operator
DataT*()</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return Get();</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> operator
bool()</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
if
(m_pData && m_pData->m_pDataT)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return true;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return false;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2> bool =
operator
!()</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return !operator bool();</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
</FONT></DIV>
<DIV><FONT face="Courier New" size=2> friend bool
operator==(</FONT><FONT face="Courier New" size=2>const
CPrismSmartPointer<DataT>& lhs,</FONT><FONT face="Courier =
New"
size=2>const CPrismSmartPointer<DataT>& rhs);</FONT></DIV>
<DIV><FONT face="Courier New" size=2> friend bool
operator==(</FONT><FONT face="Courier New" size=2>const
CPrismSmartPointer<DataT>& other, </FONT><FONT face="Courier =
New"
size=2>const DataT* pRhsT);</FONT></DIV>
<DIV><FONT face="Courier New" size=2> friend bool
operator==(</FONT><FONT face="Courier New" size=2>const
CPrismSmartPointer<DataT>& lhs, </FONT><FONT face="Courier =
New"
size=2>int nRhs);</FONT></DIV>
<DIV><FONT face="Courier New" size=2> friend void
PrismGCSmartPointer(</FONT><FONT face="Courier New"
size=2>CPrismSmartPointer<DataT>& pSP);</FONT></DIV>
<DIV><FONT face="Courier New" size=2>};</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>template<class DataT> =
inline
</FONT><FONT face="Courier New" size=2>bool =
operator==(</FONT><FONT
face="Courier New" size=2>const CPrismSmartPointer<DataT>& =
lhs,
</FONT><FONT face="Courier New" size=2>const
CPrismSmartPointer<DataT>& rhs)</FONT></DIV>
<DIV><FONT face="Courier New" size=2>{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> if =
(lhs.m_pData
&& rhs.m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return (lhs.m_pData->m_pDataT == =
rhs.m_pData->m_pDataT);</FONT></DIV>
<DIV><FONT face="Courier New" size=2> return
false;</FONT></DIV>
<DIV><FONT face="Courier New" size=2>}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>template<class DataT> =
inline
</FONT><FONT face="Courier New" size=2>bool =
operator==(</FONT><FONT
face="Courier New" size=2>const CPrismSmartPointer<DataT>& =
lhs,
</FONT><FONT face="Courier New" size=2>const DataT* =
pRhsT)</FONT></DIV>
<DIV><FONT face="Courier New" size=2>{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> if
(lhs->m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
return (lhs->m_pData->m_pDataT == pRhsT);</FONT></DIV>
<DIV><FONT face="Courier New" size=2> return
false;</FONT></DIV>
<DIV><FONT face="Courier New" size=2>}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>template<class DataT> =
inline
</FONT><FONT face="Courier New" size=2>bool =
operator==(</FONT><FONT
face="Courier New" size=2>const CPrismSmartPointer<DataT>& =
lhs,
</FONT><FONT face="Courier New" size=2>int nRhs)</FONT></DIV>
<DIV><FONT face="Courier New" size=2>{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> int nTemp =
=
0;</FONT></DIV>
<DIV><FONT face="Courier New" size=2> if
(lhs.m_pData)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> if
(lhs.m_pData->m_pDataT)</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
nTemp
= (int) (lhs.m_pData->m_pDataT);</FONT></DIV>
<DIV><FONT face="Courier New" size=2> =
}</FONT></DIV>
<DIV><FONT face="Courier New" size=2> return =
(nTemp ==
nRhs);</FONT></DIV>
<DIV><FONT face="Courier New" size=2>}</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT> </DIV>
<DIV><FONT face="Courier New" size=2>template<class DataT> =
inline
</FONT><FONT face="Courier New" size=2>void =
PrismGCSmartPointer(</FONT><FONT
face="Courier New" size=2>CPrismSmartPointer<DataT>& =
pSP)</FONT></DIV>
<DIV><FONT face="Courier New" size=2>{</FONT></DIV>
<DIV><FONT face="Courier New" size=2> pSP = =
NULL;</FONT></DIV>
<DIV><FONT face="Courier New" size=2>}</FONT></DIV></BODY></HTML>
------=_NextPart_000_00BB_01C695ED.3958DA70--