<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0" /> 
<base href="https://wiki.asterisk.org/wiki" /> 
<title>Message Title</title>  
<style type="text/css">@media only screen and (max-device-width: 480px) {.mobile-only {
        width: auto !important;
        height: auto !important;
        overflow: visible !important;
        line-height: normal !important;
        font-size: inherit !important;
        mso-hide: all;
}

.desktop-only {
        display: none !important;
}

/* iPhone 3GS fix for unwanted 20px right margin */
body { min-width: 100% !important; padding: 0; margin: 0; }

#center-content-table { max-width: none; !important; }
#header-pattern-container { padding: 10px 10px 10px 10px !important; line-height: 20px !important; }
#header-avatar-image-container { padding-right: 8px !important; }
#email-content-container { padding: 0 !important; }
.mobile-expand { border-radius: 0 !important; border-left: 0 !important; border-right: 0 !important; padding-left: 26px !important;}
.mobile-resize-text { font-size: 16px !important; line-height: 22px !important; }
#page-title-pattern-header { font-size: 20px !important; line-height: 28px !important; }
#page-title-pattern-icon-image-container-cell { padding-top: 7px !important; }
#inline-user-pattern { display: block !important; }
#inline-user-pattern-avatar { padding-top: 3px !important; }
.contextual-area-pattern { border-bottom: 1px solid #ccc !important; padding: 15px 10px 0 10px !important;}
.users-involved-pattern-column-table { width: 100% !important;  }
.users-involved-pattern-avatar-table-cell { padding: 3px 5px 5px 0 !important; }
.users-involved-pattern-column-container { padding-right: 0 !important; }
.contextual-excerpt-pattern, #users-involved-pattern { border: 0 !important; }

/** Aui Typography upsized for mobile **/
#content-excerpt-pattern-container, #contextual-excerpt-pattern-text-container { font-size: 16px !important; line-height: 22px !important; }
#content-excerpt-pattern-container h1, #contextual-excerpt-pattern-text-container h1 { font-size: 24px !important; line-height: 28px !important; }
#content-excerpt-pattern-container h2, #contextual-excerpt-pattern-text-container h2 { font-size: 20px !important; line-height: 28px !important; }
#content-excerpt-pattern-container h3, #contextual-excerpt-pattern-text-container h3 { font-size: 18px !important; line-height: 24px !important; }
#content-excerpt-pattern-container h4, #contextual-excerpt-pattern-text-container h4 { font-size: 16px !important; line-height: 22px !important; }
#content-excerpt-pattern-container h5, #contextual-excerpt-pattern-text-container h5 { font-size: 14px !important; line-height: 20px !important; }
#content-excerpt-pattern-container h6, #contextual-excerpt-pattern-text-container h6 { font-size: 14px !important; line-height: 20px !important; }
.user-mention { line-height: 18px !important; }
/** Aui Typography end **/

/* Show appropriate footer logo on mobile, display links vertically */
#footer-pattern { padding: 15px 10px !important; }
#footer-pattern-logo-desktop-container { padding: 0 !important; }
#footer-pattern-logo-desktop { width: 0 !important; height: 0 !important; }
#footer-pattern-logo-mobile {
    padding-top: 10px !important;
    width: 30px !important;
    height: 27px !important;
    display: inline !important;
}
#footer-pattern-text {
    display: block !important;
}
#footer-pattern-links-container { line-height: 0 !important;}
.footer-pattern-links.mobile-resize-text,
.footer-pattern-links.mobile-resize-text,
#footer-pattern-text.mobile-resize-text,
#footer-pattern-links-container.no-footer-links {
    font-size: 14px !important;
    line-height: 20px !important;
}
.footer-link { display: block !important; }
#footer-pattern-links-container table { display: inline-block !important; float: none !important; }
#footer-pattern-links-container, #footer-pattern-text { text-align: center !important; }
#footer-pattern-links { padding-bottom: 5px !important; }

/** Team Calendar overrides, these should be removed when notifications are updated in Team Calendars. For now CSS
    overrides are being used because the structure of the content can't change without rereleasing the plugin */
.mail-calendar-container .day-header + table tr td:first-child {
    vertical-align: top !important;
    padding-top: 5px !important;
}}
@media (min-width: 900px) {#center-content-table { width: 900px; }}
@media all {#outlook a {padding:0;} /* Force Outlook to provide a "view in browser" menu link. */
/* Prevent Webkit and Windows Mobile platforms from changing default font sizes.*/
body{-webkit-text-size-adjust:100%; -ms-text-size-adjust:100%;}
.ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */
#background-table {margin:0; padding:0; width:100% !important; }
/* Needed to override highlighting on date and time links in iOS */
.grey a {color: #707070; text-decoration: none; }/* These styles are appended to the head element of a notification in order to prevent Apple Mail and similar
   clients from underlining the due dates with a blue hyperlink */
/* a lozenge outside an inline task should always be #333, lozenges inside an inline task should be
   colored according to their upcoming due dates, a completed task date lozenge or deleted task date
   lozenge should always be #707070 */
.date-time-lozenge a {color: #333333; text-decoration: none; }
.inline-task-text-container .date-time-lozenge.date-upcoming a {color: #DF6F00; text-decoration: none; }
.inline-task-text-container .date-time-lozenge.date-past a {color: #D04437; text-decoration: none; }
.inline-task-text-container.content-deleted-color .date-time-lozenge a,
.inline-task-text-container.checked .date-time-lozenge a {
    color: #707070; text-decoration: none;
}}
</style> 
</head>
<body>
<table id="background-table" cellpadding="0" cellspacing="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; background-color: #f5f5f5"> 
<tbody> 
<tr> 
<td id="header-pattern-container" style="padding: 0px; border-collapse: collapse; padding: 10px 20px"> 
<table id="header-pattern" cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td id="header-avatar-image-container" valign="top" style="padding: 0px; border-collapse: collapse; vertical-align: top; width: 32px; padding-right: 9px"><a href="https://wiki.asterisk.org/wiki/display/~jcolp?src=email" style="color: #3b73af; text-decoration: none"><img id="header-avatar-image" class="image_fix" src="cid:avatar_72d18d2d9f6a7c208e7edb4531f793b7" height="32" width="32" border="0" style="border-radius: 3px; vertical-align: top" /></a></td>
<td id="header-text-container" valign="middle" style="padding: 0px; border-collapse: collapse; vertical-align: middle; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px">Joshua C. Colp <strong>edited</strong> a page</td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<!-- End Header pattern --> 
<tr> 
<td id="email-content-container" style="padding: 0px; border-collapse: collapse; padding: 0 20px"> 
<table id="email-content-table" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; border-spacing: 0; border-collapse: separate"> 
<tbody> 
<tr> 
<td class="email-content-rounded-top mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; padding: 0 15px 0 16px; height: 15px; background-color: #fff; border-left: 1px solid #ccc; border-top: 1px solid #ccc; border-right: 1px solid #ccc; border-bottom: 0; border-top-right-radius: 5px; border-top-left-radius: 5px"> </td> 
</tr> 
<tr> 
<td class="email-content-main mobile-expand" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff"> 
<table id="page-title-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td id="page-title-pattern-icon-image-container" valign="top" style="padding: 0px; border-collapse: collapse; width: 16px; vertical-align: top"> 
<table cellspacing="0" cellpadding="0" border="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td id="page-title-pattern-icon-image-container-cell" style="padding: 0px; border-collapse: collapse; width: 16px; padding: 9px 8px 0px 0px; mso-text-raise: 5px; mso-line-height-rule: exactly"><a href="https://wiki.asterisk.org/wiki/display/AST/Minutes?src=email" title="page icon" style="vertical-align: top;; color: #3b73af; text-decoration: none"><img style="vertical-align: top; display: block;" src="cid:page-icon" alt="page icon" title="page icon" height="16" width="16" border="0" /></a></td> 
</tr> 
</tbody> 
</table> </td>
<td style="vertical-align: top;; padding: 0px; border-collapse: collapse; padding-right: 5px; font-size: 20px; line-height: 30px; mso-line-height-rule: exactly" id="page-title-pattern-header-container"><span id="page-title-pattern-header" style="font-family: Arial, sans-serif; padding: 0; font-size: 20px; line-height: 30px; mso-text-raise: 2px; mso-line-height-rule: exactly; vertical-align: middle"><a href="https://wiki.asterisk.org/wiki/display/AST/Minutes?src=email" title="Minutes" style="color: #3b73af; text-decoration: none">Minutes</a></span></td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td class="email-content-main mobile-expand" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff"> 
<table class="content-excerpt-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> 
<tbody> 
<tr> 
<td class="content-excerpt-pattern-container mobile-resize-text " style="padding: 0px; border-collapse: collapse; padding: 0 0 0 24px"> <p style="margin: 10px 0 0 0; margin-top: 0">Opening Matt Fredrickson - asterisk project lead</p> <p style="margin: 10px 0 0 0">we want to make sure to thank you by having a lunch that is catered, there is some drinks & breakfasts available.<br /> <br />so lots of ways to prevent your blood suagar from dropping</p> <p style="margin: 10px 0 0 0">thanks for E4 stratiges for lunch that helps us a lot</p> <p style="margin: 10px 0 0 0">also of note we are ending at 15h, that is atypical due to conflicting obligations like a panel<br />Eric - when will pictures happen<br />Answer - we will wait until lunchtime</p> <p style="margin: 10px 0 0 0">lunch is in the national ballroom B (accross the way)</p> <p style="margin: 10px 0 0 0">We do have a speakerphone available & a wireless network called asteriskdevcon that should be more reliable than the astricon wifi<br /> <br />Password is the same digium18<br />Also want to thank Torrey for taking notes day and George for setting up streaming for those who cannot participate onsite.   The development process is bigger than any one room<br /> <br />Introductions:</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Matt Fredrickson - sangoma</li> 
<li>Torrey Searle - Voxbone</li> 
<li>Malcom Davenport - digium - product manager - here for free food</li> 
<li>Jared Smith - digium</li> 
<li>Christophe Durieux - connect with the community</li> 
<li>Claude Paltry - jive </li> 
<li>Jroan Vinzens- sipgate - bulding a new infrastructure in ast16 with ari</li> 
<li>david duffet - digium - observing</li> 
<li>fred posner - lod - interestin in the future of asterisk</li> 
<li>Ludovic gasc - allo cloud -belgium - interested in ari</li> 
<li>pascal cadotte - wazzo - in quebec in future development esp ari</li> 
<li>evan boily - wazzo - hope next astricon will be in canada - interested in futre of asterisk</li> 
<li>Igor Goncharovskiy - russia - IQTek unistim developer</li> 
<li>Nir Simovitch - isreal - clodonix - uncarrier - here for fun</li> 
<li>Eric Klein - clondonix - sponsoring dangerous demos</li> 
<li>Lenz Dimitiri - lowe in switserland</li> 
<li>Sean McCord - psycore systems - atlanta</li> 
<li>Dan Jenkins - nimble ape UK - here to be quiet</li> 
<li>andrew naggy - socal - sangoma</li> 
<li>james benstrup - writes bugs for freepbx</li> 
<li>brian walters - sangoma - buffalo ny - interested in future of asterisk</li> 
<li>Jason Parker - atlanta -sangoma - work on phones for sangoma</li> 
<li>Dan Collins - usan - knoxville TN</li> 
<li>Paulo Vicentini - Brazil - Voxbone - help with ast13 rollout</li> 
<li>Steve Murphy - next vortex - wyoming - </li> 
<li>Peter Weschke - see where asterisk is going with ari</li> 
<li>harrison schults - corona - indianapolis</li> 
<li>john harden </li> 
<li>alex goodman - corona</li> 
<li>Ben Ford - digium - working on ast for 1 year</li> 
<li>Kevin Harwell - alabama - digium - getting feedback</li> 
<li> <span class="gwt-InlineHyperlink">Alexander Traud</span> - frankfurt germany - unemploied - used ast for 6 years </li> 
<li>George Joseph - digium developer</li> 
</ul> <p style="margin: 10px 0 0 0"> <br /> <br /> <br /> <br />What ever direction you like to see asterisk is within your power.  <br />What has happened in this last year:<br />asterisk 15.x 6 bug fix releases, current is 15.6.1<br />asterisk 14 8 security releases last version is 14.7.7<br />asterisk 13.x 6 bug fix releases current 13.23.1<br /> <br /> <br />3300 merged code reviews (across all branches)<br /> <br />it is amazing the number of contributions, that is a pretty amazing number<br />that is also means alot of eyeballs, people helping wiht review is strongly encouraged, there are alot of patches pending review a long time because of lack of reviews<br /> <br /> <br />1000 commits on asterisk 16 (close 3 per day) 72 individual contributing<br />asterisk 16 as been released! it has been in feature freeze already for a while.  if you haven't tested it yet, then well patches welcome <img class="emoticon emoticon-smile" src="/wiki/s/en_GB/5639/a252d7f5e75d7a8bf7047b4b2c92f71a56a8f048.48/_/images/icons/emoticons/smile.png" data-emoticon-name="smile" alt="(smile)" style="vertical-align: middle" /><br /> <br />Top contributor<br />260 Corey Farrel<br /> <br />Standard release vs LTS<br /> <br />something happened last here that broke convention, that made some people angry<br /> <br />in asterisk land we have 2 categories of releases, one is the standard release and the other is the magic LTS<br /> <br />alot of people feel confort in LTS, we decided in lots of caution due to the lots of changes in ast 15 especially ref multi-stream support <br />we decided not to make 15 an tls, which broke lots of conventions. On the other hand the changes were supprisingly stable.  they maintained compatiblity with most of the applicaiton interfaces<br /> <br /> <br />Standard release<br />1 year bug fix, 1 year security fix<br /> <br />LTS <br />4 year bug fix, 1 year security fix<br /> <br />additionaly we have a new branch inclusion policy.  new features can be put into an existing branch so long as there are tested and are non-major nor breaking changes<br /> <br /> <br />that allowed us to alot of neat things with that especially in branch 13, and it helps other branches because all those tests can get moved to the other branches as well<br /> <br />it has been a few years since the last LTS.  16 will be an lts, will be around until 2022, and security fixes til 2023<br /> <br />What's new in 16?</p> <p style="margin: 10px 0 0 0">Webrtc video <br />webrtc api <br />chan_pjsip performance<br />misc fun</p> <p style="margin: 10px 0 0 0">Improving video resilance</p> 
<ul style="list-style-type: square;; margin: 10px 0 0 0"> 
<li>sensitive to packet loss</li> 
<li>a loss of a single frame - strange things happen</li> 
<li>in ast 15 we took a sledge happer approach, if we detected packet loss we requested a full new video frame, (sending an entire video frame uncompressed, -very wasteful)</li> 
<li>we knew there were some better tech, but didn't have time to use them</li> 
<li>one tech is NACK - an RTCP control message 
<ul style="list-style-type: square;; margin: 10px 0 0 0; margin-top: 0"> 
<li>rtcp is the protocol used in accompanment of rtp, sends statistics</li> 
<li>the decided to extend rtcp to do other things to allow other things, including NACK</li> 
<li>it is a negative acknowledgement</li> 
<li>so if a packet is lost, you send a nack to inform of the lost packet and sender will retransmit, allowing stream repair<br /> <br /> <br />Remb</li> 
</ul> </li> 
<li>bandwith estimation</li> 
<li>informs of sender of bandwith limitaitons (I only detect 1.5mb of video, please limit)</li> 
<li>instant packet repair problem</li> 
<li>negotiated in sdp (nack is as well)</li> 
</ul> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">Enhanced Messaging:<br />Backround - updated all apis to have multiple audio/video streams<br />last year it looked like people in boxes ( it was a really big deal)<br />there is some metadata, local video description, remote video description<br /> <br />how on earth do I figure out that is kevin karwell and write in on his box<br />we added an api to correlate callerid streams with participant metadata<br />additionally we thought it would be good to add participant to participant messaging to confbridge<br />allows a one stop shop solution, or to keep messaging close the the media path<br />uses in-dialog sip MESSAGE, you can set the content type, but only use UTF-8<br /> <br /> </p> <p style="margin: 10px 0 0 0">George did alot of work on the conference bridge, don't want to take away his thunder<br /> <br />PJSIP performace improvements<br />good talk ref chan_sip vs pjsip last year, large attendence room was packed.  in alot of cases chan_pjsip performed better, but some cases it did not<br />however not a considerable difference, but we still wanted to address them<br /> <br />approx 7% in cpu usage worse in reg handling<br />after some perfomance improvements we now have chan_pjsip perform better than chan_sip, 2k req/s for chan_pjsip vs 300 for chan_sip<br /> <br />Misc fun<br />build improvements: DragonFly BSD, NetBSD, OpenBSD, Solaris 11, FreeBSD<br /> <br />I'm a linux guy so I always fall into the trap of thinking that Linux is the only *nix out there, but Alexander Traud contributed alot for building for other platforms<br /> <br />IPV6 added for Dundi<br />Does anybody use Dundi? (not that you shouldn't be useing it but it often gets forgoten about)<br /> <br /> <br />pjproject updated to v2.8<br />ability to bundle build libjansson, some versions of jansson have bugs, so bundling helps<br />misc gccc bug fixes<br />enhanced messaging with app_sendtext<br />new databuffer api added to the internal core api of asterisk, allows to do things like packet retransmisison buffers</p> <p style="margin: 10px 0 0 0">early media video support in app_dial<br /> <br /> <br /> </p> <p style="margin: 10px 0 0 0">python3 compatibility fixes - test suite is largely written in python, and different supporiting scripts</p> <p style="margin: 10px 0 0 0">if you are a python developer we would love to see some help in reviewing those scripts to geting them compatible with python 3<br />sean bright worked on ephemeral DTLS certificates saves alot of pain of cert generation</p> <p style="margin: 10px 0 0 0">support for a new cdr backend called beanstalk, developed by Nir </p> <p style="margin: 10px 0 0 0">started looking into performance bottlenecks in stasis message buss, (it's a pubsub message buss) </p> <p style="margin: 10px 0 0 0">improvements to strictrtp - the way we live in a world that is outside the standards of the RFCs, nat is a reality and part of the challenges are that, in sdp there is an address it expects to recieve media on.  In order to work in that world you have to believe that address.  If the other end is a private ip address that isn't true.  some of the things that are done are symmetricip, where asterisk sends rtp back to the same address it recieved on, this is all find, but it has to trust the rtp stream is the right stream.  But this can lead to hijacking of rtp streams.<br /> <br /> <br />Strict rtp is on by default, prevents of rtp hijacking can't happen, it may cause limitations when lots of video streams are happening, or crappy networks that send packets in big clumps, that presented problems in strictrtp, some improvements were added to make that better. <br /> <br /> <br />Reminder ast14 went EOL a couple weeks ago.  Ast15 graduated to security fixes only mode.  Keep track of what's happening in non-lts major releases of asterisk.<br />keep a test environment with non-lts releases to avoid supprises,<br /> <br />ast17 is presumably a standard relase so good opportunity to start breaking things<br /> <br /> <br />Questions:</p> <p style="margin: 10px 0 0 0">when shall we see 16?<br />Answer:</p> <p style="margin: 10px 0 0 0">right now! downloads.asterisk.org is up</p> <p style="margin: 10px 0 0 0"> <br />Agenda for today<br />Presentation by George Joseph and Kevin Karwell about performance enhancements in 16 (30 min)</p> <p style="margin: 10px 0 0 0">presentation of Ben Ford (originally Josh Colp presentation) about new video improvements (30 min)</p> <p style="margin: 10px 0 0 0">Luch 12-1</p> <p style="margin: 10px 0 0 0">Discussions</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">George Joseph | kevin Harwell presentation presentation:<br /> <br />Asterisk 2018 Performance Update</p> <p style="margin: 10px 0 0 0">Matt gave a preview this morning but we are going to go in more detail</p> <p style="margin: 10px 0 0 0">all of us would define performance a bit different as we have different usage patters & network environments and introducing their own deifintion of performance</p> <p style="margin: 10px 0 0 0">so it is hard to define performance and what it means to improve it.  CPU? CPS? memory? disk io?</p> <p style="margin: 10px 0 0 0">where do improvements come from?</p> <p style="margin: 10px 0 0 0">every release have performance improvements, some from community, some from core.  even minor releases have perf improvements.  you should always check the changes file as some perf changes might have functional implications too</p> <p style="margin: 10px 0 0 0">Key improvements:</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">rmudgett spent a good amount of time with CDRs to reduce the time and resources to process it.  </p> <p style="margin: 10px 0 0 0">it doesn't really impact cps or quality, so do we care? yes, it takes reasources away from those other things.</p> <p style="margin: 10px 0 0 0">stasis is another area, it's our internal pubsub buss.  over the last 1.5 months we have done alot of work to reduce the overhead. one of the areas we discovered was that app_voicemail when you start it, and you have holding turned on, app_voicemail wants to know which mailboxes currently have subscribers so it only polls the mailboxes with subscribers. </p> <p style="margin: 10px 0 0 0">most people don't have that turned on, collected via stasis, and in order to do that stasis had to keep track of every mailbox, it had to also have to keep track of the message flowing on the buss & never flushed cached.  even if you didn't have polling turned on then you had alot of memory growth, which in turned caused cpu growth.  all for app_voicemail.  We cut that out, resulting in significat memory & cpu reduction</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">qualify & options, alot of attention this last year, one issue especially with realtime db, the time it takes to iterate contacts, to find which ones need to have qualify, and also write it back.  lots of startup overhead.  similarly inbound reistrations are the same way.  Very read/write dependent.  if you have thousands of aors and you are building up this db of contacts it can get really slow.  pjsip show contacts is forced to go back to the database just to show it on the console<br /> <br />kevin will show some results now:</p> <p style="margin: 10px 0 0 0">the thing we mainly focused on was cpu utilization, but you will also see some slides about memory</p> <p style="margin: 10px 0 0 0">CDRs -30% increase in record processing, thanks richard</p> <p style="margin: 10px 0 0 0">stasis cache - before memory climbing, after cpu is stablized and memory too</p> <p style="margin: 10px 0 0 0">pjsip contacts</p> <p style="margin: 10px 0 0 0">prior to 13.21.0</p> <p style="margin: 10px 0 0 0">poor load and reload time, low reg/s</p> <p style="margin: 10px 0 0 0">asterisk 13.21.0</p> <p style="margin: 10px 0 0 0">improved registrations per second<br />asterisk 13.22.0 and after</p> <p style="margin: 10px 0 0 0">context re-write patch had the biggest effect for improving performance</p> <p style="margin: 10px 0 0 0">reloading contacts now take less than a second</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">Inbound registrations</p> <p style="margin: 10px 0 0 0">pjsip channel was kind of lacking on registration perfomance (as mentioned last year) we took that seriously</p> <p style="margin: 10px 0 0 0">setup: 1. socket 2 core 2 threads per core i3-2330 cpu 2.20GHZ (cpu will be averaged across all cpus)</p> <p style="margin: 10px 0 0 0">regs are written to a database </p> <p style="margin: 10px 0 0 0">we only loaded the modules required for the test (only loaded registration module)</p> <p style="margin: 10px 0 0 0">4000 endpoints</p> <p style="margin: 10px 0 0 0">we used sipp scenario to over local network</p> <p style="margin: 10px 0 0 0">res_pjsip uses 7-8% more cpu than chan_sip, not many retransmissions</p> <p style="margin: 10px 0 0 0">13.23.0 now uses less cpu than chan_sip for registration traffic (1-2% less cpu usage)</p> <p style="margin: 10px 0 0 0">asterisk 16.1.0</p> <p style="margin: 10px 0 0 0">cpu has dropped even more (3% less cpu than chan sip) mem use dropped by 3-4 mb</p> <p style="margin: 10px 0 0 0">chan_sip can safely handle 300req/s but will choke on retransmisisons after</p> <p style="margin: 10px 0 0 0">res_pjsip can easily handle that & much more, here you can see it easily handle 2k reg/s, at 2.5k/s retransmissions did climb a bit, but still ok</p> <p style="margin: 10px 0 0 0">in the latest version of asterisk should see more improvements, some will be shipped in 16.1, be sure to test</p> <p style="margin: 10px 0 0 0">testing is a huge part, so please let us know what you find (patches are welcome too)</p> <p style="margin: 10px 0 0 0">Questions?</p> <p style="margin: 10px 0 0 0">which format do you write cdrs in, can you specify the format?</p> <p style="margin: 10px 0 0 0">answer: we don't have a json formatter for cdrs yet</p> <p style="margin: 10px 0 0 0">answer: we have different backens, e.g. database, adding a json backend should be easy to add</p> <p style="margin: 10px 0 0 0">answer: improvements should be across the board regardless of the backend tech</p> <p style="margin: 10px 0 0 0">question: what was the motivation of performace evaluation</p> <p style="margin: 10px 0 0 0">answer: there was a presentation last year that did a comparison of chan_sip vs chan_pjsip</p> <p style="margin: 10px 0 0 0">answer: there should be a blogpost with a link to the tests</p> <p style="margin: 10px 0 0 0">question: in the presentaiton ref performace, there was also a performance hit ref concurrent calls</p> <p style="margin: 10px 0 0 0">answer: concurrent calls depends on media processing, chan_pjsip and chan_sip share the same underlaying media processing, so we confused by that and have no idea how to test that</p> <p style="margin: 10px 0 0 0">answer: the delta between the two was only 1-2 concurrent call difference, so we were looking for more extreme differences that</p> <p style="margin: 10px 0 0 0">answer: if anything could make the difference, it could be memory as pjsip does use more memory</p> <p style="margin: 10px 0 0 0">answer: don't have any data-points but I found that chan_pjsip can handle more concurrent calls than chan_sip</p> <p style="margin: 10px 0 0 0">answer: found a performance difference between 1.4 and 1.6 and it came down to a one line change ref DNS, there should be more performance tests on a regular basis</p> <p style="margin: 10px 0 0 0">answer: yes, we are attempting to focus more on performance, we can def use more feedback, especially on what things we should test, indeed DNS can make a huge difference</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">Ben Ford<br />How not to trust the quality of the internet</p> <p style="margin: 10px 0 0 0">Shattering the illusion some have that the traffic on the internet always get from point A to point B</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">today we will talk about media improvements particularly ref video</p> <p style="margin: 10px 0 0 0">I'm not josh & don't have his knowlege, send him or me questions <a href="mailto:bford@digium.com" class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">bford@digium.com</a> </p> <p style="margin: 10px 0 0 0">Overview:</p> <p style="margin: 10px 0 0 0">patchy networks cause packet loss, which causes awful video experience</p> <p style="margin: 10px 0 0 0">we are going to talk about how REMB & NACK work within asterisk w some demos</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">packet loss causes:</p> <p style="margin: 10px 0 0 0">routing options - sub-obtimal routing (it may go via california)</p> <p style="margin: 10px 0 0 0">network congestion - some packets won't get there</p> <p style="margin: 10px 0 0 0">some packets may end up out of order</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">this hurts communicaiton if you are missing packets then you are obviosuly going to get (more apparent in video)</p> <p style="margin: 10px 0 0 0">video freezes, or video stops</p> <p style="margin: 10px 0 0 0">audio just gets choppy or "wonky" sounding</p> <p style="margin: 10px 0 0 0">webrtc has tech to help video REMB & nack</p> <p style="margin: 10px 0 0 0">What is remb?</p> <p style="margin: 10px 0 0 0">remote estimated max bitrate</p> <p style="margin: 10px 0 0 0">what this does is poll all the users of a call and find the bandwith of each user individually</p> <p style="margin: 10px 0 0 0">it applys to all media streams</p> <p style="margin: 10px 0 0 0">it can change throughout the lifetime of a call - so things can change during the call</p> <p style="margin: 10px 0 0 0">it can control the video encoding bitrate of the sender, telling the sender the range we can expect/allow</p> <p style="margin: 10px 0 0 0">supported in webrtc land</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">how does remb work</p> <p style="margin: 10px 0 0 0">each receiver going to calculate max bitrate, then send it to asteris</p> <p style="margin: 10px 0 0 0">asterisk relays or generates it's own feedback message</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">REMB is just a first step, transportcc and tmmbr, not widely supported though, foundation is in place to add later</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">NACK is like a ACK but not really it's a negative acknowledgement</p> <p style="margin: 10px 0 0 0">it is a message when you do not get something you expect, eg report a lost packet</p> <p style="margin: 10px 0 0 0">can be used to trigger retransmission & counter the effects of packet loss</p> <p style="margin: 10px 0 0 0">works on a per-stream basis</p> <p style="margin: 10px 0 0 0">no guarantee to get all lost packets back, (you may loose the packets again)</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">how does nack work?</p> <p style="margin: 10px 0 0 0">ingresss -store packets in a buffer, so we can resend if needed</p> <p style="margin: 10px 0 0 0">egress - if we recieve a packet we are expecting process it</p> <p style="margin: 10px 0 0 0">otherwise store it, any missing packets then send a NACK request</p> <p style="margin: 10px 0 0 0">when buffer reaches 1/2 size we send a nack to get the missing packets</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">if we get packets out of order, we store them, it's possible for the missing packet to still come late, if it does we process it, then get any subsequent packets from the buffer</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">conference bridges behave differently for remb than for 1 on 1</p> <p style="margin: 10px 0 0 0">we provde a way to combine reports, we do that by adding options</p> <p style="margin: 10px 0 0 0">avg max and min bitrate</p> <p style="margin: 10px 0 0 0">depending on which reports we receive we send either lower/highets/avg we receive to the other participants</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">it's possible to receive nack request from multiple participants asterisk needs to determine which stream it belongs to</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0">Discussions:</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Have discussion about proposing that chan_sip be marked deprecated</li> 
</ul> <p style="margin: 10px 0 0 0">Torrey brings up the point that chan_sip should be no-loaded by default.  PJSIP users often have to nuke chan_sip just to use PJSIP.<br />Dan brings up the point that the plan for chan_sip (warnings on startup, no-load in 16) didn't happen.  Dan also suggests no-loading chan_sip in SuperAwesome Company.<br />Jason suggests that even though 16.0 doesn't have the warnings; we should add them anyway.  MattF disagrees and doesn't think we should make the change, given that 16 exists.<br />Fred points out that warnings should be noisy in the logs - not just errors.<br />A point was made that there still are some gaps in capability.  MattF's rebuttal is that those capabilities are ones that are lightly used and the user community hasn't ported them forward for years.<br />Alexander makes the point that forcing users to move by no-loading or making it harder to use chan_sip, could result in user exodus.  He also makes the point that it is good to ensure people don't end up on a channel driver that isn't well-supported.</p> 
<ul style="margin: 10px 0 0 0"> 
<li>res_xmpp/chan_motif should they remain core supported (due to dependency on unmaintained libraries)</li> 
</ul> <p style="margin: 10px 0 0 0">Corey notes that the last commit on the supporting library is 2011, and it isn't even packaged in Fedora.<br />Jared seconds.<br />No dissent.</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Discuss deprecation/removal of res_monitor</li> 
</ul> <p style="margin: 10px 0 0 0">Torrey wants to know what replaces res_monitor.  chan_spy replaces res_monitor.<br />Corey prefers mixmonitor because it uses framehooks; monitor requires separate core code (and doesn't use framehooks).<br />No dissent.</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Discussion around removal of macro functionality</li> 
</ul> <p style="margin: 10px 0 0 0">macro is long-deprecated.</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Opportunistic DTLS</li> 
</ul> <p style="margin: 10px 0 0 0">Torrey uses Kamailio.  Kamailio is one endpoint.  He'd like to have one endpoint configuration that'd work for both.  Most things work except for use_received_transport.  The outbound leg doesn't work, but may not be as necessary.<br />A patch had been submitted but was rejected. <a href="https://gerrit.asterisk.org/#/c/asterisk/+/10245/" class="external-link" rel="nofollow" style="color: #3b73af; text-decoration: none">https://gerrit.asterisk.org/#/c/asterisk/+/10245/</a> <br />Discussion will resume on the mailing list.</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Making it easier to send audio to/from Amazon, Google, IBM (especially in context of speech recognition)</li> 
</ul> <p style="margin: 10px 0 0 0">Dan prefers not putting audio on the machine itself when his ARI apps are themselves, remote.  It'd be nice to have an HTTP endpoint way to get one or both sides of the media stream for a call and relay them somewhere else.  In particular, Dan's looking to push that audio out to a remote speech API.<br />Sean references (GRPC) as a means for sending audio.  He has similar needs to Dan and built something called app_audiosocket, that directs a call over a TCP socket to anywhere; sends audio (SLIN) + metadata and receives audio back.  It solved his problem and he'll hopefully demo it tomorrow.  He pipes it to Google or to a websocket connection for manipulation.  It's a better solution than app_jack, which is only local, and UniMRCP.<br />Sean and Dan want a way to use ARI to control where the audio is being sent to and received from.  ASR, TTS, audio manipulations.<br />George - so a REST endpoint that allows you to specify the channel, a hostname, and a port.<br />Sean's app does the work, but it's not callable via ARI.<br />Ivan wants the feature callable not only by ARI, but also via Dialplan.  He's familiar with chan_rtp, but it's hard to use for his purposes.<br />Matt - big picture, the capabilities today aren't enough to handle these requests in chan_rtp.<br />Dan points out that other projects handle this with individual modules for individual services.</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Getting access to end of call statistics (regardless of who hangs up first)</li> 
</ul> <p style="margin: 10px 0 0 0">Torrey wants SRTP stats at the end of a call, or put (in the hangup handler) what codecs were negotiated, or whether SRTP was negotiated, or query the channel for details in order to drop them into billing information, or find out if T.38 was negotiated to see if it was a fax call.  But, there's no, currently, safe way to access that information after the channel is hung up.  He's tried to copy details from the A-leg to the B-leg, but there's not a good way to guarantee the information's lifetime by the time the channel in invoked.<br />Matt - some of this, e.g. T.38 events, might be contained in CEL and be able to pump that externally.<br />Steve - Where would this information be stored?  Once the channel is gone, it's gone.  CEL was created to generate the information about a call as it traverses and is the right place for this, not CDRs.<br />Torrey - could a </p> 
<ul style="margin: 10px 0 0 0"> 
<li>Getting rid of extensions.conf for ARI applications</li> 
</ul> <p style="margin: 10px 0 0 0">Missed notes for this section...</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Discussion around having Asterisk and some message queue/bus (like RabbitMQ) talk directly to each other</li> 
</ul> <p style="margin: 10px 0 0 0">Torrey uses an ARI proxy and then puts it on an external message bus.  Torrey would like to get rid of the proxy.<br />Dan wants to know if we can have an ARI proxy built into Asterisk; Torrey says "yes, that's what I'm wondering."<br />Sylvain did a presentation about RabbitMQ and Stasis last year and has a module over on github.  Andrew has either looked at it our used it.<br />Dan wants one way to do this.<br />Jroan sees the need for some small glue code to make it simpler to use any message bus, not one in particular.<br />Dan points out that this might be made easier if you could have more than one websocket connected for one app - instead of today's limitation of one socket for one app.<br />There are some rumblings about Protocol Buffers and Swagger, etc.</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Alexander wants to talk about RTCP/media-interaction with audio codecs</li> 
</ul> <p style="margin: 10px 0 0 0">Most people in the room have deployed Asterisk with Opus.<br />Most of the room doesn't use Opus as a primary audio codec.<br />Sean - most of the room is interested in it, but most of the room hasn't done it.<br />Alexander just wanted to survey the room.</p> 
<ul style="margin: 10px 0 0 0"> 
<li>Josh Elson wants to talk about task processor architecture limitations, e.g. the challenges of 50K sparsely registering endpoints.</li> 
</ul> <p style="margin: 10px 0 0 0">They struggle with equal prioritization between taskprocessors and that one taskprocessor overflowing can cause badness for other items.<br />Is there a good approach to handling this?<br />A method of configuration might be helpful, but no such thing exists at this time.  CDRs and AMI are both problematic; ARI where poorly-written apps that don't respond at the TCP layer can bring down the whole system.</p> <p style="margin: 10px 0 0 0"> </p> 
<ul style="margin: 10px 0 0 0"> 
<li>Give Igor some time to talk about improvements for various applications in how you interact with multiple media streams.</li> 
<li>Discuss how Sangoma's acquisition of Digium affects the future of Asterisk</li> 
</ul> <p style="margin: 10px 0 0 0">There's a Q&A about this in a few minutes in a different conference room.</p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0"> </p> <p style="margin: 10px 0 0 0"> </p> </td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td class="email-content-main mobile-expand action-padding last-row-padding" style="padding: 0px; border-collapse: collapse; border-left: 1px solid #ccc; border-right: 1px solid #ccc; border-top: 0; border-bottom: 0; padding: 0 15px 15px 16px; background-color: #fff; padding-bottom: 10px; padding-bottom: 10px"> 
<table id="actions-pattern" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 1px"> 
<tbody> 
<tr> 
<td id="actions-pattern-container" valign="middle" style="padding: 0px; border-collapse: collapse; padding: 15px 0 0 24px; vertical-align: middle"> 
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"><a href="https://wiki.asterisk.org/wiki/display/AST/Minutes?src=email" title="View page Icon" style="color: #3b73af; text-decoration: none"><img class="actions-pattern-action-icon-image" height="16" width="16" border="0" title="View page Icon" src="cid:com.atlassian.confluence.plugins.confluence-email-resources%3Aview-page-email-adg-footer-item%3Aicon" alt="View page Icon" style="vertical-align: middle" /></a></td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px; white-space: nowrap"><a href="https://wiki.asterisk.org/wiki/display/AST/Minutes?src=email" title="View page" style="color: #3b73af; text-decoration: none">View page</a></td>
<td class="actions-pattern-action-bull" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; color: #999; padding: 0 5px">•</td> 
</tr> 
</tbody> 
</table> 
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"><a href="https://wiki.asterisk.org/wiki/display/AST/Minutes?showComments=true&showCommentArea=true&src=email#addcomment" title="Add comment Icon" style="color: #3b73af; text-decoration: none"><img class="actions-pattern-action-icon-image" height="16" width="16" border="0" title="Add comment Icon" src="cid:com.atlassian.confluence.plugins.confluence-email-resources%3Aadd-comment-to-content-email-adg-footer-item%3Aicon" alt="Add comment Icon" style="vertical-align: middle" /></a></td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px; white-space: nowrap"><a href="https://wiki.asterisk.org/wiki/display/AST/Minutes?showComments=true&showCommentArea=true&src=email#addcomment" title="Add comment" style="color: #3b73af; text-decoration: none">Add comment</a></td>
<td class="actions-pattern-action-bull" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; color: #999; padding: 0 5px">•</td> 
</tr> 
</tbody> 
</table> 
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td class="actions-pattern-action-icon-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 0px; vertical-align: middle"><a href="https://wiki.asterisk.org/wiki/plugins/likes/like.action?contentId=41451707&src=email" title="Like Icon" style="color: #3b73af; text-decoration: none"><img class="actions-pattern-action-icon-image" height="16" width="16" border="0" title="Like Icon" src="cid:com.atlassian.confluence.plugins.confluence-like%3Aview-email-adg-content-item%3Aicon" alt="Like Icon" style="vertical-align: middle" /></a></td>
<td class="actions-pattern-action-text-container" style="padding: 0px; border-collapse: collapse; font-family: Arial, sans-serif; font-size: 14px; line-height: 20px; mso-line-height-rule: exactly; mso-text-raise: 4px; padding-left: 5px; white-space: nowrap"><a href="https://wiki.asterisk.org/wiki/plugins/likes/like.action?contentId=41451707&src=email" title="Like" style="color: #3b73af; text-decoration: none">Like</a></td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td class="email-content-rounded-bottom mobile-expand" style="padding: 0px; border-collapse: collapse; color: #fff; height: 5px; line-height: 5px; padding: 0 15px 0 16px; background-color: #fff; border-bottom-right-radius: 5px; border-bottom-left-radius: 5px; border-top: 0; border-left: 1px solid #ccc; border-bottom: 1px solid #ccc; border-right: 1px solid #ccc; mso-line-height-rule: exactly"> </td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td id="footer-pattern" style="padding: 0px; border-collapse: collapse; padding: 12px 20px"> 
<table id="footer-pattern-container" cellspacing="0" cellpadding="0" border="0" width="100%" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333"> 
<tbody> 
<tr> 
<td id="footer-pattern-links-container" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px"> 
<table align="left" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px"> 
<tbody> 
<tr> 
<td class="footer-pattern-links mobile-resize-text" style="padding: 0px; border-collapse: collapse"><a href="https://wiki.asterisk.org/wiki/users/removespacenotification.action?spaceKey=AST&src=email" title="" style="color: #3b73af; text-decoration: none">Stop watching space</a></td>
<td class="footer-pattern-links-bull" style="padding: 0px; border-collapse: collapse; padding: 0 5px; color: #999">•</td> 
</tr> 
</tbody> 
</table> 
<table style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px"> 
<tbody> 
<tr> 
<td class="footer-pattern-links mobile-resize-text" style="padding: 0px; border-collapse: collapse"><a href="https://wiki.asterisk.org/wiki/users/editmyemailsettings.action?src=email" title="" style="color: #3b73af; text-decoration: none">Manage notifications</a></td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
<tr> 
<td id="footer-pattern-text" class="mobile-resize-text" width="100%" style="padding: 0px; border-collapse: collapse; color: #999; font-size: 12px; line-height: 18px; font-family: Arial, sans-serif; mso-line-height-rule: exactly; mso-text-raise: 2px; display: none">This message was sent by Atlassian Confluence 5.6.6</td> 
</tr> 
</tbody> 
</table> </td> 
</tr> 
</tbody> 
</table> 
<table id="sealed-section" border="0" cellpadding="0" cellspacing="0" width="0" style="border-collapse: collapse; mso-table-lspace: 0pt; mso-table-rspace: 0pt; color: #333; display: none"> 
<tbody> 
<tr> 
<td style="padding: 0px; border-collapse: collapse; border: 0; font-size: 0px; line-height: 0; mso-line-height-rule: exactly"></td> 
</tr> 
</tbody> 
</table>
</body>
</html>