// System.out.println("Copying " + destRegion + ", shifts=" + JArrays.toString(shifts, ",", 100));
if (n == 1) {
segmentCopier.copySegment(destRegion);
} else { // the recursion
final IRange destRange = destRegion.coordRange(n - 1);
final long destMin = destRange.min();
final long destMax = destRange.max();
Matrices.Region.MutableIRange mutableCoordRange = new Matrices.Region.MutableIRange();
for (long k = destMin; k <= destMax; k++) {
destCoordinates[n - 1] = k;
srcCoordinates[n - 1] = shifts.length >= n ? k - shifts[n - 1] : k;