code: function _simpleDeepMerge() {
  		var options,
  			name,
  			src,
  			copy,
  			clone,
  			target = arguments[0] || {},
  			i = 1,
  			length = arguments.length;
  
  		// Handle case when target is a string or something (possible in deep copy)
  		if (typeof target !== "object" && !$.isFunction(target)) {
  			target = {};
  		}
  		if (i === length) {
  			throw "need at least two args";
  		}
  		for (; i < length; i++) {
  			// Only deal with non-null/undefined values
  			if ((options = arguments[i]) != null) {
  				// Extend the base object
  				for (name in options) {
  					src = target[name];
  					copy = options[name];
  					// Prevent never-ending loop
  					if (target === copy) {
  						continue;
  					}
  					// Recurse if we're merging plain objects
  					// (NOTE: unlike $.extend, we don't merge arrays, but relace them)
  					if (copy && $.isPlainObject(copy)) {
  						clone = src && $.isPlainObject(src) ? src : {};
  						// Never move original objects, clone them
  						target[name] = _simpleDeepMerge(clone, copy);
  						// Don't bring in undefined values
  					} else if (copy !== undefined) {
  						target[name] = copy;
  					}
  				}
  			}
  		}
  		// Return the modified object
  		return target;
  	}
docs: Deep-merge a list of objects (but replace array-type options).
  
  jQuery's $.extend(true, ...) method does a deep merge, that also merges Arrays.
  This variant is used to merge extension defaults with user options, and should
  merge objects, but override arrays (for example the `triggerStart: [...]` option
  of ext-edit). Also `null` values are copied over and not skipped.
  
  See issue #876
  
  Example:
  _simpleDeepMerge({}, o1, o2);