docs: function diffValueArrays(propPath, arrOld, arrNew, patchSpec) {
  
  	let iOld = 0, iNew = 0, t = 0;
  	const lenOld = arrOld.length, lenNew = arrNew.length;
  
  	while ((iOld < lenOld) && (iNew < lenNew)) {
  
  		const valOld = arrOld[iOld];
  		const valNew = arrNew[iNew];
  
  		if (valOld === valNew) {
  			iOld++;
  			iNew++;
  			t++;
  		} else {
  			const si = iOld;
  			let di = iNew;
  			while ((di < lenNew) && (arrNew[di] !== valOld))
  				di++;
  			if (di < lenNew) {
  				while (iNew < di) {
  					patchSpec.push({
  						op: 'add',
  						path: `${propPath}/${t}`,
  						value: arrNew[iNew]
  					});
  					iNew++;
  					t++;
  				}
  				iOld++;
  				iNew++;
  				t++;
  			} else {
  				let sni = si + 1;
  				while (sni < lenOld) {
  					const v = arrOld[sni];
  					for (di = iNew; di < lenNew; di++) {
  						if (arrNew[di] === v)
  							break;
  					}
  					if (di < lenNew) {
  						break;
  					} else {
  						sni++;
  					}
  				}
  				if (sni < lenOld) {
  					while ((iOld < sni) && (iNew < di)) {
  						patchSpec.push({
  							op: 'replace',
  							path: `${propPath}/${t}`,
  							value: arrNew[iNew]
  						});
  						iOld++;
  						iNew++;
  						t++;
  					}
  					while (iOld < sni) {
  						patchSpec.push({
  							op: 'remove',
  							path: `${propPath}/${t + sni - iOld - 1}`
  						});
  						iOld++;
  					}
  					while (iNew < di) {
  						patchSpec.push({
  							op: 'add',
  							path: `${propPath}/${t}`,
  							value: arrNew[iNew]
  						});
  						iNew++;
  						t++;
  					}
  					iOld++;
  					iNew++;
  					t++;
  				} else {
  					break;
  				}
  			}
  		}
  	}
  	while ((iOld < lenOld) && (iNew < lenNew)) {
  		patchSpec.push({
  			op: 'replace',
  			path: `${propPath}/${t}`,
  			value: arrNew[iNew]
  		});
  		iOld++;
  		iNew++;
  		t++;
  	}
  	while (iOld++ < lenOld) {
  		patchSpec.push({
  			op: 'remove',
  			path: `${propPath}/${t + lenOld - iOld}`
  		});
  	}
  	while (iNew < lenNew) {
  		patchSpec.push({
  			op: 'add',
  			path: `${propPath}/-`,
  			value: arrNew[iNew]
  		});
  		iNew++;
  	}
  }