Generate program that has the following intention:

This is the structure of the `NAME_1` class:
````
class NAME_1:
    def __init__(
        self,
        value=None,
        successor=None,
        successors=[],
        predecessors=[],
        incoming_nodes=[],
        outgoing_nodes=[],
    ):
        self.value = value
        self.successor = successor
        self.successors = successors
        self.predecessors = predecessors
        self.incoming_nodes = incoming_nodes
        self.outgoing_nodes = outgoing_nodes
````

The intention of the program is to implement a depth-first search (DFS) algorithm for finding a path from a given start NAME_1 to a specified goal NAME_1 in a directed graph. The algorithm is implemented using a class NAME_1 to represent nodes in the graph and a function p4 to perform the depth-first search.

The NAME_1 class has the following attributes:

-value: Represents the value associated with the NAME_1.
-successor: Represents the successor NAME_1.
-successors: Represents a list of successors of the NAME_1.
-predecessors: Represents a list of predecessors of the NAME_1.
-incoming_nodes: Represents a list of incoming nodes to the NAME_1.
-outgoing_nodes: Represents a list of outgoing nodes from the NAME_1.

The p4 function takes two arguments, startnode and goalnode. It performs a depth-first search from the startnode to find a path to the goalnode. The function uses a helper function search_from to perform the search. search_from takes a NAME_1 as an argument and returns True if a path to the goalnode is found, otherwise it returns False.

The search_from function maintains a set of visited nodes called nodesvisited to prevent revisiting the same NAME_1 multiple times. It checks if the current NAME_1 is the goalnode, and if so, returns True. If not, it adds the current NAME_1 to the set of visited nodes and checks if any of the successors of the current NAME_1 have a path to the goalnode. If any of the successors have a path to the goalnode, it returns True. Otherwise, it returns False.
 In your entire response, the letter a should appear less than 31.
user