private IEnumerator puzzlePlayIEnum()
    {
        addActualToReal();                          //Adds from previous reading

        for (int i = 0; i < actualInput.Count; i++) //Reset all inputs
        {
            actualInput[i] = 0;
            //print(this.GetType().Name + ":puzzlePlay():i/actualInput: " + i + "/"+ actualInput[i]);
            //print(Time.time + ": acutalInput=0");
        }
        //bool on = false;
        for (int i = 0; i < outputs.Count; i++)
        {
            POutputController curOutObj = outputObjs[i].GetComponent <POutputController>();
            if (outputs[i].signal[EOTPPlayTurn] > 0)
            {
                curOutObj.beingPowered = true;
                curOutObj.tryPower(true);
                curOutObj.sendPower(-1);
                //on = true;
            }
            else
            {
                curOutObj.beingPowered = false;
                curOutObj.tryPower(false);
                curOutObj.sendPower(-1);
            }
            //print(this.GetType().Name + ":puzzlePlay():" + outputs[i].getSignal()[EOTPPlayTurn]);
        }

        print("Waiting for middle: " + EOTP_MIDDLE_WAIT_TIME_MS + "sec!");
        yield return(new WaitForSeconds(EOTP_MIDDLE_WAIT_TIME_MS));

        EOTP_waitforinput = true;
        EOTPPlayTurn++;
        print(this.GetType().Name + ": puzzlePlay(): PlayTurn: " + EOTPPlayTurn);

        stepText.text = EOTPPlayTurn + "/" + (outputs[0].signal.Length + 1);

        if (EOTPPlayTurn < outputs[0].signal.Length)
        {
            StartCoroutine(EOTPwait());
        }
        else
        {
            StartCoroutine(EOTPwaitFinish());
            //print(this.GetType().Name + ":puzzlePlay(): finished");
        }
    }
    public bool resetPuzzle()
    {
        print(this.GetType().Name + ": reseting puzzle");
        UtilBools.puzzleInteractLock(false);
        EOTPPlayTurn = 0; //reset
        bool ok = true;

        for (int li = 0; li < realInput.Count; li++)
        {
            for (int i = 0; i < realInput[li].Count; i++)
            {
                print(this.GetType().Name + ":EOTPwaitFinish():li/i: " + li + "/" + i);
                print(this.GetType().Name + ":EOTPwaitFinish():Input Gotten:" + realInput[li][i]);
                print(this.GetType().Name + ":EOTPwaitFinish():Input Wanted:" + inputs[li].signal[i]);
                if (realInput[li][i] != inputs[li].signal[i])
                {
                    ok = false;
                }
            }
            //reset each list for next check logic
            realInput[li] = new List <int>();
        }
        stepping = false;
        stepText.gameObject.SetActive(false);
        stopStepButton.SetActive(false);
        //reset powered
        for (int i = 0; i < outputs.Count; i++)
        {
            POutputController curOutObj = outputObjs[i].GetComponent <POutputController>();
            curOutObj.beingPowered = false;
            curOutObj.tryPower(false);
            curOutObj.sendPower(-1);
        }
        return(ok);
    }