<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<!--[if !mso]><style>v\:* {behavior:url(#default#VML);}
o\:* {behavior:url(#default#VML);}
w\:* {behavior:url(#default#VML);}
.shape {behavior:url(#default#VML);}
</style><![endif]--><style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}
p.msonormal0, li.msonormal0, div.msonormal0
{mso-style-name:msonormal;
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
p.m-48210739831100181m-3187456436790761122xmsonormal, li.m-48210739831100181m-3187456436790761122xmsonormal, div.m-48210739831100181m-3187456436790761122xmsonormal
{mso-style-name:m_-48210739831100181m_-3187456436790761122xmsonormal;
mso-margin-top-alt:auto;
margin-right:0cm;
mso-margin-bottom-alt:auto;
margin-left:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.hoenzb
{mso-style-name:hoenzb;}
span.EmailStyle20
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="FR-CA" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-CA">Hi all, <br>
<br>
Thank you greatly for your responses.<br>
<br>
Well I do agree ParaView is a different beast, but I have seen no problem in scaling with the number of actors (except maybe when loading a StateFile).
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">I</span><span lang="EN-CA" style="font-family:"Times New Roman",serif">’</span><span lang="EN-CA">m will take a look at
</span><span lang="EN-CA">mapper->StaticOn(), but I’m afraid the problem will now be of determining when a mapper should be static and when it should be dynamic.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">A more automated principle would be welcome.
<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA">Jonathan Borduas<br>
<br>
<o:p></o:p></span></p>
<p class="MsoNormal"><b><span lang="EN-US">From:</span></b><span lang="EN-US"> Ken Martin [mailto:ken.martin@kitware.com]
<br>
<b>Sent:</b> March 5, 2018 12:56 PM<br>
<b>To:</b> Will Schroeder <will.schroeder@kitware.com><br>
<b>Cc:</b> Jonathan Borduas <jonathan.borduas@caboma.com>; vtk-developers@vtk.org<br>
<b>Subject:</b> Re: [vtk-developers] Massive lag in a Pileline. Too complex pipeline ?<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-CA">For VTK there is no need to disconnect. In fact mapper->StaticOn() is faster than disconnecting once you have rendered once I believe. Also if you know your data is opaque setting ForceOpaqueOn() helps as well. With
just those two settings on VTK master I can get 10000 actors rendering at a rate of 11 fps on a laptop.<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA">For VTK I really do believe some of the core information object pipeline stuff needs to be reworked. Simple calls like GetInputObject take a huge % of time and create multiple objects on the heap per call etc.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA">ParaView is a different beast as it has GUI etc.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-CA">On Mon, Mar 5, 2018 at 12:04 PM, Will Schroeder <</span><a href="mailto:will.schroeder@kitware.com" target="_blank"><span lang="EN-CA">will.schroeder@kitware.com</span></a><span lang="EN-CA">> wrote:<o:p></o:p></span></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span lang="EN-CA">Just a quick response off of the top of my head:<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA">vtkMapper::Static (i.e, SetStaticOn()) prevents the mapper from propagating updates down the pipeline.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA">I have seen pipelines hacked as follows: executing them once, and then perform a local shallow copy of the resulting data into data object(s) (e.g., polydata) which is disconnected from the pipeline hence the updates
are fast.<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA">I suspect there are more elegant ways but maybe this will get the conversation going...<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-CA">On Mon, Mar 5, 2018 at 11:56 AM, Jonathan Borduas <</span><a href="mailto:jonathan.borduas@caboma.com" target="_blank"><span lang="EN-CA">jonathan.borduas@caboma.com</span></a><span lang="EN-CA">> wrote:<o:p></o:p></span></p>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0cm;margin-bottom:5.0pt">
<div>
<div>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black">Hi all,
</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt">VTK pipelines are great, they allow to dynamically create a flow of algorithms. However, we recently encountered a massive lag in our pipeline related
to the pipeline mechanisms (as opposed to the algorithms’ calculation time). We are using a derivative of ParaView with homemade filters.
</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt">We profiled our application in such a way that the profiling session started when all of the algorithms present in the pipeline had already been executed
once and were up to date. The profiler pointed out two methods that were called a very significant amount of times while no updates were required on any of the algorithms of the pipeline. Those methods were:</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-CA" style="font-size:12.0pt">1) vtkInformation::GetAsObjectBase(...)</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-CA" style="font-size:12.0pt">2) vtkDemandDrivenPipeline::ComputePipelineMTime(...)</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black">This lag doesn’t appear when only filters at the beginning of the pipeline are shown, but as we go down in the pipeline and show the outputs
of filters, the lag become unbearable:</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black">We think this lag is caused by the number of inputs our filters have combined with the length and complexity of the pipeline. In the following,
I will explain our line of thought and propose a way to solve our pipeline scalability problem.
</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><b><span lang="EN-CA" style="font-size:12.0pt;color:black">Demand Driven Pipelines for Representation:</span></b><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black">Our understanding is that a representation pipeline usually involves that the multiplicity of outputs<b> is greater than</b> the multiplicity
of inputs. The pipeline fans out. This mean that the Update() process is rather fast and scalable.
</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal" align="center" style="text-align:center">
<span style="font-size:12.0pt;color:black"><img border="0" width="240" height="194" style="width:2.5in;height:2.0208in" id="m_-48210739831100181m_-3187456436790761122x_Picture_x0020_1" src="cid:image001.jpg@01D3B489.338F1290" alt="cid:image001.jpg@01D3B489.338F1290"></span><span lang="EN-CA" style="font-size:12.0pt;color:black"><br>
</span><span lang="EN-CA" style="font-size:7.0pt;color:black">In the previous picture, if filter 3 needs an Update(), only filter 0,1 and 3 will have a RequestData().</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal" align="center" style="text-align:center">
<span lang="EN-CA" style="font-size:7.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><b><span lang="EN-CA" style="font-size:12.0pt;color:black">Demand Driven Pipeline for Modeling:</span></b><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal" style="margin-bottom:12.0pt">
<span lang="EN-CA" style="font-size:12.0pt;color:black">However, in our case, we use VTK as a visualisation library as well as a mesh processing tool. To process mesh, you often need multiple inputs (boolean operations, points projections on a mesh</span><span lang="EN-CA" style="font-size:12.0pt;font-family:"Times New Roman",serif;color:black">…</span><span lang="EN-CA" style="font-size:12.0pt;color:black">):
the multiplicity of inputs is <b>equivalent </b>to the multiplicity of outputs.</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal" align="center" style="text-align:center">
<span lang="EN-CA" style="font-size:12.0pt;color:black"><img border="0" width="278" height="336" style="width:2.8958in;height:3.5in" id="m_-48210739831100181m_-3187456436790761122x_Picture_x0020_7" src="cid:image002.jpg@01D3B489.338F1290" alt="cid:image002.jpg@01D3B489.338F1290"></span><o:p></o:p></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal" align="center" style="margin-bottom:12.0pt;text-align:center">
<span lang="EN-CA" style="font-size:7.0pt;color:black">If filter 8 needs an Update(), all filters Upstream will require to Update() except (6,3,1)</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black">With high input multiplicity, the Update() process, even with a distributed executive pipeline, will impact performance, creating a significant
overhead. </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><b><span lang="EN-CA" style="font-size:12.0pt;color:black">Demand Driven Pipeline with Event Driven Subsets:</span></b><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black">Here we suggest an improvement over the DemandDrivenPipeline by introducing Event Driven (push) subsets:</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal" align="center" style="text-align:center">
<span lang="EN-CA" style="font-size:12.0pt;color:black"><img border="0" width="353" height="342" style="width:3.677in;height:3.5625in" id="m_-48210739831100181m_-3187456436790761122_x005f_x0000_i1034" src="cid:image003.jpg@01D3B489.338F1290" alt="cid:image003.jpg@01D3B489.338F1290"></span><span lang="EN-CA" style="font-size:12.0pt;color:black"><br>
</span><span lang="EN-CA" style="font-size:7.0pt;color:black">If Filter 8 needs an Update(), the signal will be passed to the subset and then to Filter0. Filter 2,4,5 and 7 are force to calculate in a Event-driven fashion.</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal" align="center" style="text-align:center">
<span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black">The overhead of the representation pipeline Update() when you have a high input multiplicity could be reduced with the creation of subsets
of a pipeline. The subsets should be handled as Event Triggered Pipelines (Push Pipelines).
<br>
<br>
A push subset could be considered like a filter that contains a small part of the pipeline and where all outputs execute a RequestData() using a Push Pipeline.</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black">We are aware of the vtkThreadedStreamingPipeline that had PUSH/PULL capability, however it is now legacy. Also, we do not require the threaded/scheduler
capability of this pipeline model. An extended version of the vtkDemandDrivenPipeline with a Event Driven (pull) pipeline that would apply to a subset would be ideal.
</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black"> </span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="m-48210739831100181m-3187456436790761122xmsonormal"><span lang="EN-CA" style="font-size:12.0pt;color:black">Please share your thoughts on creating such a pipeline. Please keep in mind that this suggestion has the goal to keep the pipeline’s dynamism,
we are aware that we could package the subset into a single filter. <br>
<br>
Thank you,<br>
<br>
Jonathan Borduas</span><span lang="EN-CA"><o:p></o:p></span></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto"><span lang="EN-CA"> <o:p></o:p></span></p>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span lang="EN-CA"><br>
_______________________________________________<br>
Powered by </span><a href="http://www.kitware.com" target="_blank"><span lang="EN-CA">www.kitware.com</span></a><span lang="EN-CA"><br>
<br>
Visit other Kitware open-source projects at </span><a href="http://www.kitware.com/opensource/opensource.html" target="_blank"><span lang="EN-CA">http://www.kitware.com/opensource/opensource.html</span></a><span lang="EN-CA"><br>
<br>
Search the list archives at: </span><a href="http://markmail.org/search/?q=vtk-developers" target="_blank"><span lang="EN-CA">http://markmail.org/search/?q=vtk-developers</span></a><span lang="EN-CA"><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
</span><a href="https://vtk.org/mailman/listinfo/vtk-developers" target="_blank"><span lang="EN-CA">https://vtk.org/mailman/listinfo/vtk-developers</span></a><span lang="EN-CA"><br>
<br>
<o:p></o:p></span></p>
</blockquote>
</div>
<p class="MsoNormal"><span lang="EN-CA" style="color:#888888"><br>
<br clear="all">
<span class="hoenzb"><o:p></o:p></span></span></p>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<p class="MsoNormal"><span class="hoenzb"><span lang="EN-CA" style="color:#888888">--
</span></span><span class="hoenzb"><span lang="EN-CA"><o:p></o:p></span></span></p>
<div>
<div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="color:#888888">William J. Schroeder, PhD<br>
Kitware, Inc. - Building the World's Technical Computing Software<br>
28 Corporate Drive<br>
Clifton Park, NY 12065<br>
</span><a href="mailto:will.schroeder@kitware.com" target="_blank"><span lang="EN-CA">will.schroeder@kitware.com</span></a><span lang="EN-CA" style="color:#888888"><br>
</span><a href="http://www.kitware.com" target="_blank"><span lang="EN-CA">http://www.kitware.com</span></a><span lang="EN-CA" style="color:#888888"><br>
</span><a href="tel:(518)%20881-4902" target="_blank"><span lang="EN-CA">(518) 881-4902</span></a><span lang="EN-CA"><o:p></o:p></span></p>
</div>
</div>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span lang="EN-CA"><br>
_______________________________________________<br>
Powered by </span><a href="http://www.kitware.com" target="_blank"><span lang="EN-CA">www.kitware.com</span></a><span lang="EN-CA"><br>
<br>
Visit other Kitware open-source projects at </span><a href="http://www.kitware.com/opensource/opensource.html" target="_blank"><span lang="EN-CA">http://www.kitware.com/opensource/opensource.html</span></a><span lang="EN-CA"><br>
<br>
Search the list archives at: </span><a href="http://markmail.org/search/?q=vtk-developers" target="_blank"><span lang="EN-CA">http://markmail.org/search/?q=vtk-developers</span></a><span lang="EN-CA"><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
</span><a href="https://vtk.org/mailman/listinfo/vtk-developers" target="_blank"><span lang="EN-CA">https://vtk.org/mailman/listinfo/vtk-developers</span></a><span lang="EN-CA"><br>
<br>
<o:p></o:p></span></p>
</blockquote>
</div>
<p class="MsoNormal"><span lang="EN-CA"><br>
<br clear="all">
<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<p class="MsoNormal"><span lang="EN-CA">-- <o:p></o:p></span></p>
<div>
<div>
<div>
<p class="MsoNormal"><span lang="EN-CA">Ken Martin PhD<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-CA">Distinguished Engineer<br>
</span><span lang="EN-CA" style="font-size:9.5pt">Kitware Inc.</span><span lang="EN-CA"><o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA">28 Corporate Drive<br>
Clifton Park NY 12065<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span lang="EN-CA"><o:p> </o:p></span></p>
</div>
<div>
<p class="MsoNormal"><span lang="EN-CA" style="font-size:10.0pt;font-family:"Tahoma",sans-serif">This communication, including all attachments, contains confidential and legally privileged information, and it is intended only for the use of the addressee.
Access to this email by anyone else is unauthorized. If you are not the intended recipient, any disclosure, copying, distribution or any action taken in reliance on it is prohibited and may be unlawful. If you received this communication in error please notify
us immediately and destroy the original message. </span><span style="font-size:10.0pt;font-family:"Tahoma",sans-serif">Thank you.</span><o:p></o:p></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>