{
public Expr evaluate(Expr[] args) throws ExprException {
assertMinArgCount(args, 3);
assertMaxArgCount(args, 5);
Expr r = args[0];
if (!(r instanceof ExprVariable)) {
throw new ExprException("First argument to OFFSET not a reference");
}
ExprVariable ref = (ExprVariable) r;
Range range = (Range) ref.getAnnotation();
if (range == null) {
range = Range.valueOf(ref.getName());
}
if (range == null) {
throw new ExprException("First argument to OFFSET not a reference");
}
GridReference gf = range.getDimension1();
int x = gf.getColumn();
int y = gf.getRow();
int rows = asInteger(args[1], true);
int cols = asInteger(args[2], true);
int height = 1;
int width = 1;
if (args.length > 3) {
Expr h = args[3];
if (!(h instanceof ExprMissing)) {
height = asInteger(h, true);
}
}
if (height < 1) {
return ExprError.VALUE;
}
if (args.length > 4) {
Expr w = args[4];
if (!(w instanceof ExprMissing)) {
width = asInteger(w, true);
}
}
if (width < 1) {