public BlastPacket ProcessBlastPacket(BlastPacket pkt) {// process a packet for distance updates
    BlastPacket PktNext = null;
    Node nbr = pkt.LatestSender;
    //pkt.LatestSender = this;//?
    NbrInfo FromNbr = this.Neighbors.get(nbr);// nbr is the neighbor who handed me this packet

    if (this.MyAddressVector.contains(pkt.OriginZone)) {
      /*
       first, if I am a member of the same zone that launched this packet, disregard it. no gradients of a zone inside that zone.
       what happens if a node disobeys this?
       */
      return null;
    }

    //pkt.Distance += FromNbr.Distance;// now packet's distance will be my distance from endpoint
    RouteEntry MyKnowledgeOfEndpoint;
    // when I get a blast packet, I look up its origin (as destination) in the routing table. 
    if (!this.Routing.containsKey(pkt.OriginZone)) {// if no entry is found, add it and forward the packet.
      // here is where we would flag if our routing table is too full
      MyKnowledgeOfEndpoint = new RouteEntry();
      MyKnowledgeOfEndpoint.ConsumePacket(FromNbr, pkt);
      MyKnowledgeOfEndpoint.AddFieldStrength(pkt, this.Neighbors.size());
      this.Routing.put(pkt.OriginZone, MyKnowledgeOfEndpoint);
      FromNbr.RefMe();
      PktNext = pkt.CloneMe();
      PktNext.UpdateForResend(this, FromNbr.Distance, MyKnowledgeOfEndpoint.FieldStrength);// now child's field strength will be the strength of field at me .FieldFocus
      //PktNext.LatestSender = this; PktNext.FieldStrength *= MyKnowledgeOfEndpoint.FieldFocus;// now child's field strength will be the strength of field at me
    } else {
      MyKnowledgeOfEndpoint = this.Routing.get(pkt.OriginZone);
      if (pkt.SerialNumber > MyKnowledgeOfEndpoint.LatestSerialNumber) {// if its birth time is more recent than the existing entry, replace the old entry and forward the packet.
        MyKnowledgeOfEndpoint.ClosestNbr.UnRefMe();
        MyKnowledgeOfEndpoint.ConsumePacket(FromNbr, pkt);
        MyKnowledgeOfEndpoint.RolloverFieldStrength();// old packet is surpassed, close the deal?
        MyKnowledgeOfEndpoint.AddFieldStrength(pkt, this.Neighbors.size());
        FromNbr.RefMe();
        PktNext = pkt.CloneMe();
        PktNext.UpdateForResend(this, FromNbr.Distance, MyKnowledgeOfEndpoint.FieldStrength);// now child's field strength will be the strength of field at me .FieldFocus
        //PktNext.LatestSender = this; PktNext.FieldStrength *= MyKnowledgeOfEndpoint.FieldFocus;// now child's field strength will be the strength of field at me
      } else if (pkt.SerialNumber == MyKnowledgeOfEndpoint.LatestSerialNumber) {// if its birth time is the same as the current entry
        if (pkt.Distance < MyKnowledgeOfEndpoint.Distance) {// if it has better miles than the current entry, replace the current entry and forward the packet.
          MyKnowledgeOfEndpoint.ClosestNbr.UnRefMe();
          MyKnowledgeOfEndpoint.ConsumePacket(FromNbr, pkt);
          MyKnowledgeOfEndpoint.AddFieldStrength(pkt, this.Neighbors.size());
          FromNbr.RefMe();
          PktNext = pkt.CloneMe();
          PktNext.UpdateForResend(this, FromNbr.Distance, MyKnowledgeOfEndpoint.FieldStrength);// now child's field strength will be the strength of field at me .FieldFocus
          //PktNext.LatestSender = this; PktNext.FieldStrength *= MyKnowledgeOfEndpoint.FieldFocus;// now child's field strength will be the strength of field at me
        }
      }
    }
    // otherwise return null and the packet will be discarded.
    return PktNext;
  }