class AbstractLocalFileScriptRunner extends AbstractRunner {

	private static final Deque<String> PREVIOUS_BUNDLE_PATHS = new ConcurrentLinkedDeque<>();

	@Override
	protected void adjustBundlePath(String script, IRunner.Options options) {
		File file = new File(script);

		if (file.exists()) {
			String currentBundlePath = ImagePath.getBundlePath();
			if(currentBundlePath != null) {
			  PREVIOUS_BUNDLE_PATHS.push(currentBundlePath);
			}
			ImagePath.setBundleFolder(file.getParentFile());
		}
	}

	@Override
	protected void resetBundlePath(String script, IRunner.Options options) {
		if (new File(script).exists() && !PREVIOUS_BUNDLE_PATHS.isEmpty()) {
		    ImagePath.setBundlePath(PREVIOUS_BUNDLE_PATHS.pop());
		}
	}

	@Override
	public boolean canHandle(String identifier) {<FILL_FUNCTION_BODY>}

	public void checkAndSetConsole() {
		if (!consoleChecked()) {
			setConsole(SikulixIDE.get().getConsole());
			consoleChecked(true);
		}
		
	}
}

		if (identifier != null) {
			/*
			 * Test if we have a network protocol in front of the identifier. In such a case
			 * we cannot handle the identifier directly
			 */
			int protoSepIndex = identifier.indexOf("://");
			if (protoSepIndex > 0 && protoSepIndex <= 5) {
				return false;
			}

			return super.canHandle(identifier);
		}

		return false;
	
<methods>public non-sealed void <init>() ,public final void abort() ,public boolean canHandle(java.lang.String) ,public final boolean canHandleFileEnding(java.lang.String) ,public void checkAndSetConsole() ,public final void close() ,public boolean consoleChecked() ,public void consoleChecked(boolean) ,public final int evalScript(java.lang.String, org.sikuli.support.runner.IRunner.Options) ,public void execAfter(java.lang.String[]) ,public void execBefore(java.lang.String[]) ,public java.lang.String getDefaultExtension() ,public org.sikuli.support.runner.IRunner.EffectiveRunner getEffectiveRunner(java.lang.String) ,public java.lang.String[] getFileEndings() ,public final boolean hasExtension(java.lang.String) ,public final void init(java.lang.String[]) throws org.sikuli.script.SikuliXception,public boolean isAbortSupported() ,public final boolean isAborted() ,public final boolean isReady() ,public final boolean isRunning() ,public boolean isSupported() ,public final void redirect(java.io.PrintStream, java.io.PrintStream) ,public final void reset() ,public final void runLines(java.lang.String, org.sikuli.support.runner.IRunner.Options) ,public final int runScript(java.lang.String, java.lang.String[], org.sikuli.support.runner.IRunner.Options) ,public void setConsole(java.lang.Object) <variables>public static final int NOT_SUPPORTED,private static final java.util.concurrent.ScheduledExecutorService TIMEOUT_EXECUTOR,private static final java.lang.Object WORKER_LOCK,private boolean aborted,static ArrayList<java.lang.String> codeAfter,static ArrayList<java.lang.String> codeBefore,private java.lang.Object console,private boolean consoleChecked,private boolean ready,private boolean running,private static volatile java.lang.Thread worker