Program: 157650
Project: 157650
Buggy source:
/** 
 * Manual player action for undoing one declared blocker  (used for multi-blocker creatures)
 * @param blockerId
 * @param groupToUnblock
 * @param game
 */
public void removeBlockerGromGroup(UUID blockerId,CombatGroup groupToUnblock,Game game){
  Permanent creature=game.getPermanent(blockerId);
  if (creature != null) {
    List<CombatGroup> groupsToCheck=new ArrayList<>();
    for (    CombatGroup group : groups) {
      if (group.equals(groupToUnblock) && group.blockers.contains(blockerId)) {
        groupsToCheck.add(group);
        for (        UUID attackerId : group.getAttackers()) {
          Permanent attacker=game.getPermanent(attackerId);
          if (attacker != null) {
            for (            UUID bandedId : attacker.getBandedCards()) {
              if (!bandedId.equals(attackerId)) {
                CombatGroup bandedGroup=findGroup(bandedId);
                if (bandedGroup != null) {
                  groupsToCheck.add(bandedGroup);
                }
              }
            }
          }
        }
      }
    }
    for (    CombatGroup group : groupsToCheck) {
      group.blockers.remove(blockerId);
      group.blockerOrder.remove(blockerId);
      if (group.blockers.isEmpty()) {
        group.blocked=false;
      }
      if (creature.getBlocking() > 0) {
        if (group.equals(groupToUnblock)) {
          creature.setBlocking(creature.getBlocking() - 1);
        }
      }
 else {
        throw new UnsupportedOperationException("String_Node_Str");
      }
      boolean canRemove=false;
      for (      CombatGroup blockGroup : getBlockingGroups()) {
        if (blockGroup.blockers.contains(blockerId)) {
          for (          UUID attackerId : group.getAttackers()) {
            blockGroup.attackers.remove(attackerId);
            blockGroup.attackerOrder.remove(attackerId);
          }
          if (creature.getBlocking() == 0) {
            blockGroup.blockers.remove(blockerId);
            blockGroup.attackerOrder.clear();
          }
        }
        if (blockGroup.blockers.isEmpty()) {
          canRemove=true;
        }
      }
      if (canRemove) {
        blockingGroups.remove(blockerId);
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Manual player action for undoing one declared blocker (used for multi-blocker creatures)
 * @param blockerId
 * @param groupToUnblock
 * @param game
 */
public void removeBlockerGromGroup(UUID blockerId,CombatGroup groupToUnblock,Game game){
  Permanent creature=game.getPermanent(blockerId);
  if (creature != null) {
    List<CombatGroup> groupsToCheck=new ArrayList<>();
    for (    CombatGroup group : groups) {
      if (group.equals(groupToUnblock) && group.blockers.contains(blockerId)) {
        groupsToCheck.add(group);
        for (        UUID attackerId : group.getAttackers()) {
          Permanent attacker=game.getPermanent(attackerId);
          if (attacker != null) {
            for (            UUID bandedId : attacker.getBandedCards()) {
              if (!bandedId.equals(attackerId)) {
                CombatGroup bandedGroup=findGroup(bandedId);
                if (bandedGroup != null) {
                  groupsToCheck.add(bandedGroup);
                }
              }
            }
          }
        }
      }
    }
    for (    CombatGroup group : groupsToCheck) {
      group.blockers.remove(blockerId);
      group.blockerOrder.remove(blockerId);
      if (group.blockers.isEmpty()) {
        group.blocked=false;
      }
      if (creature.getBlocking() > 0) {
        if (group.equals(groupToUnblock)) {
          creature.setBlocking(creature.getBlocking() - 1);
        }
      }
 else {
        throw new UnsupportedOperationException("String_Node_Str");
      }
      boolean canRemove=false;
      for (      CombatGroup blockGroup : getBlockingGroups()) {
        if (blockGroup.blockers.contains(blockerId)) {
          for (          UUID attackerId : group.getAttackers()) {
            blockGroup.attackers.remove(attackerId);
            blockGroup.attackerOrder.remove(attackerId);
          }
          if (creature.getBlocking() == 0) {
            blockGroup.blockers.remove(blockerId);
            blockGroup.attackerOrder.clear();
          }
        }
        if (blockGroup.blockers.isEmpty()) {
          canRemove=true;
        }
      }
      if (canRemove) {
        blockingGroups.remove(blockerId);
      }
    }
  }
}