@Override
  public DfaInstructionState[] accept(@NotNull DataFlowInterpreter interpreter, @NotNull DfaMemoryState stateBefore) {
    DfaValue tosValue = stateBefore.isEmptyStack() ? interpreter.getFactory().getUnknown() : stateBefore.peek();
    DfaCondition cond = createCondition(tosValue);
    UnsatisfiedConditionProblem problem = getProblem();
    if (cond.equals(DfaCondition.getTrue())) {
      if (problem != null) {
        interpreter.getListener().onCondition(problem, tosValue, ThreeState.NO, stateBefore);
      }
      return nextStates(interpreter, stateBefore);
    }
    DfaMemoryState falseState = stateBefore.createCopy();
    boolean trueStatePossible = stateBefore.applyCondition(cond);
    boolean falseStatePossible = falseState.applyCondition(cond.negate());
    List<DfaInstructionState> result = new ArrayList<>();
    if (trueStatePossible) {
      result.add(nextState(interpreter, stateBefore));
    }
    if (problem != null) {
      ThreeState failed = !trueStatePossible ? ThreeState.YES :
                          !falseStatePossible ? ThreeState.NO : ThreeState.UNSURE;
      interpreter.getListener().onCondition(problem, tosValue, failed, stateBefore);
    }
    if (falseStatePossible && myTransferValue != null) {
      List<DfaInstructionState> states = myTransferValue.dispatch(falseState, interpreter);
      if (myMakeEphemeral) {
        for (DfaInstructionState negState : states) {
          negState.getMemoryState().markEphemeral();
        }
      }
      result.addAll(states);
    }
    return result.toArray(DfaInstructionState.EMPTY_ARRAY);
  }
@Override
  public DfaInstructionState[] accept(@NotNull DataFlowInterpreter interpreter, @NotNull DfaMemoryState stateBefore)