public NetworkMockup() {
    this.initialFactTemplate = defTemplate("initial-fact", "");
    defFacts("initial-fact", "", Arrays.asList(new TemplateContainer<>(initialFactTemplate)));

    {
      final Template dummyFact =
          this.defTemplate("dummy-fact", "used as default value for FACT-ADDRESS");
      @SuppressWarnings("unchecked")
      final FactIdentifier dummyFactIdentifier =
          new org.jamocha.function.fwa.Assert<>(
                  this, new TemplateContainer[] {new TemplateContainer<>(dummyFact)})
              .evaluate();
      for (final SlotType type : EnumSet.allOf(SlotType.class)) {
        switch (type) {
          case BOOLEAN:
            defaultValues.put(type, Boolean.FALSE);
            break;
          case DATETIME:
            defaultValues.put(type, ZonedDateTime.now());
            break;
          case DOUBLE:
            defaultValues.put(type, Double.valueOf(0.0));
            break;
          case LONG:
            defaultValues.put(type, Long.valueOf(0));
            break;
          case NIL:
            defaultValues.put(type, null);
            break;
          case STRING:
            defaultValues.put(type, "");
            break;
          case SYMBOL:
            defaultValues.put(type, this.getScope().getOrCreateSymbol("nil"));
            break;
          case FACTADDRESS:
            defaultValues.put(type, dummyFactIdentifier);
            break;
          case BOOLEANS:
          case DATETIMES:
          case DOUBLES:
          case FACTADDRESSES:
          case LONGS:
          case NILS:
          case STRINGS:
          case SYMBOLS:
            defaultValues.put(type, Array.newInstance(type.getJavaClass(), 0));
            break;
        }
      }
    }
  }
  // Error check and decode the EMB
  private boolean EMBdecode(byte[] dibit_buf) {
    int a, r, cc, lcss;
    boolean pi;
    boolean EMDdata[] = new boolean[16];
    // Convert from dibits into boolean
    // The EMB is broken into 2 parts either side of the embedded
    // these need reuniting into a single 20 bit boolean array
    r = 0;
    for (a = 66; a < 70; a++) {
      if (dibit_buf[a] == 0) {
        EMDdata[r] = false;
        EMDdata[r + 1] = false;
      } else if (dibit_buf[a] == 1) {
        EMDdata[r] = false;
        EMDdata[r + 1] = true;
      } else if (dibit_buf[a] == 2) {
        EMDdata[r] = true;
        EMDdata[r + 1] = false;
      } else if (dibit_buf[a] == 3) {
        EMDdata[r] = true;
        EMDdata[r + 1] = true;
      }
      r = r + 2;
    }
    for (a = 86; a < 90; a++) {
      if (dibit_buf[a] == 0) {
        EMDdata[r] = false;
        EMDdata[r + 1] = false;
      } else if (dibit_buf[a] == 1) {
        EMDdata[r] = false;
        EMDdata[r + 1] = true;
      } else if (dibit_buf[a] == 2) {
        EMDdata[r] = true;
        EMDdata[r + 1] = false;
      } else if (dibit_buf[a] == 3) {
        EMDdata[r] = true;
        EMDdata[r + 1] = true;
      }
      r = r + 2;
    }
    // Error check the EMB
    // If it passes this is a Voice Burst with Embedded Signalling
    if (QuadResidue1676(EMDdata) == true) {
      StringBuilder sb = new StringBuilder(250);
      line[0] = theApp.getTimeStamp() + " DMR Voice Frame with Embedded Signalling";
      colours[0] = Color.BLACK;
      fonts[0] = theApp.boldFont;
      // Colour code
      if (EMDdata[0] == true) cc = 8;
      else cc = 0;
      if (EMDdata[1] == true) cc = cc + 4;
      if (EMDdata[2] == true) cc = cc + 2;
      if (EMDdata[3] == true) cc = cc + 1;
      // Update the colour code display
      if (theApp != null) theApp.setColourCode(cc);
      // PI
      pi = EMDdata[4];
      // LCSS
      if (EMDdata[5] == true) lcss = 2;
      else lcss = 0;
      if (EMDdata[6] == true) lcss++;
      // Display the colour code
      sb.append("EMB : Colour Code " + Integer.toString(cc));
      // PI
      if (pi == true) sb.append(" : PI=1");
      // LCSS
      if (lcss == 0) sb.append(" : Single fragment LC ");
      else if (lcss == 1) sb.append(" : First fragment of LC ");
      else if (lcss == 2) sb.append(" : Last fragment of LC");
      else if (lcss == 3) sb.append(" : Continuation fragment of LC");
      line[2] = sb.toString();
      // Add this to the embedded data class
      theApp.embedded_lc.addData(dibit_buf, lcss);
      // Is embedded data ready
      if (theApp.embedded_lc.getDataReady() == true) {
        String elines[] = theApp.embedded_lc.getLines();
        // Display the embedded LC along with a timestamp
        line[3] = theApp.getTimeStamp() + " " + elines[0];
      }
      // Pass on voice data
      VoiceData voicedata = new VoiceData();
      voicedata.handleVoice(theApp, dibit_buf);
      // If the user doesn't want to see voice frames set shouldDisplay to false
      if (theApp.isDisplayVoiceFrames() == false) shouldDisplay = false;
      // Return all done
      return true;
    } else {
      // Is this a Data Frame with Embedded signalling
      // See if its has a slot type field that passes its error check
      SlotType slottype = new SlotType();
      boolean SLOT_TYPEres, BPTCres = false;
      line[0] = theApp.getTimeStamp() + " DMR Data Frame with Embedded Signalling";
      colours[0] = Color.BLACK;
      fonts[0] = theApp.boldFont;
      line[2] = slottype.decode(theApp, dibit_buf);
      SLOT_TYPEres = slottype.isPassErrorCheck();
      // If the slot type is OK try to decode the rest
      if (SLOT_TYPEres == true) {
        int dataType = slottype.returnDataType();
        // PI Header
        if (dataType == 0) {
          BPTC19696 bptc19696 = new BPTC19696();
          if (bptc19696.decode(dibit_buf) == true) {
            BPTCres = true;
            boolean bits[] = bptc19696.dataOut();
            // Display the PI header bits as raw binary
            StringBuilder sb = new StringBuilder();
            int ai;
            for (ai = 0; ai < bits.length; ai++) {
              if (bits[ai] == true) sb.append("1");
              else sb.append("0");
            }
            line[3] = sb.toString();
            fonts[3] = theApp.boldFont;
            colours[3] = Color.BLACK;
          }
        }

        // Voice LC Header
        if (dataType == 1) {
          BPTC19696 bptc19696 = new BPTC19696();
          if (bptc19696.decode(dibit_buf) == true) {
            BPTCres = true;
            boolean bits[] = bptc19696.dataOut();
            // TODO : Ensure the Voice LC Headers in Embedded Data Frames pass the Reed Solomon
            // (12,9) error check
            FullLinkControl flc = new FullLinkControl();
            String clines[] = new String[3];
            clines = flc.decode(theApp, bits);
            line[3] = clines[0];
            line[4] = clines[1];
            line[5] = clines[2];
            fonts[3] = theApp.boldFont;
            colours[3] = Color.BLACK;
            fonts[4] = theApp.boldFont;
            colours[4] = Color.BLACK;
            fonts[5] = theApp.boldFont;
            colours[5] = Color.BLACK;
          }
        }
        // Terminator with LC
        if (dataType == 2) {
          BPTC19696 bptc19696 = new BPTC19696();
          if (bptc19696.decode(dibit_buf) == true) {
            BPTCres = true;
            boolean bits[] = bptc19696.dataOut();
            // TODO : Ensure the Terminator LCs in Embedded Data Frames pass the Reed Solomon (12,9)
            // error check
            FullLinkControl flc = new FullLinkControl();
            String clines[] = new String[3];
            clines = flc.decode(theApp, bits);
            line[3] = clines[0];
            line[4] = clines[1];
            line[5] = clines[2];
            fonts[3] = theApp.boldFont;
            colours[3] = Color.BLACK;
            fonts[4] = theApp.boldFont;
            colours[4] = Color.BLACK;
            fonts[5] = theApp.boldFont;
            colours[5] = Color.BLACK;
          }
        }
        // CSBK
        if (dataType == 3) {
          BPTC19696 bptc19696 = new BPTC19696();
          if (bptc19696.decode(dibit_buf) == true) {
            crc tCRC = new crc();
            boolean bits[] = bptc19696.dataOut();
            // Does the CSBK pass its CRC test ?
            if (tCRC.crcCSBK(bits) == true) {
              CSBK csbk = new CSBK();
              String clines[] = new String[3];
              BPTCres = true;
              clines = csbk.decode(theApp, bits);
              line[3] = clines[0];
              line[4] = clines[1];
              line[5] = clines[2];
              fonts[3] = theApp.boldFont;
              colours[3] = Color.BLACK;
              fonts[4] = theApp.boldFont;
              colours[4] = Color.BLACK;
              fonts[5] = theApp.boldFont;
              colours[5] = Color.BLACK;
            }
          }
        }
        // Data Header
        if (dataType == 6) {
          BPTC19696 bptc19696 = new BPTC19696();
          if (bptc19696.decode(dibit_buf) == true) {
            crc tCRC = new crc();
            boolean bits[] = bptc19696.dataOut();
            // Does the Data Header pass its CRC test ?
            if (tCRC.crcDataHeader(bits) == true) {
              String clines[] = new String[3];
              BPTCres = true;
              DMRData data = new DMRData(theApp);
              clines = data.decodeHeader(bits);
              line[3] = clines[0];
              line[4] = clines[1];
              line[5] = clines[2];
              fonts[3] = theApp.boldFont;
              colours[3] = Color.BLACK;
              fonts[4] = theApp.boldFont;
              colours[4] = Color.BLACK;
              fonts[5] = theApp.boldFont;
              colours[5] = Color.BLACK;
            }
          }
        }
        // Rate ½ Data Continuation
        if (dataType == 7) BPTCres = true;
        // Rate ¾ Data Continuation
        if (dataType == 8) BPTCres = true;
        // Idle
        // Error check this to detect problems with the data stream
        if (dataType == 9) {
          BPTC19696 bptc19696 = new BPTC19696();
          BPTCres = bptc19696.decode(dibit_buf);
          // If we don't want to display these then clear the lines
          if (theApp.isDisplayIdlePDU() == false) shouldDisplay = false;
        }
      }
      if ((SLOT_TYPEres == true) && (BPTCres == true)) return true;
      else return false;
    }
  }