code: function distributeTwoNodes(firstNode, secondNode) {
    // lists of terms we'll be multiplying together from each node
    let firstArgs, secondArgs;
    if (isParenthesisOfAddition(firstNode)) {
      firstArgs = firstNode.content.args;
    }
    else {
      firstArgs = [firstNode];
    }
  
    if (isParenthesisOfAddition(secondNode)) {
      secondArgs = secondNode.content.args;
    }
    else {
      secondArgs = [secondNode];
    }
    // the new operands under addition, now products of terms
    const newArgs = [];
  
    // e.g. (4+x)(x+y+z) will become 4(x+y+z) + x(x+y+z) as an intermediate
    // step.
    if (firstArgs.length > 1 && secondArgs.length > 1) {
      firstArgs.forEach(leftArg => {
        const arg = Node.Creator.operator('*', [leftArg, secondNode]);
        arg.changeGroup = 1;
        newArgs.push(arg);
      });
    }
    else {
      // a list of all pairs of nodes between the two arg lists
      firstArgs.forEach(leftArg => {
        secondArgs.forEach(rightArg => {
          const arg = Node.Creator.operator('*', [leftArg, rightArg]);
          arg.changeGroup = 1;
          newArgs.push(arg);
        });
      });
    }
    return Node.Creator.parenthesis(Node.Creator.operator('+', newArgs));
  }
docs: Distributes two nodes together. At least one node must be parenthesis node e.g. 2*(x+3) -> (2*x + 2*3)       (5+x)*x -> 5*x + x*x e.g. (5+x)*(x+3) -> (5*x + 5*3 + x*x + x*3) Returns a node.