code: private static void transport(Grammar grammar, Attribute seed, int move, IntBitSet rawBorder,
                                    IntBitSet targetSymbols, List<AgBuffer> resultBuffers) {
          AgBuffer commulated;
          IntBitSet border;
          boolean down;
          List<Attribute> attrs;
          int i;
          int max;
          Attribute dest;
          AgBuffer tmp;
          int card;
          AgBuffer buffer;
          Attribute attr;
          Occurrence occ;
  
          if (move == Path.DOWN || move == Path.UP) {
              border = new IntBitSet();
              grammar.getSymbols(border);
          } else {
              border = rawBorder;
          }
          down = (move == Path.DOWN || move == Path.DOWNS);
          if (down && !border.contains(seed.symbol)) {
              // TODO: needed for \Block//VariableReference in compiler examples
              border.add(seed.symbol);
          }
          commulated = Pusher.run(down, seed, border, grammar);
          attrs = commulated.getTransportAttributes();
          max = attrs.size();
          for (i = 0; i < max; i++) {
              dest = attrs.get(i);
              if (dest != seed && targetSymbols.contains(dest.symbol)) {
                  tmp = commulated.createReduced(dest);
                  occ = null;
                  if (down) {
                      card = tmp.isDownOptional()? Type.OPTION : Type.VALUE;
                      card = Type.cardCard(card, seed.type.card);
                  } else {
                      occ = tmp.calcOccurrence(dest);
                      card = Type.cardCard(occ.card(), seed.type.card);
                      if (seed.type.card == Type.SEQUENCE || occ.max == Occurrence.UNBOUNDED) {
                          occ = null;  // don't split
                      }
                  }
                  if (occ == null) {
                      buffer = new AgBuffer((Attribute) null);
                      attr = buffer.cloneAttributes(tmp, new Type(seed.type.type, card), dest);
                      buffer.setStart(attr);
                      resultBuffers.add(buffer);
                  } else {
                      createSplitted(tmp, seed.type.type, occ, dest, resultBuffers);
                  }
              }
          }
      }
docs: --