@Override
	protected void createMergeResolvers() {
		Program resultProgram = (Program) resultDomainObject;
		Program myProgram = (Program) myDomainObject;
		Program originalProgram = (Program) originalDomainObject;
		Program latestProgram = (Program) latestDomainObject;
		// create the merge resolvers
		int idx = 0;
		mergeResolvers = new MergeResolver[8];
		mergeResolvers[idx++] =
			new MemoryMergeManager(this, resultProgram, myProgram, originalProgram, latestProgram);

		mergeResolvers[idx++] =
			new ProgramTreeMergeManager(this, resultProgram, myProgram, originalProgram,
				latestProgram, (ProgramChangeSet) latestChangeSet, (ProgramChangeSet) myChangeSet);

		mergeResolvers[idx++] =
			new DataTypeMergeManager(this, resultProgram, myProgram, originalProgram, latestProgram,
				(ProgramChangeSet) latestChangeSet, (ProgramChangeSet) myChangeSet);

		mergeResolvers[idx++] =
			new ProgramContextMergeManager(this, resultProgram, originalProgram, latestProgram,
				myProgram, (ProgramChangeSet) latestChangeSet, (ProgramChangeSet) myChangeSet);

		mergeResolvers[idx++] =
			new FunctionTagMerger(this, resultProgram, originalProgram, latestProgram, myProgram,
				(ProgramChangeSet) latestChangeSet, (ProgramChangeSet) myChangeSet);

		ListingMergeManager listingMergeManager =
			new ListingMergeManager(this, resultProgram, originalProgram, latestProgram, myProgram,
				(ProgramChangeSet) latestChangeSet, (ProgramChangeSet) myChangeSet);
		mergeResolvers[idx++] = listingMergeManager;

		mergeResolvers[idx++] =
			new ExternalProgramMerger(this, resultProgram, originalProgram, latestProgram,
				myProgram, (ProgramChangeSet) latestChangeSet, (ProgramChangeSet) myChangeSet);

		mergeResolvers[idx++] = new PropertyListMergeManager(this, resultProgram, myProgram,
			originalProgram, latestProgram);
	}
Top level object that manages each step of the merge/resolve conflicts process.
Ghidra/Features/Base/src/main/java/ghidra/app/merge/ProgramMultiUserMergeManager.java