<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=us-ascii"><meta name=ProgId content=Word.Document><meta name=Generator content="Microsoft Word 14"><meta name=Originator content="Microsoft Word 14"><link rel=File-List href="cid:filelist.xml@01D0C8A1.4D4F8010"><!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:SpellingState>Clean</w:SpellingState>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:EnvelopeVis/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="true" DefSemiHidden="true" DefQFormat="false" DefPriority="99" LatentStyleCount="267">
<w:LsdException Locked="false" Priority="0" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" Priority="39" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" Name="toc 9"/>
<w:LsdException Locked="false" Priority="35" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" Priority="10" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" Priority="1" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" Priority="11" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" Priority="22" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" Priority="59" SemiHidden="false" UnhideWhenUsed="false" Name="Table Grid"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" UnhideWhenUsed="false" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" SemiHidden="false" UnhideWhenUsed="false" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" SemiHidden="false" UnhideWhenUsed="false" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" SemiHidden="false" UnhideWhenUsed="false" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" SemiHidden="false" UnhideWhenUsed="false" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" SemiHidden="false" UnhideWhenUsed="false" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" SemiHidden="false" UnhideWhenUsed="false" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" SemiHidden="false" UnhideWhenUsed="false" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" SemiHidden="false" UnhideWhenUsed="false" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" QFormat="true" Name="TOC Heading"/>
</w:LatentStyles>
</xml><![endif]--><style><!--
/* Font Definitions */
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;
        mso-font-charset:0;
        mso-generic-font-family:swiss;
        mso-font-pitch:variable;
        mso-font-signature:-536870145 1073786111 1 0 415 0;}
@font-face
        {font-family:Verdana;
        panose-1:2 11 6 4 3 5 4 4 2 4;
        mso-font-charset:0;
        mso-generic-font-family:swiss;
        mso-font-pitch:variable;
        mso-font-signature:-1593833729 1073750107 16 0 415 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {mso-style-unhide:no;
        mso-style-qformat:yes;
        mso-style-parent:"";
        margin:0cm;
        margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-fareast-font-family:Calibri;
        mso-hansi-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
a:link, span.MsoHyperlink
        {mso-style-noshow:yes;
        mso-style-priority:99;
        color:blue;
        text-decoration:underline;
        text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-noshow:yes;
        mso-style-priority:99;
        color:purple;
        text-decoration:underline;
        text-underline:single;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        mso-style-noshow:yes;
        mso-style-unhide:no;
        mso-ansi-font-size:11.0pt;
        mso-bidi-font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-fareast-font-family:Calibri;
        mso-hansi-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";
        color:windowtext;}
span.SpellE
        {mso-style-name:"";
        mso-spl-e:yes;}
.MsoChpDefault
        {mso-style-type:export-only;
        mso-default-props:yes;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-fareast-font-family:Calibri;
        mso-hansi-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;
        mso-header-margin:36.0pt;
        mso-footer-margin:36.0pt;
        mso-paper-source:0;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 10]><style>/* Style Definitions */
table.MsoNormalTable
        {mso-style-name:"Table Normal";
        mso-tstyle-rowband-size:0;
        mso-tstyle-colband-size:0;
        mso-style-noshow:yes;
        mso-style-priority:99;
        mso-style-parent:"";
        mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
        mso-para-margin:0cm;
        mso-para-margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-hansi-font-family:Calibri;}
</style><![endif]--><!--[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=EN-US link=blue vlink=purple style='tab-interval:36.0pt'><div class=WordSection1><p class=MsoNormal>From: <span class=SpellE>Artem</span> Kuzmitskiy <artem.kuzmitskiy@lge.com><o:p></o:p></p><p class=MsoNormal>Subject: [PATCH 2/3] Add restore for unnamed <span class=SpellE>unix</span> sockets<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Added functionality for restoring unnamed <span class=SpellE>unix</span> sockets<o:p></o:p></p><p class=MsoNormal>using already <span style='mso-tab-count:1'> </span>implemented feature - inherit <span class=SpellE>fd</span> and using same command line<o:p></o:p></p><p class=MsoNormal>option.<o:p></o:p></p><p class=MsoNormal>Usage example:<o:p></o:p></p><p class=MsoNormal><span style='mso-tab-count:1'> </span><span class=SpellE>criu</span> restore -d -D images -o restore.log --<span class=SpellE>pidfile</span> <span class=SpellE>restore.pid</span> -v4 \<o:p></o:p></p><p class=MsoNormal><span style='mso-spacerun:yes'> </span>-x --inherit-<span class=SpellE>fd</span> <span class=SpellE>fd</span>[3]:socket:[9677263]<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Signed-off-by: <span class=SpellE>Artem</span> Kuzmitskiy <artem.kuzmitskiy@lge.com><o:p></o:p></p><p class=MsoNormal>---<o:p></o:p></p><p class=MsoNormal> <span class=SpellE>files.c</span><span style='mso-spacerun:yes'> </span>| 19 +++++++++++++++----<o:p></o:p></p><p class=MsoNormal> include/<span class=SpellE>files.h</span> |<span style='mso-spacerun:yes'> </span>2 +-<o:p></o:p></p><p class=MsoNormal> include/<span class=SpellE>image.h</span> |<span style='mso-spacerun:yes'> </span>1 +<o:p></o:p></p><p class=MsoNormal> <span class=SpellE>sk-unix.c</span><span style='mso-spacerun:yes'> </span>| 47 +++++++++++++++++++++++++++++++++++------------<o:p></o:p></p><p class=MsoNormal> 4 files changed, 52 insertions(+), 17 deletions(-)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>diff --<span class=SpellE>git</span> a/<span class=SpellE>files.c</span> b/<span class=SpellE>files.c</span><o:p></o:p></p><p class=MsoNormal>index 613289a..887b55c 100644<o:p></o:p></p><p class=MsoNormal>--- a/<span class=SpellE>files.c</span><o:p></o:p></p><p class=MsoNormal>+++ b/<span class=SpellE>files.c</span><o:p></o:p></p><p class=MsoNormal>@@ -1404,6 +1404,19 @@ static <span class=SpellE>int</span> <span class=SpellE>inherit_fd_lookup_id</span>(char *id)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>return ret;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>+<span class=SpellE>bool</span> <span class=SpellE>inherit_fd_lookup_desc</span>(<span class=SpellE>struct</span> <span class=SpellE>file_desc</span> *d)<o:p></o:p></p><p class=MsoNormal>+{<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>char <span class=SpellE>buf</span>[32], *<span class=SpellE>id_str</span>;<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>if (!d->ops->name)<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span>return -1;<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span><span class=SpellE>id_str</span> = d->ops->name(d, <span class=SpellE>buf</span>, <span class=SpellE>sizeof</span>(<span class=SpellE>buf</span>));<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span><span class=SpellE>int</span> ret = <span class=SpellE>inherit_fd_lookup_id</span>(<span class=SpellE>id_str</span>);<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>return (ret < 0 ? false : true);<o:p></o:p></p><p class=MsoNormal>+}<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal> <span class=SpellE>bool</span> <span class=SpellE>inherited_fd</span>(<span class=SpellE>struct</span> <span class=SpellE>file_desc</span> *d, <span class=SpellE>int</span> *<span class=SpellE>fd_p</span>)<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>char <span class=SpellE>buf</span>[32], *<span class=SpellE>id_str</span>;<o:p></o:p></p><p class=MsoNormal>@@ -1421,12 +1434,10 @@ <span class=SpellE>bool</span> <span class=SpellE>inherited_fd</span>(<span class=SpellE>struct</span> <span class=SpellE>file_desc</span> *d, <span class=SpellE>int</span> *<span class=SpellE>fd_p</span>)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:2'> </span>return true;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>*<span class=SpellE>fd_p</span> = dup(<span class=SpellE>i_fd</span>);<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:1'> </span>if (*<span class=SpellE>fd_p</span> < 0) {<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>if (*<span class=SpellE>fd_p</span> < 0)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:2'> </span><span class=SpellE>pr_perror</span>("Inherit <span class=SpellE>fd</span> DUP failed");<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:2'> </span>return false;<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:1'> </span>}<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>else<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:2'> </span><span class=SpellE>pr_info</span>("File %s will be restored from <span class=SpellE>fd</span> %d duped "<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span><span class=SpellE>pr_info</span>("File %s will be restored from <span class=SpellE>fd</span> %d dumped "<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:4'> </span>"from inherit <span class=SpellE>fd</span> %d\n", <span class=SpellE>id_str</span>, *<span class=SpellE>fd_p</span>, <span class=SpellE>i_fd</span>);<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>return true;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal>diff --<span class=SpellE>git</span> a/include/<span class=SpellE>files.h</span> b/include/<span class=SpellE>files.h</span><o:p></o:p></p><p class=MsoNormal>index db7e108..25d69ad 100644<o:p></o:p></p><p class=MsoNormal>--- a/include/<span class=SpellE>files.h</span><o:p></o:p></p><p class=MsoNormal>+++ b/include/<span class=SpellE>files.h</span><o:p></o:p></p><p class=MsoNormal>@@ -174,7 +174,7 @@ extern <span class=SpellE>int</span> <span class=SpellE>inherit_fd_add</span>(<span class=SpellE>int</span> <span class=SpellE>fd</span>, char *key);<o:p></o:p></p><p class=MsoNormal> extern void <span class=SpellE>inherit_fd_log</span>(void);<o:p></o:p></p><p class=MsoNormal> extern <span class=SpellE>int</span> <span class=SpellE>inherit_fd_resolve_clash</span>(<span class=SpellE>int</span> <span class=SpellE>fd</span>);<o:p></o:p></p><p class=MsoNormal> extern <span class=SpellE>int</span> <span class=SpellE>inherit_fd_fini</span>(void);<o:p></o:p></p><p class=MsoNormal>-<o:p></o:p></p><p class=MsoNormal>+extern <span class=SpellE>bool</span> <span class=SpellE>inherit_fd_lookup_desc</span>(<span class=SpellE>struct</span> <span class=SpellE>file_desc</span> *);<o:p></o:p></p><p class=MsoNormal> extern <span class=SpellE>bool</span> <span class=SpellE>inherited_fd</span>(<span class=SpellE>struct</span> <span class=SpellE>file_desc</span> *, <span class=SpellE>int</span> *<span class=SpellE>fdp</span>);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> #<span class=SpellE>endif</span> /* __CR_FILES_H__ */<o:p></o:p></p><p class=MsoNormal>diff --<span class=SpellE>git</span> a/include/<span class=SpellE>image.h</span> b/include/<span class=SpellE>image.h</span><o:p></o:p></p><p class=MsoNormal>index c13ead0..305febf 100644<o:p></o:p></p><p class=MsoNormal>--- a/include/<span class=SpellE>image.h</span><o:p></o:p></p><p class=MsoNormal>+++ b/include/<span class=SpellE>image.h</span><o:p></o:p></p><p class=MsoNormal>@@ -41,6 +41,7 @@<o:p></o:p></p><p class=MsoNormal> #define USK_EXTERN<span style='mso-tab-count:1'> </span>(1 << 0)<o:p></o:p></p><p class=MsoNormal> #define USK_SERVICE<span style='mso-tab-count:1'> </span>(1 << 1)<o:p></o:p></p><p class=MsoNormal> #define USK_CALLBACK<span style='mso-tab-count:1'> </span>(1 << 2)<o:p></o:p></p><p class=MsoNormal>+#define USK_INHERIT<span style='mso-tab-count:1'> </span>(1 << 3)<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> /*<o:p></o:p></p><p class=MsoNormal><span style='mso-spacerun:yes'> </span>* VMA_AREA status:<o:p></o:p></p><p class=MsoNormal>diff --<span class=SpellE>git</span> a/<span class=SpellE>sk-unix.c</span> b/<span class=SpellE>sk-unix.c</span><o:p></o:p></p><p class=MsoNormal>index 33d83e6..a7cdd85 100644<o:p></o:p></p><p class=MsoNormal>--- a/<span class=SpellE>sk-unix.c</span><o:p></o:p></p><p class=MsoNormal>+++ b/<span class=SpellE>sk-unix.c</span><o:p></o:p></p><p class=MsoNormal>@@ -150,7 +150,6 @@ static <span class=SpellE>bool</span> <span class=SpellE>unix_sk_exception_lookup_id</span>(<span class=SpellE>ino_t</span> <span class=SpellE>ino</span>)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>return ret;<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-<o:p></o:p></p><p class=MsoNormal> static <span class=SpellE>int</span> <span class=SpellE>write_unix_entry</span>(<span class=SpellE>struct</span> <span class=SpellE>unix_sk_desc</span> *<span class=SpellE>sk</span>)<o:p></o:p></p><p class=MsoNormal> {<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span><span class=SpellE>int</span> ret;<o:p></o:p></p><p class=MsoNormal>@@ -718,21 +717,23 @@ static <span class=SpellE>int</span> <span class=SpellE>post_open_unix_sk</span>(<span class=SpellE>struct</span> <span class=SpellE>file_desc</span> *d, <span class=SpellE>int</span> <span class=SpellE>fd</span>)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>if (<span class=SpellE>ui</span>-><span class=SpellE>ue</span>-><span class=SpellE>uflags</span> & USK_CALLBACK)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:2'> </span>return 0;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-<span style='mso-tab-count:1'> </span><span class=SpellE>pr_info</span>("\<span class=SpellE>tConnect</span> %#x to %#x\n", <span class=SpellE>ui</span>-><span class=SpellE>ue</span>-><span class=SpellE>ino</span>, peer-><span class=SpellE>ue</span>-><span class=SpellE>ino</span>);<o:p></o:p></p><p class=MsoNormal>-<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>/* Skip external sockets */<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>if (!<span class=SpellE>list_empty</span>(&peer-><span class=SpellE>d.fd_info_head</span>))<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:2'> </span><span class=SpellE>futex_wait_while</span>(&peer->prepared, 0);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-<span style='mso-tab-count:1'> </span><span class=SpellE>memset</span>(&<span class=SpellE>addr</span>, 0, <span class=SpellE>sizeof</span>(<span class=SpellE>addr</span>));<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:1'> </span><span class=SpellE>addr.sun_family</span> = AF_UNIX;<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:1'> </span><span class=SpellE>memcpy</span>(&<span class=SpellE>addr.sun_path</span>, peer->name, peer-><span class=SpellE>ue</span>-><span class=SpellE>name.len</span>);<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>if (!(<span class=SpellE>ui</span>-><span class=SpellE>ue</span>-><span class=SpellE>uflags</span> & USK_INHERIT)) {<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span><span class=SpellE>memset</span>(&<span class=SpellE>addr</span>, 0, <span class=SpellE>sizeof</span>(<span class=SpellE>addr</span>));<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span><span class=SpellE>addr.sun_family</span> = AF_UNIX;<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span><span class=SpellE>memcpy</span>(&<span class=SpellE>addr.sun_path</span>, peer->name, peer-><span class=SpellE>ue</span>-><span class=SpellE>name.len</span>);<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>-<span style='mso-tab-count:1'> </span>if (connect(<span class=SpellE>fd</span>, (<span class=SpellE>struct</span> <span class=SpellE>sockaddr</span> *)&<span class=SpellE>addr</span>,<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:4'> </span><span class=SpellE>sizeof</span>(<span class=SpellE>addr.sun_family</span>) +<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:4'> </span>peer-><span class=SpellE>ue</span>-><span class=SpellE>name.len</span>) < 0) {<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:2'> </span><span class=SpellE>pr_perror</span>("Can't connect %#x socket", <span class=SpellE>ui</span>-><span class=SpellE>ue</span>-><span class=SpellE>ino</span>);<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:2'> </span>return -1;<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span><span class=SpellE>pr_info</span>("\<span class=SpellE>tConnect</span> %#x to %#x\n", <span class=SpellE>ui</span>-><span class=SpellE>ue</span>-><span class=SpellE>ino</span>, peer-><span class=SpellE>ue</span>-><span class=SpellE>ino</span>);<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span>if (connect(<span class=SpellE>fd</span>, (<span class=SpellE>struct</span> <span class=SpellE>sockaddr</span> *)&<span class=SpellE>addr</span>,<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:5'> </span><span class=SpellE>sizeof</span>(<span class=SpellE>addr.sun_family</span>) +<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:5'> </span>peer-><span class=SpellE>ue</span>-><span class=SpellE>name.len</span>) < 0) {<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:3'> </span><span class=SpellE>pr_perror</span>("Can't connect %#x socket", <span class=SpellE>ui</span>-><span class=SpellE>ue</span>-><span class=SpellE>ino</span>);<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:3'> </span>return -1;<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span>}<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>}<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>if (<span class=SpellE>restore_sk_queue</span>(<span class=SpellE>fd</span>, peer-><span class=SpellE>ue</span>->id))<o:p></o:p></p><p class=MsoNormal>@@ -1008,7 +1009,13 @@ static <span class=SpellE>int</span> <span class=SpellE>open_unix_sk</span>(<span class=SpellE>struct</span> <span class=SpellE>file_desc</span> *d)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span><span class=SpellE>struct</span> <span class=SpellE>unix_sk_info</span> *<span class=SpellE>ui</span>;<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span><span class=SpellE>ui</span> = <span class=SpellE>container_of</span>(d, <span class=SpellE>struct</span> <span class=SpellE>unix_sk_info</span>, d);<o:p></o:p></p><p class=MsoNormal>-<span style='mso-tab-count:1'> </span>if (<span class=SpellE>ui</span>->flags & USK_PAIR_MASTER)<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span><span class=SpellE>int</span> <span class=SpellE>unixsk_fd</span> = -1;<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>if (<span class=SpellE>inherited_fd</span>(d, &<span class=SpellE>unixsk_fd</span>)) {<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span><span class=SpellE>ui</span>-><span class=SpellE>ue</span>-><span class=SpellE>uflags</span> |= USK_INHERIT;<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span>return <span class=SpellE>unixsk_fd</span>;<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>} else if (<span class=SpellE>ui</span>->flags & USK_PAIR_MASTER)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:2'> </span>return <span class=SpellE>open_unixsk_pair_master</span>(<span class=SpellE>ui</span>);<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>else if (<span class=SpellE>ui</span>->flags & USK_PAIR_SLAVE)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:2'> </span>return <span class=SpellE>open_unixsk_pair_slave</span>(<span class=SpellE>ui</span>);<o:p></o:p></p><p class=MsoNormal>@@ -1016,11 +1023,27 @@ static <span class=SpellE>int</span> <span class=SpellE>open_unix_sk</span>(<span class=SpellE>struct</span> <span class=SpellE>file_desc</span> *d)<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:2'> </span>return <span class=SpellE>open_unixsk_standalone</span>(<span class=SpellE>ui</span>);<o:p></o:p></p><p class=MsoNormal> }<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>+static char *<span class=SpellE>socket_d_name</span>(<span class=SpellE>struct</span> <span class=SpellE>file_desc</span> *d, char *<span class=SpellE>buf</span>, <span class=SpellE>size_t</span> s)<o:p></o:p></p><p class=MsoNormal>+{<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span><span class=SpellE>struct</span> <span class=SpellE>unix_sk_info</span> *<span class=SpellE>ui</span>;<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span><span class=SpellE>ui</span> = <span class=SpellE>container_of</span>(d, <span class=SpellE>struct</span> <span class=SpellE>unix_sk_info</span>, d);<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>if (<span class=SpellE>snprintf</span>(<span class=SpellE>buf</span>, s, "socket:[%d]", <span class=SpellE>ui</span>-><span class=SpellE>ue</span>-><span class=SpellE>ino</span>) >= s) {<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span><span class=SpellE>pr_err</span>("Not enough room for <span class=SpellE>unixsk</span> %d identifier string\n",<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:4'> </span><span class=SpellE>ui</span>-><span class=SpellE>ue</span>-><span class=SpellE>ino</span>);<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:2'> </span>return NULL;<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>}<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>return <span class=SpellE>buf</span>;<o:p></o:p></p><p class=MsoNormal>+}<o:p></o:p></p><p class=MsoNormal>+<o:p></o:p></p><p class=MsoNormal> static <span class=SpellE>struct</span> <span class=SpellE>file_desc_ops</span> <span class=SpellE>unix_desc_ops</span> = {<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>.type = FD_TYPES__UNIXSK,<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>.open = <span class=SpellE>open_unix_sk</span>,<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>.<span class=SpellE>post_open</span> = <span class=SpellE>post_open_unix_sk</span>,<o:p></o:p></p><p class=MsoNormal> <span style='mso-tab-count:1'> </span>.<span class=SpellE>want_transport</span> = <span class=SpellE>unixsk_should_open_transport</span>,<o:p></o:p></p><p class=MsoNormal>+<span style='mso-tab-count:1'> </span>.name = <span class=SpellE>socket_d_name</span>,<o:p></o:p></p><p class=MsoNormal> };<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal> static <span class=SpellE>int</span> <span class=SpellE>collect_one_unixsk</span>(void *o, <span class=SpellE>ProtobufCMessage</span> *base)<o:p></o:p></p><p class=MsoNormal>--<o:p></o:p></p><p class=MsoNormal>2.1.4<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal><span style='font-size:8.0pt;font-family:"Verdana","sans-serif";mso-fareast-font-family:"Times New Roman";color:#595959;mso-no-proof:yes'>Best regards,<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:8.0pt;font-family:"Verdana","sans-serif";mso-fareast-font-family:"Times New Roman";color:#595959;mso-no-proof:yes'>Artem Kuzmitskiy<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:8.0pt;font-family:"Verdana","sans-serif";mso-fareast-font-family:"Times New Roman";color:#595959;mso-no-proof:yes'>LG Russia R&D Lab, St.-Petersburg<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:8.0pt;font-family:"Verdana","sans-serif";mso-fareast-font-family:"Times New Roman";color:#595959;mso-no-proof:yes'>Web Team Web 3 Part<o:p></o:p></span></p><p class=MsoNormal><span style='font-size:8.0pt;font-family:"Verdana","sans-serif";mso-fareast-font-family:"Times New Roman";color:#595959;mso-no-proof:yes'>Local phone 128<o:p></o:p></span></p><p class=MsoNormal><span style='mso-fareast-font-family:"Times New Roman";mso-no-proof:yes'><o:p> </o:p></span></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>