void CalculatePathChainForAndGate(Gate.AndGate andGate, Requirement requirementChain)
        {
/*			return andGate.Gates
 *                              //.InRandomOrder(random) //Aggregate always goes in order of definition it doesnt go in random order
 *                              .Aggregate(requirementChain, (chain, singleGate) => chain | CalculatePathChain(singleGate, chain));*/

            foreach (var gate in andGate.Gates)
            {
                CalculatePathChain(gate, requirementChain);
            }
        }
 bool GateCanBeOpenedWithoutSuppliedRequirements(Gate.AndGate gate, Requirement requirementToAvoid)
 {
     return(gate.Gates.All(g => GateCanBeOpenedWithoutSuppliedRequirements(g, requirementToAvoid)));
 }