<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
</head>







<body style="background-color: #fff;">
<span style="display:none"> </span>

<!--~-|**|PrettyHtmlStartT|**|-~-->
<div id="ygrp-mlmsg" style="position:relative;">
  <div id="ygrp-msg" style="z-index: 1;">
<!--~-|**|PrettyHtmlEndT|**|-~-->

    <div id="ygrp-text" >
      
      
      <p><div dir="ltr">I believe the code you mentioned is in there. just in case, here is my repeater_vocoder.cc:<br><br><br>/* -*- c++ -*- */<br>/*<br> * GNU Radio interface for Pavel Yazev's Project 25 IMBE Encoder/Decoder<br>
 * <br> * Copyright 2004 Free Software Foundation, Inc.<br> * Copyright 2009 Pavel Yazev E-mail: <a href="mailto:pyazev@gmail.com">pyazev@gmail.com</a><br> * Copyright 2009-2013 KA1RBI<br> * <br> * This is free software; you can redistribute it and/or modify<br>
 * it under the terms of the GNU General Public License as published by<br> * the Free Software Foundation; either version 3, or (at your option)<br> * any later version.<br> * <br> * It is distributed in the hope that it will be useful,<br>
 * but WITHOUT ANY WARRANTY; without even the implied warranty of<br> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the<br> * GNU General Public License for more details.<br> * <br> * You should have received a copy of the GNU General Public License<br>
 * along with it; see the file COPYING.  If not, write to<br> * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,<br> * Boston, MA 02111-1307, USA.<br> */<br><br>/*<br> * config.h is generated by configure.  It contains the results<br>
 * of probing for features, options etc.  It should be the first<br> * file included in your .cc file.<br> */<br>#ifdef HAVE_CONFIG_H<br>#include "config.h"<br>#endif<br><br>#include <vector><br>#include <stdint.h><br>
#include <stdio.h><br>#include <string.h><br>#include <errno.h><br>#include <sys/socket.h><br>#include <netinet/in.h><br>#include <arpa/inet.h><br><br>#include <imbe_vocoder.h><br>
#include <repeater_vocoder.h><br>#include <op25_p25_frame.h><br>#include <op25_imbe_frame.h><br>#include <gr_io_signature.h><br><br>/* bits to be preset to 1 for all transmitted frames */<br>static const bool ldu1_preset[] = {<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0-35 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 36-71 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 72-107 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 108-143 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-179 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 180-215 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 216-251 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 252-287 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 288-323 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 324-359 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 360-395 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 396-431 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 432-467 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 468-503 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 504-539 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 540-575 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 576-611 */<br>  0,1,0,1,1,0,1,1,0,1,0,1,0,1,0,1,1,0,0,1,0,1,0,1,0,1,1,0,0,0,0,0,0,0,1,0, /* 612-647 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 648-683 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 684-719 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 720-755 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0, /* 756-791 */<br>  1,0,1,0,0,1,1,0,1,0,1,0,1,0,0,1,1,0,1,0,1,0,1,0,0,1,1,0,1,0,1,0,1,0,0,1, /* 792-827 */<br>  1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 828-863 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 864-899 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 900-935 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 936-971 */<br>
  0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,0,1,0,1,1,0, /* 972-1007 */<br>  0,1,0,0,1,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1008-1043 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1044-1079 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1080-1115 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1116-1151 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,0,1,1, /* 1152-1187 */<br>
  1,1,1,1,0,0,1,1,1,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1188-1223 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1224-1259 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1260-1295 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1296-1331 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1, /* 1332-1367 */<br>  1,1,1,0,1,1,0,1,1,1,0,0,1,0,1,1,0,1,0,0,0,1,1,0,1,1,1,0,0,1,0,0,0,0,0,0, /* 1368-1403 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1404-1439 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1440-1475 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1476-1511 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1512-1547 */<br>  1,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0, /* 1548-1583 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1584-1619 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1620-1655 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1656-1691 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0  /* 1692-1727 */<br>
};<br><br>static const bool ldu2_preset[] = {<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0-35 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 36-71 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 72-107 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 108-143 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 144-179 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 180-215 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 216-251 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 252-287 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 288-323 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 324-359 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 360-395 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 396-431 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 432-467 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 468-503 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 504-539 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 540-575 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 576-611 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 612-647 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 648-683 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 684-719 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 720-755 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 756-791 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 792-827 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 828-863 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 864-899 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, /* 900-935 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 936-971 */<br>  0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 972-1007 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1008-1043 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1044-1079 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1080-1115 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1116-1151 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,1,1,0,1,0,0,0,1,0,1,1,0,1,0,0, /* 1152-1187 */<br>  1,0,0,0,1,0,1,1,0,1,1,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1188-1223 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1224-1259 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1260-1295 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1296-1331 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1,0,1,0,1,1, /* 1332-1367 */<br>
  1,1,1,1,0,1,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0, /* 1368-1403 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1404-1439 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1440-1475 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1476-1511 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1512-1547 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1548-1583 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1584-1619 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1620-1655 */<br>  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1656-1691 */<br>
  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, /* 1692-1727 */<br>};<br><br>static void clear_bits(bit_vector& v) {<br>    for (size_t i=0; i<v.size(); i++) {<br>        v[i]=0;<br>    }<br>
}<br><br>/*<br> * Create a new instance of repeater_vocoder and return<br> * a boost shared_ptr.  This is effectively the public constructor.<br> */<br>repeater_vocoder_sptr <br>repeater_make_vocoder (bool encode_flag, bool verbose_flag, int stretch_amt, char* udp_host, int udp_port, bool raw_vectors_flag)<br>
{<br>  return repeater_vocoder_sptr (new repeater_vocoder (encode_flag, verbose_flag, stretch_amt, udp_host, udp_port, raw_vectors_flag));<br>}<br><br>//////////////////////////////////////////////////////////////<br>//    enc/dec        udp    operation<br>
//    dec        no    byte input; short output<br>//    dec        yes    byte input; null output<br>//    enc        no    short input; char output<br>//    enc        yes    short input; null output<br><br>#define M_IN(encode_flag, udp_port)  (1)<br>
#define M_OUT(encode_flag, udp_port) ((udp_port) ? 0 : 1)<br>#define S_IN(encode_flag, udp_port)  ((encode_flag) ? sizeof(int16_t) : sizeof(uint8_t))<br>#define S_OUT(encode_flag, udp_port) ((udp_port) ? 0 : ((encode_flag) ? sizeof(uint8_t) : sizeof(int16_t)))<br>
<br>/*<br> * The private constructor<br> */<br>repeater_vocoder::repeater_vocoder (bool encode_flag, bool verbose_flag, int stretch_amt, char* udp_host, int udp_port, bool raw_vectors_flag)<br>    : gr_block ("vocoder",<br>
          gr_make_io_signature (M_IN(encode_flag, udp_port), M_IN(encode_flag, udp_port), S_IN(encode_flag, udp_port)),<br>          gr_make_io_signature (M_OUT(encode_flag, udp_port), M_OUT(encode_flag, udp_port), S_OUT(encode_flag, udp_port))),<br>
    frame_cnt(0),<br>    write_sock(0),<br>    write_bufp(0),<br>    peak_amplitude(0),<br>    peak(0),<br>    samp_ct(0),<br>    rxbufp(0),<br>    codeword_ct(0),<br>    sampbuf_ct(0),<br>    stretch_count(0),<br>    save_l(0),<br>
    f_body(P25_VOICE_FRAME_SIZE)<br>{<br>    opt_encode_flag = encode_flag;<br>    opt_dump_raw_vectors = raw_vectors_flag;<br>    opt_verbose = verbose_flag;<br>    opt_udp_port = udp_port;<br><br>    opt_stretch_amt = 0;<br>
    if (stretch_amt < 0) {<br>        opt_stretch_sign = -1;<br>        opt_stretch_amt = 0 - stretch_amt;<br>    } else {<br>        opt_stretch_sign = 1;<br>        opt_stretch_amt = stretch_amt;<br>    }<br><br>    if (opt_udp_port == 0)<br>
        if (encode_flag) {<br>            // local output to gr source<br>            // encoding: an LDU's worth of dibits<br>            set_output_multiple(P25_VOICE_FRAME_SIZE >> 1);<br>        } else {<br>            // decoding: an LDU's worth of audio samples<br>
            // set_output_multiple(FRAME * nof_voice_codewords);<br>        }<br>    else<br>        // remote UDP output<br>        init_sock(udp_host, opt_udp_port);<br><br>    clear_bits(f_body);<br><br>    const char *p = getenv("IMBE");<br>
    if (p && strcasecmp(p, "soft") == 0)<br>        d_software_imbe_decoder = true;<br>    else<br>        d_software_imbe_decoder = false;<br>}<br><br>/*<br> * Our virtual destructor.<br> */<br>repeater_vocoder::~repeater_vocoder ()<br>
{<br>}<br><br>static const int STATS_INTERVAL = 20;<br>static const int SAMP_INTERVAL = 8192;<br><br>void repeater_vocoder::append_imbe_codeword(bit_vector& frame_body, int16_t frame_vector[], unsigned int& codeword_ct)<br>
{<br>    voice_codeword cw(voice_codeword_sz);<br>    uint8_t obuf[P25_VOICE_FRAME_SIZE/2];<br>    // construct 144-bit codeword from 88 bits of parameters<br>    imbe_header_encode(cw, frame_vector[0], frame_vector[1], frame_vector[2], frame_vector[3], frame_vector[4], frame_vector[5], frame_vector[6], frame_vector[7]);<br>
<br>    // add codeword to voice data unit<br>    imbe_interleave(frame_body, cw, codeword_ct);<br><br>    // after the ninth and final codeword added, dispose of frame<br>    if (++codeword_ct >= nof_voice_codewords) {<br>
        static const uint64_t hws[2] = { 0x293555ef2c653437LL, 0x293aba93bec26a2bLL };<br>                int ldu_type = frame_cnt & 1;    // set ldu_type = 0(LDU1) or 1(LDU2)<br>        const bool* ldu_preset = (ldu_type == 0) ? ldu1_preset : ldu2_preset;<br>
        <br>        p25_setup_frame_header(frame_body, hws[ldu_type]);<br>        for (size_t i = 0; i < frame_body.size(); i++) {<br>            frame_body[i] = frame_body[i] | ldu_preset[i];<br>        }<br>        // finally, output the frame<br>
        if (opt_udp_port > 0) {<br>            // pack the bits into bytes, MSB first<br>            size_t obuf_ct = 0;<br>            for (uint32_t i = 0; i < P25_VOICE_FRAME_SIZE; i += 8) {<br>                uint8_t b = <br>
                    (frame_body[i+0] << 7) +<br>                    (frame_body[i+1] << 6) +<br>                    (frame_body[i+2] << 5) +<br>                    (frame_body[i+3] << 4) +<br>                    (frame_body[i+4] << 3) +<br>
                    (frame_body[i+5] << 2) +<br>                    (frame_body[i+6] << 1) +<br>                    (frame_body[i+7]     );<br>                obuf[obuf_ct++] = b;<br>            }<br>            sendto(write_sock, obuf, obuf_ct, 0, (struct sockaddr*)&write_sock_addr, sizeof(write_sock_addr));<br>
        } else {<br>            for (uint32_t i = 0; i < P25_VOICE_FRAME_SIZE; i += 2) {<br>                uint8_t dibit = <br>                    (frame_body[i+0] << 1) +<br>                    (frame_body[i+1]     );<br>
                output_queue.push_back(dibit);<br>            }<br>        }<br>        codeword_ct = 0;<br>        frame_cnt++;<br>        if (opt_verbose && (frame_cnt % STATS_INTERVAL) == 0) {<br>            gettimeofday(&tv, &tz);<br>
            int s = tv.tv_sec - oldtv.tv_sec;<br>            int us = tv.tv_usec - oldtv.tv_usec;<br>            if (us < 0) {<br>                us = us + 1000000;<br>                s  = s - 1;<br>            }<br>            float f = us;<br>
            f /= 1000000;<br>            f += s;<br>            fprintf (stderr, "time %f peak %5d\n", f / STATS_INTERVAL, peak_amplitude);<br>            oldtv = tv;<br>        }<br>        clear_bits(f_body);<br>
    }<br>}<br><br>void repeater_vocoder::rxchar(char c)<br>{<br>    int16_t snd[FRAME];<br>    int16_t frame_vector[8];<br>    int u[8];<br><br>    if (c < ' ') {<br>        if (c == '\n') {<br>            rxbuf[rxbufp] = 0;<br>
            sscanf(rxbuf, "%x %x %x %x %x %x %x %x", &u[0], &u[1], &u[2], &u[3], &u[4], &u[5], &u[6], &u[7]);<br>            rxbufp = 0;<br>            // decode 88 bits, outputs 160 sound samples (8000 rate)<br>
            if (d_software_imbe_decoder) {<br>                voice_codeword cw(voice_codeword_sz);<br>                imbe_header_encode(cw, u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7]);<br>                software_decoder.decode(cw);<br>
                audio_samples *samples = software_decoder.audio();<br>                for (int i=0; i < FRAME; i++) {<br>                    if (samples->size() > 0) {<br>                        snd[i] = (int16_t)(samples->front() * 32768.0);<br>
                        samples->pop_front();<br>                    } else {<br>                        snd[i] = 0;<br>                    }<br>                }<br>            } else {<br>                for (int i=0; i < 8; i++) {<br>
                    frame_vector[i] = u[i];<br>                }<br>        /* TEST*/    frame_vector[7] >>= 1;<br>                vocoder.imbe_decode(frame_vector, snd);<br>            }<br>            if (opt_udp_port > 0) {<br>
                sendto(write_sock, snd, FRAME * sizeof(int16_t), 0, (struct sockaddr*)&write_sock_addr, sizeof(write_sock_addr));<br>            } else {<br>                // add generated samples to output queue<br>
                for (int i = 0; i < FRAME; i++) {<br>                    output_queue_decode.push_back(snd[i]);<br>                }<br>            }<br>        }<br>        return;<br>    }<br>    rxbuf[rxbufp++] = c;<br>
    if (rxbufp >= RXBUF_MAX) {<br>        rxbufp = RXBUF_MAX - 1;<br>    }<br>}<br><br>void repeater_vocoder::compress_frame(int16_t snd[])<br>{<br>    int16_t frame_vector[8];    <br><br>    // encode 160 audio samples into 88 bits (u0-u7)<br>
    vocoder.imbe_encode(frame_vector, snd);<br><br>    // if dump option, dump u0-u7 to output<br>    if (opt_dump_raw_vectors) {<br>        char s[128];<br>        sprintf(s, "%03x %03x %03x %03x %03x %03x %03x %03x\n", frame_vector[0], frame_vector[1], frame_vector[2], frame_vector[3], frame_vector[4], frame_vector[5], frame_vector[6], frame_vector[7]);<br>
        memcpy(&write_buf[write_bufp], s, strlen(s));<br>        write_bufp += strlen(s);<br>        if (write_bufp >= 288) {<br>            sendto(write_sock, write_buf, 288, 0, (struct sockaddr*)&write_sock_addr, sizeof(write_sock_addr));<br>
            write_bufp = 0;<br>        }<br>        return;<br>    }<br>    append_imbe_codeword(f_body, frame_vector, codeword_ct);<br>}<br><br>void repeater_vocoder::add_sample(int16_t samp)<br>{<br>    // add one sample to 160-sample frame buffer and process if filled<br>
    sampbuf[sampbuf_ct++] = samp;<br>    if (sampbuf_ct >= FRAME) {<br>        compress_frame(sampbuf);<br>        sampbuf_ct = 0;<br>    }<br><br>    // track signal amplitudes<br>    int16_t asamp = (samp < 0) ? 0 - samp : samp;<br>
    peak = (asamp > peak) ? asamp : peak;<br>    if (++samp_ct >= SAMP_INTERVAL) {<br>        peak_amplitude = peak;<br>        peak = 0;<br>        samp_ct = 0;<br>    }<br>}<br><br>void repeater_vocoder::compress_samp(int16_t samp)<br>
{<br>    // Apply sample rate slew to accomodate sound card rate discrepancy -<br>    // workaround for USRP underrun problem occurring when sound card<br>    // capture rate is slower than the correct rate<br><br>    // FIXME: autodetect proper value for opt_stretch_amt<br>
    // perhaps by steering the LDU output rate to a 180.0 msec. rate<br><br>    stretch_count++;<br>    if (opt_stretch_amt != 0 && stretch_count >= opt_stretch_amt) {<br>        stretch_count = 0;<br>        if (opt_stretch_sign < 0)<br>
            // spill this samp<br>            return;<br>        // repeat this samp<br>        add_sample(samp);<br>    }<br>    add_sample(samp);<br>}<br><br>void repeater_vocoder::init_sock(char* udp_host, int udp_port)<br>
{<br>        memset (&write_sock_addr, 0, sizeof(write_sock_addr));<br>        write_sock = socket(PF_INET, SOCK_DGRAM, 17);   // UDP socket<br>        if (write_sock < 0) {<br>                fprintf(stderr, "repeater_vocoder: socket: %d\n", errno);<br>
                write_sock = 0;<br>        return;<br>        }<br>        if (!inet_aton(udp_host, &write_sock_addr.sin_addr)) {<br>                fprintf(stderr, "repeater_vocoder: bad IP address\n");<br>
        close(write_sock);<br>        write_sock = 0;<br>        return;<br>    }<br>        write_sock_addr.sin_family = AF_INET;<br>        write_sock_addr.sin_port = htons(udp_port);<br>}<br><br>void<br>repeater_vocoder::forecast(int nof_output_items, gr_vector_int &nof_input_items_reqd)<br>
{<br>   /* When encoding, this block consumes 8000 symbols/s and produces 4800<br>    * samples/s. That's a sampling rate of 5/3 or 1.66667.<br>    *<br>    * When decoding, the block consumes one line of text per voice codeword.<br>
    * Each line of text is exactly 32 bytes.  It outputs 160 samples for each <br>    * codeword; the ratio is thus 32/160 = 0.2.<br>    *<br>    * Thanks to Matt Mills for catching a bug where this value wasn't set correctly<br>
    */<br>   const size_t nof_inputs = nof_input_items_reqd.size();<br>   const int nof_samples_reqd = (opt_encode_flag) ? (1.66667 * nof_output_items) : (0.2 * nof_output_items);<br>   std::fill(&nof_input_items_reqd[0], &nof_input_items_reqd[nof_inputs], nof_samples_reqd);<br>
}<br><br>int <br>repeater_vocoder::general_work_decode (int noutput_items,<br>                   gr_vector_int &ninput_items,<br>                   gr_vector_const_void_star &input_items,<br>                   gr_vector_void_star &output_items)<br>
{<br>  const char *in = (const char *) input_items[0];<br><br>  for (int i = 0; i < ninput_items[0]; i++){<br>    rxchar(in[i]);<br>  }<br><br>  // Tell runtime system how many input items we consumed on<br>  // each input stream.<br>
<br>  consume_each (ninput_items[0]);<br><br>  uint16_t *out = reinterpret_cast<uint16_t*>(output_items[0]);<br>  const int n = std::min(static_cast<int>(output_queue_decode.size()), noutput_items);<br>  if(0 < n) {<br>
     copy(output_queue_decode.begin(), output_queue_decode.begin() + n, out);<br>     output_queue_decode.erase(output_queue_decode.begin(), output_queue_decode.begin() + n);<br>  }<br>  // Tell runtime system how many output items we produced.<br>
  return n;<br>}<br><br>int <br>repeater_vocoder::general_work_encode (int noutput_items,<br>                   gr_vector_int &ninput_items,<br>                   gr_vector_const_void_star &input_items,<br>                   gr_vector_void_star &output_items)<br>
{<br>  const short *in = (const short *) input_items[0];<br><br>  for (int i = 0; i < ninput_items[0]; i++){<br>    compress_samp(in[i]);<br>  }<br><br>  // Tell runtime system how many input items we consumed on<br>  // each input stream.<br>
<br>  consume_each (ninput_items[0]);<br><br>  if (opt_udp_port > 0)        // in udp option, we are a gr sink only<br>    return 0;<br><br>  uint8_t *out = reinterpret_cast<uint8_t*>(output_items[0]);<br>  const int n = std::min(static_cast<int>(output_queue.size()), noutput_items);<br>
  if(0 < n) {<br>     copy(output_queue.begin(), output_queue.begin() + n, out);<br>     output_queue.erase(output_queue.begin(), output_queue.begin() + n);<br>  }<br>  // Tell runtime system how many output items we produced.<br>
  return n;<br>}<br><br>int <br>repeater_vocoder::general_work (int noutput_items,<br>                   gr_vector_int &ninput_items,<br>                   gr_vector_const_void_star &input_items,<br>                   gr_vector_void_star &output_items)<br>
{<br>    if (opt_encode_flag)<br>        return general_work_encode(noutput_items, ninput_items, input_items, output_items);<br>    else<br>        return general_work_decode(noutput_items, ninput_items, input_items, output_items);<br>
}<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Dec 28, 2013 at 9:47 AM, Ryan Schilder <span dir="ltr"><<a href="mailto:rjschilder@gmail.com" target="_blank">rjschilder@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="border-left:1px #ccc solid;"><div dir="ltr">ok i'll give it a shot. just for giggles i tried the op25_audio_tx.py that I have on a local repeater. I was able to make it into the repeater!<div>
<br></div><div>I'll check the file you mentioned above right now.</div>
<div><br></div><div>Thanks!</div><span class="HOEnZb"><font color="#888888"><div>-Ryan</div></font></span></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Dec 28, 2013 at 9:40 AM,  <span dir="ltr"><<a href="mailto:ikj1234i@yahoo.com" target="_blank">ikj1234i@yahoo.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="border-left:1px #ccc solid;">


<u></u>










<div>
<span> </span>


<div>
  <div>


    <div>
      
      
      <p>Hi Ryan<br><br>This is an interesting update - sounds like some progress, anyway!<br><br>As to the encryption, older versions of the TX code did not properly set the crypto algo ID, and if you're<br>using one of these that would explain why.  The way to tell is to look in repeater_vocoder.cc to see if you<br>

have the following (see below).  If this code is not there that would explain what's happening.  If it is there then I think the next step would be to run some type of trace so we can confirm what the settings are by looking at the actual air data, there would be no doubt as to whether or not the bits are being set OK...<br>

<br>73<br><br>Max<br></p><p>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br></p><p style="font-style:normal;font-size:13px;background-color:transparent;font-family:arial,helvetica,clean,sans-serif;">

/* bits to be preset to 1 for all transmitted frames */<br>static const bool ldu1_preset[] = {<br> ...<br></p><p></p>

    </div>
     

    
    <div style="color:#fff;"></div>


</div>



  






</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</p>

    </div>
     

    <!--~-|**|PrettyHtmlStart|**|-~-->
    <div style="color: #fff; height: 0;">__._,_.___</div>

          
  
    
    <table cellspacing=4px style="margin-top: 20px; margin-bottom: 10px;">
      <tbody>
        <tr>
          <td style="font-size: 12px; font-family: arial; font-weight: bold; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA "  >
                          <a style="text-decoration: none; color: #2D50FD" href="http://groups.yahoo.com/group/op25-dev/post;_ylc=X3oDMTJxOTJkOTNhBF9TAzk3MzU5NzE0BGdycElkAzIyMDg0NTgyBGdycHNwSWQDMTcwNTY0NDA4OQRtc2dJZAMxMDU4BHNlYwNmdHIEc2xrA3JwbHkEc3RpbWUDMTM4ODI0NTkxMA--?act=reply&messageNum=1058">Reply via web post</a>
                      </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; " >
            <a href="mailto:rjschilder@gmail.com?subject=Re%3A%20%5Bop25-dev%5D%20RE%3A%20help%20with%20repeater" style="text-decoration: none; color: #2D50FD;">
              Reply to sender            </a> 
          </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; ">
            <a href="mailto:op25-dev@yahoogroups.com?subject=Re%3A%20%5Bop25-dev%5D%20RE%3A%20help%20with%20repeater" style="text-decoration: none; color: #2D50FD">
              Reply to group            </a> 
          </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #FFF; background-color: #F2F2F2; border: 1px solid #EAEAEA; " >
            <a href="http://groups.yahoo.com/group/op25-dev/post;_ylc=X3oDMTJmOGdpYzl0BF9TAzk3MzU5NzE0BGdycElkAzIyMDg0NTgyBGdycHNwSWQDMTcwNTY0NDA4OQRzZWMDZnRyBHNsawNudHBjBHN0aW1lAzEzODgyNDU5MTA-" style="text-decoration: none; color: #2D50FD">Start a New Topic</a>
          </td>
          <td style="font-size: 12px; font-family: arial; padding: 7px 5px 5px; color: #2D50FD; background-color: #F2F2F2; border: 1px solid #EAEAEA; " >
                            <a href="http://groups.yahoo.com/group/op25-dev/message/1045;_ylc=X3oDMTM1MjZnbW9wBF9TAzk3MzU5NzE0BGdycElkAzIyMDg0NTgyBGdycHNwSWQDMTcwNTY0NDA4OQRtc2dJZAMxMDU4BHNlYwNmdHIEc2xrA3Z0cGMEc3RpbWUDMTM4ODI0NTkxMAR0cGNJZAMxMDQ1" style="text-decoration: none; color: #2D50FD;">Messages in this topic</a>
                (12)
                      </td>
        </tr>
      </tbody>
    </table>

        
<!------- Start Nav Bar ------>
<!-- |**|begin egp html banner|**| -->
<!-- |**|end egp html banner|**| -->

<!-- |**|begin egp html banner|**| -->
<div id="ygrp-vital" style="background-color: #f2f2f2; font-family: Verdana; font-size: 10px; margin-bottom: 10px; padding: 10px;">
      <span id="vithd" style="font-weight: bold; color: #333; text-transform: uppercase; ">Recent Activity:</span>

    <ul style="list-style-type: none; margin: 0; padding: 0; display: inline;">
                                                    </ul>
    
  <div style="clear: both; padding-top: 2px; color: #1e66ae;">
    <a href="http://groups.yahoo.com/group/op25-dev;_ylc=X3oDMTJmbW5xaWFpBF9TAzk3MzU5NzE0BGdycElkAzIyMDg0NTgyBGdycHNwSWQDMTcwNTY0NDA4OQRzZWMDdnRsBHNsawN2Z2hwBHN0aW1lAzEzODgyNDU5MTA-" style="text-decoration: none;">Visit Your Group</a>
  </div>
</div>


  
<div id="ft" style="font-family: Arial; font-size: 11px; margin-top: 5px; padding: 0 2px 0 0; clear: both;">
  <a href="http://groups.yahoo.com/;_ylc=X3oDMTJlbWFvMXJyBF9TAzk3NDc2NTkwBGdycElkAzIyMDg0NTgyBGdycHNwSWQDMTcwNTY0NDA4OQRzZWMDZnRyBHNsawNnZnAEc3RpbWUDMTM4ODI0NTkxMA--" style="float: left;"><img src="http://l.yimg.com/ru/static/images/yg/img/email/new_logo/logo-groups-137x15.png" height="15" width="137" alt="Yahoo! Groups" style="border: 0;"/></a>
  <div style="color: #747575; float: right;">Switch to: <a href="mailto:op25-dev-traditional@yahoogroups.com?subject=Change Delivery Format: Traditional" style="text-decoration: none;">Text-Only</a>, <a href="mailto:op25-dev-digest@yahoogroups.com?subject=Email Delivery: Digest" class="margin-rt" style="text-decoration: none;">Daily Digest</a> • <a href="mailto:op25-dev-unsubscribe@yahoogroups.com?subject=Unsubscribe" style="text-decoration: none;">Unsubscribe</a> • <a href="http://info.yahoo.com/legal/us/yahoo/utos/terms/" style="text-decoration: none;">Terms of Use</a> • <a href="mailto:ygroupsnotifications@yahoogroups.com?subject=Feedback on the redesigned individual mail v1" style="text-decoration: none;">Send us Feedback </a></div>
</div>

<!-- |**|end egp html banner|**| -->

  </div> <!-- ygrp-msg -->

  <!-- Sponsor -->
  <!-- |**|begin egp html banner|**| -->
  <div id="ygrp-sponsor" style="width:160px; float:right; clear:none; margin:0 0 25px 0; background: #fff;">

<!-- Start Recommendations -->
<div id="ygrp-reco">
     </div>
<!-- End Recommendations -->



  </div>   <!-- |**|end egp html banner|**| -->

  <div style="clear:both; color: #FFF; font-size:1px;">.</div>
</div>

  <img src="http://geo.yahoo.com/serv?s=97359714/grpId=22084582/grpspId=1705644089/msgId=1058/stime=1388245910" width="1" height="1"> <br>

<div style="color: #fff; height: 0;">__,_._,___</div>
<!--~-|**|PrettyHtmlEnd|**|-~-->

</body>

<!--~-|**|PrettyHtmlStart|**|-~-->
<head>
  <style type="text/css">
  <!--
  #ygrp-mkp {
  border: 1px solid #d8d8d8;
  font-family: Arial;
  margin: 10px 0;
  padding: 0 10px;
}

#ygrp-mkp hr {
  border: 1px solid #d8d8d8;
}

#ygrp-mkp #hd {
  color: #628c2a;
  font-size: 85%;
  font-weight: 700;
  line-height: 122%;
  margin: 10px 0;
}

#ygrp-mkp #ads {
  margin-bottom: 10px;
}

#ygrp-mkp .ad {
  padding: 0 0;
}

#ygrp-mkp .ad p {
  margin: 0;
}

#ygrp-mkp .ad a {
  color: #0000ff;
  text-decoration: none;
}
  #ygrp-sponsor #ygrp-lc {
  font-family: Arial;
}

#ygrp-sponsor #ygrp-lc #hd {
  margin: 10px 0px;
  font-weight: 700;
  font-size: 78%;
  line-height: 122%;
}

#ygrp-sponsor #ygrp-lc .ad {
  margin-bottom: 10px;
  padding: 0 0;
}

  #actions {
    font-family: Verdana;
    font-size: 11px;
    padding: 10px 0;
  }

  #activity {
    background-color: #e0ecee;
    float: left;
    font-family: Verdana;
    font-size: 10px;
    padding: 10px;
  }

  #activity span {
    font-weight: 700;
  }

  #activity span:first-child {
    text-transform: uppercase;
  }

  #activity span a {
    color: #5085b6;
    text-decoration: none;
  }

  #activity span span {
    color: #ff7900;
  }

  #activity span .underline {
    text-decoration: underline;
  }

  .attach {
    clear: both;
    display: table;
    font-family: Arial;
    font-size: 12px;
    padding: 10px 0;
    width: 400px;
  }

  .attach div a {
    text-decoration: none;
  }

  .attach img {
    border: none;
    padding-right: 5px;
  }

  .attach label {
    display: block;
    margin-bottom: 5px;
  }

  .attach label a {
    text-decoration: none;
  }
  
  blockquote {
    margin: 0 0 0 4px;
  }

  .bold {
    font-family: Arial;
    font-size: 13px;
    font-weight: 700;
  }

  .bold a {
    text-decoration: none;
  }

  dd.last p a {
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span {
    margin-right: 10px;
    font-family: Verdana;
    font-weight: 700;
  }

  dd.last p span.yshortcuts {
    margin-right: 0;
  }

  div.attach-table div div a {
    text-decoration: none;
  }

  div.attach-table {
    width: 400px;
  }

  div.file-title a, div.file-title a:active, div.file-title a:hover, div.file-title a:visited {
    text-decoration: none;
  }

  div.photo-title a, div.photo-title a:active, div.photo-title a:hover, div.photo-title a:visited {
    text-decoration: none;
  }

  div#ygrp-mlmsg #ygrp-msg p a span.yshortcuts {
    font-family: Verdana;
    font-size: 10px;
    font-weight: normal;
  }

  .green {
    color: #628c2a;
  }

  .MsoNormal {
    margin: 0 0 0 0;
  }

  o {
    font-size: 0;
  }

  #photos div {
    float: left;
    width: 72px;
  }

  #photos div div {
    border: 1px solid #666666;
    height: 62px;
    overflow: hidden;
    width: 62px;
  }

  #photos div label {
    color: #666666;
    font-size: 10px;
    overflow: hidden;
    text-align: center;
    white-space: nowrap;
    width: 64px;
  }

  #reco-category {
    font-size: 77%;
  }

  #reco-desc {
    font-size: 77%;
  }

  .replbq {
    margin: 4px;
  }

  #ygrp-actbar div a:first-child {
   /* border-right: 0px solid #000;*/
    margin-right: 2px;
    padding-right: 5px;
  }

  #ygrp-mlmsg {
    font-size: 13px;
    font-family: Arial, helvetica,clean, sans-serif;
    *font-size: small;
    *font: x-small;
  }

  #ygrp-mlmsg table {
    font-size: inherit;
    font: 100%;
  }

  #ygrp-mlmsg select, input, textarea {
    font: 99% Arial, Helvetica, clean, sans-serif;
  }

  #ygrp-mlmsg pre, code {
    font:115% monospace;
    *font-size:100%;
  }

  #ygrp-mlmsg * {
    line-height: 1.22em;
  }

  #ygrp-mlmsg #logo {
    padding-bottom: 10px;
  }


  #ygrp-msg p a {
    font-family: Verdana;
  }

  #ygrp-msg p#attach-count span {
    color: #1E66AE;
    font-weight: 700;
  }

  #ygrp-reco #reco-head {
    color: #ff7900;
    font-weight: 700;
  }

  #ygrp-reco {
    margin-bottom: 20px;
    padding: 0px;
  }

  #ygrp-sponsor #ov li a {
    font-size: 130%;
    text-decoration: none;
  }

  #ygrp-sponsor #ov li {
    font-size: 77%;
    list-style-type: square;
    padding: 6px 0;
  } 

  #ygrp-sponsor #ov ul {
    margin: 0;
    padding: 0 0 0 8px;
  }

  #ygrp-text {
    font-family: Georgia;
  }

  #ygrp-text p {
    margin: 0 0 1em 0;
  }

  #ygrp-text tt {
    font-size: 120%;
  }

  #ygrp-vital ul li:last-child {
    border-right: none !important; 
  } 
  -->
  </style>
</head>

<!--~-|**|PrettyHtmlEnd|**|-~-->
</html>
<!-- end group email -->