text: /*
  	MIT License http://www.opensource.org/licenses/mit-license.php
  	Author Tobias Koppers @sokra
  */
  "use strict";
  
  const ResolverFactory = require("./ResolverFactory");
  
  const NodeJsInputFileSystem = require("./NodeJsInputFileSystem");
  const CachedInputFileSystem = require("./CachedInputFileSystem");
  
  const nodeFileSystem = new CachedInputFileSystem(new NodeJsInputFileSystem(), 4000);
  
  const nodeContext = {
  	environments: [
  		"node+es3+es5+process+native"
  	]
  };
  
  const asyncResolver = ResolverFactory.createResolver({
  	extensions: [".js", ".json", ".node"],
  	fileSystem: nodeFileSystem
  });
  module.exports = function resolve(context, path, request, resolveContext, callback) {
  	if(typeof context === "string") {
  		callback = resolveContext;
  		resolveContext = request;
  		request = path;
  		path = context;
  		context = nodeContext;
  	}
  	if(typeof callback !== "function") {
  		callback = resolveContext;
  	}
  	asyncResolver.resolve(context, path, request, resolveContext, callback);
  };
  
  const syncResolver = ResolverFactory.createResolver({
  	extensions: [".js", ".json", ".node"],
  	useSyncFileSystemCalls: true,
  	fileSystem: nodeFileSystem
  });
  module.exports.sync = function resolveSync(context, path, request) {
  	if(typeof context === "string") {
  		request = path;
  		path = context;
  		context = nodeContext;
  	}
  	return syncResolver.resolveSync(context, path, request);
  };
  
  const asyncContextResolver = ResolverFactory.createResolver({
  	extensions: [".js", ".json", ".node"],
  	resolveToContext: true,
  	fileSystem: nodeFileSystem
  });
  module.exports.context = function resolveContext(context, path, request, resolveContext, callback) {
  	if(typeof context === "string") {
  		callback = resolveContext;
  		resolveContext = request;
  		request = path;
  		path = context;
  		context = nodeContext;
  	}
  	if(typeof callback !== "function") {
  		callback = resolveContext;
  	}
  	asyncContextResolver.resolve(context, path, request, resolveContext, callback);
  };
  
  const syncContextResolver = ResolverFactory.createResolver({
  	extensions: [".js", ".json", ".node"],
  	resolveToContext: true,
  	useSyncFileSystemCalls: true,
  	fileSystem: nodeFileSystem
  });
  module.exports.context.sync = function resolveContextSync(context, path, request) {
  	if(typeof context === "string") {
  		request = path;
  		path = context;
  		context = nodeContext;
  	}
  	return syncContextResolver.resolveSync(context, path, request);
  };
  
  const asyncLoaderResolver = ResolverFactory.createResolver({
  	extensions: [".js", ".json", ".node"],
  	moduleExtensions: ["-loader"],
  	mainFields: ["loader", "main"],
  	fileSystem: nodeFileSystem
  });
  module.exports.loader = function resolveLoader(context, path, request, resolveContext, callback) {
  	if(typeof context === "string") {
  		callback = resolveContext;
  		resolveContext = request;
  		request = path;
  		path = context;
  		context = nodeContext;
  	}
  	if(typeof callback !== "function") {
  		callback = resolveContext;
  	}
  	asyncLoaderResolver.resolve(context, path, request, resolveContext, callback);
  };
  
  const syncLoaderResolver = ResolverFactory.createResolver({
  	extensions: [".js", ".json", ".node"],
  	moduleExtensions: ["-loader"],
  	mainFields: ["loader", "main"],
  	useSyncFileSystemCalls: true,
  	fileSystem: nodeFileSystem
  });
  module.exports.loader.sync = function resolveLoaderSync(context, path, request) {
  	if(typeof context === "string") {
  		request = path;
  		path = context;
  		context = nodeContext;
  	}
  	return syncLoaderResolver.resolveSync(context, path, request);
  };
  
  module.exports.create = function create(options) {
  	options = Object.assign({
  		fileSystem: nodeFileSystem
  	}, options);
  	const resolver = ResolverFactory.createResolver(options);
  	return function(context, path, request, resolveContext, callback) {
  		if(typeof context === "string") {
  			callback = resolveContext;
  			resolveContext = request;
  			request = path;
  			path = context;
  			context = nodeContext;
  		}
  		if(typeof callback !== "function") {
  			callback = resolveContext;
  		}
  		resolver.resolve(context, path, request, resolveContext, callback);
  	};
  };
  
  module.exports.create.sync = function createSync(options) {
  	options = Object.assign({
  		useSyncFileSystemCalls: true,
  		fileSystem: nodeFileSystem
  	}, options);
  	const resolver = ResolverFactory.createResolver(options);
  	return function(context, path, request) {
  		if(typeof context === "string") {
  			request = path;
  			path = context;
  			context = nodeContext;
  		}
  		return resolver.resolveSync(context, path, request);
  	};
  };
  
  // Export Resolver, FileSystems and Plugins
  module.exports.ResolverFactory = ResolverFactory;
  
  module.exports.NodeJsInputFileSystem = NodeJsInputFileSystem;
  module.exports.CachedInputFileSystem = CachedInputFileSystem;
  