diff --git a/docs/src/apireference.md b/docs/src/apireference.md index f520d95..144f544 100644 --- a/docs/src/apireference.md +++ b/docs/src/apireference.md @@ -49,6 +49,7 @@ velocity set_velocity! atomic_number atomic_symbol +atom_name element_symbol element ``` diff --git a/src/implementation/atom.jl b/src/implementation/atom.jl index 8c30b81..ace71c4 100644 --- a/src/implementation/atom.jl +++ b/src/implementation/atom.jl @@ -23,6 +23,7 @@ species(atom::Atom) = atom.species n_dimensions(::Atom{D}) where {D} = D +atom_name(atom::Atom) = atom_name(species(atom)) atomic_symbol(atom::Atom) = atomic_symbol(species(atom)) atomic_number(atom::Atom) = atomic_number(species(atom)) element(atom::Atom) = element(species(atom)) @@ -51,7 +52,7 @@ function Atom(identifier::AtomId, position::AbstractVector{L}, velocity::AbstractVector{V} = _default_velocity(position); species = ChemicalSpecies(identifier), - mass::M=element(species).atomic_mass, + mass::M=mass(species), kwargs...) where {L <: Unitful.Length, V <: Unitful.Velocity, M <: Unitful.Mass} Atom{length(position), L, V, M}(position, velocity, species, mass, Dict(kwargs...)) diff --git a/src/interface.jl b/src/interface.jl index c892647..33598a9 100644 --- a/src/interface.jl +++ b/src/interface.jl @@ -15,7 +15,8 @@ export cell_vectors, atomic_number, atomic_symbol, atomkeys, - hasatomkey + hasatomkey, + atom_name # diff --git a/src/utils/atomview.jl b/src/utils/atomview.jl index cd32057..6b616ba 100644 --- a/src/utils/atomview.jl +++ b/src/utils/atomview.jl @@ -41,6 +41,7 @@ position(v::AtomView) = position(v.system, v.index) mass(v::AtomView) = mass(v.system, v.index) species(v::AtomView) = species(v.system, v.index) +atom_name(v::AtomView) = atom_name(species(v)) atomic_symbol(v::AtomView) = atomic_symbol(species(v)) atomic_number(v::AtomView) = atomic_number(species(v)) n_dimensions(v::AtomView) = n_dimensions(v.system) diff --git a/src/utils/chemspecies.jl b/src/utils/chemspecies.jl index 72479c4..5a6db22 100644 --- a/src/utils/chemspecies.jl +++ b/src/utils/chemspecies.jl @@ -11,9 +11,15 @@ import Base: ==, convert, show, length export ChemicalSpecies +# masses are saved in a different file to not clutter this file +include("isotope_masses.jl") + """ Encodes a chemical species by wrapping an integer that represents the atomic -number, the number of protons, and additional unspecified information as a `UInt32`. +number, the number of protons, and additional name as max 4 characters. + +The name variable can be used as atom name in PDB format or +some other way to mark same kind of atoms from one another. Constructors for standard chemical elements ```julia @@ -35,13 +41,44 @@ ChemicalSpecies(:C; n_neutrons = 7) ChemicalSpecies(6; n_neutrons = 7) ChemicalSpecies(:C13) # deuterium -ChemicalSpecies(:D) +ChemicalSpecies(:D) +``` + +Constructors for names +```julia +ChemicalSpecies(:C; atom_name=:MyC) +ChemicalSpecies(:C13; atom_name=:MyC) +``` + +Comparisons with different isotopes and names +```julia +# true +ChemicalSpecies(:C13) == ChemicalSpecies(:C) + +# false +ChemicalSpecies(:C12) == ChemicalSpecies(:C13) + +# true +ChemicalSpecies(:C; atom_name=:MyC) == ChemicalSpecies(:C) + +# true +ChemicalSpecies(:C12; atom_name=:MyC) == ChemicalSpecies(:C12) + +# false +ChemicalSpecies(:C; atom_name=:MyC) == ChemicalSpecies(:C12) + +# true +ChemicalSpecies(:C12; atom_name=:MyC) == ChemicalSpecies(:C) + +# true +ChemicalSpecies(:C; atom_name=:MyC) == ChemicalSpecies(:C12; atom_name=:MyC) ``` + """ struct ChemicalSpecies atomic_number::Int16 # = Z = number of protons - nneut::Int16 # number of neutrons - info::UInt32 + n_neutrons::Int16 # number of neutrons + name::UInt32 end @@ -51,10 +88,53 @@ end Base.Broadcast.broadcastable(s::ChemicalSpecies) = Ref(s) -# better to convert z -> symbol to catch special cases such as D; e.g. -# Should ChemicalSpecies(z) == ChemicalSpecies(z,z,0)? For H this is false. -function ChemicalSpecies(z::Integer; kwargs...) - ChemicalSpecies(_chem_el_info[z].symbol; kwargs...) +function ChemicalSpecies(asymbol::Symbol; atom_name::Symbol=Symbol(""), n_neutrons::Int=-1) + str_symbol = String(asymbol) + tmp = 0 + if length(str_symbol) > 1 && isnumeric(str_symbol[end]) + # We only consider cases where number of nucleons is < 1000 + if length(str_symbol) > 2 && isnumeric(str_symbol[end-1]) + if length(str_symbol) > 3 && isnumeric(str_symbol[end-2]) + if isnumeric(str_symbol[end-3]) + # we now have >= 1000 nucleons so we error + throw( ArgumentError("Number of nucleons is >= 1000") ) + end + tmp = parse(Int, str_symbol[end-2:end]) + str_symbol = str_symbol[1:end-3] + else + tmp = parse(Int, str_symbol[end-1:end]) + str_symbol = str_symbol[1:end-2] + end + else + tmp = parse(Int, str_symbol[end]) + str_symbol = str_symbol[1:end-1] + end + end + asymbol = Symbol(str_symbol) + if ! haskey(_sym2z, asymbol) && ! ( asymbol in (:X, :D, :T) ) + throw( ArgumentError("Could not recognize atom symbol $asymbol") ) + end + z = get(_sym2z, asymbol, 0) + n_neutrons = tmp == 0 ? n_neutrons : tmp - z + if asymbol in [:D, :T] + z = 1 + n_neutrons = asymbol == :D ? 1 : 2 + end + return ChemicalSpecies(Int(z); atom_name=atom_name, n_neutrons=n_neutrons) +end + +function ChemicalSpecies(z::Integer; atom_name::Symbol=Symbol(""), n_neutrons::Int=-1) + atom_name = String(atom_name) + if length(atom_name) > 4 + throw(ArgumentError("atom_name has to be max 4 characters")) + end + if length(atom_name) == 0 + return ChemicalSpecies(z, n_neutrons, zero(UInt32),) + end + tmp = repeat(' ', 4 - length(atom_name)) * atom_name + tmp2 = SVector{4, UInt8}( tmp[1], tmp[2], tmp[3], tmp[4] ) + name = reinterpret(reshape, UInt32, tmp2)[1] + return ChemicalSpecies(z, n_neutrons, name) end ChemicalSpecies(sym::ChemicalSpecies) = sym @@ -62,75 +142,51 @@ ChemicalSpecies(sym::ChemicalSpecies) = sym ==(a::ChemicalSpecies, sym::Symbol) = ((a == ChemicalSpecies(sym)) && (Symbol(a) == sym)) -# -------- fast access to the periodic table - -if length(PeriodicTable.elements) != maximum(el.number for el in PeriodicTable.elements) - error("PeriodicTable.elements is not sorted by atomic number") -end -if !all(el.number == i for (i, el) in enumerate(PeriodicTable.elements)) - error("PeriodicTable.elements is not sorted by atomic number") +function ==(cs1::ChemicalSpecies, cs2::ChemicalSpecies) + if cs1.atomic_number != cs2.atomic_number + return false + elseif (cs1.n_neutrons >= 0 && cs2.n_neutrons >= 0) && cs1.n_neutrons != cs2.n_neutrons + return false + elseif (cs1.name != 0 && cs2.name != 0) && cs1.name != cs2.name + return false + elseif (cs1.n_neutrons < 0 && cs1.name == 0) || (cs2.n_neutrons < 0 && cs2.name == 0) + return true + elseif cs1.n_neutrons != cs2.n_neutrons && cs1.name != cs2.name + return false + else + return true + end end -const _chem_el_info = [ - (symbol = Symbol(PeriodicTable.elements[z].symbol), - atomic_mass = PeriodicTable.elements[z].atomic_mass, ) - for z in 1:length(PeriodicTable.elements) - ] +# -------- fast access to the periodic table -const _sym2z = Dict{Symbol, UInt8}() -for z in 1:length(_chem_el_info) - _sym2z[_chem_el_info[z].symbol] = z -end +const _sym2z = Dict{Symbol, UInt8}( + Symbol(el.symbol) => el.number for el in PeriodicTable.elements +) -function _nneut_default(z::Integer) - nplusp = round(Int, ustrip(u"u", _chem_el_info[z].atomic_mass)) - return nplusp - z -end +const _z2sym = Dict{UInt8, Symbol}( + el.number => Symbol(el.symbol) for el in PeriodicTable.elements +) -function ChemicalSpecies(sym::Symbol; n_neutrons = -1, info = 0) - _islett(c::Char) = 'A' <= uppercase(c) <= 'Z' +const _z2mass = Dict{UInt8, typeof(PeriodicTable.elements[1].atomic_mass)}( + el.number => el.atomic_mass for el in PeriodicTable.elements +) - # TODO - special-casing deuterium to make tests pass - # this should be handled better - if sym == :D - return ChemicalSpecies(1, 1, info) - end - # number of neutrons is explicitly specified - if n_neutrons != -1 - if !( all(_islett, String(sym)) && n_neutrons >= 0) - throw(ArgumentError("Invalid arguments for ChemicalSpecies")) - end - Z = _sym2z[sym] - return ChemicalSpecies(Z, n_neutrons, info) +function Base.Symbol(element::ChemicalSpecies) + tmp = get(_z2sym, element.atomic_number, :X) + if element.n_neutrons < 0 + return tmp end - - # number of neutrons is encoded in the symbol - str = String(sym) - elem_str = str[1:findlast(_islett, str)] - Z = _sym2z[Symbol(elem_str)] - num_str = str[findlast(_islett, str)+1:end] - if isempty(num_str) - n_neutrons = _nneut_default(Z) - else - n_neutrons = parse(Int, num_str) - Z + if element.atomic_number == 1 && element.n_neutrons == 1 + return :D end - return ChemicalSpecies(Z, n_neutrons, info) -end - -function Base.Symbol(element::ChemicalSpecies) - str = "$(_chem_el_info[element.atomic_number].symbol)" - if element.nneut != _nneut_default(element.atomic_number) - str *= "$(element.atomic_number + element.nneut)" + if element.atomic_number == 1 && element.n_neutrons == 2 + return :T end - - # TODO: again special-casing deuterium; to be fixed. - if str == "H2" - return :D - end - - return Symbol(str) + n = element.atomic_number + element.n_neutrons + return Symbol("$tmp$n") end @@ -147,7 +203,14 @@ atomic_symbol(element::ChemicalSpecies) = element Base.convert(::Type{Symbol}, element::ChemicalSpecies) = Symbol(element) -mass(element::ChemicalSpecies) = _chem_el_info[element.atomic_number].atomic_mass +function mass(element::ChemicalSpecies) + if element.n_neutrons < 0 + return get(_z2mass, element.atomic_number, 0.0u"u") + end + akey = (element.atomic_number, element.n_neutrons) + return get(_isotope_masses, akey, missing) * u"u" +end + rich_info(element::ChemicalSpecies) = PeriodicTable.elements[element.atomic_number] @@ -221,3 +284,27 @@ of identifying the type of a `species` (e.g. the element for the case of an atom this may be `:D` while `atomic_number` is still `1`. """ atomic_number(sys::AbstractSystem, index) = atomic_number.(species(sys, index)) + + +""" + atom_name(species) + atom_name(sys::AbstractSystem, i) + +Return atomic name (`Symbol`) for `species` or vector of names for `sys`. + +Defaults to [`atomic_symbol`](@ref), if `name` field is zero or not defined. +""" +function atom_name(cs::ChemicalSpecies) + if cs.name == 0 + return atomic_symbol(cs) + else + # filter first empty space characters + as_characters = Char.( reinterpret(SVector{4, UInt8}, [cs.name])[1] ) + tmp = String( filter( x -> ! isspace(x), as_characters ) ) + return Symbol( tmp ) + end +end + +atom_name(at) = atomic_symbol(at) + +atom_name(sys::AbstractSystem, index) = atom_name.(species(sys, index)) \ No newline at end of file diff --git a/src/utils/isotope_masses.jl b/src/utils/isotope_masses.jl new file mode 100644 index 0000000..4746170 --- /dev/null +++ b/src/utils/isotope_masses.jl @@ -0,0 +1,3363 @@ +# Isotope masses for ChemicalSpecies +# Data is from https://www-nds.iaea.org/relnsd/vcharthtml/VChartHTML.html +# Download with https://www-nds.iaea.org/relnsd/v1/data?fields=ground_states&nuclides=all + +const _isotope_masses = Dict{Tuple{Int16, Int16}, Float64}( + (0, 1) => 1.0086649159, + (1, 0) => 1.007825031898, + (1, 1) => 2.014101777844, + (1, 2) => 3.01604928132, + (1, 3) => 4.026431867, + (1, 4) => 5.035311492, + (1, 5) => 6.044955437, + (1, 6) => 7.052749, + (2, 1) => 3.01602932197, + (2, 2) => 4.002603254129999, + (2, 3) => 5.012057224, + (2, 4) => 6.018885889000001, + (2, 5) => 7.027990652, + (2, 6) => 8.033934388, + (2, 7) => 9.043946414, + (2, 8) => 10.052815306, + (3, 1) => 4.0271855610000005, + (3, 2) => 5.0125378, + (3, 3) => 6.01512288742, + (3, 4) => 7.01600343426, + (3, 5) => 8.022486244, + (3, 6) => 9.026790191, + (3, 7) => 10.035483453, + (3, 8) => 11.043723581, + (3, 9) => 12.052613942, + (4, 2) => 6.019726409, + (4, 3) => 7.016928714, + (4, 4) => 8.005305102, + (4, 5) => 9.012183062, + (4, 6) => 10.013534692, + (4, 7) => 11.02166108, + (4, 8) => 12.026922082, + (4, 9) => 13.036134506, + (4, 10) => 14.04289292, + (4, 11) => 15.053490215, + (4, 12) => 16.061672036, + (5, 2) => 7.029712, + (5, 3) => 8.024607315, + (5, 4) => 9.013329644999999, + (5, 5) => 10.012936862, + (5, 6) => 11.009305165999999, + (5, 7) => 12.014352638, + (5, 8) => 13.017779981, + (5, 9) => 14.025404009999999, + (5, 10) => 15.031087023, + (5, 11) => 16.039841045, + (5, 12) => 17.046931399, + (5, 13) => 18.055601683, + (5, 14) => 19.064166, + (5, 15) => 20.074505644000002, + (5, 16) => 21.084147485, + (6, 2) => 8.037643039, + (6, 3) => 9.031037202, + (6, 4) => 10.016853217, + (6, 5) => 11.011432596999999, + (6, 6) => 12.0, + (6, 7) => 13.003354835340001, + (6, 8) => 14.00324198862, + (6, 9) => 15.010599255999999, + (6, 10) => 16.014701255000002, + (6, 11) => 17.02257865, + (6, 12) => 18.02675193, + (6, 13) => 19.034797594, + (6, 14) => 20.040261732, + (6, 16) => 22.05755399, + (7, 3) => 10.041653539999999, + (7, 4) => 11.026157593, + (7, 5) => 12.01861318, + (7, 6) => 13.005738609, + (7, 7) => 14.00307400425, + (7, 8) => 15.00010889827, + (7, 9) => 16.006101925, + (7, 10) => 17.008448876, + (7, 11) => 18.014077563, + (7, 12) => 19.017022388999997, + (7, 13) => 20.023367295000003, + (7, 14) => 21.027087573, + (7, 15) => 22.034100918, + (7, 16) => 23.039421, + (7, 17) => 24.05039, + (8, 3) => 11.051249828, + (8, 4) => 12.034367726, + (8, 5) => 13.024815435, + (8, 6) => 14.008596706, + (8, 7) => 15.003065636, + (8, 8) => 15.99491461926, + (8, 9) => 16.99913175595, + (8, 10) => 17.99915961214, + (8, 11) => 19.003577969000002, + (8, 12) => 20.004075357, + (8, 13) => 21.008654948, + (8, 14) => 22.009965744, + (8, 15) => 23.015696686000002, + (8, 16) => 24.019861, + (8, 17) => 25.029338919, + (8, 18) => 26.037210155, + (9, 4) => 13.045121, + (9, 5) => 14.034315196, + (9, 6) => 15.017785139, + (9, 7) => 16.011460278, + (9, 8) => 17.002095237, + (9, 9) => 18.000937324000002, + (9, 10) => 18.998403162069998, + (9, 11) => 19.999981252, + (9, 12) => 20.999948893, + (9, 13) => 22.002998811999998, + (9, 14) => 23.003526875, + (9, 15) => 24.00809937, + (9, 16) => 25.012167727, + (9, 17) => 26.020048065, + (9, 18) => 27.026981897, + (9, 19) => 28.035860447999998, + (9, 20) => 29.043103, + (9, 21) => 30.052561, + (9, 22) => 31.061023, + (10, 5) => 15.043172977, + (10, 6) => 16.02575086, + (10, 7) => 17.017713962000002, + (10, 8) => 18.005708696, + (10, 9) => 19.001880906, + (10, 10) => 19.99244017525, + (10, 11) => 20.993846684999998, + (10, 12) => 21.991385113000003, + (10, 13) => 22.994466905, + (10, 14) => 23.993610649, + (10, 15) => 24.997814796999997, + (10, 16) => 26.000516496, + (10, 17) => 27.007569462000003, + (10, 18) => 28.012130767000002, + (10, 19) => 29.019753, + (10, 20) => 30.024992235, + (10, 21) => 31.033474816, + (10, 22) => 32.03972, + (10, 23) => 33.049523, + (10, 24) => 34.056728, + (11, 6) => 17.037273, + (11, 7) => 18.026879388, + (11, 8) => 19.013880263999997, + (11, 9) => 20.007354301, + (11, 10) => 20.997654459, + (11, 11) => 21.994437546999997, + (11, 12) => 22.98976928195, + (11, 13) => 23.990963011999998, + (11, 14) => 24.989953974, + (11, 15) => 25.992634649, + (11, 16) => 26.994076408, + (11, 17) => 27.998939, + (11, 18) => 29.002877091, + (11, 19) => 30.009097931000003, + (11, 20) => 31.013146654, + (11, 21) => 32.020011024, + (11, 22) => 33.025529, + (11, 23) => 34.03401, + (11, 24) => 35.040614, + (11, 25) => 36.049279, + (11, 26) => 37.057042, + (12, 7) => 19.034179920000003, + (12, 8) => 20.018763075, + (12, 9) => 21.011705764, + (12, 10) => 21.999570596999998, + (12, 11) => 22.994123767999998, + (12, 12) => 23.985041689, + (12, 13) => 24.985836965999997, + (12, 14) => 25.982592972, + (12, 15) => 26.984340647, + (12, 16) => 27.983875425999997, + (12, 17) => 28.988607162999998, + (12, 18) => 29.990465454, + (12, 19) => 30.996648232000002, + (12, 20) => 31.999110138, + (12, 21) => 33.005327862, + (12, 22) => 34.008935455, + (12, 23) => 35.01679, + (12, 24) => 36.021879, + (12, 25) => 37.030286265, + (12, 26) => 38.03658, + (12, 27) => 39.045921, + (12, 28) => 40.053194, + (13, 8) => 21.029082, + (13, 9) => 22.01954, + (13, 10) => 23.007244351, + (13, 11) => 23.999947598000002, + (13, 12) => 24.990428308, + (13, 13) => 25.986891875999998, + (13, 14) => 26.981538408, + (13, 15) => 27.981910009, + (13, 16) => 28.980453164, + (13, 17) => 29.982969171, + (13, 18) => 30.983949754, + (13, 19) => 31.988084338, + (13, 20) => 32.990877685, + (13, 21) => 33.996781924000004, + (13, 22) => 34.999759816, + (13, 23) => 36.006388, + (13, 24) => 37.010531, + (13, 25) => 38.017681, + (13, 26) => 39.02307, + (13, 27) => 40.03094, + (13, 28) => 41.037134, + (13, 29) => 42.045078, + (13, 30) => 43.05182, + (14, 8) => 22.036114, + (14, 9) => 23.025711, + (14, 10) => 24.01153543, + (14, 11) => 25.004108798, + (14, 12) => 25.992333818, + (14, 13) => 26.986704687, + (14, 14) => 27.97692653442, + (14, 15) => 28.976494664340002, + (14, 16) => 29.973770137, + (14, 17) => 30.975363196, + (14, 18) => 31.974151537999997, + (14, 19) => 32.977976964, + (14, 20) => 33.978538045, + (14, 21) => 34.984550111000004, + (14, 22) => 35.986649271, + (14, 23) => 36.992945191, + (14, 24) => 37.995523, + (14, 25) => 39.002491, + (14, 26) => 40.006083641000004, + (14, 27) => 41.014171, + (14, 28) => 42.018078, + (14, 29) => 43.026119, + (14, 30) => 44.031466, + (15, 10) => 25.021675, + (15, 11) => 26.01178, + (15, 12) => 26.999292499000003, + (15, 13) => 27.99232646, + (15, 14) => 28.981800368000002, + (15, 15) => 29.978313489999998, + (15, 16) => 30.97376199768, + (15, 17) => 31.973907643, + (15, 18) => 32.971725692, + (15, 19) => 33.973645886, + (15, 20) => 34.973314045, + (15, 21) => 35.97825961, + (15, 22) => 36.979606942000004, + (15, 23) => 37.984303104999995, + (15, 24) => 38.986285865, + (15, 25) => 39.991262221, + (15, 26) => 40.994654, + (15, 27) => 42.00117214, + (15, 28) => 43.005411, + (15, 29) => 44.011927, + (15, 30) => 45.017134, + (15, 31) => 46.02452, + (16, 10) => 26.029716, + (16, 11) => 27.018777, + (16, 12) => 28.004372762, + (16, 13) => 28.996678, + (16, 14) => 29.98490677, + (16, 15) => 30.979557002, + (16, 16) => 31.97207117354, + (16, 17) => 32.97145890862, + (16, 18) => 33.967867011, + (16, 19) => 34.969032321, + (16, 20) => 35.967080692, + (16, 21) => 36.9711255, + (16, 22) => 37.97116329999999, + (16, 23) => 38.97513385, + (16, 24) => 39.975482561, + (16, 25) => 40.979593451, + (16, 26) => 41.9810651, + (16, 27) => 42.986907635, + (16, 28) => 43.990118846, + (16, 29) => 44.996414, + (16, 30) => 46.000687, + (16, 32) => 48.013301, + (17, 12) => 29.015053, + (17, 13) => 30.005018333, + (17, 14) => 30.992448097, + (17, 15) => 31.985684605, + (17, 16) => 32.977451988, + (17, 17) => 33.97376249, + (17, 18) => 34.968852694, + (17, 19) => 35.968306821999995, + (17, 20) => 36.965902573, + (17, 21) => 37.968010408, + (17, 22) => 38.968008151, + (17, 23) => 39.970415466, + (17, 24) => 40.970684524999996, + (17, 25) => 41.973342, + (17, 26) => 42.9740637, + (17, 27) => 43.978014918, + (17, 28) => 44.980394353, + (17, 29) => 45.985254925999996, + (17, 30) => 46.989715, + (17, 31) => 47.995405, + (17, 32) => 49.000794, + (17, 33) => 50.008266, + (17, 34) => 51.015341, + (17, 35) => 52.024004, + (18, 12) => 30.023694, + (18, 13) => 31.012158, + (18, 14) => 31.997637824, + (18, 15) => 32.989925545, + (18, 16) => 33.980270092, + (18, 17) => 34.975257719, + (18, 18) => 35.967545105999996, + (18, 19) => 36.966776300999996, + (18, 20) => 37.962732102, + (18, 21) => 38.964313037000004, + (18, 22) => 39.96238312204, + (18, 23) => 40.96450057, + (18, 24) => 41.963045737, + (18, 25) => 42.965636056, + (18, 26) => 43.964923814, + (18, 27) => 44.968039731, + (18, 28) => 45.968039244, + (18, 29) => 46.97276711200001, + (18, 30) => 47.976001, + (18, 31) => 48.981685, + (18, 32) => 49.985797, + (18, 33) => 50.993033, + (18, 34) => 51.998519, + (18, 35) => 53.00729, + (19, 12) => 31.03678, + (19, 14) => 33.008095, + (19, 15) => 33.99869, + (19, 16) => 34.988005406000006, + (19, 17) => 35.981301887, + (19, 18) => 36.97337589, + (19, 19) => 37.969081114, + (19, 20) => 38.96370648482, + (19, 21) => 39.963998165, + (19, 22) => 40.96182525611, + (19, 23) => 41.962402305, + (19, 24) => 42.960734701, + (19, 25) => 43.961586984, + (19, 26) => 44.960691491, + (19, 27) => 45.961981584, + (19, 28) => 46.961661612, + (19, 29) => 47.965341184, + (19, 30) => 48.968210753, + (19, 31) => 49.972380015, + (19, 32) => 50.975828664, + (19, 33) => 51.981602, + (19, 34) => 52.9868, + (19, 35) => 53.994471, + (19, 36) => 55.000505, + (19, 37) => 56.008567, + (20, 14) => 34.015985, + (20, 15) => 35.005572, + (20, 16) => 35.993074388, + (20, 17) => 36.985897849, + (20, 18) => 37.976319223, + (20, 19) => 38.970710811, + (20, 20) => 39.96259085, + (20, 21) => 40.962277905, + (20, 22) => 41.958617780000004, + (20, 23) => 42.958766381, + (20, 24) => 43.955481489, + (20, 25) => 44.95618627, + (20, 26) => 45.953687726000005, + (20, 27) => 46.954541134, + (20, 28) => 47.952522654, + (20, 29) => 48.955662625, + (20, 30) => 49.957499215000006, + (20, 31) => 50.960995663000006, + (20, 32) => 51.963213646, + (20, 33) => 52.968451, + (20, 34) => 53.972989, + (20, 35) => 54.979978, + (20, 36) => 55.985496, + (20, 37) => 56.992958, + (20, 38) => 57.998357, + (21, 17) => 37.995438, + (21, 18) => 38.984784953, + (21, 19) => 39.977967275, + (21, 20) => 40.969251163, + (21, 21) => 41.965516685999994, + (21, 22) => 42.961150425, + (21, 23) => 43.959402818, + (21, 24) => 44.955907051, + (21, 25) => 45.955167034, + (21, 26) => 46.952402444, + (21, 27) => 47.952222903, + (21, 28) => 48.950013159, + (21, 29) => 49.952187437, + (21, 30) => 50.953568838, + (21, 31) => 51.95649617, + (21, 32) => 52.958379173, + (21, 33) => 53.963029359, + (21, 34) => 54.966889637, + (21, 35) => 55.972607611, + (21, 36) => 56.977048, + (21, 37) => 57.983382, + (21, 38) => 58.988374, + (21, 40) => 61.000537, + (22, 16) => 38.012206, + (22, 17) => 39.002684, + (22, 18) => 39.990345145999996, + (22, 19) => 40.983148, + (22, 20) => 41.973049369, + (22, 21) => 42.96852842, + (22, 22) => 43.959689936, + (22, 23) => 44.958120758, + (22, 24) => 45.952626355999996, + (22, 25) => 46.951757490999995, + (22, 26) => 47.947940677, + (22, 27) => 48.947864391, + (22, 28) => 49.944785622000005, + (22, 29) => 50.946609468000005, + (22, 30) => 51.946883509, + (22, 31) => 52.949670714, + (22, 32) => 53.950892, + (22, 33) => 54.955091, + (22, 34) => 55.957677675, + (22, 35) => 56.963068098, + (22, 36) => 57.966808519000004, + (22, 37) => 58.972217, + (22, 38) => 59.976275, + (22, 39) => 60.982426, + (22, 40) => 61.986903, + (22, 41) => 62.993709, + (22, 42) => 63.998411, + (23, 19) => 41.99182, + (23, 20) => 42.980766, + (23, 21) => 43.974440977, + (23, 22) => 44.965768498, + (23, 23) => 45.960197389, + (23, 24) => 46.954903558, + (23, 25) => 47.952250899999996, + (23, 26) => 48.948510509, + (23, 27) => 49.947156681, + (23, 28) => 50.943957663999996, + (23, 29) => 51.944773636, + (23, 30) => 52.94433494, + (23, 31) => 53.946432009000006, + (23, 32) => 54.947262, + (23, 33) => 55.950420082, + (23, 34) => 56.952297, + (23, 35) => 57.956595985, + (23, 36) => 58.959623343000004, + (23, 37) => 59.964479215000004, + (23, 38) => 60.967603529, + (23, 39) => 61.972932556, + (23, 40) => 62.976661, + (23, 41) => 63.98248, + (23, 42) => 64.986999, + (23, 43) => 65.993237, + (23, 44) => 66.998128, + (24, 18) => 42.007579, + (24, 19) => 42.997885, + (24, 20) => 43.985591, + (24, 21) => 44.97905, + (24, 22) => 45.968360968999995, + (24, 23) => 46.962894995, + (24, 24) => 47.954029431, + (24, 25) => 48.95133372, + (24, 26) => 49.946042209, + (24, 27) => 50.94476538799999, + (24, 28) => 51.940504714, + (24, 29) => 52.940646304, + (24, 30) => 53.938877358999996, + (24, 31) => 54.940836637000004, + (24, 32) => 55.940648976999995, + (24, 33) => 56.943612112000004, + (24, 34) => 57.944184501, + (24, 35) => 58.948345425999996, + (24, 36) => 59.949641656000004, + (24, 37) => 60.95437813, + (24, 38) => 61.956142920000005, + (24, 39) => 62.961161, + (24, 40) => 63.963886, + (24, 41) => 64.969608, + (24, 42) => 65.973011, + (24, 43) => 66.979313, + (24, 44) => 67.983156, + (24, 45) => 68.989662, + (24, 46) => 69.993945, + (25, 19) => 44.008009, + (25, 20) => 44.994654, + (25, 21) => 45.986669, + (25, 22) => 46.975774, + (25, 23) => 47.96854876, + (25, 24) => 48.959613350000005, + (25, 25) => 49.954238157, + (25, 26) => 50.94820877, + (25, 27) => 51.94555909, + (25, 28) => 52.941287497000005, + (25, 29) => 53.940355772, + (25, 30) => 54.93804304, + (25, 31) => 55.938902816, + (25, 32) => 56.938285944, + (25, 33) => 57.940066643, + (25, 34) => 58.940391111000004, + (25, 35) => 59.943136574, + (25, 36) => 60.944452541000004, + (25, 37) => 61.947907384000004, + (25, 38) => 62.949664672, + (25, 39) => 63.953849369000004, + (25, 40) => 64.95601974899999, + (25, 41) => 65.960546833, + (25, 42) => 66.96395, + (25, 43) => 67.968953, + (25, 44) => 68.972775, + (25, 45) => 69.978046, + (25, 47) => 71.988009, + (25, 48) => 72.992807, + (26, 19) => 45.015467, + (26, 20) => 46.001299, + (26, 21) => 46.992346, + (26, 22) => 47.980667, + (26, 23) => 48.973429, + (26, 24) => 49.962988, + (26, 25) => 50.956855137000005, + (26, 26) => 51.948113364, + (26, 27) => 52.945305629, + (26, 28) => 53.939608189000005, + (26, 29) => 54.938291158, + (26, 30) => 55.934935537, + (26, 31) => 56.93539195, + (26, 32) => 57.933273575, + (26, 33) => 58.934873492, + (26, 34) => 59.934070249, + (26, 35) => 60.936746240999994, + (26, 36) => 61.936791809, + (26, 37) => 62.940272698, + (26, 38) => 63.940987761, + (26, 39) => 64.94501532299999, + (26, 40) => 65.946249958, + (26, 41) => 66.95093, + (26, 42) => 67.952875, + (26, 43) => 68.957918, + (26, 44) => 69.960397, + (26, 45) => 70.965722, + (26, 46) => 71.968599, + (26, 47) => 72.974246, + (26, 48) => 73.977821, + (26, 49) => 74.984219, + (26, 50) => 75.988631, + (27, 21) => 48.001857, + (27, 23) => 49.981117, + (27, 24) => 50.970647, + (27, 25) => 51.963130224, + (27, 26) => 52.954203277999994, + (27, 27) => 53.948459075, + (27, 28) => 54.941996416, + (27, 29) => 55.939838032, + (27, 30) => 56.936289818999995, + (27, 31) => 57.935751292000006, + (27, 32) => 58.933193523999996, + (27, 33) => 59.933815536, + (27, 34) => 60.932476031, + (27, 35) => 61.934058198, + (27, 36) => 62.93359963, + (27, 37) => 63.935810176, + (27, 38) => 64.93646207100001, + (27, 39) => 65.939442943, + (27, 40) => 66.940609625, + (27, 41) => 67.94455940099999, + (27, 42) => 68.945909, + (27, 43) => 69.9500534, + (27, 44) => 70.952366923, + (27, 45) => 71.956736, + (27, 46) => 72.959238, + (27, 47) => 73.963993, + (27, 48) => 74.967192, + (27, 49) => 75.972453, + (27, 50) => 76.976479, + (27, 51) => 77.983553, + (28, 20) => 48.019515, + (28, 21) => 49.009157, + (28, 22) => 49.996286, + (28, 23) => 50.987493, + (28, 24) => 51.975781, + (28, 25) => 52.96819, + (28, 26) => 53.957833, + (28, 27) => 54.951329846, + (28, 28) => 55.942127761, + (28, 29) => 56.939791394000004, + (28, 30) => 57.93534165, + (28, 31) => 58.934345442, + (28, 32) => 59.930785129, + (28, 33) => 60.931054818999996, + (28, 34) => 61.928344753, + (28, 35) => 62.929669020999995, + (28, 36) => 63.927966228, + (28, 37) => 64.930084585, + (28, 38) => 65.929139333, + (28, 39) => 66.931569413, + (28, 40) => 67.931868787, + (28, 41) => 68.935610267, + (28, 42) => 69.9364313, + (28, 43) => 70.940518962, + (28, 44) => 71.941785924, + (28, 45) => 72.94620668099999, + (28, 46) => 73.947718, + (28, 47) => 74.952506, + (28, 48) => 75.954707, + (28, 49) => 76.959903, + (28, 50) => 77.962555, + (28, 51) => 78.969769, + (28, 52) => 79.975051, + (28, 53) => 80.982727, + (28, 54) => 81.988492, + (29, 24) => 52.985894, + (29, 25) => 53.977198, + (29, 26) => 54.966038, + (29, 27) => 55.958529278, + (29, 28) => 56.949211686, + (29, 29) => 57.944532283, + (29, 30) => 58.939496713, + (29, 31) => 59.937363787, + (29, 32) => 60.933457375, + (29, 33) => 61.932594803, + (29, 34) => 62.929597119, + (29, 35) => 63.929764001, + (29, 36) => 64.927789476, + (29, 37) => 65.928868804, + (29, 38) => 66.92772949, + (29, 39) => 67.929610887, + (29, 40) => 68.929429267, + (29, 41) => 69.93239207799999, + (29, 42) => 70.932676831, + (29, 43) => 71.935820306, + (29, 44) => 72.936674376, + (29, 45) => 73.93987486, + (29, 46) => 74.941523817, + (29, 47) => 75.945268974, + (29, 48) => 76.94754359900001, + (29, 49) => 77.951916524, + (29, 50) => 78.95447309999999, + (29, 51) => 79.960623, + (29, 52) => 80.965743, + (29, 53) => 81.972378, + (29, 54) => 82.97811, + (30, 24) => 53.993879, + (30, 25) => 54.984681, + (30, 26) => 55.972743, + (30, 27) => 56.965056, + (30, 28) => 57.954590296, + (30, 29) => 58.949311886, + (30, 30) => 59.941841317000005, + (30, 31) => 60.939506964, + (30, 32) => 61.934333359, + (30, 33) => 62.93321114, + (30, 34) => 63.929141776, + (30, 35) => 64.929240534, + (30, 36) => 65.926033639, + (30, 37) => 66.927127422, + (30, 38) => 67.924844232, + (30, 39) => 68.92655036, + (30, 40) => 69.925319175, + (30, 41) => 70.927719578, + (30, 42) => 71.926842806, + (30, 43) => 72.92958258, + (30, 44) => 73.92940726, + (30, 45) => 74.932840244, + (30, 46) => 75.933114956, + (30, 47) => 76.93688719699999, + (30, 48) => 77.938289204, + (30, 49) => 78.942638067, + (30, 50) => 79.94455292900001, + (30, 51) => 80.950402617, + (30, 52) => 81.954574097, + (30, 53) => 82.961041, + (30, 54) => 83.965829, + (30, 55) => 84.973054, + (31, 28) => 58.963757, + (31, 29) => 59.957498, + (31, 30) => 60.949398861, + (31, 31) => 61.944189639, + (31, 32) => 62.939294194, + (31, 33) => 63.936840366, + (31, 34) => 64.932734424, + (31, 35) => 65.931589766, + (31, 36) => 66.92820227600001, + (31, 37) => 67.927980161, + (31, 38) => 68.925573528, + (31, 39) => 69.926021914, + (31, 40) => 70.924702554, + (31, 41) => 71.92636745200001, + (31, 42) => 72.92517468000001, + (31, 43) => 73.926945725, + (31, 44) => 74.92650448399999, + (31, 45) => 75.928827624, + (31, 46) => 76.92915429899999, + (31, 47) => 77.931610854, + (31, 48) => 78.932851582, + (31, 49) => 79.93642077300001, + (31, 50) => 80.93813384100001, + (31, 51) => 81.943176531, + (31, 52) => 82.9471203, + (31, 53) => 83.952663, + (31, 54) => 84.957333, + (31, 55) => 85.963757, + (31, 56) => 86.969007, + (32, 27) => 58.982426, + (32, 28) => 59.970445, + (32, 29) => 60.963725, + (32, 30) => 61.954761, + (32, 31) => 62.949628, + (32, 32) => 63.941689912, + (32, 33) => 64.939368136, + (32, 34) => 65.933862124, + (32, 35) => 66.932716999, + (32, 36) => 67.92809530500001, + (32, 37) => 68.927964467, + (32, 38) => 69.924248542, + (32, 39) => 70.92495212, + (32, 40) => 71.922075824, + (32, 41) => 72.923458954, + (32, 42) => 73.92117776, + (32, 43) => 74.92285837, + (32, 44) => 75.921402725, + (32, 45) => 76.92354984299999, + (32, 46) => 77.92285291099999, + (32, 47) => 78.92535950599999, + (32, 48) => 79.925350773, + (32, 49) => 80.928832941, + (32, 50) => 81.92977403100001, + (32, 51) => 82.9345391, + (32, 52) => 83.93757509000001, + (32, 53) => 84.94296965800001, + (32, 54) => 85.946967, + (32, 55) => 86.953204, + (32, 56) => 87.957574, + (32, 57) => 88.96453, + (32, 58) => 89.969436, + (33, 30) => 62.964036, + (33, 31) => 63.95756, + (33, 32) => 64.949611, + (33, 33) => 65.944148778, + (33, 34) => 66.93925111, + (33, 35) => 67.936774127, + (33, 36) => 68.932246289, + (33, 37) => 69.93093464200001, + (33, 38) => 70.92711359399999, + (33, 39) => 71.926752291, + (33, 40) => 72.923829086, + (33, 41) => 73.923928596, + (33, 42) => 74.92159456200001, + (33, 43) => 75.92239201100001, + (33, 44) => 76.920647555, + (33, 45) => 77.921827771, + (33, 46) => 78.920948419, + (33, 47) => 79.92247444, + (33, 48) => 80.922132288, + (33, 49) => 81.924738731, + (33, 50) => 82.9252069, + (33, 51) => 83.92930329000001, + (33, 52) => 84.93216365800001, + (33, 53) => 85.936701532, + (33, 54) => 86.940291716, + (33, 55) => 87.94584, + (33, 56) => 88.950048, + (33, 57) => 89.955995, + (33, 58) => 90.960816, + (33, 59) => 91.967386, + (34, 29) => 62.981911, + (34, 30) => 63.971165, + (34, 31) => 64.964552, + (34, 32) => 65.955276, + (34, 33) => 66.949994, + (34, 34) => 67.941825236, + (34, 35) => 68.939414845, + (34, 36) => 69.933515521, + (34, 37) => 70.93220943099999, + (34, 38) => 71.927140506, + (34, 39) => 72.926754881, + (34, 40) => 73.922475933, + (34, 41) => 74.92252287000001, + (34, 42) => 75.91921370200001, + (34, 43) => 76.91991415000001, + (34, 44) => 77.91730924400001, + (34, 45) => 78.918499252, + (34, 46) => 79.91652176100001, + (34, 47) => 80.917993019, + (34, 48) => 81.916699531, + (34, 49) => 82.919118604, + (34, 50) => 83.918466761, + (34, 51) => 84.92226075800001, + (34, 52) => 85.92431173199999, + (34, 53) => 86.928688616, + (34, 54) => 87.93141749, + (34, 55) => 88.93666905799999, + (34, 56) => 89.940096, + (34, 57) => 90.9457, + (34, 58) => 91.94984, + (34, 59) => 92.956135, + (34, 60) => 93.96049, + (34, 61) => 94.9673, + (35, 32) => 66.965078, + (35, 33) => 67.958356, + (35, 34) => 68.95033841, + (35, 35) => 69.944792321, + (35, 36) => 70.939342153, + (35, 37) => 71.936594606, + (35, 38) => 72.931673441, + (35, 39) => 73.929910279, + (35, 40) => 74.925810566, + (35, 41) => 75.924541574, + (35, 42) => 76.921379193, + (35, 43) => 77.92114585799999, + (35, 44) => 78.918337574, + (35, 45) => 79.918529784, + (35, 46) => 80.916288197, + (35, 47) => 81.916801752, + (35, 48) => 82.91517528499999, + (35, 49) => 83.91649641699999, + (35, 50) => 84.915645758, + (35, 51) => 85.918805432, + (35, 52) => 86.920674016, + (35, 53) => 87.92408329000001, + (35, 54) => 88.926704558, + (35, 55) => 89.931292848, + (35, 56) => 90.934398617, + (35, 57) => 91.939631595, + (35, 58) => 92.94322, + (35, 59) => 93.948846, + (35, 60) => 94.952925, + (35, 61) => 95.95898, + (35, 62) => 96.963499, + (35, 63) => 97.969887, + (36, 31) => 66.983305, + (36, 32) => 67.972489, + (36, 33) => 68.965496, + (36, 34) => 69.955877, + (36, 35) => 70.950265695, + (36, 36) => 71.942092406, + (36, 37) => 72.93928919300001, + (36, 38) => 73.93308401600001, + (36, 39) => 74.930945744, + (36, 40) => 75.925910743, + (36, 41) => 76.924669999, + (36, 42) => 77.920366341, + (36, 43) => 78.920082919, + (36, 44) => 79.91637794, + (36, 45) => 80.916589703, + (36, 46) => 81.91348115368, + (36, 47) => 82.914126516, + (36, 48) => 83.91149772708, + (36, 49) => 84.91252726, + (36, 50) => 85.91061062468, + (36, 51) => 86.913354759, + (36, 52) => 87.914447879, + (36, 53) => 88.917835449, + (36, 54) => 89.91952792900001, + (36, 55) => 90.923806309, + (36, 56) => 91.926173092, + (36, 57) => 92.93114717200001, + (36, 58) => 93.93414045200001, + (36, 59) => 94.939710922, + (36, 60) => 95.943014473, + (36, 61) => 96.949088782, + (36, 62) => 97.952635, + (36, 63) => 98.958776, + (36, 64) => 99.962995, + (36, 65) => 100.969318, + (37, 35) => 71.958851, + (37, 36) => 72.95060450599999, + (37, 37) => 73.944265867, + (37, 38) => 74.93857320000001, + (37, 39) => 75.935073031, + (37, 40) => 76.930401599, + (37, 41) => 77.92814186599999, + (37, 42) => 78.923990095, + (37, 43) => 79.922516442, + (37, 44) => 80.9189939, + (37, 45) => 81.918209023, + (37, 46) => 82.91511418099999, + (37, 47) => 83.91437522300001, + (37, 48) => 84.91178973603999, + (37, 49) => 85.91116744300001, + (37, 50) => 86.909180529, + (37, 51) => 87.91131559, + (37, 52) => 88.91227813600001, + (37, 53) => 89.914797557, + (37, 54) => 90.916537261, + (37, 55) => 91.91972847699999, + (37, 56) => 92.922039334, + (37, 57) => 93.92639481900001, + (37, 58) => 94.92926384900001, + (37, 59) => 95.934133398, + (37, 60) => 96.937177117, + (37, 61) => 97.941632317, + (37, 62) => 98.94511919, + (37, 63) => 99.950331532, + (37, 64) => 100.954302, + (37, 65) => 101.960008, + (37, 66) => 102.964401, + (37, 67) => 103.970531, + (38, 35) => 72.9657, + (38, 36) => 73.95617, + (38, 37) => 74.949952767, + (38, 38) => 75.94176276, + (38, 39) => 76.937945454, + (38, 40) => 77.932179979, + (38, 41) => 78.929704692, + (38, 42) => 79.924517538, + (38, 43) => 80.923211393, + (38, 44) => 81.918399845, + (38, 45) => 82.917554372, + (38, 46) => 83.91341911800001, + (38, 47) => 84.91293204099999, + (38, 48) => 85.90926072473, + (38, 49) => 86.90887749454001, + (38, 50) => 87.905612253, + (38, 51) => 88.907450808, + (38, 52) => 89.90772787, + (38, 53) => 90.910195942, + (38, 54) => 91.911038222, + (38, 55) => 92.914024314, + (38, 56) => 93.915355641, + (38, 57) => 94.919358282, + (38, 58) => 95.921719045, + (38, 59) => 96.926375621, + (38, 60) => 97.92869263600001, + (38, 61) => 98.932883604, + (38, 62) => 99.93578327, + (38, 63) => 100.940606264, + (38, 64) => 101.944004679, + (38, 65) => 102.949243, + (38, 66) => 103.953022, + (38, 67) => 104.959001, + (38, 68) => 105.963177, + (38, 69) => 106.969672, + (39, 37) => 75.958937, + (39, 38) => 76.950146, + (39, 39) => 77.94399, + (39, 40) => 78.937946, + (39, 41) => 79.93435475, + (39, 42) => 80.92945428300001, + (39, 43) => 81.92693018899999, + (39, 44) => 82.92248402599999, + (39, 45) => 83.92067106, + (39, 46) => 84.916433039, + (39, 47) => 85.914886095, + (39, 48) => 86.9108761, + (39, 49) => 87.90950127400001, + (39, 50) => 88.905838156, + (39, 51) => 89.907141749, + (39, 52) => 90.90729804799999, + (39, 53) => 91.90894575200001, + (39, 54) => 92.909578434, + (39, 55) => 93.91159206200001, + (39, 56) => 94.912819697, + (39, 57) => 95.91590930500001, + (39, 58) => 96.918286702, + (39, 59) => 97.922394841, + (39, 60) => 98.924160839, + (39, 61) => 99.927727678, + (39, 62) => 100.930160817, + (39, 63) => 101.934328471, + (39, 64) => 102.937243796, + (39, 65) => 103.941943, + (39, 66) => 104.945711, + (39, 67) => 105.950842, + (39, 68) => 106.954943, + (39, 69) => 107.960515, + (39, 70) => 108.965131, + (40, 37) => 76.966076, + (40, 38) => 77.956146, + (40, 39) => 78.94979, + (40, 40) => 79.941213, + (40, 41) => 80.938245, + (40, 42) => 81.93170749699999, + (40, 43) => 82.929240926, + (40, 44) => 83.923325663, + (40, 45) => 84.921443199, + (40, 46) => 85.91629681399999, + (40, 47) => 86.914817338, + (40, 48) => 87.91022071500001, + (40, 49) => 88.908879751, + (40, 50) => 89.904698755, + (40, 51) => 90.905640205, + (40, 52) => 91.905035336, + (40, 53) => 92.906470661, + (40, 54) => 93.906312523, + (40, 55) => 94.908040276, + (40, 56) => 95.90827761499999, + (40, 57) => 96.910963802, + (40, 58) => 97.912740448, + (40, 59) => 98.916675081, + (40, 60) => 99.918010499, + (40, 61) => 100.921458454, + (40, 62) => 101.923154181, + (40, 63) => 102.927204054, + (40, 64) => 103.92944919300001, + (40, 65) => 104.934021832, + (40, 66) => 105.93693, + (40, 67) => 106.942007, + (40, 68) => 107.945303, + (40, 69) => 108.950907, + (40, 70) => 109.954675, + (40, 71) => 110.960837, + (40, 72) => 111.965196, + (40, 73) => 112.971723, + (41, 40) => 80.95023, + (41, 41) => 81.94438, + (41, 42) => 82.93815, + (41, 43) => 83.934305711, + (41, 44) => 84.928845836, + (41, 45) => 85.925781536, + (41, 46) => 86.920692473, + (41, 47) => 87.918226476, + (41, 48) => 88.913444696, + (41, 49) => 89.91125920100001, + (41, 50) => 90.906990256, + (41, 51) => 91.90718858, + (41, 52) => 92.90637317, + (41, 53) => 93.907279001, + (41, 54) => 94.90683111, + (41, 55) => 95.908101586, + (41, 56) => 96.90810162199999, + (41, 57) => 97.910332645, + (41, 58) => 98.911609377, + (41, 59) => 99.914340578, + (41, 60) => 100.915306508, + (41, 61) => 101.918090447, + (41, 62) => 102.919453416, + (41, 63) => 103.922907728, + (41, 64) => 104.92494257700001, + (41, 65) => 105.928928505, + (41, 66) => 106.931589685, + (41, 67) => 107.936075604, + (41, 68) => 108.939141, + (41, 69) => 109.943843, + (41, 70) => 110.947439, + (41, 71) => 111.952689, + (41, 72) => 112.956833, + (41, 73) => 113.962469, + (41, 74) => 114.966849, + (41, 75) => 115.972914, + (42, 39) => 80.966226, + (42, 40) => 81.956661, + (42, 41) => 82.950252, + (42, 42) => 83.941846, + (42, 43) => 84.938260736, + (42, 44) => 85.93117409199999, + (42, 45) => 86.928196198, + (42, 46) => 87.921967779, + (42, 47) => 88.91946814900001, + (42, 48) => 89.91393126999999, + (42, 49) => 90.91174518999999, + (42, 50) => 91.906807153, + (42, 51) => 92.906808772, + (42, 52) => 93.90508358599999, + (42, 53) => 94.905837436, + (42, 54) => 95.90467477, + (42, 55) => 96.906016903, + (42, 56) => 97.905403609, + (42, 57) => 98.907707299, + (42, 58) => 99.907467982, + (42, 59) => 100.910337648, + (42, 60) => 101.91029372499999, + (42, 61) => 102.913091954, + (42, 62) => 103.913747443, + (42, 63) => 104.91698198899999, + (42, 64) => 105.918273231, + (42, 65) => 106.92211977, + (42, 66) => 107.924047508, + (42, 67) => 108.928438318, + (42, 68) => 109.930717956, + (42, 69) => 110.93565196600001, + (42, 70) => 111.938293, + (42, 71) => 112.943478, + (42, 72) => 113.946666, + (42, 73) => 114.952174, + (42, 74) => 115.955759, + (42, 75) => 116.961686, + (42, 76) => 117.965249, + (42, 77) => 118.971465, + (43, 42) => 84.950778, + (43, 43) => 85.944637, + (43, 44) => 86.93806718500001, + (43, 45) => 87.93379421099999, + (43, 46) => 88.927648649, + (43, 47) => 89.924073919, + (43, 48) => 90.918424972, + (43, 49) => 91.91526977699999, + (43, 50) => 92.910245147, + (43, 51) => 93.909652319, + (43, 52) => 94.907652281, + (43, 53) => 95.907866675, + (43, 54) => 96.90636072, + (43, 55) => 97.907211206, + (43, 56) => 98.90624968099999, + (43, 57) => 99.907652715, + (43, 58) => 100.907305271, + (43, 59) => 101.909207239, + (43, 60) => 102.90917395999999, + (43, 61) => 103.911433718, + (43, 62) => 104.91166202400001, + (43, 63) => 105.91435667399999, + (43, 64) => 106.91545843700001, + (43, 65) => 107.918493493, + (43, 66) => 108.92025410699999, + (43, 67) => 109.923741263, + (43, 68) => 110.925898966, + (43, 69) => 111.929941658, + (43, 70) => 112.932569032, + (43, 71) => 113.93709, + (43, 72) => 114.9401, + (43, 73) => 115.94502, + (43, 74) => 116.94832, + (43, 75) => 117.953526, + (43, 76) => 118.956876, + (43, 77) => 119.962426, + (43, 78) => 120.96614, + (43, 79) => 121.97176, + (44, 41) => 84.967117, + (44, 42) => 85.957305, + (44, 43) => 86.950907, + (44, 44) => 87.941664, + (44, 45) => 88.937337849, + (44, 46) => 89.930344378, + (44, 47) => 90.92674153, + (44, 48) => 91.920234373, + (44, 49) => 92.917104442, + (44, 50) => 93.91134286, + (44, 51) => 94.910404415, + (44, 52) => 95.90758891, + (44, 53) => 96.90754577599999, + (44, 54) => 97.90528670900001, + (44, 55) => 98.905930284, + (44, 56) => 99.90421045999999, + (44, 57) => 100.90557308599999, + (44, 58) => 101.904340312, + (44, 59) => 102.906314846, + (44, 60) => 103.905425312, + (44, 61) => 104.907745478, + (44, 62) => 105.907328181, + (44, 63) => 106.90996983699999, + (44, 64) => 107.910185793, + (44, 65) => 108.913323707, + (44, 66) => 109.91403850100001, + (44, 67) => 110.917567566, + (44, 68) => 111.918806922, + (44, 69) => 112.922846729, + (44, 70) => 113.92461443, + (44, 71) => 114.929033049, + (44, 72) => 115.931219191, + (44, 73) => 116.936135, + (44, 74) => 117.938808, + (44, 75) => 118.94409, + (44, 76) => 119.946623, + (44, 77) => 120.952098, + (44, 78) => 121.955147, + (44, 79) => 122.960762, + (44, 80) => 123.96394, + (44, 81) => 124.969544, + (45, 44) => 88.950992, + (45, 45) => 89.944569, + (45, 46) => 90.937123, + (45, 47) => 91.932367692, + (45, 48) => 92.925912778, + (45, 49) => 93.92173045, + (45, 50) => 94.91589789300001, + (45, 51) => 95.914451705, + (45, 52) => 96.91132787199999, + (45, 53) => 97.910707734, + (45, 54) => 98.908121241, + (45, 55) => 99.908114147, + (45, 56) => 100.90615890299999, + (45, 57) => 101.906834282, + (45, 58) => 102.905494081, + (45, 59) => 103.906645309, + (45, 60) => 104.905687787, + (45, 61) => 105.907285879, + (45, 62) => 106.90674797499999, + (45, 63) => 107.90871530400001, + (45, 64) => 108.90874955500001, + (45, 65) => 109.91107974500001, + (45, 66) => 110.91164316400001, + (45, 67) => 111.914405199, + (45, 68) => 112.915440212, + (45, 69) => 113.91872168, + (45, 70) => 114.920311649, + (45, 71) => 115.92406206, + (45, 72) => 116.92603629099999, + (45, 73) => 117.930341116, + (45, 74) => 118.93255695100001, + (45, 75) => 119.937069, + (45, 76) => 120.939613, + (45, 77) => 121.944305, + (45, 78) => 122.947192, + (45, 79) => 123.952002, + (45, 80) => 124.955094, + (45, 81) => 125.960064, + (45, 82) => 126.963789, + (45, 83) => 127.970649, + (46, 44) => 89.95737, + (46, 45) => 90.950435, + (46, 46) => 91.941192225, + (46, 47) => 92.936680426, + (46, 48) => 93.929036286, + (46, 49) => 94.924888506, + (46, 50) => 95.918213739, + (46, 51) => 96.916471985, + (46, 52) => 97.91269833499999, + (46, 53) => 98.91177307299999, + (46, 54) => 99.908520438, + (46, 55) => 100.908284824, + (46, 56) => 101.90563229199999, + (46, 57) => 102.906111074, + (46, 58) => 103.90403039300001, + (46, 59) => 104.90507947900001, + (46, 60) => 105.903480287, + (46, 61) => 106.905128058, + (46, 62) => 107.90389180599999, + (46, 63) => 108.90595057600001, + (46, 64) => 109.905172878, + (46, 65) => 110.907690358, + (46, 66) => 111.907330557, + (46, 67) => 112.910261912, + (46, 68) => 113.91036943, + (46, 69) => 114.913659333, + (46, 70) => 115.91429787199999, + (46, 71) => 116.91795558400001, + (46, 72) => 117.919067273, + (46, 73) => 118.923341138, + (46, 74) => 119.924551745, + (46, 75) => 120.928950342, + (46, 76) => 121.93063169300001, + (46, 77) => 122.935126, + (46, 78) => 123.937305, + (46, 79) => 124.942072, + (46, 80) => 125.944401, + (46, 81) => 126.949307, + (46, 82) => 127.952345, + (46, 83) => 128.959334, + (46, 84) => 129.964863, + (46, 85) => 130.972367, + (47, 45) => 91.95971, + (47, 46) => 92.950188, + (47, 47) => 93.943744, + (47, 48) => 94.935688, + (47, 49) => 95.93074390299999, + (47, 50) => 96.9238814, + (47, 51) => 97.92155997, + (47, 52) => 98.917645766, + (47, 53) => 99.91611544300001, + (47, 54) => 100.912683951, + (47, 55) => 101.91170453800001, + (47, 56) => 102.908960558, + (47, 57) => 103.908623715, + (47, 58) => 104.906525604, + (47, 59) => 105.906663499, + (47, 60) => 106.905091509, + (47, 61) => 107.905950245, + (47, 62) => 108.904755778, + (47, 63) => 109.906110724, + (47, 64) => 110.905296827, + (47, 65) => 111.90704854799999, + (47, 66) => 112.906572865, + (47, 67) => 113.908823029, + (47, 68) => 114.908767445, + (47, 69) => 115.911386809, + (47, 70) => 116.911774086, + (47, 71) => 117.914595484, + (47, 72) => 118.915570309, + (47, 73) => 119.918784765, + (47, 74) => 120.920125279, + (47, 75) => 121.92366444599999, + (47, 76) => 122.92531506, + (47, 77) => 123.928899227, + (47, 78) => 124.930735, + (47, 79) => 125.934814, + (47, 80) => 126.937037, + (47, 81) => 127.941266, + (47, 82) => 128.944315, + (47, 83) => 129.950727, + (47, 84) => 130.956253, + (47, 85) => 131.96307, + (48, 46) => 93.956586, + (48, 47) => 94.949483, + (48, 48) => 95.940341, + (48, 49) => 96.934799343, + (48, 50) => 97.927389315, + (48, 51) => 98.924925845, + (48, 52) => 99.92034882899999, + (48, 53) => 100.91858620900001, + (48, 54) => 101.91448179700001, + (48, 55) => 102.91341692200001, + (48, 56) => 103.909856228, + (48, 57) => 104.90946389300001, + (48, 58) => 105.90645979099999, + (48, 59) => 106.90661204899999, + (48, 60) => 107.904183588, + (48, 61) => 108.904986697, + (48, 62) => 109.90300747, + (48, 63) => 110.904183776, + (48, 64) => 111.902763896, + (48, 65) => 112.904408105, + (48, 66) => 113.903364998, + (48, 67) => 114.905437426, + (48, 68) => 115.90476323, + (48, 69) => 116.90722603900001, + (48, 70) => 117.906921956, + (48, 71) => 118.909847052, + (48, 72) => 119.909868065, + (48, 73) => 120.91296366, + (48, 74) => 121.91345905, + (48, 75) => 122.91689246, + (48, 76) => 123.917659772, + (48, 77) => 124.92125759000001, + (48, 78) => 125.92243029000001, + (48, 79) => 126.926203291, + (48, 80) => 127.927816778, + (48, 81) => 128.93223559700002, + (48, 82) => 129.934387563, + (48, 83) => 130.94072774, + (48, 84) => 131.945823136, + (48, 85) => 132.952614, + (48, 86) => 133.957638, + (49, 47) => 95.959109, + (49, 48) => 96.949125, + (49, 49) => 97.942129, + (49, 50) => 98.93411, + (49, 51) => 99.93110192900001, + (49, 52) => 100.926414025, + (49, 53) => 101.924105911, + (49, 54) => 102.91987883, + (49, 55) => 103.918214538, + (49, 56) => 104.91450232199999, + (49, 57) => 105.913463596, + (49, 58) => 106.910287497, + (49, 59) => 107.909693654, + (49, 60) => 108.907149679, + (49, 61) => 109.907170674, + (49, 62) => 110.905107236, + (49, 63) => 111.90553871799999, + (49, 64) => 112.904060451, + (49, 65) => 113.904916405, + (49, 66) => 114.903878772, + (49, 67) => 115.905259992, + (49, 68) => 116.904515729, + (49, 69) => 117.906356705, + (49, 70) => 118.905851622, + (49, 71) => 119.90796748899999, + (49, 72) => 120.90785277799999, + (49, 73) => 121.910282458, + (49, 74) => 122.910435252, + (49, 75) => 123.91318487299999, + (49, 76) => 124.913673841, + (49, 77) => 125.916468202, + (49, 78) => 126.91746604000001, + (49, 79) => 127.92035363699999, + (49, 80) => 128.921808534, + (49, 81) => 129.924952257, + (49, 82) => 130.926972839, + (49, 83) => 131.932998444, + (49, 84) => 132.938067, + (49, 85) => 133.944208, + (49, 86) => 134.949425, + (49, 87) => 135.956017, + (49, 88) => 136.961535, + (50, 49) => 98.948495, + (50, 50) => 99.93864894400001, + (50, 51) => 100.93525925200001, + (50, 52) => 101.930289525, + (50, 53) => 102.927973, + (50, 54) => 103.92310519499999, + (50, 55) => 104.92126842100001, + (50, 56) => 105.916957394, + (50, 57) => 106.915713649, + (50, 58) => 107.91189429, + (50, 59) => 108.91129285699999, + (50, 60) => 109.90784483499999, + (50, 61) => 110.90774114300001, + (50, 62) => 111.904824894, + (50, 63) => 112.90517585699999, + (50, 64) => 113.90278013, + (50, 65) => 114.90334469499999, + (50, 66) => 115.901742825, + (50, 67) => 116.902954036, + (50, 68) => 117.90160662999999, + (50, 69) => 118.903311266, + (50, 70) => 119.902202557, + (50, 71) => 120.904243488, + (50, 72) => 121.903445494, + (50, 73) => 122.905727065, + (50, 74) => 123.905279619, + (50, 75) => 124.90778937, + (50, 76) => 125.907658958, + (50, 77) => 126.910391726, + (50, 78) => 127.910507828, + (50, 79) => 128.91348244, + (50, 80) => 129.913974531, + (50, 81) => 130.917053067, + (50, 82) => 131.917823898, + (50, 83) => 132.923913753, + (50, 84) => 133.92868043000001, + (50, 85) => 134.934908603, + (50, 86) => 135.939699, + (50, 87) => 136.946162, + (50, 88) => 137.951143, + (50, 89) => 138.957799, + (50, 90) => 139.962973, + (51, 52) => 102.939162, + (51, 53) => 103.936344, + (51, 54) => 104.93127654700001, + (51, 55) => 105.928637979, + (51, 56) => 106.92415062100001, + (51, 57) => 107.92222673100001, + (51, 58) => 108.91814120299999, + (51, 59) => 109.916854283, + (51, 60) => 110.91321818700001, + (51, 61) => 111.912399903, + (51, 62) => 112.909374664, + (51, 63) => 113.909289155, + (51, 64) => 114.906598, + (51, 65) => 115.906792732, + (51, 66) => 116.90484151899999, + (51, 67) => 117.905532194, + (51, 68) => 118.90394406200001, + (51, 69) => 119.905080308, + (51, 70) => 120.903811353, + (51, 71) => 121.905169335, + (51, 72) => 122.90421529199999, + (51, 73) => 123.905937065, + (51, 74) => 124.90525426399999, + (51, 75) => 125.907253158, + (51, 76) => 126.906925557, + (51, 77) => 127.909146121, + (51, 78) => 128.909146623, + (51, 79) => 129.911662686, + (51, 80) => 130.911989339, + (51, 81) => 131.914508013, + (51, 82) => 132.915272128, + (51, 83) => 133.92053733400002, + (51, 84) => 134.925184354, + (51, 85) => 135.930749009, + (51, 86) => 136.935522519, + (51, 87) => 137.941331, + (51, 88) => 138.946269, + (51, 89) => 139.952345, + (51, 90) => 140.957552, + (51, 91) => 141.963918, + (52, 52) => 103.94672340800001, + (52, 53) => 104.943304516, + (52, 54) => 105.937498521, + (52, 55) => 106.934882, + (52, 56) => 107.929380469, + (52, 57) => 108.92730453200001, + (52, 58) => 109.922458102, + (52, 59) => 110.921000587, + (52, 60) => 111.91672784800001, + (52, 61) => 112.915891, + (52, 62) => 113.91208782, + (52, 63) => 114.911902, + (52, 64) => 115.908465558, + (52, 65) => 116.90864622699999, + (52, 66) => 117.905860104, + (52, 67) => 118.906405699, + (52, 68) => 119.90406577899999, + (52, 69) => 120.90494506499999, + (52, 70) => 121.90304470800001, + (52, 71) => 122.904271022, + (52, 72) => 123.902818341, + (52, 73) => 124.90443117800001, + (52, 74) => 125.903312144, + (52, 75) => 126.905226993, + (52, 76) => 127.904461237, + (52, 77) => 128.906596419, + (52, 78) => 129.906222745, + (52, 79) => 130.90852221, + (52, 80) => 131.908546713, + (52, 81) => 132.91096333, + (52, 82) => 133.911396376, + (52, 83) => 134.916554715, + (52, 84) => 135.92010118000002, + (52, 85) => 136.925599354, + (52, 86) => 137.929472452, + (52, 87) => 138.935367191, + (52, 88) => 139.939487057, + (52, 89) => 140.945604, + (52, 90) => 141.950027, + (52, 91) => 142.956489, + (52, 92) => 143.961116, + (52, 93) => 144.967783, + (53, 55) => 107.943348, + (53, 56) => 108.938086022, + (53, 57) => 109.935085102, + (53, 58) => 110.930269236, + (53, 59) => 111.92800454799999, + (53, 60) => 112.92365006200001, + (53, 61) => 113.92201890000001, + (53, 62) => 114.918048, + (53, 63) => 115.916885513, + (53, 64) => 116.913645649, + (53, 65) => 117.913074, + (53, 66) => 118.91006091, + (53, 67) => 119.910093729, + (53, 68) => 120.907411492, + (53, 69) => 121.907590094, + (53, 70) => 122.905589753, + (53, 71) => 123.906210297, + (53, 72) => 124.90463061, + (53, 73) => 125.905624205, + (53, 74) => 126.90447259199999, + (53, 75) => 127.905809355, + (53, 76) => 128.904983643, + (53, 77) => 129.906670168, + (53, 78) => 130.906126375, + (53, 79) => 131.907993511, + (53, 80) => 132.9078284, + (53, 81) => 133.90977566, + (53, 82) => 134.910059355, + (53, 83) => 135.914604693, + (53, 84) => 136.91802817800001, + (53, 85) => 137.922726392, + (53, 86) => 138.9264934, + (53, 87) => 139.931715914, + (53, 88) => 140.935666081, + (53, 89) => 141.941166595, + (53, 90) => 142.945475, + (53, 91) => 143.951336, + (53, 92) => 144.955845, + (53, 93) => 145.961846, + (53, 94) => 146.966505, + (54, 54) => 107.954232285, + (54, 55) => 108.95043495499999, + (54, 56) => 109.94425875900001, + (54, 57) => 110.94147, + (54, 58) => 111.935559068, + (54, 59) => 112.933221663, + (54, 60) => 113.927980329, + (54, 61) => 114.926293943, + (54, 62) => 115.921580955, + (54, 63) => 116.920358758, + (54, 64) => 117.91617867800001, + (54, 65) => 118.91541064100001, + (54, 66) => 119.911784267, + (54, 67) => 120.911453012, + (54, 68) => 121.908367655, + (54, 69) => 122.908482235, + (54, 70) => 123.90588517399999, + (54, 71) => 124.90638764, + (54, 72) => 125.904297422, + (54, 73) => 126.905183636, + (54, 74) => 127.90353075341, + (54, 75) => 128.90478085742, + (54, 76) => 129.903509346, + (54, 77) => 130.90508412808, + (54, 78) => 131.90415508346, + (54, 79) => 132.905910748, + (54, 80) => 133.90539303, + (54, 81) => 134.90723144100002, + (54, 82) => 135.907214474, + (54, 83) => 136.911557771, + (54, 84) => 137.914146268, + (54, 85) => 138.91879219999998, + (54, 86) => 139.92164581400002, + (54, 87) => 140.92678718099998, + (54, 88) => 141.929973095, + (54, 89) => 142.93536955000002, + (54, 90) => 143.938945076, + (54, 91) => 144.944719631, + (54, 92) => 145.948518245, + (54, 93) => 146.954482, + (54, 94) => 147.958508, + (54, 95) => 148.964573, + (54, 96) => 149.968878, + (55, 57) => 111.950172, + (55, 58) => 112.944428484, + (55, 59) => 113.941292244, + (55, 60) => 114.93591, + (55, 61) => 115.933395, + (55, 62) => 116.928616723, + (55, 63) => 117.926559517, + (55, 64) => 118.922377327, + (55, 65) => 119.920677277, + (55, 66) => 120.917227235, + (55, 67) => 121.91610814399999, + (55, 68) => 122.91299606, + (55, 69) => 123.912247366, + (55, 70) => 124.90972595299999, + (55, 71) => 125.90944582099999, + (55, 72) => 126.90741752699999, + (55, 73) => 127.907748452, + (55, 74) => 128.90606591, + (55, 75) => 129.906709281, + (55, 76) => 130.905468457, + (55, 77) => 131.90643774, + (55, 78) => 132.90545195800001, + (55, 79) => 133.906718501, + (55, 80) => 134.905976907, + (55, 81) => 135.90731143099998, + (55, 82) => 136.907089296, + (55, 83) => 137.91101711899998, + (55, 84) => 138.913363822, + (55, 85) => 139.917283707, + (55, 86) => 140.92004527900002, + (55, 87) => 141.924299514, + (55, 88) => 142.92734734599998, + (55, 89) => 143.932075402, + (55, 90) => 144.93552892699998, + (55, 91) => 145.940621867, + (55, 92) => 146.944261512, + (55, 93) => 147.949639026, + (55, 94) => 148.953516, + (55, 95) => 149.959023, + (55, 96) => 150.963199, + (55, 97) => 151.968728, + (56, 58) => 113.950718489, + (56, 59) => 114.947482, + (56, 60) => 115.941621, + (56, 61) => 116.938316403, + (56, 62) => 117.933226, + (56, 63) => 118.930659683, + (56, 64) => 119.92604499699999, + (56, 65) => 120.924052286, + (56, 66) => 121.919904, + (56, 67) => 122.91878106, + (56, 68) => 123.915093627, + (56, 69) => 124.91447184, + (56, 70) => 125.911250202, + (56, 71) => 126.911091272, + (56, 72) => 127.908352446, + (56, 73) => 128.908683409, + (56, 74) => 129.90632600200001, + (56, 75) => 130.906946315, + (56, 76) => 131.90506123100002, + (56, 77) => 132.906007443, + (56, 78) => 133.904508249, + (56, 79) => 134.905688447, + (56, 80) => 135.9045758, + (56, 81) => 136.905827207, + (56, 82) => 137.90524705899998, + (56, 83) => 138.908841164, + (56, 84) => 139.910608231, + (56, 85) => 140.914403653, + (56, 86) => 141.916432904, + (56, 87) => 142.920625149, + (56, 88) => 143.92295482100002, + (56, 89) => 144.9275184, + (56, 90) => 145.9303632, + (56, 91) => 146.9353039, + (56, 92) => 147.938223, + (56, 93) => 148.943284, + (56, 94) => 149.9464411, + (56, 95) => 150.951755, + (56, 96) => 151.95533, + (56, 97) => 152.960848, + (56, 98) => 153.964659, + (57, 60) => 116.950326, + (57, 63) => 119.938196, + (57, 64) => 120.933236, + (57, 65) => 121.93071, + (57, 66) => 122.9263, + (57, 67) => 123.92457427500001, + (57, 68) => 124.92081593099999, + (57, 69) => 125.91951266699999, + (57, 70) => 126.916375083, + (57, 71) => 127.915592123, + (57, 72) => 128.912695592, + (57, 73) => 129.912369413, + (57, 74) => 130.91007, + (57, 75) => 131.910119047, + (57, 76) => 132.908218, + (57, 77) => 133.908514011, + (57, 78) => 134.906984427, + (57, 79) => 135.907634962, + (57, 80) => 136.906450438, + (57, 81) => 137.907124041, + (57, 82) => 138.90636292699998, + (57, 83) => 139.90948728499998, + (57, 84) => 140.910971155, + (57, 85) => 141.91409076, + (57, 86) => 142.916079482, + (57, 87) => 143.919645589, + (57, 88) => 144.921808065, + (57, 89) => 145.925688017, + (57, 90) => 146.9284178, + (57, 91) => 147.9326794, + (57, 92) => 148.93535125900002, + (57, 93) => 149.9395475, + (57, 94) => 150.942769, + (57, 95) => 151.947085, + (57, 96) => 152.950553, + (57, 97) => 153.955416, + (57, 98) => 154.95928, + (57, 99) => 155.964519, + (57, 100) => 156.968792, + (58, 63) => 120.943435, + (58, 64) => 121.93787, + (58, 65) => 122.93528, + (58, 66) => 123.93031, + (58, 67) => 124.92844, + (58, 68) => 125.923971, + (58, 69) => 126.922727, + (58, 70) => 127.918911, + (58, 71) => 128.918102, + (58, 72) => 129.914736, + (58, 73) => 130.914429465, + (58, 74) => 131.911466226, + (58, 75) => 132.911520402, + (58, 76) => 133.908928142, + (58, 77) => 134.909160662, + (58, 78) => 135.90712925600002, + (58, 79) => 136.907762416, + (58, 80) => 137.90599418, + (58, 81) => 138.90664702900003, + (58, 82) => 139.905448433, + (58, 83) => 140.90828599099999, + (58, 84) => 141.909250208, + (58, 85) => 142.912391953, + (58, 86) => 143.91365276300002, + (58, 87) => 144.917265113, + (58, 88) => 145.918812294, + (58, 89) => 146.9226899, + (58, 90) => 147.92442418599998, + (58, 91) => 148.9284269, + (58, 92) => 149.930384032, + (58, 93) => 150.93427219999998, + (58, 94) => 151.936682, + (58, 95) => 152.941052, + (58, 96) => 153.94394, + (58, 97) => 154.948706, + (58, 98) => 155.951884, + (58, 99) => 156.957133, + (58, 100) => 157.960773, + (59, 62) => 120.955393, + (59, 65) => 123.94294, + (59, 66) => 124.937659, + (59, 67) => 125.93524, + (59, 68) => 126.93071, + (59, 69) => 127.928791, + (59, 70) => 128.925095, + (59, 71) => 129.92359, + (59, 72) => 130.92023496, + (59, 73) => 131.91924, + (59, 74) => 132.916330558, + (59, 75) => 133.915696729, + (59, 76) => 134.913111772, + (59, 77) => 135.91267747, + (59, 78) => 136.91067918299998, + (59, 79) => 137.910757495, + (59, 80) => 138.90893269999998, + (59, 81) => 139.9090856, + (59, 82) => 140.907659604, + (59, 83) => 141.91005163999998, + (59, 84) => 142.91082262400002, + (59, 85) => 143.913310682, + (59, 86) => 144.91451798699998, + (59, 87) => 145.91768763, + (59, 88) => 146.919007438, + (59, 89) => 147.922129992, + (59, 90) => 148.92373609999999, + (59, 91) => 149.926676391, + (59, 92) => 150.92830906600003, + (59, 93) => 151.9315529, + (59, 94) => 152.933903511, + (59, 95) => 153.93788516499998, + (59, 96) => 154.940509193, + (59, 97) => 155.94476690000002, + (59, 98) => 156.9480031, + (59, 99) => 157.952603, + (59, 100) => 158.956232, + (59, 101) => 159.961138, + (59, 102) => 160.965121, + (60, 65) => 124.948395, + (60, 66) => 125.942694, + (60, 67) => 126.939978, + (60, 68) => 127.935018, + (60, 69) => 128.933038, + (60, 70) => 129.928506, + (60, 71) => 130.92724802, + (60, 72) => 131.923321237, + (60, 73) => 132.922348, + (60, 74) => 133.918790207, + (60, 75) => 134.918181318, + (60, 76) => 135.91497606099998, + (60, 77) => 136.91456309900002, + (60, 78) => 137.911950938, + (60, 79) => 138.911951208, + (60, 80) => 139.90954613, + (60, 81) => 140.90961669, + (60, 82) => 141.907728824, + (60, 83) => 142.909819815, + (60, 84) => 143.910092798, + (60, 85) => 144.912579151, + (60, 86) => 145.913122459, + (60, 87) => 146.916105969, + (60, 88) => 147.916899027, + (60, 89) => 148.920154583, + (60, 90) => 149.920901322, + (60, 91) => 150.923839363, + (60, 92) => 151.92469124200002, + (60, 93) => 152.927717868, + (60, 94) => 153.92959740400002, + (60, 95) => 154.93313559799998, + (60, 96) => 155.935370358, + (60, 97) => 156.939351074, + (60, 98) => 157.94220562, + (60, 99) => 158.946619085, + (60, 100) => 159.949839172, + (60, 101) => 160.954664, + (60, 102) => 161.958121, + (60, 103) => 162.963414, + (61, 67) => 127.948234, + (61, 68) => 128.942909, + (61, 69) => 129.940451, + (61, 70) => 130.935834, + (61, 71) => 131.93384, + (61, 72) => 132.929782, + (61, 73) => 133.928326, + (61, 74) => 134.924785, + (61, 75) => 135.923595949, + (61, 76) => 136.920479519, + (61, 77) => 137.919576119, + (61, 78) => 138.91679922799997, + (61, 79) => 139.916035918, + (61, 80) => 140.913555081, + (61, 81) => 141.912890982, + (61, 82) => 142.91093806799998, + (61, 83) => 143.912596208, + (61, 84) => 144.912755748, + (61, 85) => 145.91470224, + (61, 86) => 146.91514494400002, + (61, 87) => 147.91748109099998, + (61, 88) => 148.918341507, + (61, 89) => 149.920990014, + (61, 90) => 150.921216613, + (61, 91) => 151.923505185, + (61, 92) => 152.92415625200002, + (61, 93) => 153.926712791, + (61, 94) => 154.928136951, + (61, 95) => 155.93111405899998, + (61, 96) => 156.933121298, + (61, 97) => 157.936546948, + (61, 98) => 158.939286409, + (61, 99) => 159.943215272, + (61, 100) => 160.946229837, + (61, 101) => 161.950574, + (61, 102) => 162.953881, + (61, 103) => 163.958819, + (61, 104) => 164.96278, + (62, 67) => 128.954557, + (62, 68) => 129.948792, + (62, 69) => 130.946022, + (62, 70) => 131.940805, + (62, 71) => 132.93856, + (62, 72) => 133.93411, + (62, 73) => 134.93252, + (62, 74) => 135.928275553, + (62, 75) => 136.92700795899998, + (62, 76) => 137.923243988, + (62, 77) => 138.92229663100002, + (62, 78) => 139.91899471399998, + (62, 79) => 140.918481545, + (62, 80) => 141.915209415, + (62, 81) => 142.914634848, + (62, 82) => 143.912006285, + (62, 83) => 144.913417157, + (62, 84) => 145.91304683500002, + (62, 85) => 146.914904401, + (62, 86) => 147.914829233, + (62, 87) => 148.917191211, + (62, 88) => 149.917281993, + (62, 89) => 150.91993885899998, + (62, 90) => 151.91973864599998, + (62, 91) => 152.922103576, + (62, 92) => 153.922215756, + (62, 93) => 154.92464664500002, + (62, 94) => 155.92553819100002, + (62, 95) => 156.92841859799998, + (62, 96) => 157.929949262, + (62, 97) => 158.93321713, + (62, 98) => 159.935337032, + (62, 99) => 160.939160062, + (62, 100) => 161.941621687, + (62, 101) => 162.945679085, + (62, 102) => 163.948550061, + (62, 103) => 164.95329, + (62, 104) => 165.956575, + (62, 105) => 166.962072, + (62, 106) => 167.966033, + (63, 67) => 129.964022, + (63, 68) => 130.957634, + (63, 69) => 131.954696, + (63, 71) => 133.946537, + (63, 72) => 134.94187, + (63, 73) => 135.93962, + (63, 74) => 136.935430719, + (63, 75) => 137.933709, + (63, 76) => 138.929792307, + (63, 77) => 139.928087633, + (63, 78) => 140.92493173399998, + (63, 79) => 141.923446719, + (63, 80) => 142.920298678, + (63, 81) => 143.918819481, + (63, 82) => 144.91627265900001, + (63, 83) => 145.917210852, + (63, 84) => 146.91675244, + (63, 85) => 147.918091288, + (63, 86) => 148.917936875, + (63, 87) => 149.919707092, + (63, 88) => 150.919856606, + (63, 89) => 151.92175097999998, + (63, 90) => 152.921236789, + (63, 91) => 153.922985699, + (63, 92) => 154.922899847, + (63, 93) => 155.924762976, + (63, 94) => 156.925432556, + (63, 95) => 157.927782192, + (63, 96) => 158.929099512, + (63, 97) => 159.931836982, + (63, 98) => 160.933663991, + (63, 99) => 161.936958329, + (63, 100) => 162.93926550999998, + (63, 101) => 163.942852943, + (63, 102) => 164.94554007, + (63, 103) => 165.949813, + (63, 104) => 166.953011, + (63, 105) => 167.957863, + (63, 106) => 168.961717, + (64, 70) => 133.955416, + (64, 71) => 134.952496, + (64, 72) => 135.9473, + (64, 73) => 136.94502, + (64, 74) => 137.940247, + (64, 75) => 138.93813, + (64, 76) => 139.933674, + (64, 77) => 140.932126, + (64, 78) => 141.928116, + (64, 79) => 142.926750678, + (64, 80) => 143.922963, + (64, 81) => 144.921710051, + (64, 82) => 145.918318513, + (64, 83) => 146.919101014, + (64, 84) => 147.918121414, + (64, 85) => 148.91934766600002, + (64, 86) => 149.918663949, + (64, 87) => 150.920354922, + (64, 88) => 151.919798414, + (64, 89) => 152.921756945, + (64, 90) => 153.92087297400002, + (64, 91) => 154.92262935600002, + (64, 92) => 155.92213012, + (64, 93) => 156.92396742399998, + (64, 94) => 157.9241112, + (64, 95) => 158.926395822, + (64, 96) => 159.927061202, + (64, 97) => 160.929676267, + (64, 98) => 161.930991812, + (64, 99) => 162.93409663999998, + (64, 100) => 163.935916193, + (64, 101) => 164.93931708000002, + (64, 102) => 165.94163041299998, + (64, 103) => 166.945490012, + (64, 104) => 167.948309, + (64, 105) => 168.952882, + (64, 106) => 169.956146, + (64, 107) => 170.961127, + (64, 108) => 171.964605, + (65, 70) => 134.964516, + (65, 73) => 137.953193, + (65, 74) => 138.94833, + (65, 75) => 139.945805048, + (65, 76) => 140.941448, + (65, 77) => 141.93928085800002, + (65, 78) => 142.93513733199998, + (65, 79) => 143.933045, + (65, 80) => 144.928717001, + (65, 81) => 145.92725273899998, + (65, 82) => 146.92405462, + (65, 83) => 147.92427547600002, + (65, 84) => 148.923253792, + (65, 85) => 149.923664799, + (65, 86) => 150.92310897, + (65, 87) => 151.924081855, + (65, 88) => 152.92344169400002, + (65, 89) => 153.924683681, + (65, 90) => 154.92350951100002, + (65, 91) => 155.92475420899999, + (65, 92) => 156.924031888, + (65, 93) => 157.925419942, + (65, 94) => 158.925353707, + (65, 95) => 159.92717455300001, + (65, 96) => 160.927576806, + (65, 97) => 161.9292754, + (65, 98) => 162.930653609, + (65, 99) => 163.933327561, + (65, 100) => 164.934955198, + (65, 101) => 165.93793972699999, + (65, 102) => 166.940007046, + (65, 103) => 167.943337074, + (65, 104) => 168.945807, + (65, 105) => 169.949855, + (65, 106) => 170.953011, + (65, 107) => 171.957391, + (65, 108) => 172.960805, + (65, 109) => 173.965679, + (66, 73) => 138.959527, + (66, 74) => 139.95402, + (66, 75) => 140.95128, + (66, 76) => 141.946194, + (66, 77) => 142.943994332, + (66, 78) => 143.93926951199998, + (66, 79) => 144.937473992, + (66, 80) => 145.932844526, + (66, 81) => 146.931082712, + (66, 82) => 147.927149944, + (66, 83) => 148.927327516, + (66, 84) => 149.92559306799998, + (66, 85) => 150.92619127900002, + (66, 86) => 151.924725274, + (66, 87) => 152.925771729, + (66, 88) => 153.92442892, + (66, 89) => 154.925758049, + (66, 90) => 155.92428359299998, + (66, 91) => 156.925469555, + (66, 92) => 157.924414817, + (66, 93) => 158.925745938, + (66, 94) => 159.925203578, + (66, 95) => 160.926939425, + (66, 96) => 161.92680450699999, + (66, 97) => 162.92873722099998, + (66, 98) => 163.929180819, + (66, 99) => 164.93170940200002, + (66, 100) => 165.93281281, + (66, 101) => 166.935682415, + (66, 102) => 167.937134977, + (66, 103) => 168.940315231, + (66, 104) => 169.94234, + (66, 105) => 170.946312, + (66, 106) => 171.948728, + (66, 107) => 172.953043, + (66, 108) => 173.955845, + (66, 109) => 174.960569, + (66, 110) => 175.963918, + (67, 73) => 139.968526, + (67, 74) => 140.963108, + (67, 75) => 141.96001, + (67, 76) => 142.95486, + (67, 77) => 143.952109712, + (67, 78) => 144.947267392, + (67, 79) => 145.94499350299998, + (67, 80) => 146.940142293, + (67, 81) => 147.937743925, + (67, 82) => 148.933820457, + (67, 83) => 149.93349835299998, + (67, 84) => 150.931698176, + (67, 85) => 151.931717618, + (67, 86) => 152.930206671, + (67, 87) => 153.930606776, + (67, 88) => 154.929103363, + (67, 89) => 155.929641634, + (67, 90) => 156.928251974, + (67, 91) => 157.92894490999998, + (67, 92) => 158.927718683, + (67, 93) => 159.92873553799998, + (67, 94) => 160.927861815, + (67, 95) => 161.929102543, + (67, 96) => 162.92874025999998, + (67, 97) => 163.930240548, + (67, 98) => 164.930329116, + (67, 99) => 165.932291209, + (67, 100) => 166.933140254, + (67, 101) => 167.935523766, + (67, 102) => 168.93687988999997, + (67, 103) => 169.939626548, + (67, 104) => 170.941472713, + (67, 105) => 171.94473, + (67, 106) => 172.94702, + (67, 107) => 173.950757, + (67, 108) => 174.953516, + (67, 109) => 175.957713, + (67, 110) => 176.961052, + (67, 111) => 177.965507, + (68, 75) => 142.966548, + (68, 76) => 143.9607, + (68, 77) => 144.957874, + (68, 78) => 145.952418357, + (68, 79) => 146.949964456, + (68, 80) => 147.944735026, + (68, 81) => 148.942306, + (68, 82) => 149.93791552399998, + (68, 83) => 150.937448567, + (68, 84) => 151.93505034700001, + (68, 85) => 152.93508635, + (68, 86) => 153.932790799, + (68, 87) => 154.93321571, + (68, 88) => 155.931065926, + (68, 89) => 156.931922652, + (68, 90) => 157.929893474, + (68, 91) => 158.93069079, + (68, 92) => 159.92907719299998, + (68, 93) => 160.93000353, + (68, 94) => 161.928787299, + (68, 95) => 162.930039908, + (68, 96) => 163.929207739, + (68, 97) => 164.930733482, + (68, 98) => 165.930301067, + (68, 99) => 166.932056192, + (68, 100) => 167.932378282, + (68, 101) => 168.93459844400002, + (68, 102) => 169.935471933, + (68, 103) => 170.938037372, + (68, 104) => 171.939363461, + (68, 105) => 172.9424, + (68, 106) => 173.94423, + (68, 107) => 174.94777, + (68, 108) => 175.94994, + (68, 109) => 176.95399, + (68, 110) => 177.956779, + (68, 111) => 178.961267, + (68, 112) => 179.96438, + (69, 75) => 143.976211, + (69, 76) => 144.970389, + (69, 77) => 145.966661, + (69, 78) => 146.961379887, + (69, 79) => 147.958384026, + (69, 80) => 148.952828, + (69, 81) => 149.95009, + (69, 82) => 150.945494433, + (69, 83) => 151.944476, + (69, 84) => 152.94205802300002, + (69, 85) => 153.941570062, + (69, 86) => 154.939209576, + (69, 87) => 155.938985746, + (69, 88) => 156.936973, + (69, 89) => 157.936979525, + (69, 90) => 158.934975, + (69, 91) => 159.935264177, + (69, 92) => 160.933549, + (69, 93) => 161.934001211, + (69, 94) => 162.932658282, + (69, 95) => 163.933538019, + (69, 96) => 164.932441843, + (69, 97) => 165.933562136, + (69, 98) => 166.932857206, + (69, 99) => 167.934178457, + (69, 100) => 168.934218956, + (69, 101) => 169.935807093, + (69, 102) => 170.936435162, + (69, 103) => 171.938406959, + (69, 104) => 172.93960663, + (69, 105) => 173.942174061, + (69, 106) => 174.94384231, + (69, 107) => 175.94699770699998, + (69, 108) => 176.948932, + (69, 109) => 177.952506, + (69, 110) => 178.955018, + (69, 111) => 179.959023, + (69, 112) => 180.961954, + (70, 79) => 148.964219, + (70, 80) => 149.958314, + (70, 81) => 150.955402453, + (70, 82) => 151.950326699, + (70, 83) => 152.949372, + (70, 84) => 153.946395696, + (70, 85) => 154.945783216, + (70, 86) => 155.942817096, + (70, 87) => 156.942651368, + (70, 88) => 157.939871202, + (70, 89) => 158.940060257, + (70, 90) => 159.93755921000002, + (70, 91) => 160.93791238400001, + (70, 92) => 161.93577934200002, + (70, 93) => 162.936345406, + (70, 94) => 163.934500743, + (70, 95) => 164.93527024099998, + (70, 96) => 165.93387643900002, + (70, 97) => 166.934954069, + (70, 98) => 167.933891297, + (70, 99) => 168.935184208, + (70, 100) => 169.93476724200002, + (70, 101) => 170.93633151499998, + (70, 102) => 171.93638665400002, + (70, 103) => 172.938216211, + (70, 104) => 173.938867545, + (70, 105) => 174.94128190700002, + (70, 106) => 175.942574706, + (70, 107) => 176.945263846, + (70, 108) => 177.94666940000002, + (70, 109) => 178.94993, + (70, 110) => 179.951991, + (70, 111) => 180.95589, + (70, 112) => 181.958239, + (70, 113) => 182.962426, + (70, 114) => 183.965002, + (70, 115) => 184.969425, + (71, 79) => 149.973407, + (71, 80) => 150.967471, + (71, 81) => 151.96412, + (71, 82) => 152.95880224799998, + (71, 83) => 153.957416, + (71, 84) => 154.95432600499998, + (71, 85) => 155.953086606, + (71, 86) => 156.95014480700002, + (71, 87) => 157.94931562, + (71, 88) => 158.94663561500002, + (71, 89) => 159.946033, + (71, 90) => 160.943572, + (71, 91) => 161.943282776, + (71, 92) => 162.941179, + (71, 93) => 163.941339, + (71, 94) => 164.939406758, + (71, 95) => 165.939859, + (71, 96) => 166.938243, + (71, 97) => 167.938729798, + (71, 98) => 168.937645845, + (71, 99) => 169.93847922999998, + (71, 100) => 170.937918591, + (71, 101) => 171.93909132, + (71, 102) => 172.938935722, + (71, 103) => 173.94034284, + (71, 104) => 174.94077721099998, + (71, 105) => 175.942691711, + (71, 106) => 176.94376357, + (71, 107) => 177.945960065, + (71, 108) => 178.947332985, + (71, 109) => 179.949890744, + (71, 110) => 180.951908, + (71, 111) => 181.955158, + (71, 112) => 182.957363, + (71, 113) => 183.96103, + (71, 114) => 184.963542, + (71, 115) => 185.96745, + (71, 116) => 186.970188, + (71, 117) => 187.974428, + (72, 81) => 152.970692, + (72, 82) => 153.964863, + (72, 83) => 154.963167, + (72, 84) => 155.959399083, + (72, 85) => 156.958288, + (72, 86) => 157.954801217, + (72, 87) => 158.953995837, + (72, 88) => 159.95068272799998, + (72, 89) => 160.95027792699997, + (72, 90) => 161.94721552599998, + (72, 91) => 162.947107211, + (72, 92) => 163.944370709, + (72, 93) => 164.944567, + (72, 94) => 165.94218, + (72, 95) => 166.9426, + (72, 96) => 167.940568, + (72, 97) => 168.941259, + (72, 98) => 169.939609, + (72, 99) => 170.940492, + (72, 100) => 171.93944971599998, + (72, 101) => 172.940513, + (72, 102) => 173.940048377, + (72, 103) => 174.941511424, + (72, 104) => 175.94140979699998, + (72, 105) => 176.943230187, + (72, 106) => 177.943708322, + (72, 107) => 178.945825705, + (72, 108) => 179.946559537, + (72, 109) => 180.94911083399998, + (72, 110) => 181.95056368399997, + (72, 111) => 182.953533203, + (72, 112) => 183.955448507, + (72, 113) => 184.958862, + (72, 114) => 185.960897, + (72, 115) => 186.964573, + (72, 116) => 187.966903, + (72, 117) => 188.970853, + (72, 118) => 189.973376, + (73, 82) => 154.974248, + (73, 83) => 155.972087, + (73, 84) => 156.968227445, + (73, 85) => 157.966593, + (73, 86) => 158.963028046, + (73, 87) => 159.961541678, + (73, 88) => 160.958369489, + (73, 89) => 161.957292907, + (73, 90) => 162.954337194, + (73, 91) => 163.953534, + (73, 92) => 164.950780287, + (73, 93) => 165.950512, + (73, 94) => 166.948093, + (73, 95) => 167.948047, + (73, 96) => 168.946011, + (73, 97) => 169.946175, + (73, 98) => 170.944476, + (73, 99) => 171.944895, + (73, 100) => 172.94375, + (73, 101) => 173.944454, + (73, 102) => 174.943737, + (73, 103) => 175.944857, + (73, 104) => 176.94448194, + (73, 105) => 177.94568, + (73, 106) => 178.94593905000002, + (73, 107) => 179.94746758899998, + (73, 108) => 180.947998528, + (73, 109) => 181.95015461199998, + (73, 110) => 182.95137538, + (73, 111) => 183.954009958, + (73, 112) => 184.955561317, + (73, 113) => 185.958553036, + (73, 114) => 186.960391, + (73, 115) => 187.963596, + (73, 116) => 188.96569, + (73, 117) => 189.969168, + (73, 118) => 190.97153, + (73, 119) => 191.975201, + (73, 120) => 192.97766, + (73, 121) => 193.98161, + (74, 83) => 156.978862, + (74, 84) => 157.974565, + (74, 85) => 158.972696, + (74, 86) => 159.968513946, + (74, 87) => 160.967249, + (74, 88) => 161.96350034099999, + (74, 89) => 162.962524251, + (74, 90) => 163.958952445, + (74, 91) => 164.95828066299998, + (74, 92) => 165.95503195199998, + (74, 93) => 166.95481108, + (74, 94) => 167.95180545899998, + (74, 95) => 168.951778689, + (74, 96) => 169.949231235, + (74, 97) => 170.949451, + (74, 98) => 171.947292, + (74, 99) => 172.947689, + (74, 100) => 173.946079, + (74, 101) => 174.946717, + (74, 102) => 175.945634, + (74, 103) => 176.946643, + (74, 104) => 177.945885791, + (74, 105) => 178.94707937799998, + (74, 106) => 179.94671330399999, + (74, 107) => 180.948218733, + (74, 108) => 181.948205636, + (74, 109) => 182.950224416, + (74, 110) => 183.95093318000002, + (74, 111) => 184.953421206, + (74, 112) => 185.95436514, + (74, 113) => 186.95716124900002, + (74, 114) => 187.958488325, + (74, 115) => 188.961557, + (74, 116) => 189.963103542, + (74, 117) => 190.966531, + (74, 118) => 191.968202, + (74, 119) => 192.971884, + (74, 120) => 193.973795, + (74, 121) => 194.977735, + (74, 122) => 195.979882, + (74, 123) => 196.984036, + (75, 84) => 158.984106, + (75, 85) => 159.98188, + (75, 86) => 160.977624313, + (75, 87) => 161.975896, + (75, 88) => 162.97208543399998, + (75, 89) => 163.97050712200001, + (75, 90) => 164.967085831, + (75, 91) => 165.965821216, + (75, 92) => 166.962604, + (75, 93) => 167.961572607, + (75, 94) => 168.958765979, + (75, 95) => 169.958234844, + (75, 96) => 170.955716, + (75, 97) => 171.955376165, + (75, 98) => 172.953243, + (75, 99) => 173.953115, + (75, 100) => 174.951381, + (75, 101) => 175.951623, + (75, 102) => 176.950328, + (75, 103) => 177.950989, + (75, 104) => 178.94998968599998, + (75, 105) => 179.950791568, + (75, 106) => 180.950061507, + (75, 107) => 181.95121156, + (75, 108) => 182.950821306, + (75, 109) => 183.95252807300002, + (75, 110) => 184.95295832, + (75, 111) => 185.95498917199998, + (75, 112) => 186.955752217, + (75, 113) => 187.958113658, + (75, 114) => 188.959227764, + (75, 115) => 189.96180006400002, + (75, 116) => 190.963123322, + (75, 117) => 191.966088, + (75, 118) => 192.967545, + (75, 119) => 193.970735, + (75, 120) => 194.97256, + (75, 121) => 195.975996, + (75, 122) => 196.978153, + (75, 123) => 197.98176, + (75, 124) => 198.984187, + (76, 85) => 160.989054, + (76, 86) => 161.984434, + (76, 87) => 162.982462, + (76, 88) => 163.978073158, + (76, 89) => 164.976654, + (76, 90) => 165.972698135, + (76, 91) => 166.971552304, + (76, 92) => 167.96779905000002, + (76, 93) => 168.967017521, + (76, 94) => 169.963579273, + (76, 95) => 170.963180402, + (76, 96) => 171.960017309, + (76, 97) => 172.95980838699998, + (76, 98) => 173.957063192, + (76, 99) => 174.956945126, + (76, 100) => 175.954770315, + (76, 101) => 176.95495790200002, + (76, 102) => 177.95325333399998, + (76, 103) => 178.953815985, + (76, 104) => 179.952381665, + (76, 105) => 180.953247188, + (76, 106) => 181.95211015400002, + (76, 107) => 182.953125028, + (76, 108) => 183.952492919, + (76, 109) => 184.95404596900002, + (76, 110) => 185.953837569, + (76, 111) => 186.955749569, + (76, 112) => 187.95583729199998, + (76, 113) => 188.958145949, + (76, 114) => 189.958445442, + (76, 115) => 190.960928105, + (76, 116) => 191.96147876499998, + (76, 117) => 192.964149637, + (76, 118) => 193.965179407, + (76, 119) => 194.968318, + (76, 120) => 195.96964326100002, + (76, 121) => 196.973076, + (76, 122) => 197.974664, + (76, 123) => 198.978239, + (76, 124) => 199.980086, + (76, 125) => 200.984069, + (76, 126) => 201.986548, + (76, 127) => 202.992195, + (77, 87) => 163.991966, + (77, 88) => 164.987552, + (77, 89) => 165.985716, + (77, 90) => 166.98167197299998, + (77, 91) => 167.97996097799998, + (77, 92) => 168.976281743, + (77, 93) => 169.975113, + (77, 94) => 170.97164552, + (77, 95) => 171.970607035, + (77, 96) => 172.967505477, + (77, 97) => 173.96694993900002, + (77, 98) => 174.964149519, + (77, 99) => 175.963626261, + (77, 100) => 176.9613015, + (77, 101) => 177.961079395, + (77, 102) => 178.95911759400002, + (77, 103) => 179.95922944600002, + (77, 104) => 180.957634691, + (77, 105) => 181.958076296, + (77, 106) => 182.956841231, + (77, 107) => 183.957476, + (77, 108) => 184.956698, + (77, 109) => 185.957946754, + (77, 110) => 186.957542, + (77, 111) => 187.958834999, + (77, 112) => 188.958722602, + (77, 113) => 189.96054337400003, + (77, 114) => 190.960591455, + (77, 115) => 191.962602414, + (77, 116) => 192.96292375299998, + (77, 117) => 193.965075703, + (77, 118) => 194.965976898, + (77, 119) => 195.968399669, + (77, 120) => 196.96965721700002, + (77, 121) => 197.972399, + (77, 122) => 198.973807097, + (77, 123) => 199.976844, + (77, 124) => 200.978701, + (77, 125) => 201.982136, + (77, 126) => 202.984573, + (77, 127) => 203.989726, + (77, 128) => 204.993988, + (78, 87) => 164.999658, + (78, 88) => 165.994866, + (78, 89) => 166.99275, + (78, 90) => 167.988180196, + (78, 91) => 168.986619, + (78, 92) => 169.982502087, + (78, 93) => 170.981248868, + (78, 94) => 171.977341059, + (78, 95) => 172.976449922, + (78, 96) => 173.972820431, + (78, 97) => 174.972400593, + (78, 98) => 175.968938162, + (78, 99) => 176.96846954100002, + (78, 100) => 177.96564928799998, + (78, 101) => 178.965358742, + (78, 102) => 179.96303801, + (78, 103) => 180.963089946, + (78, 104) => 181.96117160499998, + (78, 105) => 182.96159589500002, + (78, 106) => 183.959921929, + (78, 107) => 184.96061365900002, + (78, 108) => 185.959350845, + (78, 109) => 186.960616646, + (78, 110) => 187.959397521, + (78, 111) => 188.960848485, + (78, 112) => 189.95994982300002, + (78, 113) => 190.961676261, + (78, 114) => 191.961042667, + (78, 115) => 192.962984546, + (78, 116) => 193.962683498, + (78, 117) => 194.96479432499999, + (78, 118) => 195.964954648, + (78, 119) => 196.96734303, + (78, 120) => 197.967896718, + (78, 121) => 198.97059702200002, + (78, 122) => 199.971444609, + (78, 123) => 200.97451330500002, + (78, 124) => 201.975639, + (78, 125) => 202.979055, + (78, 126) => 203.981084, + (78, 127) => 204.986237, + (78, 128) => 205.99008, + (78, 129) => 206.995556, + (78, 130) => 207.999463, + (79, 91) => 169.996024, + (79, 92) => 170.991881533, + (79, 93) => 171.989996704, + (79, 94) => 172.98622426300003, + (79, 95) => 173.984908, + (79, 96) => 174.981316375, + (79, 97) => 175.980116925, + (79, 98) => 176.976869701, + (79, 99) => 177.97605671399998, + (79, 100) => 178.973173666, + (79, 101) => 179.972489738, + (79, 102) => 180.970079102, + (79, 103) => 181.969614433, + (79, 104) => 182.967588106, + (79, 105) => 183.967451523, + (79, 106) => 184.965798871, + (79, 107) => 185.965952703, + (79, 108) => 186.964542147, + (79, 109) => 187.965247966, + (79, 110) => 188.963948286, + (79, 111) => 189.964751746, + (79, 112) => 190.963716452, + (79, 113) => 191.96481761500002, + (79, 114) => 192.964138442, + (79, 115) => 193.965419051, + (79, 116) => 194.96503782300002, + (79, 117) => 195.966571213, + (79, 118) => 196.96657010299998, + (79, 119) => 197.96824371399998, + (79, 120) => 198.968766573, + (79, 121) => 199.970756558, + (79, 122) => 200.971657678, + (79, 123) => 201.973856, + (79, 124) => 202.975154492, + (79, 125) => 203.97811, + (79, 126) => 204.980064, + (79, 127) => 205.984766, + (79, 128) => 206.988577, + (79, 129) => 207.993655, + (79, 130) => 208.997606, + (79, 131) => 210.002877, + (80, 90) => 170.005814, + (80, 91) => 171.003585, + (80, 92) => 171.998860581, + (80, 93) => 172.997143, + (80, 94) => 173.99287057499998, + (80, 95) => 174.991444451, + (80, 96) => 175.98734867, + (80, 97) => 176.98628459, + (80, 98) => 177.98248475600002, + (80, 99) => 178.981821759, + (80, 100) => 179.97826018, + (80, 101) => 180.977819368, + (80, 102) => 181.974689173, + (80, 103) => 182.97444465200002, + (80, 104) => 183.971717709, + (80, 105) => 184.971890696, + (80, 106) => 185.969362061, + (80, 107) => 186.96981354, + (80, 108) => 187.967580738, + (80, 109) => 188.968194776, + (80, 110) => 189.96632225, + (80, 111) => 190.967158301, + (80, 112) => 191.965634263, + (80, 113) => 192.966653395, + (80, 114) => 193.965449108, + (80, 115) => 194.966705809, + (80, 116) => 195.965833445, + (80, 117) => 196.967213715, + (80, 118) => 197.96676917699997, + (80, 119) => 198.968280994, + (80, 120) => 199.96832694100002, + (80, 121) => 200.970303054, + (80, 122) => 201.970643604, + (80, 123) => 202.97287239599999, + (80, 124) => 203.973494037, + (80, 125) => 204.97607315099998, + (80, 126) => 205.977513837, + (80, 127) => 206.9823, + (80, 128) => 207.985759, + (80, 129) => 208.990757, + (80, 130) => 209.99431, + (80, 131) => 210.999581, + (80, 132) => 212.003242, + (80, 133) => 213.008803, + (80, 134) => 214.012636, + (80, 135) => 215.018368, + (80, 136) => 216.022459, + (81, 95) => 176.000627731, + (81, 96) => 176.996414252, + (81, 97) => 177.995047, + (81, 98) => 178.991122185, + (81, 99) => 179.98991894999997, + (81, 100) => 180.986259978, + (81, 101) => 181.985692649, + (81, 102) => 182.982192843, + (81, 103) => 183.981874973, + (81, 104) => 184.978789189, + (81, 105) => 185.978654787, + (81, 106) => 186.97590474, + (81, 107) => 187.97602088600001, + (81, 108) => 188.973573525, + (81, 109) => 189.973841771, + (81, 110) => 190.971784093, + (81, 111) => 191.972225, + (81, 112) => 192.970501994, + (81, 113) => 193.971081408, + (81, 114) => 194.969774052, + (81, 115) => 195.970481189, + (81, 116) => 196.969560492, + (81, 117) => 197.970446669, + (81, 118) => 198.969877, + (81, 119) => 199.970963608, + (81, 120) => 200.97082023500002, + (81, 121) => 201.972108874, + (81, 122) => 202.97234409799998, + (81, 123) => 203.97386342, + (81, 124) => 204.97442731799998, + (81, 125) => 205.976110108, + (81, 126) => 206.977418605, + (81, 127) => 207.982018006, + (81, 128) => 208.985351713, + (81, 129) => 209.990072942, + (81, 130) => 210.993475, + (81, 131) => 211.998335, + (81, 132) => 213.001915, + (81, 133) => 214.00694, + (81, 134) => 215.010768, + (81, 135) => 216.015964, + (81, 136) => 217.020032, + (82, 96) => 178.00383617100002, + (82, 97) => 179.002202492, + (82, 98) => 179.99791617699998, + (82, 99) => 180.99666059999998, + (82, 100) => 181.992673537, + (82, 101) => 182.99186252700002, + (82, 102) => 183.988135634, + (82, 103) => 184.98761, + (82, 104) => 185.984239409, + (82, 105) => 186.983910842, + (82, 106) => 187.980879079, + (82, 107) => 188.980843658, + (82, 108) => 189.97808187200002, + (82, 109) => 190.97821645500002, + (82, 110) => 191.97578959799998, + (82, 111) => 192.976135914, + (82, 112) => 193.97401178799998, + (82, 113) => 194.974516167, + (82, 114) => 195.972787552, + (82, 115) => 196.973434737, + (82, 116) => 197.97201545, + (82, 117) => 198.97291262000002, + (82, 118) => 199.971818546, + (82, 119) => 200.972870431, + (82, 120) => 201.972151613, + (82, 121) => 202.973390617, + (82, 122) => 203.973043506, + (82, 123) => 204.974481682, + (82, 124) => 205.97446521, + (82, 125) => 206.97589682100002, + (82, 126) => 207.976652005, + (82, 127) => 208.98108997799997, + (82, 128) => 209.98418838100002, + (82, 129) => 210.988735288, + (82, 130) => 211.991895891, + (82, 131) => 212.996560796, + (82, 132) => 213.999803521, + (82, 133) => 215.004661591, + (82, 134) => 216.008062, + (82, 135) => 217.013162, + (82, 136) => 218.016779, + (82, 137) => 219.022136, + (82, 138) => 220.025905, + (83, 101) => 184.001347, + (83, 102) => 184.9976, + (83, 103) => 185.996623169, + (83, 104) => 186.99314727200002, + (83, 105) => 187.992276064, + (83, 106) => 188.989195139, + (83, 107) => 189.988624828, + (83, 108) => 190.985786972, + (83, 109) => 191.985470077, + (83, 110) => 192.98294722, + (83, 111) => 193.982798581, + (83, 112) => 194.980648759, + (83, 113) => 195.980666509, + (83, 114) => 196.978864927, + (83, 115) => 197.979201316, + (83, 116) => 198.977672841, + (83, 117) => 199.97813129, + (83, 118) => 200.97699501699998, + (83, 119) => 201.977723042, + (83, 120) => 202.976892077, + (83, 121) => 203.977835687, + (83, 122) => 204.977385182, + (83, 123) => 205.97849884299998, + (83, 124) => 206.978470551, + (83, 125) => 207.97974206, + (83, 126) => 208.980398599, + (83, 127) => 209.98412023699998, + (83, 128) => 210.987268715, + (83, 129) => 211.99128503, + (83, 130) => 212.99438357, + (83, 131) => 213.998710909, + (83, 132) => 215.001749095, + (83, 133) => 216.006305985, + (83, 134) => 217.009372, + (83, 135) => 218.014188, + (83, 136) => 219.01752, + (83, 137) => 220.022501, + (83, 138) => 221.02598, + (83, 139) => 222.031079, + (83, 140) => 223.034611, + (83, 141) => 224.039796, + (84, 102) => 186.004403174, + (84, 103) => 187.00303148199998, + (84, 104) => 187.999415586, + (84, 105) => 188.99847342500001, + (84, 106) => 189.995101731, + (84, 107) => 190.994558494, + (84, 108) => 191.99134027399998, + (84, 109) => 192.991062421, + (84, 110) => 193.988186058, + (84, 111) => 194.988065781, + (84, 112) => 195.985540722, + (84, 113) => 196.985621939, + (84, 114) => 197.98338875299999, + (84, 115) => 198.983640445, + (84, 116) => 199.981812355, + (84, 117) => 200.982263799, + (84, 118) => 201.980738934, + (84, 119) => 202.981416072, + (84, 120) => 203.980310078, + (84, 121) => 204.98119000600002, + (84, 122) => 205.980473662, + (84, 123) => 206.981593334, + (84, 124) => 207.981246035, + (84, 125) => 208.982430361, + (84, 126) => 209.98287368599998, + (84, 127) => 210.986653171, + (84, 128) => 211.988867982, + (84, 129) => 212.992857154, + (84, 130) => 213.99520128700001, + (84, 131) => 214.99941838499998, + (84, 132) => 216.001913416, + (84, 133) => 217.006316145, + (84, 134) => 218.008971234, + (84, 135) => 219.013614, + (84, 136) => 220.016386, + (84, 137) => 221.021228, + (84, 138) => 222.02414, + (84, 139) => 223.02907, + (84, 140) => 224.03211, + (84, 141) => 225.037123, + (84, 142) => 226.04031, + (84, 143) => 227.04539, + (85, 106) => 191.004148081, + (85, 107) => 192.003140912, + (85, 108) => 192.999927725, + (85, 109) => 193.99923081600002, + (85, 110) => 194.99627447999998, + (85, 111) => 195.99579903400002, + (85, 112) => 196.993177353, + (85, 113) => 197.99279786399998, + (85, 114) => 198.990527715, + (85, 115) => 199.990351099, + (85, 116) => 200.988417058, + (85, 117) => 201.98862568599998, + (85, 118) => 202.98694290400002, + (85, 119) => 203.987251393, + (85, 120) => 204.986060546, + (85, 121) => 205.98664576800002, + (85, 122) => 206.985799715, + (85, 123) => 207.986613011, + (85, 124) => 208.986168701, + (85, 125) => 209.987147423, + (85, 126) => 210.98749622600002, + (85, 127) => 211.990737301, + (85, 128) => 212.992936593, + (85, 129) => 213.996372331, + (85, 130) => 214.998651002, + (85, 131) => 216.00242264300002, + (85, 132) => 217.004717794, + (85, 133) => 218.008695941, + (85, 134) => 219.011160587, + (85, 135) => 220.015433, + (85, 136) => 221.018017, + (85, 137) => 222.022494, + (85, 138) => 223.025151, + (85, 139) => 224.029749, + (85, 140) => 225.032528, + (85, 141) => 226.037209, + (85, 142) => 227.040183, + (85, 143) => 228.04496, + (85, 144) => 229.048191, + (86, 107) => 193.009707973, + (86, 108) => 194.006145636, + (86, 109) => 195.005421703, + (86, 110) => 196.00212043099998, + (86, 111) => 197.001621446, + (86, 112) => 197.998679197, + (86, 113) => 198.998325436, + (86, 114) => 199.995705335, + (86, 115) => 200.99559051100002, + (86, 116) => 201.993263982, + (86, 117) => 202.993361155, + (86, 118) => 203.991443729, + (86, 119) => 204.99172322799998, + (86, 120) => 205.99019540900002, + (86, 121) => 206.990730224, + (86, 122) => 207.989634513, + (86, 123) => 208.990401389, + (86, 124) => 209.98968886199998, + (86, 125) => 210.990600767, + (86, 126) => 211.990703946, + (86, 127) => 212.99388514700001, + (86, 128) => 213.99536265, + (86, 129) => 214.998745037, + (86, 130) => 216.000271942, + (86, 131) => 217.003927632, + (86, 132) => 218.005601123, + (86, 133) => 219.009478683, + (86, 134) => 220.01139244299998, + (86, 135) => 221.015535637, + (86, 136) => 222.01757601699998, + (86, 137) => 223.02188928299998, + (86, 138) => 224.024095803, + (86, 139) => 225.028485572, + (86, 140) => 226.03086138, + (86, 141) => 227.03530439300002, + (86, 142) => 228.037835415, + (86, 143) => 229.04225727200003, + (86, 144) => 230.045271, + (86, 145) => 231.049973, + (87, 110) => 197.011008086, + (87, 111) => 198.010282081, + (87, 112) => 199.007269384, + (87, 113) => 200.006584666, + (87, 114) => 201.003852491, + (87, 115) => 202.003329637, + (87, 116) => 203.00094086700003, + (87, 117) => 204.00065197200001, + (87, 118) => 204.998593854, + (87, 119) => 205.99866144100002, + (87, 120) => 206.99694144999998, + (87, 121) => 207.997139082, + (87, 122) => 208.995939701, + (87, 123) => 209.99641059599998, + (87, 124) => 210.99555518900002, + (87, 125) => 211.99622541999997, + (87, 126) => 212.99618440999998, + (87, 127) => 213.998971193, + (87, 128) => 215.000341534, + (87, 129) => 216.003189523, + (87, 130) => 217.00463198, + (87, 131) => 218.00757862, + (87, 132) => 219.009250664, + (87, 133) => 220.012326789, + (87, 134) => 221.01425371399998, + (87, 135) => 222.017582615, + (87, 136) => 223.019734241, + (87, 137) => 224.02334809599998, + (87, 138) => 225.025572466, + (87, 139) => 226.029544512, + (87, 140) => 227.031865413, + (87, 141) => 228.035839433, + (87, 142) => 229.038291443, + (87, 143) => 230.042390787, + (87, 144) => 231.045175353, + (87, 145) => 232.04946121900002, + (87, 146) => 233.052517833, + (88, 113) => 201.012814699, + (88, 114) => 202.009742305, + (88, 115) => 203.009233907, + (88, 116) => 204.006506855, + (88, 117) => 205.006230692, + (88, 118) => 206.00382784200002, + (88, 119) => 207.00377242, + (88, 120) => 208.001855012, + (88, 121) => 209.001994902, + (88, 122) => 210.000475406, + (88, 123) => 211.00089304899998, + (88, 124) => 211.999786619, + (88, 125) => 213.000370971, + (88, 126) => 214.00009956, + (88, 127) => 215.002718208, + (88, 128) => 216.003533534, + (88, 129) => 217.006322676, + (88, 130) => 218.007134297, + (88, 131) => 219.010084715, + (88, 132) => 220.011027542, + (88, 133) => 221.01391729300002, + (88, 134) => 222.01537337099998, + (88, 135) => 223.018500648, + (88, 136) => 224.020210361, + (88, 137) => 225.023610502, + (88, 138) => 226.025408186, + (88, 139) => 227.02917620500003, + (88, 140) => 228.031068574, + (88, 141) => 229.034956703, + (88, 142) => 230.037054776, + (88, 143) => 231.041027085, + (88, 144) => 232.043475267, + (88, 145) => 233.04759457, + (88, 146) => 234.0503821, + (89, 116) => 205.015144152, + (89, 117) => 206.014476477, + (89, 118) => 207.011965967, + (89, 119) => 208.01155225099998, + (89, 120) => 209.009495375, + (89, 121) => 210.009408625, + (89, 122) => 211.00766884599997, + (89, 123) => 212.007836442, + (89, 124) => 213.006592665, + (89, 125) => 214.00690640000002, + (89, 126) => 215.00647406099998, + (89, 127) => 216.008749101, + (89, 128) => 217.00934232499998, + (89, 129) => 218.01164886, + (89, 130) => 219.01242042500002, + (89, 131) => 220.014754527, + (89, 132) => 221.01559972099997, + (89, 133) => 222.017844232, + (89, 134) => 223.019135982, + (89, 135) => 224.02172224900002, + (89, 136) => 225.023228601, + (89, 137) => 226.026096999, + (89, 138) => 227.02775059400003, + (89, 139) => 228.031019685, + (89, 140) => 229.032947, + (89, 141) => 230.036327, + (89, 142) => 231.038393, + (89, 143) => 232.042034, + (89, 144) => 233.044346, + (89, 145) => 234.048139, + (89, 146) => 235.05084, + (89, 147) => 236.054988, + (90, 118) => 208.017915348, + (90, 119) => 209.017601, + (90, 120) => 210.015093515, + (90, 121) => 211.014896923, + (90, 122) => 212.01300157, + (90, 123) => 213.01301147, + (90, 124) => 214.01148148, + (90, 125) => 215.01172463999998, + (90, 126) => 216.011055933, + (90, 127) => 217.01310344299998, + (90, 128) => 218.01327624799998, + (90, 129) => 219.015526432, + (90, 130) => 220.015769866, + (90, 131) => 221.018185757, + (90, 132) => 222.01846822, + (90, 133) => 223.020811083, + (90, 134) => 224.021466137, + (90, 135) => 225.023950975, + (90, 136) => 226.024903699, + (90, 137) => 227.027702546, + (90, 138) => 228.028739741, + (90, 139) => 229.031761357, + (90, 140) => 230.03313226699998, + (90, 141) => 231.036302764, + (90, 142) => 232.038053606, + (90, 143) => 233.04158012599999, + (90, 144) => 234.043599801, + (90, 145) => 235.047255, + (90, 146) => 236.049657, + (90, 147) => 237.053629, + (90, 148) => 238.056388, + (91, 120) => 211.02367403600002, + (91, 121) => 212.023184819, + (91, 122) => 213.021099644, + (91, 123) => 214.02089105500002, + (91, 124) => 215.01911395500002, + (91, 125) => 216.019134633, + (91, 126) => 217.018309024, + (91, 127) => 218.020021133, + (91, 128) => 219.01994990900002, + (91, 129) => 220.021769753, + (91, 130) => 221.021873393, + (91, 131) => 222.023687064, + (91, 132) => 223.023980414, + (91, 133) => 224.025617286, + (91, 134) => 225.02614792699998, + (91, 135) => 226.02794821700002, + (91, 136) => 227.028803586, + (91, 137) => 228.031050758, + (91, 138) => 229.032095585, + (91, 139) => 230.034539717, + (91, 140) => 231.0358825, + (91, 141) => 232.03859020500002, + (91, 142) => 233.040246535, + (91, 143) => 234.04330555500002, + (91, 144) => 235.045399, + (91, 145) => 236.048668, + (91, 146) => 237.051023, + (91, 147) => 238.054637, + (91, 148) => 239.05726, + (92, 123) => 215.026719774, + (92, 124) => 216.024762829, + (92, 125) => 217.02466, + (92, 126) => 218.023504877, + (92, 127) => 219.02500923300002, + (92, 129) => 221.026323297, + (92, 130) => 222.02605795699998, + (92, 131) => 223.02796075400002, + (92, 132) => 224.02763591299998, + (92, 133) => 225.02938505, + (92, 134) => 226.029338669, + (92, 135) => 227.031181124, + (92, 136) => 228.031368959, + (92, 137) => 229.03350597600001, + (92, 138) => 230.033940114, + (92, 139) => 231.03629218, + (92, 140) => 232.037154765, + (92, 141) => 233.039634294, + (92, 142) => 234.040950296, + (92, 143) => 235.043928117, + (92, 144) => 236.04556613, + (92, 145) => 237.04872830899998, + (92, 146) => 238.05078693599998, + (92, 147) => 239.054291989, + (92, 148) => 240.05659241100003, + (92, 149) => 241.06033, + (92, 150) => 242.062931, + (92, 151) => 243.067075, + (93, 126) => 219.031601865, + (93, 127) => 220.03271628, + (93, 129) => 222.033574706, + (93, 130) => 223.03291334, + (93, 131) => 224.03438803, + (93, 132) => 225.033943422, + (93, 133) => 226.035230364, + (93, 134) => 227.034975012, + (93, 135) => 228.036313, + (93, 136) => 229.03628726899998, + (93, 137) => 230.03782806, + (93, 138) => 231.03824359799998, + (93, 139) => 232.040107, + (93, 140) => 233.040739421, + (93, 141) => 234.04289324500002, + (93, 142) => 235.044061518, + (93, 143) => 236.046568296, + (93, 144) => 237.04817164, + (93, 145) => 238.05094460299998, + (93, 146) => 239.05293753799998, + (93, 147) => 240.05616377799998, + (93, 148) => 241.05830967100002, + (93, 149) => 242.06163954800002, + (93, 150) => 243.064204, + (93, 151) => 244.067891, + (94, 134) => 228.038763325, + (94, 135) => 229.040145099, + (94, 136) => 230.039648313, + (94, 137) => 231.04112594600002, + (94, 138) => 232.04118213299998, + (94, 139) => 233.04299741100002, + (94, 140) => 234.043317489, + (94, 141) => 235.045284609, + (94, 142) => 236.04605666100002, + (94, 143) => 237.048407888, + (94, 144) => 238.04955817500002, + (94, 145) => 239.052161596, + (94, 146) => 240.05381174000001, + (94, 147) => 241.056849651, + (94, 148) => 242.058740979, + (94, 149) => 243.062002068, + (94, 150) => 244.06420440099998, + (94, 151) => 245.067824554, + (94, 152) => 246.070204172, + (94, 153) => 247.0743, + (95, 128) => 223.04584, + (95, 134) => 229.04528253400002, + (95, 135) => 230.046025, + (95, 137) => 232.046613, + (95, 138) => 233.046468, + (95, 139) => 234.047731, + (95, 140) => 235.047906478, + (95, 141) => 236.049427, + (95, 142) => 237.049995, + (95, 143) => 238.051982531, + (95, 144) => 239.053022729, + (95, 145) => 240.05529837400002, + (95, 146) => 241.05682734299998, + (95, 147) => 242.059547358, + (95, 148) => 243.061379889, + (95, 149) => 244.064282892, + (95, 150) => 245.066452827, + (95, 151) => 246.069774, + (95, 152) => 247.072092, + (95, 153) => 248.075752, + (96, 137) => 233.050771485, + (96, 138) => 234.050158568, + (96, 139) => 235.051545, + (96, 140) => 236.051372112, + (96, 141) => 237.052868988, + (96, 142) => 238.053081606, + (96, 143) => 239.05490851899998, + (96, 144) => 240.05552823300002, + (96, 145) => 241.057651218, + (96, 146) => 242.058834187, + (96, 147) => 243.06138732899998, + (96, 148) => 244.062750622, + (96, 149) => 245.065491047, + (96, 150) => 246.06722201600002, + (96, 151) => 247.070352678, + (96, 152) => 248.072349086, + (96, 153) => 249.07595399200002, + (96, 154) => 250.078357541, + (96, 155) => 251.082284988, + (97, 136) => 233.056652, + (97, 137) => 234.057322, + (97, 139) => 236.057479, + (97, 141) => 238.058204, + (97, 142) => 239.058239, + (97, 143) => 240.059758, + (97, 144) => 241.060098, + (97, 145) => 242.061999, + (97, 146) => 243.063005905, + (97, 147) => 244.06517896900002, + (97, 148) => 245.066359814, + (97, 149) => 246.0686713, + (97, 150) => 247.070305889, + (97, 151) => 248.073141689, + (97, 152) => 249.074983118, + (97, 153) => 250.07831719499998, + (97, 154) => 251.080760555, + (97, 156) => 253.08688, + (98, 139) => 237.06219927200002, + (98, 140) => 238.06149, + (98, 141) => 239.062482, + (98, 142) => 240.062253447, + (98, 143) => 241.06369, + (98, 144) => 242.063754544, + (98, 145) => 243.065475, + (98, 146) => 244.065999447, + (98, 147) => 245.06804675499998, + (98, 148) => 246.068803685, + (98, 149) => 247.070971348, + (98, 150) => 248.072182905, + (98, 151) => 249.074850428, + (98, 152) => 250.076404494, + (98, 153) => 251.07958717100001, + (98, 154) => 252.081626507, + (98, 155) => 253.08513372299998, + (98, 156) => 254.087323575, + (98, 157) => 255.091046, + (98, 158) => 256.093442, + (99, 141) => 240.068949, + (99, 142) => 241.068592, + (99, 143) => 242.069567, + (99, 144) => 243.069508, + (99, 145) => 244.070881, + (99, 146) => 245.071192, + (99, 147) => 246.072806474, + (99, 148) => 247.07362192899998, + (99, 149) => 248.075469, + (99, 150) => 249.076409, + (99, 151) => 250.078611, + (99, 152) => 251.079991431, + (99, 153) => 252.082979173, + (99, 154) => 253.084821241, + (99, 155) => 254.088024337, + (99, 156) => 255.090273504, + (99, 157) => 256.093597, + (99, 158) => 257.095979, + (100, 141) => 241.074311, + (100, 142) => 242.07343, + (100, 143) => 243.074414, + (100, 144) => 244.074036, + (100, 145) => 245.075354, + (100, 146) => 246.075353334, + (100, 147) => 247.076944, + (100, 148) => 248.077185451, + (100, 149) => 249.078926042, + (100, 150) => 250.079519765, + (100, 151) => 251.08154513, + (100, 152) => 252.08246601899998, + (100, 153) => 253.085180945, + (100, 154) => 254.086852424, + (100, 155) => 255.089963495, + (100, 156) => 256.091771699, + (100, 157) => 257.095105419, + (100, 158) => 258.097077, + (100, 159) => 259.100596, + (101, 143) => 244.081157, + (101, 144) => 245.080864, + (101, 145) => 246.081713, + (101, 146) => 247.08152, + (101, 147) => 248.082607, + (101, 148) => 249.082857155, + (101, 149) => 250.08416493399997, + (101, 150) => 251.084774287, + (101, 151) => 252.086385, + (101, 152) => 253.087143, + (101, 153) => 254.08959, + (101, 154) => 255.091081702, + (101, 155) => 256.093888, + (101, 156) => 257.095537343, + (101, 157) => 258.098433634, + (101, 158) => 259.100445, + (101, 159) => 260.10365, + (102, 146) => 248.086623, + (102, 147) => 249.087802, + (102, 148) => 250.087565, + (102, 149) => 251.088942, + (102, 150) => 252.08896607, + (102, 151) => 253.09056278, + (102, 152) => 254.090954211, + (102, 153) => 255.09319643900002, + (102, 154) => 256.094281912, + (102, 155) => 257.096884203, + (102, 156) => 258.098205, + (102, 157) => 259.100998364, + (102, 158) => 260.102641, + (102, 160) => 262.107463, + (103, 149) => 252.095048, + (103, 150) => 253.09503385, + (103, 151) => 254.09623881299999, + (103, 152) => 255.096562399, + (103, 153) => 256.098494024, + (103, 154) => 257.09948, + (103, 155) => 258.101753, + (103, 156) => 259.1029, + (103, 157) => 260.105504, + (103, 158) => 261.106879, + (103, 159) => 262.109615, + (103, 161) => 264.114198, + (103, 163) => 266.119874, + (104, 149) => 253.100528, + (104, 150) => 254.100055, + (104, 151) => 255.101267, + (104, 152) => 256.101151464, + (104, 153) => 257.102916796, + (104, 154) => 258.10342989500003, + (104, 155) => 259.105601, + (104, 156) => 260.10644, + (104, 157) => 261.108769591, + (104, 158) => 262.109923, + (104, 159) => 263.112461, + (104, 161) => 265.116683, + (104, 163) => 267.121787, + (105, 150) => 255.106919, + (105, 151) => 256.107674, + (105, 152) => 257.107520042, + (105, 153) => 258.108972995, + (105, 154) => 259.109491859, + (105, 155) => 260.111297, + (105, 156) => 261.111979, + (105, 157) => 262.114067, + (105, 158) => 263.114987, + (105, 161) => 266.121032, + (105, 162) => 267.122399, + (105, 163) => 268.125669, + (105, 165) => 270.131399, + (106, 152) => 258.11304, + (106, 153) => 259.114353, + (106, 154) => 260.114383435, + (106, 155) => 261.115948135, + (106, 156) => 262.116338978, + (106, 157) => 263.118299, + (106, 158) => 264.11893, + (106, 159) => 265.121089, + (106, 160) => 266.121973, + (106, 161) => 267.124323, + (106, 163) => 269.128495, + (106, 165) => 271.133782, + (107, 153) => 260.121443, + (107, 154) => 261.121395733, + (107, 155) => 262.122654688, + (107, 156) => 263.122916, + (107, 157) => 264.124486, + (107, 158) => 265.124955, + (107, 159) => 266.12679, + (107, 160) => 267.127499, + (107, 163) => 270.133366, + (107, 164) => 271.135115, + (107, 165) => 272.138259, + (107, 167) => 274.143599, + (107, 171) => 278.154988, + (108, 155) => 263.128479, + (108, 156) => 264.12835633000003, + (108, 157) => 265.129791744, + (108, 158) => 266.130048783, + (108, 159) => 267.131678, + (108, 160) => 268.132011, + (108, 161) => 269.133649, + (108, 162) => 270.134313, + (108, 163) => 271.137082, + (108, 165) => 273.141458, + (108, 167) => 275.14653, + (108, 169) => 277.151772, + (108, 170) => 278.153753, + (109, 157) => 266.137062253, + (109, 159) => 268.138649, + (109, 161) => 270.140322, + (109, 165) => 274.147343, + (109, 166) => 275.148972, + (109, 167) => 276.151705, + (109, 168) => 277.153525, + (109, 169) => 278.156487, + (109, 173) => 282.166888, + (110, 157) => 267.143726, + (110, 159) => 269.14475096499996, + (110, 160) => 270.14458662, + (110, 161) => 271.145951, + (110, 163) => 273.148455, + (110, 167) => 277.155763, + (110, 169) => 279.159984, + (110, 170) => 280.161375, + (110, 171) => 281.164545, + (110, 172) => 282.166174, + (111, 161) => 272.153273, + (111, 163) => 274.155247, + (111, 167) => 278.16159, + (111, 168) => 279.16288, + (111, 169) => 280.165204, + (111, 170) => 281.166757, + (111, 171) => 282.169343, + (111, 175) => 286.178756, + (112, 165) => 277.163535, + (112, 169) => 281.169563, + (112, 170) => 282.170507, + (112, 171) => 283.173202, + (112, 172) => 284.17436, + (112, 173) => 285.177227, + (112, 174) => 286.178691, + (113, 165) => 278.170725, + (113, 169) => 282.17577, + (113, 170) => 283.176666, + (113, 171) => 284.178843, + (113, 172) => 285.180106, + (113, 173) => 286.182456, + (113, 177) => 290.191429, + (114, 170) => 284.181192, + (114, 171) => 285.183503, + (114, 172) => 286.184226, + (114, 173) => 287.18672, + (114, 174) => 288.187781, + (114, 175) => 289.190517, + (114, 176) => 290.191875, + (115, 172) => 287.19082, + (115, 173) => 288.192879, + (115, 174) => 289.193971, + (115, 175) => 290.196235, + (116, 174) => 290.198635, + (116, 175) => 291.201014, + (116, 176) => 292.201969, + (116, 177) => 293.204583, + (117, 176) => 293.208727, + (117, 177) => 294.21084, + (118, 176) => 294.213979, +) diff --git a/test/properties.jl b/test/properties.jl index 277c8b9..cc9a52b 100644 --- a/test/properties.jl +++ b/test/properties.jl @@ -24,7 +24,7 @@ end s3 = ChemicalSpecies(:D) @test atomic_number(s3) == 1 @test element_symbol(s3) == :H - @test s3.nneut == 1 + @test s3.n_neutrons == 1 end @testset "Chemical formula with system" begin diff --git a/test/species.jl b/test/species.jl index b97b9f9..e9315ec 100644 --- a/test/species.jl +++ b/test/species.jl @@ -26,8 +26,79 @@ end @test atomic_number( Int16(12) ) == 12 @test "$(ChemicalSpecies(:O))" == "$(ChemicalSpecies(8))" == "O" -@test "$(ChemicalSpecies(8, 8, 0))" == "O" -@test "$(ChemicalSpecies(:C; n_neutrons=6))" == "C" +@test "$(ChemicalSpecies(8, 8, 0))" == "O16" +@test "$(ChemicalSpecies(:C; n_neutrons=6))" == "C12" @test "$(ChemicalSpecies(:C; n_neutrons=7))" == "C13" +@test ChemicalSpecies(:H) == :H +@test ChemicalSpecies(:D) == :D +@test ChemicalSpecies(:T) == :T +@test ChemicalSpecies(:X) == :X +@test ChemicalSpecies(:U238) == :U238 +@test ChemicalSpecies(:Cl35) == :Cl35 +@test ChemicalSpecies(:He3) == :He3 + +@test_throws ArgumentError ChemicalSpecies(:C; atom_name=:MyLongC) +@test_throws ArgumentError ChemicalSpecies(:U2389) +@test_throws ArgumentError ChemicalSpecies(:Q) +@test_throws ArgumentError ChemicalSpecies(:Q23) + +@test ChemicalSpecies(:H) != ChemicalSpecies(:C) +@test ChemicalSpecies(:C13) == ChemicalSpecies(:C) +@test ChemicalSpecies(:C12) != ChemicalSpecies(:C13) +@test ChemicalSpecies(:C; atom_name=:MyC) == ChemicalSpecies(:C) +@test ChemicalSpecies(:C12; atom_name=:MyC) == ChemicalSpecies(:C12) +@test ChemicalSpecies(:C; atom_name=:MyC) != ChemicalSpecies(:C12) +@test ChemicalSpecies(:C12; atom_name=:MyC) == ChemicalSpecies(:C) +@test ChemicalSpecies(:C; atom_name=:MyC) == ChemicalSpecies(:C12; atom_name=:MyC) +@test ChemicalSpecies(:C; atom_name=:MyC) != ChemicalSpecies(:C; atom_name=:noC) +@test ChemicalSpecies(:D) != ChemicalSpecies(:T) +@test ChemicalSpecies(:H) == ChemicalSpecies(:D) +@test ChemicalSpecies(:H) == ChemicalSpecies(:T) +@test ChemicalSpecies(:H1) != ChemicalSpecies(:D) +@test ChemicalSpecies(:H1) == ChemicalSpecies(1; n_neutrons=0) + +@test mass(ChemicalSpecies(:C)) != mass(ChemicalSpecies(:C12)) +@test mass(ChemicalSpecies(:C)) != mass(ChemicalSpecies(:C13)) +@test mass(ChemicalSpecies(:C12)) != mass(ChemicalSpecies(:C13)) + +@test atom_name(ChemicalSpecies(:C)) == atomic_symbol(ChemicalSpecies(:C)) +@test atom_name(ChemicalSpecies(:C; atom_name=:MyC)) == :MyC + +tmp = ChemicalSpecies(:C12; atom_name=:MyC) +@test atom_name(tmp) != atomic_symbol(tmp) + +@test mass(ChemicalSpecies(:C)) != mass(ChemicalSpecies(:C12)) +@test mass(ChemicalSpecies(:C12)) != mass(ChemicalSpecies(:C13)) +@test mass(ChemicalSpecies(:X)) == 0.0u"u" +@test ismissing( mass(ChemicalSpecies(:H31)) ) + +@testset "ChemicalSpecies in Atom and FastSystem" begin + box = ([1, 0, 0]u"m", [0, 1, 0]u"m", [0, 0, 1]u"m") + pbcs = (true, true, false) + atoms = Atom[ChemicalSpecies(:C; atom_name=:MyC) => [0.25, 0.25, 0.25]u"m", + :C12 => [0.75, 0.75, 0.75]u"m"] + system = FastSystem(atoms, box, pbcs) + + @test atom_name(atoms[1]) == :MyC + @test atom_name(atoms[2]) == :C12 + @test atomic_symbol(atoms[1]) == :C + @test atomic_symbol(atoms[2]) == :C12 + + @test mass(atoms[1]) == mass(ChemicalSpecies(:C)) + @test mass(atoms[2]) == mass(ChemicalSpecies(:C12)) + + @test atom_name(system, 1) == :MyC + @test atom_name(system, 2) == :C12 + @test atomic_symbol(system, 1) == :C + @test atomic_symbol(system, 2) == :C12 + + @test atom_name(system[1]) == :MyC + @test atom_name(system[2]) == :C12 + @test atomic_symbol(system[1]) == :C + @test atomic_symbol(system[2]) == :C12 + + @test mass(system, 1) == mass(ChemicalSpecies(:C)) + @test mass(system, 2) == mass(ChemicalSpecies(:C12)) +end end