#  Licensed to the Apache Software Foundation (ASF) under one or more
#  contributor license agreements.  See the NOTICE file distributed with
#  this work for additional information regarding copyright ownership.
#  The ASF licenses this file to You under the Apache License, Version 2.0
#  (the "License"); you may not use this file except in compliance with
#  the License.  You may obtain a copy of the License at
#
#       http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.


# This properties file contains all Javascript functions as keys.
# The values are the implementing class, the static method name, and 
# the number of double parameters.

abs = java.lang.Math, abs, 1
acos = java.lang.Math, acos, 1
acosh = org.apache.lucene.util.MathUtil, acosh, 1
asin = java.lang.Math, asin, 1
asinh = org.apache.lucene.util.MathUtil, asinh, 1
atan = java.lang.Math, atan, 1
atan2 = java.lang.Math, atan2, 2
atanh = org.apache.lucene.util.MathUtil, atanh, 1
ceil = java.lang.Math, ceil, 1
cos = java.lang.Math, cos, 1
cosh = java.lang.Math, cosh, 1
exp = java.lang.Math, exp, 1
floor = java.lang.Math, floor, 1
haversin = org.apache.lucene.util.SloppyMath, haversinKilometers, 4
ln = java.lang.Math, log, 1
log10 = java.lang.Math, log10, 1
logn = org.apache.lucene.util.MathUtil, log, 2
max = java.lang.Math, max, 2
min = java.lang.Math, min, 2
pow = java.lang.Math, pow, 2
sin = java.lang.Math, sin, 1
sinh = java.lang.Math, sinh, 1
sqrt = java.lang.Math, sqrt, 1
tan = java.lang.Math, tan, 1
tanh = java.lang.Math, tanh, 1
