function process(vValue, vModelOrObject, sPath, iCurrentLevel, iMaxLevel, bBindingInfosOnly) {

			if (iCurrentLevel === iMaxLevel) {
				Log.warning("BindingResolver maximum level processing reached. Please check for circular dependencies.");
				return vValue;
			}

			// iterates arrays
			if (Array.isArray(vValue)) {
				return vValue.map(function(vItem) {
					return process(vItem, vModelOrObject, sPath, iCurrentLevel + 1, iMaxLevel, bBindingInfosOnly);
				});
			}

			// iterates objects
			if (vValue && isPlainObject(vValue) && !BindingHelper.isBindingInfo(vValue)) {
				var oNewObj = {};
				for (var sProp in vValue) {
					oNewObj[sProp] = process(vValue[sProp], vModelOrObject, sPath, iCurrentLevel + 1, iMaxLevel, bBindingInfosOnly);
				}
				return oNewObj;
			}

			// resolves strings that might contain binding syntax
			if (typeof vValue === "string" && !bBindingInfosOnly) {
				return resolveBinding(vValue, vModelOrObject, sPath);
			}

			// resolve objects that are binding infos
			if (typeof vValue === "object" && BindingHelper.isBindingInfo(vValue)) {
				return resolveBinding(vValue, vModelOrObject, sPath);
			}

			return vValue;
		}
Resolves all binding syntaxes and binding infos recursively.
The function is pure and won't modify 'vValue' if it is object or array. It will return new one instead.

@param {*} vValue The value to resolve.
@param {*} vModelOrObject The model.
@param {string} [sPath] The path to take.
@param {number} iCurrentLevel The current level of recursion.
@param {number} iMaxLevel The maximum level of recursion.
@param {boolean} [bBindingInfosOnly] Set to true if it should resolve only binding infos, without resolving strings.
@private
@returns {*} The resolved value.