diff --git a/.gitignore b/.gitignore index 154c6cf..f73f8d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ -bundle -dist -node_modules +.vscode/ +bundle/ +dist/ +node_modules/ pious-squid-*.tgz +scratchpad.js \ No newline at end of file diff --git a/.npmignore b/.npmignore index 670347d..d55ccc5 100644 --- a/.npmignore +++ b/.npmignore @@ -1,9 +1,10 @@ +.git .gitignore -.vscode -bundle +.vscode/ +bundle/ dist/test -examples -src -tsconfig.json -tslint.json -webpack.config.js +examples/ +scratchpad.js +src/ +test/ +tsconfig.json \ No newline at end of file diff --git a/README.MD b/README.MD index 9db282c..7ba1476 100644 --- a/README.MD +++ b/README.MD @@ -7,108 +7,184 @@ browser. ## Features -+ **Coordinate Frames** - - Earth Centered Earth Fixed *(ECEF)* - - Earth Centered Inertial *(ECI)* - - Geodetic *(LLA)* - - J2000 - - Keplerian Elements - - Look Angles - - Spherical - - Topocentric-Horizon *(SEZ)* - -+ **Ephemeris Propagators** - - Keplerian *(analytic)* - - 4th Order Runge-Kutta *(numerical)* - - Interpolator *(hybrid)* - -+ **Celestial Bodies** - - Earth Precession / Nutation - - Earth Atmospheric Density - - Moon Position - - Sun Position - -+ **Time** - - Julian Date - - Leap Seconds - - Terrestrial Centuries - - Julian Centuries - - Greenwich Mean Sidereal Time - -+ **Model Forces** - - J2 / J3 / J4 Effect - - Earth Gravity - - Moon Gravity - - Sun Gravity - - Solar Radiation Pressure - - Atmospheric Drag +- **Coordinate Frames** + + - Classical Orbit Elements + - Earth Centered Earth Fixed _(ITRF)_ + - Geodetic + - J2000 + - Look Angles + - Relative Motion _(RIC)_ + +- **Ephemeris Propagators** + + - 4th Order Runge-Kutta _(numerical)_ + - Keplerian _(analytic)_ + +- **Celestial Bodies** + + - Earth Atmospheric Density + - Earth Precession / Nutation + - Moon Position + - Solar Eclipse + - Sun Position + +- **Epoch** + + - Barycentric Dynamical Time _(TDB)_ + - Greenwich Mean Sidereal Time + - International Atomic Time _(TAI)_ + - Julian Centuries + - Julian Date + - Leap Seconds + - Terrestrial Time _(TT)_ + - UTC/UT1 Time + +- **Force Model** + + - Atmospheric Drag + - Earth Geopotential (70x70) + - Moon Gravity + - Solar Radiation Pressure + - Sun Gravity ## Install -To include `pious-squid` in your *NodeJS* project: +To include `pious-squid` in your _NodeJS_ project: npm install pious-squid --save The browser library bundles (`pious-squid.js` or `pious-squid.min.js`) can be -found under, the +found under, the [Releases](https://github.com/david-rc-dayton/pious-squid/releases) -tab on *GitHub*. +tab on _GitHub_. ## Example To propagate a satellite from its position and velocity vectors: ```javascript -// import pious-squid module -const PiousSquid = require('pious-squid') -const J2000 = PiousSquid.J2000 -const RungeKutta4 = PiousSquid.RungeKutta4 - - -// create the initial state -let initState = new J2000( - Date.UTC(2010, 2, 10, 22, 53, 14, 697), // UTC epoch - 8228, 389, 6888, // position (km) - -0.7, 6.6, -0.6 // velocity (km/s) -) - -console.log(initState.toString()) -//=> [J2000] -// Epoch: Wed, 10 Mar 2010 22:53:14 GMT -// Position: [ 8228, 389, 6888 ] km -// Velocity: [ -0.7, 6.6, -0.6 ] km/s - - -// initialize the propagator, changing the stepsize to 300 seconds -let rk4Prop = new RungeKutta4(initState, { stepSize: 300 }) - -console.log(rk4Prop.toString()) -//=> [RungeKutta4] -// Step Size: 300 seconds -// Satellite Mass: 1000 kg -// Satellite Surface Area: 1 m^2 -// Drag Coefficient: 2.2 -// Reflectivity Coefficient: 1.4 -// J2 Effect: ENABLED -// J3 Effect: ENABLED -// J4 Effect: ENABLED -// Sun Gravity: ENABLED -// Moon Gravity: ENABLED -// Solar Radiation Pressure: ENABLED -// Atmospheric Drag: ENABLED - - -// propagate the state one day forward -let newState = rk4Prop.propagate(Date.UTC(2010, 2, 11, 22, 53, 14, 697)) - -console.log(newState.toString()) -//=> [J2000] -// Epoch: Thu, 11 Mar 2010 22:53:14 GMT -// Position: [ -7924.483, -12493.015, -6492.194 ] km -// Velocity: [ 2.75, -2.552, 2.332 ] km/s +const PiousSquid = require("pious-squid"); +const EpochUTC = PiousSquid.EpochUTC; +const J2000 = PiousSquid.J2000; +const Kepler = PiousSquid.KeplerPropagator; +const RungeKutta4 = PiousSquid.RungeKutta4Propagator; +const Vector3D = PiousSquid.Vector3D; + +//============================================================================== +// define an initial state +//============================================================================== + +// initial state in J2000 frame +const initialState = new J2000( + EpochUTC.fromDateString("2018-12-21T00:00:00.000Z"), // epoch (UTC) + new Vector3D(-1117.913276, 73.093299, -7000.018272), // km + new Vector3D(3.531365461, 6.583914964, -0.495649656) // km/s +); + +console.log(initialState.toString()); +// => [J2000] +// Epoch: 2018-12-21T00:00:00.000Z +// Position: [ -1117.913276000, 73.093299000, -7000.018272000 ] km +// Velocity: [ 3.531365461, 6.583914964, -0.495649656 ] km/s + +// real-world expected state (24-hours into the future) +const expectedState = new J2000( + EpochUTC.fromDateString("2018-12-22T00:00:00.000Z"), + new Vector3D(-212.125533, -2464.351601, 6625.907454), + new Vector3D(-3.618617698, -6.12677853, -2.38955619) +); + +console.log(expectedState.toString()); +// => [J2000] +// Epoch: 2018-12-22T00:00:00.000Z +// Position: [ -212.125533000, -2464.351601000, 6625.907454000 ] km +// Velocity: [ -3.618617698, -6.126778530, -2.389556190 ] km/s + +//============================================================================== +// propagate state vector (numerical high-accuracy) +//============================================================================== + +// create a propagator using J2000 state +const hiAccProp = new RungeKutta4(initialState); + +// set step size +hiAccProp.setStepSize(5); // seconds + +// add earth gravity +hiAccProp.forceModel.setEarthGravity( + 50, // degree + 50 // order +); + +// add sun & moon gravity +hiAccProp.forceModel.setThirdBody( + true, // moon + true // sun +); + +// add atmospheric drag +hiAccProp.forceModel.setAtmosphericDrag( + 2200, // mass (kg) + 3.7 // area (m^2) +); + +// add solar radiation pressure +hiAccProp.forceModel.setSolarRadiationPressure( + 2200, // mass (kg) + 3.7 // area (m^2) +); + +// propagated state (24-hours into the future) +const resultState = hiAccProp.propagate( + new EpochUTC.fromDateString("2018-12-22T00:00:00.000Z") +); + +console.log(resultState.toString()); +// => [J2000] +// Epoch: 2018-12-22T00:00:00.000Z +// Position: [ -212.131047437, -2464.369130369, 6625.895065916 ] km +// Velocity: [ -3.618619800, -6.126775254, -2.389578954 ] km/s + +// calculate the distance between result and expected, in kilometers +const distance = resultState.position.distance(expectedState.position); + +console.log((distance * 1000).toFixed(3) + " meters"); +// => 22.162 meters + +//============================================================================== +// propagate state vector (numerical two-body) +//============================================================================== + +const twoBodyProp = new RungeKutta4(initialState); +twoBodyProp.forceModel.setEarthGravity(0, 0); +twoBodyProp.propagate(new EpochUTC.fromDateString("2018-12-22T00:00:00.000Z")); + +console.log(twoBodyProp.state.toString()); +// => [J2000] +// Epoch: 2018-12-22T00:00:00.000Z +// Position: [ -1241.886675379, -3977.873474857, 5689.561067368 ] km +// Velocity: [ -3.502813706, -5.085314761, -4.303326274 ] km/s + +//============================================================================== +// propagate classical elements (analytical two-body) +//============================================================================== + +// convert j2000 state to classical elements +const ceState = initialState.toClassicalElements(); + +// create a propagator using classical elements, and propagate +const keplerProp = new Kepler(ceState); +keplerProp.propagate(new EpochUTC.fromDateString("2018-12-22T00:00:00.000Z")); + +console.log(keplerProp.state.toString()); +// => [J2000] +// Epoch: 2018-12-22T00:00:00.000Z +// Position: [ -1241.885644014, -3977.871988515, 5689.562370838 ] km +// Velocity: [ -3.502814112, -5.085316082, -4.303324341 ] km/s ``` -Additional examples can be found in the +Additional examples can be found in the [examples](https://github.com/david-rc-dayton/pious-squid/tree/master/examples) directory in the project root directory. diff --git a/examples/coordinates-earth-centered-fixed.js b/examples/coordinates-earth-centered-fixed.js deleted file mode 100644 index 0bb5ad5..0000000 --- a/examples/coordinates-earth-centered-fixed.js +++ /dev/null @@ -1,57 +0,0 @@ -// Example: using EarthCenteredFixed coordinates - -// import pious-squid module -const PiousSquid = require(".."); -const EarthCenteredFixed = PiousSquid.EarthCenteredFixed; -const Geodetic = PiousSquid.Geodetic; -const DEG2RAD = PiousSquid.constants.DEG2RAD; - -// create a new Earth Centered Earth Fixed (ECEF) coordinate, in kilometers -let coordECEF = new EarthCenteredFixed(1389.432, 4631.217, 4145.652); - -console.log(coordECEF.toString()); -//=> [EarthCenteredFixed] -// Position: [ 1389.432, 4631.217, 4145.652 ] km -// Velocity: [ 0, 0, 0 ] km/s - -// convert to Earth Centered Inertial (ECI) coordinate frame for a given epoch -let coordECI = coordECEF.toECI(Date.UTC(2016, 11, 12)); - -console.log(coordECI.toString()); -//=> [EarthCenteredInertial] -// Epoch: Mon, 12 Dec 2016 00:00:00 GMT -// Position: [ -4361.339, 2087.443, 4145.652 ] km -// Velocity: [ -0.152, -0.318, 0 ] km/s - -// convert to Geodetic (LLA) coordinate frame -let coordGeo = coordECEF.toGeodetic(); - -console.log(coordGeo.toString()); -//=> [Geodetic] -// Latitude: 40.800° -// Longitude: 73.300° -// Altitude: 0.026 km - -// convert to Spherical coordinates -let coordSph = coordECEF.toSpherical(); - -console.log(coordSph.toString()); -//=> [Spherical] -// (r) Radius: 6369.075 km -// (θ) Inclination: 49.390° -// (φ) Azimuth: 73.300° - -// convert to Topocentric-Horizon coordinates, relative to an observer -let coordTopo = coordECEF.toTopocentric( - new Geodetic( - 30 * DEG2RAD, // observer latitude (radians) - 70 * DEG2RAD, // observer longitude (radians) - 0.125 // observer altitude (km) - ) -); - -console.log(coordTopo.toString()); -//=> [Topocentric] -// (S)outh: -1195.177 km -// (E)ast: 278.331 km -// (Z)enith: -119.675 km diff --git a/examples/coordinates-earth-centered-inertial.js b/examples/coordinates-earth-centered-inertial.js deleted file mode 100644 index 60b834c..0000000 --- a/examples/coordinates-earth-centered-inertial.js +++ /dev/null @@ -1,39 +0,0 @@ -// Example: using EarthCenteredFixed coordinates - -// import pious-squid module -const PiousSquid = require(".."); -const EarthCenteredInertial = PiousSquid.EarthCenteredInertial; - -// create a new Earth Centered Inertial (ECI) coordinate -let coordECI = new EarthCenteredInertial( - Date.UTC(2010, 2, 10, 22, 53, 14, 697), // UTC epoch - 8228, - 389, - 6888, // position (km) - -0.7, - 6.6, - -0.6 // velocity (km/s) -); - -console.log(coordECI.toString()); -//=> [EarthCenteredInertial] -// Epoch: Wed, 10 Mar 2010 22:53:14 GMT -// Position: [ 8228, 389, 6888 ] km -// Velocity: [ -0.7, 6.6, -0.6 ] km/s - -// convert to Earth Centered Earth Fixed (ECEF) coordinate frame -let coordECEF = coordECI.toECEF(); - -console.log(coordECEF.toString()); -//=> [EarthCenteredFixed] -// Position: [ -7068.812, -4228.854, 6888 ] km -// Velocity: [ 3.426, -4.971, -0.6 ] km/s - -// convert to J2000 (J2K) coordinate frame -let coordJ2K = coordECI.toJ2K(); - -console.log(coordJ2K.toString()); -//=> [J2000] -// Epoch: Wed, 10 Mar 2010 22:53:14 GMT -// Position: [ 8235.935, 369.732, 6879.572 ] km -// Velocity: [ -0.685, 6.602, -0.599 ] km/s diff --git a/examples/coordinates-geodetic.js b/examples/coordinates-geodetic.js deleted file mode 100644 index 54bdd13..0000000 --- a/examples/coordinates-geodetic.js +++ /dev/null @@ -1,27 +0,0 @@ -// Example: using Geodetic coordinates - -// import pious-squid module -const PiousSquid = require(".."); -const Geodetic = PiousSquid.Geodetic; -const DEG2RAD = PiousSquid.constants.DEG2RAD; - -// create a new Geodetic (LLA) coordinate -let coordGeo = new Geodetic( - 30 * DEG2RAD, // observer latitude (radians) - 70 * DEG2RAD, // observer longitude (radians) - 0.125 // observer altitude (km) -); - -console.log(coordGeo.toString()); -//=> [Geodetic] -// Latitude: 30.000° -// Longitude: 70.000° -// Altitude: 0.125 km - -// convert to Earth Centered Earth Fixed (ECEF) coordinate frame -let coordECEF = coordGeo.toECEF(); - -console.log(coordECEF.toString()); -//=> [EarthCenteredFixed] -// Position: [ 1890.812, 5194.963, 3170.436 ] km -// Velocity: [ 0, 0, 0 ] km/s diff --git a/examples/coordinates-j2000.js b/examples/coordinates-j2000.js deleted file mode 100644 index 0c37735..0000000 --- a/examples/coordinates-j2000.js +++ /dev/null @@ -1,44 +0,0 @@ -// Example: using J2000 coordinates - -// import pious-squid module -const PiousSquid = require(".."); -const J2000 = PiousSquid.J2000; - -// create a new J2000 (J2K) coordinate -let coordJ2K = new J2000( - Date.UTC(2010, 2, 10, 22, 53, 14, 697), // UTC epoch - 8228, - 389, - 6888, // position (km) - -0.7, - 6.6, - -0.6 // velocity (km/s) -); - -console.log(coordJ2K.toString()); -//=> [J2000] -// Epoch: Wed, 10 Mar 2010 22:53:14 GMT -// Position: [ 8228, 389, 6888 ] km -// Velocity: [ -0.7, 6.6, -0.6 ] km/s - -// convert to Earth Centered Inertial (ECI) coordinate frame -let coordECI = coordJ2K.toECI(); - -console.log(coordECI.toString()); -//=> [EarthCenteredInertial] -// Epoch: Wed, 10 Mar 2010 22:53:14 GMT -// Position: [ 8220.011, 408.249, 6896.42 ] km -// Velocity: [ -0.715, 6.598, -0.601 ] km/s - -// convert to a Keplerian Element Set -let coordKep = coordJ2K.toKeplerian(); - -console.log(coordKep.toString()); -//=> [KeplerianElements] -// Epoch: Wed, 10 Mar 2010 22:53:14 GMT -// (a) Semimajor Axis: 13360.643 km -// (e) Eccentricity: 0.220498 -// (i) Inclination: 39.9375° -// (Ω) Right Ascension: 269.8556° -// (ω) Argument of Perigee: 125.7244° -// (ν) True Anomaly: 326.4625° diff --git a/examples/coordinates-keplerian-elements.js b/examples/coordinates-keplerian-elements.js deleted file mode 100644 index 7154826..0000000 --- a/examples/coordinates-keplerian-elements.js +++ /dev/null @@ -1,48 +0,0 @@ -// Example: using KeplerianElements - -// import pious-squid module -const PiousSquid = require(".."); -const KeplerianElements = PiousSquid.KeplerianElements; -const DEG2RAD = PiousSquid.constants.DEG2RAD; - -// create new KeplerianElements -let coordKep = new KeplerianElements( - Date.UTC(2018, 1, 7, 12, 0, 0, 0), // UTC epoch - 6787.23371, // semimajor axis (kilometers) - 0.0008787, // eccentricity (unitless) - 51.34474 * DEG2RAD, // inclination (radians) - 304.51644 * DEG2RAD, // right ascension (radians) - 54.44526 * DEG2RAD, // argument of perigee (radians) - 279.68095 * DEG2RAD // true anomaly (radians) -); - -console.log(coordKep.toString()); -//=> [KeplerianElements] -// Epoch: Wed, 07 Feb 2018 12:00:00 GMT -// (a) Semimajor Axis: 6787.234 km -// (e) Eccentricity: 0.000879 -// (i) Inclination: 51.3447° -// (Ω) Right Ascension: 304.5164° -// (ω) Argument of Perigee: 54.4453° -// (ν) True Anomaly: 279.6809° - -// calculate mean motion, in radians per second -let meanMotion = coordKep.meanMotion(); - -console.log(meanMotion); -//=> 0.0011290929142210111 - -// calculate the number of orbit revolutions per day -let revsPerDay = coordKep.revsPerDay(); - -console.log(revsPerDay); -//=> 15.52614207911775 - -// convert to J2000 (J2K) coordinate frame -let coordJ2K = coordKep.toJ2K(); - -console.log(coordJ2K.toString()); -//=> [J2000] -// Epoch: Wed, 07 Feb 2018 12:00:00 GMT -// Position: [ 1935.716, -6079.271, -2312.645 ] km -// Velocity: [ 5.443, -0.309, 5.388 ] km/s diff --git a/examples/coordinates-spherical.js b/examples/coordinates-spherical.js deleted file mode 100644 index c0b2424..0000000 --- a/examples/coordinates-spherical.js +++ /dev/null @@ -1,27 +0,0 @@ -// Example: using Spherical coordinates - -// import pious-squid module -const PiousSquid = require(".."); -const Spherical = PiousSquid.Spherical; -const DEG2RAD = PiousSquid.constants.DEG2RAD; - -// create a new Spherical coordinate -let coordSph = new Spherical( - 6369.075, // range (km) - 49.39 * DEG2RAD, // inclination (radians) - 73.3 * DEG2RAD // azimuth (radians) -); - -console.log(coordSph.toString()); -//=> [Spherical] -// (r) Radius: 6369.075 km -// (θ) Inclination: 49.390° -// (φ) Azimuth: 73.300° - -// convert to Earth Centered Earth Fixed (ECEF) coordinate frame -let coordECEF = coordSph.toECEF(); - -console.log(coordECEF.toString()); -//=> [EarthCenteredFixed] -// Position: [ 1389.426, 4631.199, 4145.674 ] km -// Velocity: [ 0, 0, 0 ] km/s diff --git a/examples/propagators-example.js b/examples/propagators-example.js new file mode 100644 index 0000000..f2ae8a2 --- /dev/null +++ b/examples/propagators-example.js @@ -0,0 +1,118 @@ +const PiousSquid = require(".."); +const EpochUTC = PiousSquid.EpochUTC; +const J2000 = PiousSquid.J2000; +const Kepler = PiousSquid.KeplerPropagator; +const RungeKutta4 = PiousSquid.RungeKutta4Propagator; +const Vector3D = PiousSquid.Vector3D; + +//============================================================================== +// define an initial state +//============================================================================== + +// initial state in J2000 frame +const initialState = new J2000( + EpochUTC.fromDateString("2018-12-21T00:00:00.000Z"), // epoch (UTC) + new Vector3D(-1117.913276, 73.093299, -7000.018272), // km + new Vector3D(3.531365461, 6.583914964, -0.495649656) // km/s +); + +console.log(initialState.toString()); +// => [J2000] +// Epoch: 2018-12-21T00:00:00.000Z +// Position: [ -1117.913276000, 73.093299000, -7000.018272000 ] km +// Velocity: [ 3.531365461, 6.583914964, -0.495649656 ] km/s + +// real-world expected state (24-hours into the future) +const expectedState = new J2000( + EpochUTC.fromDateString("2018-12-22T00:00:00.000Z"), + new Vector3D(-212.125533, -2464.351601, 6625.907454), + new Vector3D(-3.618617698, -6.12677853, -2.38955619) +); + +console.log(expectedState.toString()); +// => [J2000] +// Epoch: 2018-12-22T00:00:00.000Z +// Position: [ -212.125533000, -2464.351601000, 6625.907454000 ] km +// Velocity: [ -3.618617698, -6.126778530, -2.389556190 ] km/s + +//============================================================================== +// propagate state vector (numerical high-accuracy) +//============================================================================== + +// create a propagator using J2000 state +const hiAccProp = new RungeKutta4(initialState); + +// set step size +hiAccProp.setStepSize(5); // seconds + +// add earth gravity +hiAccProp.forceModel.setEarthGravity( + 50, // degree + 50 // order +); + +// add sun & moon gravity +hiAccProp.forceModel.setThirdBody( + true, // moon + true // sun +); + +// add atmospheric drag +hiAccProp.forceModel.setAtmosphericDrag( + 2200, // mass (kg) + 3.7 // area (m^2) +); + +// add solar radiation pressure +hiAccProp.forceModel.setSolarRadiationPressure( + 2200, // mass (kg) + 3.7 // area (m^2) +); + +// propagated state (24-hours into the future) +const resultState = hiAccProp.propagate( + new EpochUTC.fromDateString("2018-12-22T00:00:00.000Z") +); + +console.log(resultState.toString()); +// => [J2000] +// Epoch: 2018-12-22T00:00:00.000Z +// Position: [ -212.131047437, -2464.369130369, 6625.895065916 ] km +// Velocity: [ -3.618619800, -6.126775254, -2.389578954 ] km/s + +// calculate the distance between result and expected, in kilometers +const distance = resultState.position.distance(expectedState.position); + +console.log((distance * 1000).toFixed(3) + " meters"); +// => 22.162 meters + +//============================================================================== +// propagate state vector (numerical two-body) +//============================================================================== + +const twoBodyProp = new RungeKutta4(initialState); +twoBodyProp.forceModel.setEarthGravity(0, 0); +twoBodyProp.propagate(new EpochUTC.fromDateString("2018-12-22T00:00:00.000Z")); + +console.log(twoBodyProp.state.toString()); +// => [J2000] +// Epoch: 2018-12-22T00:00:00.000Z +// Position: [ -1241.886675379, -3977.873474857, 5689.561067368 ] km +// Velocity: [ -3.502813706, -5.085314761, -4.303326274 ] km/s + +//============================================================================== +// propagate classical elements (analytical two-body) +//============================================================================== + +// convert j2000 state to classical elements +const ceState = initialState.toClassicalElements(); + +// create a propagator using classical elements, and propagate +const keplerProp = new Kepler(ceState); +keplerProp.propagate(new EpochUTC.fromDateString("2018-12-22T00:00:00.000Z")); + +console.log(keplerProp.state.toString()); +// => [J2000] +// Epoch: 2018-12-22T00:00:00.000Z +// Position: [ -1241.885644014, -3977.871988515, 5689.562370838 ] km +// Velocity: [ -3.502814112, -5.085316082, -4.303324341 ] km/s diff --git a/examples/propagators-interpolator.js b/examples/propagators-interpolator.js deleted file mode 100644 index 5c918c6..0000000 --- a/examples/propagators-interpolator.js +++ /dev/null @@ -1,92 +0,0 @@ -// Example: using the Interpolator meta-propagator - -/* - * NOTE: The Interpolator class is used to iterpolate between pre-propagated - * states. This can be used to quickly generate new states over a finite time - * range rather than numerically integrating perturbations for a solution. In - * short, this class sacrifices RAM for CPU cycles. - */ - -// import pious-squid module -const PiousSquid = require(".."); -const J2000 = PiousSquid.J2000; -const RungeKutta4 = PiousSquid.RungeKutta4; -const Interpolator = PiousSquid.Interpolator; - -// create the initial state -let initState = new J2000( - Date.UTC(2010, 2, 10, 22, 53, 14, 697), // UTC epoch - 8228, - 389, - 6888, // position (km) - -0.7, - 6.6, - -0.6 // velocity (km/s) -); - -console.log(initState.toString()); -//=> [J2000] -// Epoch: Wed, 10 Mar 2010 22:53:14 GMT -// Position: [ 8228, 389, 6888 ] km -// Velocity: [ -0.7, 6.6, -0.6 ] km/s - -// initialize the propagator -let rk4Prop = new RungeKutta4(initState); - -console.log(rk4Prop.toString()); -//=> [RungeKutta4] -// Step Size: 300 seconds -// Satellite Mass: 1000 kg -// Satellite Surface Area: 1 m^2 -// Drag Coefficient: 2.2 -// Reflectivity Coefficient: 1.4 -// J2 Effect: ENABLED -// J3 Effect: ENABLED -// J4 Effect: ENABLED -// Sun Gravity: ENABLED -// Moon Gravity: ENABLED -// Solar Radiation Pressure: ENABLED -// Atmospheric Drag: ENABLED - -// cache 24-hours of J2000 states, sampled every 300 seconds -let j2kCache = rk4Prop.step( - Date.UTC(2010, 2, 10), // start epoch - 300, // interval (seconds) - 288 // iterations (300 secs * 288 = 86400 secs = 24 hrs) -); - -console.log(j2kCache.toString()); -//=> [J2000] -// Epoch: Wed, 10 Mar 2010 00:00:00 GMT -// Position: [ -7100.939, -13074.581, -6033.937 ] km -// Velocity: [ 2.956, -2.243, 2.461 ] km/s,[J2000] -// Epoch: Wed, 10 Mar 2010 00:05:00 GMT -// Position: [ -6184.362, -13689.31, -5270.382 ] km -// Velocity: [ 3.151, -1.851, 2.626 ] km/s,[J2000] -// ... -// ... (full results omitted for brevity) -// ... -// Epoch: Wed, 10 Mar 2010 23:55:00 GMT -// Position: [ -5752.783, 10281.398, -4845.123 ] km -// Velocity: [ -4.02, -2.303, -3.36 ] km/s,[J2000] -// Epoch: Thu, 11 Mar 2010 00:00:00 GMT -// Position: [ -6906.88, 9505.758, -5809.635 ] km -// Velocity: [ -3.669, -2.853, -3.065 ] km/s - -// create a new Interpolator using the cached state -let interp = new Interpolator(j2kCache); - -console.log(interp.toString()); -//=> [Interpolator] -// Method: verlet -// Range: [Wed, 10 Mar 2010 00:00:00 GMT] -> [Thu, 11 Mar 2010 00:00:00 GMT] -// Step Size: 60 seconds - -// interpolate a state in the cached timerange -let newState = interp.propagate(Date.UTC(2010, 2, 10, 11, 23, 9)); - -console.log(newState.toString()); -//=> [J2000] -// Epoch: Wed, 10 Mar 2010 11:23:09 GMT -// Position: [ -9175.343, 7168.625, -7667.659 ] km -// Velocity: [ -2.753, -3.797, -2.314 ] km/s diff --git a/examples/propagators-kepler.js b/examples/propagators-kepler.js deleted file mode 100644 index c2d7852..0000000 --- a/examples/propagators-kepler.js +++ /dev/null @@ -1,44 +0,0 @@ -// Example: using the Kepler propagator - -// import pious-squid module -const PiousSquid = require(".."); -const DEG2RAD = PiousSquid.constants.DEG2RAD; -const KeplerianElements = PiousSquid.KeplerianElements; -const Kepler = PiousSquid.Kepler; - -// create the initial state -let initState = new KeplerianElements( - Date.UTC(2018, 1, 7, 12, 0, 0, 0), // UTC epoch - 6787.23371, // semimajor axis (kilometers) - 0.0008787, // eccentricity (unitless) - 51.34474 * DEG2RAD, // inclination (radians) - 304.51644 * DEG2RAD, // right ascension (radians) - 54.44526 * DEG2RAD, // argument of perigee (radians) - 279.68095 * DEG2RAD // true anomaly (radians) -); - -console.log(initState.toString()); -//=> [KeplerianElements] -// Epoch: Wed, 07 Feb 2018 12:00:00 GMT -// (a) Semimajor Axis: 6787.234 km -// (e) Eccentricity: 0.000879 -// (i) Inclination: 51.3447° -// (Ω) Right Ascension: 304.5164° -// (ω) Argument of Perigee: 54.4453° -// (ν) True Anomaly: 279.6809° - -// initialize the propagator, using default two-body settings -let kepProp = new Kepler(initState); - -console.log(kepProp.toString()); -//=> [Kepler] -// Two-Body Propagator - -// propagate the state one day forward -let newState = kepProp.propagate(Date.UTC(2018, 1, 7, 13, 0, 0, 0)); - -console.log(newState.toString()); -//=> [J2000] -// Epoch: Wed, 07 Feb 2018 13:00:00 GMT -// Position: [ -5020.445, 3881.912, -2421.653 ] km -// Velocity: [ -1.528, -5.29, -5.321 ] km/s diff --git a/examples/propagators-rk4.js b/examples/propagators-rk4.js deleted file mode 100644 index b1af726..0000000 --- a/examples/propagators-rk4.js +++ /dev/null @@ -1,49 +0,0 @@ -// Example: using the RungeKutta4 propagator - -// import pious-squid module -const PiousSquid = require(".."); -const J2000 = PiousSquid.J2000; -const RungeKutta4 = PiousSquid.RungeKutta4; - -// create the initial state -let initState = new J2000( - Date.UTC(2010, 2, 10, 22, 53, 14, 697), // UTC epoch - 8228, // i-axis position (km) - 389, // j-axis position (km) - 6888, // k-axis position (km) - -0.7, // i-axis velocity (km/s) - 6.6, // j-axis velocity (km/s) - -0.6 // k-axis velocity (km/s) -); - -console.log(initState.toString()); -//=> [J2000] -// Epoch: Wed, 10 Mar 2010 22:53:14 GMT -// Position: [ 8228, 389, 6888 ] km -// Velocity: [ -0.7, 6.6, -0.6 ] km/s - -// initialize the propagator, changing the stepsize to 60 seconds -let rk4Prop = new RungeKutta4(initState, { stepSize: 60 }); - -console.log(rk4Prop.toString()); -//=> [RungeKutta4] -// Step Size: 60 seconds -// Satellite Mass: 1000 kg -// Satellite Surface Area: 1 m^2 -// Drag Coefficient: 2.2 -// Reflectivity Coefficient: 1.4 -// Geopotential Degree: 4 -// Geopotential Order: 4 -// Sun Gravity: ENABLED -// Moon Gravity: ENABLED -// Solar Radiation Pressure: ENABLED -// Atmospheric Drag: ENABLED - -// propagate the state one day forward -let newState = rk4Prop.propagate(Date.UTC(2010, 2, 11, 22, 53, 14, 697)); - -console.log(newState.toString()); -//=> [J2000] -// Epoch: Thu, 11 Mar 2010 22:53:14 GMT -// Position: [ -7925.762, -12491.855, -6493.288 ] km -// Velocity: [ 2.749, -2.552, 2.332 ] km/s diff --git a/package-lock.json b/package-lock.json index 10930c2..6a03a14 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,9 @@ { "name": "pious-squid", - "version": "1.3.0", + "version": "2.0.0-snapshot", "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/chai": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", - "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", - "dev": true - }, "@types/mocha": { "version": "5.2.5", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", @@ -22,294 +16,62 @@ "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==", "dev": true }, - "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", - "dev": true - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" } }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", - "dev": true - }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", + "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", "dev": true }, "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - } - }, - "ajv": { - "version": "6.6.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", - "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", - "dev": true, - "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true - }, - "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", - "dev": true - }, - "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", "dev": true }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "acorn-node": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", + "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "acorn": "^6.0.2", + "acorn-dynamic-import": "^4.0.0", + "acorn-walk": "^6.1.0", + "xtend": "^4.0.1" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "acorn-walk": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", "dev": true }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", "dev": true }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", "dev": true }, "asn1.js": { @@ -340,7 +102,7 @@ }, "util": { "version": "0.10.3", - "resolved": "http://registry.npmjs.org/util/-/util-0.10.3.tgz", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", "dev": true, "requires": { @@ -349,176 +111,18 @@ } } }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "babel-polyfill": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", - "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0", - "core-js": "^2.4.0", - "regenerator-runtime": "^0.10.0" - } - }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "^2.4.0", - "regenerator-runtime": "^0.11.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", - "dev": true - } - } - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", - "dev": true - }, - "bluebird": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", - "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", - "dev": true - }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -535,47 +139,105 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-pack": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", + "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "combine-source-map": "~0.8.0", + "defined": "^1.0.0", + "safe-buffer": "^5.1.1", + "through2": "^2.0.0", + "umd": "^3.0.0" + } + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "resolve": "1.1.7" }, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true } } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "browserify": { + "version": "16.2.3", + "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", + "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "dev": true, + "requires": { + "JSONStream": "^1.0.3", + "assert": "^1.4.0", + "browser-pack": "^6.0.1", + "browser-resolve": "^1.11.0", + "browserify-zlib": "~0.2.0", + "buffer": "^5.0.2", + "cached-path-relative": "^1.0.0", + "concat-stream": "^1.6.0", + "console-browserify": "^1.1.0", + "constants-browserify": "~1.0.0", + "crypto-browserify": "^3.0.0", + "defined": "^1.0.0", + "deps-sort": "^2.0.0", + "domain-browser": "^1.2.0", + "duplexer2": "~0.1.2", + "events": "^2.0.0", + "glob": "^7.1.0", + "has": "^1.0.0", + "htmlescape": "^1.1.0", + "https-browserify": "^1.0.0", + "inherits": "~2.0.1", + "insert-module-globals": "^7.0.0", + "labeled-stream-splicer": "^2.0.0", + "mkdirp": "^0.5.0", + "module-deps": "^6.0.0", + "os-browserify": "~0.3.0", + "parents": "^1.0.1", + "path-browserify": "~0.0.0", + "process": "~0.11.0", + "punycode": "^1.3.2", + "querystring-es3": "~0.2.0", + "read-only-stream": "^2.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.1.4", + "shasum": "^1.0.0", + "shell-quote": "^1.6.1", + "stream-browserify": "^2.0.0", + "stream-http": "^2.0.0", + "string_decoder": "^1.1.1", + "subarg": "^1.0.0", + "syntax-error": "^1.1.1", + "through2": "^2.0.0", + "timers-browserify": "^1.0.1", + "tty-browserify": "0.0.1", + "url": "~0.11.0", + "util": "~0.10.1", + "vm-browserify": "^1.0.0", + "xtend": "^4.0.0" + } + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -648,14 +310,13 @@ } }, "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", + "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", "dev": true, "requires": { "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "ieee754": "^1.1.4" } }, "buffer-from": { @@ -670,351 +331,89 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "cacache": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", - "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "cached-path-relative": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", + "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "bluebird": "^3.5.3", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.3", - "graceful-fs": "^4.1.15", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "combine-source-map": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", + "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "convert-source-map": "~1.1.0", + "inline-source-map": "~0.6.0", + "lodash.memoize": "~3.0.3", + "source-map": "~0.5.3" } }, - "camelcase": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz", - "integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==", + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" } }, - "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - } + "date-now": "^0.1.4" } }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "convert-source-map": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", + "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", "dev": true }, - "check-error": { + "core-util-is": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" - } - }, - "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", - "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-js": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.1.tgz", - "integrity": "sha512-L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg==", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, "create-ecdh": { @@ -1054,19 +453,6 @@ "sha.js": "^2.4.8" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -1086,12 +472,6 @@ "randomfill": "^1.0.3" } }, - "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", - "dev": true - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", @@ -1107,66 +487,22 @@ "ms": "2.0.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", "dev": true }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "deps-sort": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", + "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "JSONStream": "^1.0.3", + "shasum": "^1.0.0", + "subarg": "^1.0.0", + "through2": "^2.0.0" } }, "des.js": { @@ -1179,11 +515,16 @@ "minimalistic-assert": "^1.0.0" } }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true + "detective": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz", + "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==", + "dev": true, + "requires": { + "acorn-node": "^1.3.0", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } }, "diff": { "version": "3.5.0", @@ -1208,16 +549,13 @@ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "readable-stream": "^2.0.2" } }, "elliptic": { @@ -1235,2449 +573,325 @@ "minimalistic-crypto-utils": "^1.0.0" } }, - "emojis-list": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "events": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", + "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", "dev": true }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "iconv-lite": "~0.4.13" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-assigned-identifiers": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", + "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { - "once": "^1.4.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, - "enhanced-resolve": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", - "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "tapable": "^1.0.0" + "function-bind": "^1.1.1" } }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "prr": "~1.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint-scope": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", - "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "estraverse": "^4.1.0" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "htmlescape": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", + "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", "dev": true }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "figgy-pudding": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", - "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-cache-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.0.0.tgz", - "integrity": "sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.21", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": "^2.1.0" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.1", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.0", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.1.10", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.5.1", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.1.1", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.5.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.0.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.2", - "bundled": true, - "dev": true - } - } - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", - "dev": true - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", - "dev": true, - "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", - "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", - "dev": true, - "requires": { - "ansi-escapes": "^1.1.0", - "chalk": "^1.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.1", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx": "^4.1.0", - "string-width": "^2.0.0", - "strip-ansi": "^3.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "interpret": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", - "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "loader-runner": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz", - "integrity": "sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==", - "dev": true - }, - "loader-utils": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", - "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" - } - }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", - "dev": true, - "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "http://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "neo-async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", - "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "node-fetch": { - "version": "1.6.3", - "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", - "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", - "dev": true, - "requires": { - "encoding": "^0.1.11", - "is-stream": "^1.0.1" - } - }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^1.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.0", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { + "once": "^1.3.0", "wrappy": "1" } }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "opencollective": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", - "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", - "dev": true, - "requires": { - "babel-polyfill": "6.23.0", - "chalk": "1.1.3", - "inquirer": "3.0.6", - "minimist": "1.2.0", - "node-fetch": "1.6.3", - "opn": "4.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "http://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "opn": { - "version": "4.0.2", - "resolved": "http://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, - "p-limit": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", - "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", + "inline-source-map": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", + "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", "dev": true, "requires": { - "p-try": "^2.0.0" + "source-map": "~0.5.3" } }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "insert-module-globals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", + "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", "dev": true, "requires": { - "p-limit": "^2.0.0" + "JSONStream": "^1.0.3", + "acorn-node": "^1.5.2", + "combine-source-map": "^0.8.0", + "concat-stream": "^1.6.1", + "is-buffer": "^1.1.0", + "path-is-absolute": "^1.0.1", + "process": "~0.11.0", + "through2": "^2.0.0", + "undeclared-identifiers": "^1.1.2", + "xtend": "^4.0.0" } }, - "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", - "dev": true - }, - "pako": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.7.tgz", - "integrity": "sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ==", + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", - "dev": true, - "requires": { - "cyclist": "~0.2.2", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", - "dev": true, - "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" - } - }, - "parse-passwd": { + "isarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "http://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "pbkdf2": { - "version": "3.0.17", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", - "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", + "json-stable-stringify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", + "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", "dev": true, "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "jsonify": "~0.0.0" } }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, - "pinkie-promise": { + "labeled-stream-splicer": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", + "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", "dev": true, "requires": { - "pinkie": "^2.0.0" - } - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "inherits": "^2.0.1", + "isarray": "^2.0.4", + "stream-splicer": "^2.0.0" }, "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "isarray": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", + "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", + "dev": true } } }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "lodash.memoize": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", + "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", "dev": true }, - "resolve": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", - "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "resolve-from": "^3.0.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, - "resolve-dir": { + "minimalistic-assert": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "dev": true }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "brace-expansion": "^1.1.7" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { - "glob": "^7.1.3" + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" }, "dependencies": { "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -3690,361 +904,294 @@ } } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "module-deps": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", + "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "JSONStream": "^1.0.3", + "browser-resolve": "^1.7.0", + "cached-path-relative": "^1.0.0", + "concat-stream": "~1.6.0", + "defined": "^1.0.0", + "detective": "^5.0.2", + "duplexer2": "^0.1.2", + "inherits": "^2.0.1", + "parents": "^1.0.0", + "readable-stream": "^2.0.2", + "resolve": "^1.4.0", + "stream-combiner2": "^1.1.1", + "subarg": "^1.0.0", + "through2": "^2.0.0", + "xtend": "^4.0.0" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "aproba": "^1.1.1" + "wrappy": "1" } }, - "rx": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", - "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=", + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "pako": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", + "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", "dev": true }, - "safe-regex": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "parents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", + "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", "dev": true, "requires": { - "ret": "~0.1.10" + "path-platform": "~0.11.15" } }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3" } }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, - "serialize-javascript": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", - "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "path-platform": { + "version": "0.11.15", + "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", + "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", "dev": true }, - "sha.js": { - "version": "2.4.11", - "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "safe-buffer": "^5.1.0" } }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "read-only-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", + "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "dev": true, + "requires": { + "readable-stream": "^2.0.2" } }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" }, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "safe-buffer": "~5.1.0" } } } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "resolve": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", + "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "glob": "^7.1.3" } }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "shasum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", + "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", "dev": true, "requires": { - "figgy-pudding": "^3.5.1" + "json-stable-stringify": "~0.0.0", + "sha.js": "~2.4.4" } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "stream-browserify": { "version": "2.0.1", - "resolved": "http://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", "dev": true, "requires": { @@ -4052,14 +1199,14 @@ "readable-stream": "^2.0.2" } }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "stream-combiner2": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", + "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "duplexer2": "~0.1.0", + "readable-stream": "^2.0.2" } }, "stream-http": { @@ -4075,63 +1222,34 @@ "xtend": "^4.0.0" } }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "stream-splicer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", + "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "inherits": "^2.0.1", + "readable-stream": "^2.0.2" } }, "string_decoder": { - "version": "1.1.1", - "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", "dev": true, "requires": { "safe-buffer": "~5.1.0" } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "minimist": "^1.1.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "supports-color": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", @@ -4141,50 +1259,18 @@ "has-flag": "^3.0.0" } }, - "tapable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", - "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", - "dev": true - }, - "terser": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.1.tgz", - "integrity": "sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==", - "dev": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1", - "source-map-support": "~0.5.6" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", - "dev": true - } - } - }, - "terser-webpack-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", - "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", + "syntax-error": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", + "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", "dev": true, "requires": { - "cacache": "^11.0.2", - "find-cache-dir": "^2.0.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "terser": "^3.8.1", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "acorn-node": "^1.2.0" } }, "through": { "version": "2.3.8", - "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, @@ -4199,21 +1285,12 @@ } }, "timers-browserify": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", - "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", + "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", "dev": true, "requires": { - "os-tmpdir": "~1.0.2" + "process": "~0.11.0" } }, "to-arraybuffer": { @@ -4222,93 +1299,10 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", - "dev": true - }, - "tslint": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.0.tgz", - "integrity": "sha512-CKEcH1MHUBhoV43SA/Jmy1l24HJJgI0eyLbBNSRyFlsQvb9v6Zdq+Nz2vEOH00nC5SUx4SneJ59PZUS/ARcokQ==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, "tty-browserify": { - "version": "0.0.0", - "resolved": "http://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, "typedarray": { @@ -4338,139 +1332,33 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", "dev": true - } - } - }, - "uglifyjs-webpack-plugin": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.1.1.tgz", - "integrity": "sha512-TQEcyMNkObX/H+FfcKjiDgs5RcXX8vW2UUUrDTOfQgg3lrafztfeM5WAwXo+AzqozJK6NP9w98xNpG/dutzSsg==", - "dev": true, - "requires": { - "cacache": "^11.2.0", - "find-cache-dir": "^2.0.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-js": "^3.0.0", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" - } - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", - "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, - "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "umd": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", + "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", "dev": true }, - "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "undeclared-identifiers": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", + "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", "dev": true, "requires": { - "punycode": "^2.1.0" + "acorn-node": "^1.3.0", + "get-assigned-identifiers": "^1.2.0", + "simple-concat": "^1.0.0", + "xtend": "^4.0.1" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -4489,12 +1377,6 @@ } } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, "util": { "version": "0.10.4", "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", @@ -4510,174 +1392,12 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "v8-compile-cache": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", - "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", - "dev": true - }, "vm-browserify": { - "version": "0.0.4", - "resolved": "http://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", - "dev": true, - "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" - } - }, - "webpack": { - "version": "4.28.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.28.3.tgz", - "integrity": "sha512-vLZN9k5I7Nr/XB1IDG9GbZB4yQd1sPuvufMFgJkx0b31fi2LD97KQIjwjxE7xytdruAYfu5S0FLBLjdxmwGJCg==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "acorn": "^5.6.2", - "acorn-dynamic-import": "^3.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "chrome-trace-event": "^1.0.0", - "enhanced-resolve": "^4.1.0", - "eslint-scope": "^4.0.0", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "micromatch": "^3.1.8", - "mkdirp": "~0.5.0", - "neo-async": "^2.5.0", - "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", - "tapable": "^1.1.0", - "terser-webpack-plugin": "^1.1.0", - "watchpack": "^1.5.0", - "webpack-sources": "^1.3.0" - }, - "dependencies": { - "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, - "webpack-cli": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.2.0.tgz", - "integrity": "sha512-wxnUqH0P5ErcwGIKMZbUqix2FjuUmhpS2N9ukZAuGmk9+3vOt7VY2ZM/90W9UZetf6lOJuBNcsbeGU7uCTLdSA==", - "dev": true, - "requires": { - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.0", - "findup-sync": "^2.0.0", - "global-modules": "^1.0.0", - "global-modules-path": "^2.3.0", - "import-local": "^2.0.0", - "interpret": "^1.1.0", - "loader-utils": "^1.1.0", - "opencollective": "^1.0.3", - "supports-color": "^5.5.0", - "v8-compile-cache": "^2.0.2", - "yargs": "^12.0.4" - }, - "dependencies": { - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", + "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", "dev": true }, - "worker-farm": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", - "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4689,48 +1409,6 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true - }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", - "dev": true - }, - "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } } } } diff --git a/package.json b/package.json index a486106..d63eafb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pious-squid", - "version": "1.3.0", + "version": "2.0.0-snapshot", "description": "Orbital mechanics and satellite mission analysis library, for NodeJS and the browser.", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -10,11 +10,11 @@ }, "scripts": { "build": "tsc", - "bundle": "webpack-cli", + "bundle": "browserify dist/index.js -s PiousSquid -o bundle/pious-squid.js", "clean-build": "npm run clean && npm run build", - "clean-bundle": "npm run clean-build && npm run bundle", + "clean-bundle": "npm run clean-build && npm run bundle && npm run minify", "clean": "rimraf dist bundle pious-squid-*.tgz", - "lint": "tslint --project tsconfig.json './src/**/*.ts'", + "minify": "uglifyjs bundle/pious-squid.js > bundle/pious-squid.min.js", "prepack": "npm run clean-bundle", "test": "mocha ./dist/test/**/*.js", "watch": "tsc --watch" @@ -31,16 +31,12 @@ "author": "David RC Dayton", "license": "MIT", "devDependencies": { - "@types/chai": "^4.1.7", "@types/mocha": "^5.2.5", "@types/node": "^10.12.18", - "chai": "^4.2.0", + "browserify": "^16.2.3", "mocha": "^5.2.0", "rimraf": "^2.6.3", - "tslint": "^5.12.0", "typescript": "^3.2.2", - "uglifyjs-webpack-plugin": "^2.1.1", - "webpack": "^4.28.3", - "webpack-cli": "^3.2.0" + "uglify-js": "^3.4.9" } } diff --git a/src/bodies.ts b/src/bodies.ts deleted file mode 100644 index 0117bcf..0000000 --- a/src/bodies.ts +++ /dev/null @@ -1,183 +0,0 @@ -import * as c from "./constants"; -import { Epoch } from "./epoch"; -import { evalPoly } from "./operations"; -import { Vector } from "./vector"; - -/** - * Calculate the [zeta, theta, zed] angles of precession, in radians. - * - * @param epoch satellite state epoch - */ -export function precession(epoch: Epoch): [number, number, number] { - const t = epoch.terrestrialCenturies; - const zeta = evalPoly(t, [0.0, 0.6406161, 0.0000839, 5.0e-6]) * c.DEG2RAD; - const theta = evalPoly(t, [0.0, 0.556753, -0.0001185, -1.16e-5]) * c.DEG2RAD; - const zed = evalPoly(t, [0.0, 0.6406161, 0.0003041, 5.1e-6]) * c.DEG2RAD; - return [zeta, theta, zed]; -} - -/** - * Calculate the [deltaPsi, deltaEpsilon, meanEpsilon] angles of nutation, - * in radians. - * - * @param epoch satellite state epoch - */ -export function nutation(epoch: Epoch): [number, number, number] { - const degRev = 360; - const t = epoch.terrestrialCenturies; - const moonAnom = - (evalPoly( - t, - [134.96340251, 1325.0 * degRev + 198.8675605, 0.0088553, 1.4343e-5] - ) % - degRev) * - c.DEG2RAD; - const sunAnom = - (evalPoly( - t, - [357.52910918, 99.0 * degRev + 359.0502911, -0.0001537, 3.8e-8] - ) % - degRev) * - c.DEG2RAD; - const moonLat = - (evalPoly( - t, - [93.27209062, 1342.0 * degRev + 82.0174577, -0.003542, -2.88e-7] - ) % - degRev) * - c.DEG2RAD; - const sunElong = - (evalPoly( - t, - [297.85019547, 1236.0 * degRev + 307.1114469, -0.0017696, 1.831e-6] - ) % - degRev) * - c.DEG2RAD; - const moonRaan = - (evalPoly( - t, - [125.04455501, -(5.0 * degRev + 134.1361851), 0.0020756, 2.139e-6] - ) % - degRev) * - c.DEG2RAD; - let deltaPsi = 0; - let deltaEpsilon = 0; - c.IAU_1980.map(iauLine => { - const arg = - iauLine[0] * moonAnom + - iauLine[1] * sunAnom + - iauLine[2] * moonLat + - iauLine[3] * sunElong + - iauLine[4] * moonRaan; - const sinC = iauLine[5] + iauLine[6] * t; - const cosC = iauLine[7] + iauLine[8] * t; - deltaPsi = deltaPsi + sinC * Math.sin(arg); - deltaEpsilon = deltaEpsilon + cosC * Math.cos(arg); - }); - deltaPsi = deltaPsi * c.MM2R; - deltaEpsilon = deltaEpsilon * c.MM2R; - const meanEpsilon = - (evalPoly(t, [23.439291, -0.013004, -1.64e-7, 5.04e-7]) % degRev) * - c.DEG2RAD; - return [deltaPsi, deltaEpsilon, meanEpsilon]; -} - -/** - * Calculate the density of the Earth's atmosphere, in kg/m^3, for a given - * position using the exponential atmospheric density model. - * - * @param position satellite position 3-vector, in kilometers - */ -export function atmosphericDensity(position: Vector): number { - const rDist = position.magnitude - c.EARTH_RAD_EQ; - let fields = [0.0, 0.0, 0.0]; - if (rDist <= c.EXP_ATMOSPHERE[0][0]) { - fields = c.EXP_ATMOSPHERE[0]; - } else if (rDist >= c.EXP_ATMOSPHERE[c.EXP_ATMOSPHERE.length - 1][0]) { - fields = c.EXP_ATMOSPHERE[c.EXP_ATMOSPHERE.length - 1]; - } else { - for (let i = 0; i < c.EXP_ATMOSPHERE.length - 1; i++) { - if ( - c.EXP_ATMOSPHERE[i][0] <= rDist && - rDist < c.EXP_ATMOSPHERE[i + 1][0] - ) { - fields = c.EXP_ATMOSPHERE[i]; - } - } - } - const base = fields[0]; - const density = fields[1]; - const height = fields[2]; - return density * Math.exp(-(rDist - base) / height); -} - -/** - * Calculate the J2000 position of the Moon, in kilometers, at a given epoch. - * - * @param epoch satellite state epoch - */ -export function moonPosition(epoch: Epoch): Vector { - const { sin, cos } = Math; - const jCent = epoch.julianCenturies; - const lamEcl = - ((218.32 + - 481267.883 * jCent + - 6.29 * sin((134.9 + 477198.85 * jCent) * c.DEG2RAD) - - 1.27 * sin((259.2 - 413335.38 * jCent) * c.DEG2RAD) + - 0.66 * sin((235.7 + 890534.23 * jCent) * c.DEG2RAD) + - 0.21 * sin((269.9 + 954397.7 * jCent) * c.DEG2RAD) - - 0.19 * sin((357.5 + 35999.05 * jCent) * c.DEG2RAD) - - 0.11 * sin((186.6 + 966404.05 * jCent) * c.DEG2RAD)) % - 360) * - c.DEG2RAD; - const phiEcl = - ((5.13 * sin((93.3 + 483202.03 * jCent) * c.DEG2RAD) + - 0.28 * sin((228.2 + 960400.87 * jCent) * c.DEG2RAD) - - 0.28 * sin((318.3 + 6003.18 * jCent) * c.DEG2RAD) - - 0.17 * sin((217.6 - 407332.2 * jCent) * c.DEG2RAD)) % - 360) * - c.DEG2RAD; - const pllx = - ((0.9508 + - 0.0518 * cos((134.9 + 477198.85 * jCent) * c.DEG2RAD) + - 0.0095 * cos((259.2 - 413335.38 * jCent) * c.DEG2RAD) + - 0.0078 * cos((235.7 + 890534.23 * jCent) * c.DEG2RAD) + - 0.0028 * cos((269.9 + 954397.7 * jCent) * c.DEG2RAD)) % - 360) * - c.DEG2RAD; - const obq = ((23.439291 - 0.0130042 * jCent) % 360) * c.DEG2RAD; - const rMag = 1.0 / sin(pllx); - const rI = rMag * (cos(phiEcl) * cos(lamEcl)) * c.EARTH_RAD_EQ; - const rJ = - rMag * - (cos(obq) * cos(phiEcl) * sin(lamEcl) - sin(obq) * sin(phiEcl)) * - c.EARTH_RAD_EQ; - const rK = - rMag * - (sin(obq) * cos(phiEcl) * sin(lamEcl) + cos(obq) * sin(phiEcl)) * - c.EARTH_RAD_EQ; - return new Vector(rI, rJ, rK); -} - -/** - * Calculate the J2000 position of the Sun, in kilometers, at a given epoch. - * - * @param epoch satellite state epoch - */ -export function sunPosition(epoch: Epoch): Vector { - const { sin, cos } = Math; - const jCent = epoch.julianCenturies; - const lamSun = (280.46 + 36000.77 * jCent) % 360; - const mSun = ((357.5277233 + 35999.05034 * jCent) % 360) * c.DEG2RAD; - const lamEc = - ((lamSun + 1.914666471 * sin(mSun) + 0.019994643 * sin(2 * mSun)) % 360) * - c.DEG2RAD; - const obliq = (23.439291 - 0.0130042 * jCent) * c.DEG2RAD; - const rMag = - 1.000140612 - 0.016708617 * cos(mSun) - 0.000139589 * cos(2 * mSun); - return new Vector( - rMag * cos(lamEc) * c.ASTRONOMICAL_UNIT, - rMag * cos(obliq) * sin(lamEc) * c.ASTRONOMICAL_UNIT, - rMag * sin(obliq) * sin(lamEc) * c.ASTRONOMICAL_UNIT - ); -} diff --git a/src/bodies/earth-body.ts b/src/bodies/earth-body.ts new file mode 100644 index 0000000..1853516 --- /dev/null +++ b/src/bodies/earth-body.ts @@ -0,0 +1,121 @@ +import { IAU_1980 } from "../data/values/iau1980"; +import { DEG2RAD, TTASEC2RAD } from "../math/constants"; +import { evalPoly } from "../math/operations"; +import { Vector3D } from "../math/vector-3d"; +import { EpochUTC } from "../time/epoch-utc"; +import { DataHandler } from "../data/data-handler"; + +export class EarthBody { + /** Earth gravitational parameter, in km^3/s^2. */ + public static readonly MU = 398600.4415; + + /** Earth equatorial radius, in kilometers. */ + public static readonly RADIUS_EQUATOR = 6378.1363; + + /** Earth coefficient of flattening. */ + public static readonly FLATTENING = 1 / 298.257; + + /** Earth rotation vector, in radians per second. */ + private static readonly ROTATION = new Vector3D(0, 0, 7.2921158553e-5); + + /** Earth polar radius, in kilometers. */ + public static readonly RADIUS_POLAR = + EarthBody.RADIUS_EQUATOR * (1 - EarthBody.FLATTENING); + + /** Earth mean radius, in kilometers. */ + public static readonly RADIUS_MEAN = + (2 * EarthBody.RADIUS_EQUATOR + EarthBody.RADIUS_POLAR) / 3; + + /** Earth eccentricity squared. */ + public static readonly ECCENTRICITY_SQUARED = + EarthBody.FLATTENING * (2 - EarthBody.FLATTENING); + + /** + * Return Earth's rotation vector, in radians per second. + * + * The vector is adjusted for length of day (LOD) variations, assuming IERS + * finals.all data is loaded in DataHandler. Otherwise, LOD corrections are + * ignored. + * + * @param epoch UTC epoch + */ + public static getRotation(epoch: EpochUTC) { + const finals = DataHandler.getFinalsData(epoch.toMjd()); + return EarthBody.ROTATION.scale(1 - finals.lod / 86400); + } + + /** + * Calculate the [zeta, theta, zed] angles of precession, in radians. + * + * @param epoch satellite state epoch + */ + public static precession(epoch: EpochUTC): [number, number, number] { + const t = epoch.toTDB().toJulianCenturies(); + const zeta = evalPoly(t, [0.0, 0.6406161, 0.0000839, 5.0e-6]); + const theta = evalPoly(t, [0.0, 0.556753, -0.0001185, -1.16e-5]); + const zed = evalPoly(t, [0.0, 0.6406161, 0.0003041, 5.1e-6]); + return [zeta * DEG2RAD, theta * DEG2RAD, zed * DEG2RAD]; + } + + /** + * Calculate the [deltaPsi, deltaEpsilon, meanEpsilon] angles of nutation, + * in radians. + * + * @param epoch satellite state epoch + */ + public static nutation(epoch: EpochUTC, n = 4): [number, number, number] { + const r = 360; + const t = epoch.toTDB().toJulianCenturies(); + const moonAnom = evalPoly(t, [ + 134.96340251, + 1325.0 * r + 198.8675605, + 0.0088553, + 1.4343e-5 + ]); + const sunAnom = evalPoly(t, [ + 357.52910918, + 99.0 * r + 359.0502911, + -0.0001537, + 3.8e-8 + ]); + const moonLat = evalPoly(t, [ + 93.27209062, + 1342.0 * r + 82.0174577, + -0.003542, + -2.88e-7 + ]); + const sunElong = evalPoly(t, [ + 297.85019547, + 1236.0 * r + 307.1114469, + -0.0017696, + 1.831e-6 + ]); + const moonRaan = evalPoly(t, [ + 125.04455501, + -(5.0 * r + 134.1361851), + 0.0020756, + 2.139e-6 + ]); + let deltaPsi = 0; + let deltaEpsilon = 0; + IAU_1980.slice(0, n).map(iauLine => { + let [a1, a2, a3, a4, a5, Ai, Bi, Ci, Di] = iauLine; + const arg = + (a1 * moonAnom + + a2 * sunAnom + + a3 * moonLat + + a4 * sunElong + + a5 * moonRaan) * + DEG2RAD; + const sinC = Ai + Bi * t; + const cosC = Ci + Di * t; + deltaPsi += sinC * Math.sin(arg); + deltaEpsilon += cosC * Math.cos(arg); + }); + deltaPsi = deltaPsi * TTASEC2RAD; + deltaEpsilon = deltaEpsilon * TTASEC2RAD; + const meanEpsilon = + evalPoly(t, [23.439291, -0.013004, -1.64e-7, 5.04e-7]) * DEG2RAD; + return [deltaPsi, deltaEpsilon, meanEpsilon]; + } +} diff --git a/src/bodies/moon-body.ts b/src/bodies/moon-body.ts new file mode 100644 index 0000000..d8d4ff1 --- /dev/null +++ b/src/bodies/moon-body.ts @@ -0,0 +1,51 @@ +import { EarthBody } from "../bodies/earth-body"; +import { DEG2RAD } from "../math/constants"; +import { Vector3D } from "../math/vector-3d"; +import { EpochUTC } from "../time/epoch-utc"; + +export class MoonBody { + /** Moon gravitational parameter, in km^3/s^2. */ + public static readonly MU = 4902.801; + + /** + * Calculate the J2000 position of the Moon, in kilometers, at a given epoch. + * + * @param epoch satellite state epoch + */ + public static position(epoch: EpochUTC) { + const jc = epoch.toUT1().toJulianCenturies(); + const dtr = DEG2RAD; + const lamEcl = + 218.32 + + 481267.883 * jc + + 6.29 * Math.sin((134.9 + 477198.85 * jc) * dtr) - + 1.27 * Math.sin((259.2 - 413335.38 * jc) * dtr) + + 0.66 * Math.sin((235.7 + 890534.23 * jc) * dtr) + + 0.21 * Math.sin((269.9 + 954397.7 * jc) * dtr) - + 0.19 * Math.sin((357.5 + 35999.05 * jc) * dtr) - + 0.11 * Math.sin((186.6 + 966404.05 * jc) * dtr); + const phiEcl = + 5.13 * Math.sin((93.3 + 483202.03 * jc) * dtr) + + 0.28 * Math.sin((228.2 + 960400.87 * jc) * dtr) - + 0.28 * Math.sin((318.3 + 6003.18 * jc) * dtr) - + 0.17 * Math.sin((217.6 - 407332.2 * jc) * dtr); + const pllx = + 0.9508 + + 0.0518 * Math.cos((134.9 + 477198.85 * jc) * dtr) + + 0.0095 * Math.cos((259.2 - 413335.38 * jc) * dtr) + + 0.0078 * Math.cos((235.7 + 890534.23 * jc) * dtr) + + 0.0028 * Math.cos((269.9 + 954397.7 * jc) * dtr); + const obq = 23.439291 - 0.0130042 * jc; + const rMag = 1.0 / Math.sin(pllx * dtr); + const rI = rMag * (Math.cos(phiEcl * dtr) * Math.cos(lamEcl * dtr)); + const rJ = + rMag * + (Math.cos(obq * dtr) * Math.cos(phiEcl * dtr) * Math.sin(lamEcl * dtr) - + Math.sin(obq * dtr) * Math.sin(phiEcl * dtr)); + const rK = + rMag * + (Math.sin(obq * dtr) * Math.cos(phiEcl * dtr) * Math.sin(lamEcl * dtr) + + Math.cos(obq * dtr) * Math.sin(phiEcl * dtr)); + return new Vector3D(rI, rJ, rK).scale(EarthBody.RADIUS_EQUATOR); + } +} diff --git a/src/bodies/sun-body.ts b/src/bodies/sun-body.ts new file mode 100644 index 0000000..f61433e --- /dev/null +++ b/src/bodies/sun-body.ts @@ -0,0 +1,70 @@ +import { EarthBody } from "../bodies/earth-body"; +import { J2000 } from "../coordinates/j2000"; +import { ASTRONOMICAL_UNIT, DEG2RAD, SPEED_OF_LIGHT } from "../math/constants"; +import { Vector3D } from "../math/vector-3d"; +import { EpochUTC } from "../time/epoch-utc"; + +export class SunBody { + /** Moon gravitational parameter, in km^3/s^2. */ + public static readonly MU = 132712440017.987; + + /** Solar flux, in W/m^2 */ + public static readonly SOLAR_FLUX = 1353; + + /** Solar Radiation Pressure, in N/m^2. */ + public static readonly SOLAR_PRESSURE = SunBody.SOLAR_FLUX / SPEED_OF_LIGHT; + + /** Solar umbra angle, in radians. */ + public static readonly UMBRA_ANGLE = 0.26411888 * DEG2RAD; + + /** Solar penumbra angle, in radians. */ + public static readonly PENUMBRA_ANGLE = 0.26900424 * DEG2RAD; + + /** + * Calculate the J2000 position of the Sun, in kilometers, at a given epoch. + * + * @param epoch satellite state epoch + */ + public static position(epoch: EpochUTC) { + const jc = epoch.toUT1().toJulianCenturies(); + const dtr = DEG2RAD; + const lamSun = 280.46 + 36000.77 * jc; + const mSun = 357.5277233 + 35999.05034 * jc; + const lamEc = + lamSun + + 1.914666471 * Math.sin(mSun * dtr) + + 0.019994643 * Math.sin(2 * mSun * dtr); + const obliq = 23.439291 - 0.0130042 * jc; + const rMag = + 1.000140612 - + 0.016708617 * Math.cos(mSun * dtr) - + 0.000139589 * Math.cos(2 * mSun * dtr); + const rI = rMag * Math.cos(lamEc * dtr); + const rJ = rMag * Math.cos(obliq * dtr) * Math.sin(lamEc * dtr); + const rK = rMag * Math.sin(obliq * dtr) * Math.sin(lamEc * dtr); + return new Vector3D(rI, rJ, rK).scale(ASTRONOMICAL_UNIT); + } + + /** + * Return true if argument state is in eclipse. + * + * @param j2kState J2000 state vector + */ + public static shadow(j2kState: J2000) { + const { epoch, position: posSat } = j2kState; + const posSun = SunBody.position(epoch); + let shadow = false; + if (posSun.dot(posSat) < 0) { + const angle = posSun.angle(posSat); + const r = posSat.magnitude(); + const satHoriz = r * Math.cos(angle); + const satVert = r * Math.sin(angle); + const penVert = + EarthBody.RADIUS_EQUATOR + Math.tan(SunBody.PENUMBRA_ANGLE) * satHoriz; + if (satVert <= penVert) { + shadow = true; + } + } + return shadow; + } +} diff --git a/src/constants.ts b/src/constants.ts deleted file mode 100644 index 1f87f59..0000000 --- a/src/constants.ts +++ /dev/null @@ -1,177 +0,0 @@ -import { Vector } from "./vector"; - -/** Value of 2 times Pi. */ -export const TWO_PI = Math.PI * 2; - -/** Unit for converting degrees to radians. */ -export const DEG2RAD = Math.PI / 180; - -/** Unit for converting radians to degrees. */ -export const RAD2DEG = 180 / Math.PI; - -/** Unit for converting 0.0001 minutes to radians. */ -export const MM2R = (1 / 60 / 60 / 10000) * DEG2RAD; - -/** Astronomical Unit, in kilometers. */ -export const ASTRONOMICAL_UNIT = 149597870.0; - -/** Earth equatorial radius, in kilometers. */ -export const EARTH_RAD_EQ = 6378.1363; - -/** Earth coefficient of flattening. */ -export const EARTH_FLAT = 1 / 298.257223563; - -/** Earth polar radius, in kilometers. */ -export const EARTH_RAD_POL = EARTH_RAD_EQ * (1 - EARTH_FLAT); - -/** Earth mean radius, in kilometers. */ -export const EARTH_RAD_MEAN = (2 * EARTH_RAD_EQ + EARTH_RAD_POL) / 3; - -/** Earth eccentricity, squared. */ -export const EARTH_ECC_SQ = - (EARTH_RAD_EQ ** 2 - EARTH_RAD_POL ** 2) / EARTH_RAD_EQ ** 2; - -/** Earth J2 coefficient. */ -export const EARTH_J2 = 0.001082627; - -/** Earth J3 coefficient. */ -export const EARTH_J3 = -0.000002532; - -/** Earth J4 coefficient. */ -export const EARTH_J4 = -0.00000162; - -/** Earth gravitational parameter, in km^3/s^2. */ -export const EARTH_MU = 398600.4415; - -/** Earth rotation vector, in radians per second. */ -export const EARTH_ROTATION = new Vector(0, 0, 7.29211514670698e-5); - -/** Moon gravitational parameter, in km^3/s^2. */ -export const MOON_MU = 4902.801; - -/** Sun gravitational parameter, in km^3/s^2. */ -export const SUN_MU = 132712440017.987; - -/** Unit for converting seconds to days. */ -export const SEC2DAY = 1 / 60 / 60 / 24; - -/** Unit for converting seconds to degrees. */ -export const SEC2DEG = 1 / 60 / 60; - -/** Solar flux constant, in watts/km^2. */ -export const SOLAR_FLUX = 1.358; - -/** Speed of light, in kilometers per second. */ -export const SPEED_OF_LIGHT = 299792.458; - -/** - * Coefficients for the exponential atmospheric density model. Contains the - * base altitude (km), nominal density (kg/m^3), and scale height (km). - */ -export const EXP_ATMOSPHERE = [ - [0, 1.225, 7.249], - [25, 3.899e-2, 6.349], - [30, 1.774e-2, 6.682], - [40, 3.972e-3, 7.554], - [50, 1.057e-3, 8.382], - [60, 3.206e-4, 7.714], - [70, 8.77e-5, 6.549], - [80, 1.905e-5, 5.799], - [90, 3.396e-6, 5.382], - [100, 5.297e-7, 5.877], - [110, 9.661e-8, 7.263], - [120, 2.438e-8, 9.473], - [130, 8.484e-9, 12.636], - [140, 3.845e-9, 16.149], - [150, 2.07e-9, 22.523], - [180, 5.464e-10, 29.74], - [200, 2.789e-10, 37.105], - [250, 7.248e-11, 45.546], - [300, 2.418e-11, 53.628], - [350, 9.518e-12, 53.298], - [400, 3.725e-12, 58.515], - [450, 1.585e-12, 60.828], - [500, 6.967e-13, 63.822], - [600, 1.454e-13, 71.835], - [700, 3.614e-14, 88.667], - [800, 1.17e-14, 124.64], - [900, 5.245e-15, 181.05], - [1000, 3.019e-15, 268.0] -]; - -/** Coefficients for calculating Earth nutation. */ -export const IAU_1980 = [ - [0, 0, 0, 0, 1, -171996.0, -174.2, 92025.0, 8.9], - [0, 0, 2, -2, 2, -13187.0, -1.6, 5736.0, -3.1], - [0, 0, 2, 0, 2, -2274.0, -0.2, 977.0, -0.5], - [0, 0, 0, 0, 2, 2062.0, 0.2, -895.0, 0.5], - [0, 1, 0, 0, 0, 1426.0, -3.4, 54.0, -0.1], - [1, 0, 0, 0, 0, 712.0, 0.1, -7.0, 0.0], - [0, 1, 2, -2, 2, -517.0, 1.2, 224.0, -0.6], - [0, 0, 2, 0, 1, -386.0, -0.4, 200.0, 0.0], - [1, 0, 2, 0, 2, -301.0, 0.0, 129.0, -0.1], - [0, -1, 2, -2, 2, 217.0, -0.5, -95.0, 0.3] -]; - -/** - * Historical list of leap seconds. Contains a tuple of the Julian Date, and - * seconds offset. - */ -export const LEAP_SECONDS = [ - [2437300.5, 1.422818], - [2437512.5, 1.372818], - [2437665.5, 1.845858], - [2438334.5, 1.845858], - [2438395.5, 3.24013], - [2438486.5, 3.34013], - [2438639.5, 3.44013], - [2438761.5, 3.54013], - [2438820.5, 3.64013], - [2438942.5, 3.74013], - [2439004.5, 3.84013], - [2439126.5, 4.31317], - [2439887.5, 4.21317], - [2441317.5, 10.0], - [2441499.5, 11.0], - [2441683.5, 12.0], - [2442048.5, 13.0], - [2442413.5, 14.0], - [2442778.5, 15.0], - [2443144.5, 16.0], - [2443509.5, 17.0], - [2443874.5, 18.0], - [2444239.5, 19.0], - [2444786.5, 20.0], - [2445151.5, 21.0], - [2445516.5, 22.0], - [2446247.5, 23.0], - [2447161.5, 24.0], - [2447892.5, 25.0], - [2448257.5, 26.0], - [2448804.5, 27.0], - [2449169.5, 28.0], - [2449534.5, 29.0], - [2450083.5, 30.0], - [2450630.5, 31.0], - [2451179.5, 32.0], - [2453736.5, 33.0], - [2454832.5, 34.0], - [2456109.5, 35.0], - [2457204.5, 36.0], - [2457754.5, 37.0] -]; - -export const EGM_96_NORMALIZED = [ - [2, 0, -0.484165371736e-3, 0.0], - [2, 1, -0.186987635955e-9, 0.119528012031e-8], - [2, 2, 0.243914352398e-5, -0.140016683654e-5], - [3, 0, 0.957254173792e-6, 0.0], - [3, 1, 0.202998882184e-5, 0.248513158716e-6], - [3, 2, 0.904627768605e-6, -0.619025944205e-6], - [3, 3, 0.721072657057e-6, 0.141435626958e-5], - [4, 0, 0.539873863789e-6, 0.0], - [4, 1, -0.536321616971e-6, -0.473440265853e-6], - [4, 2, 0.350694105785e-6, 0.66267157254e-6], - [4, 3, 0.990771803829e-6, -0.200928369177e-6], - [4, 4, -0.188560802735e-6, 0.308853169333e-6] -]; diff --git a/src/constructs/construct-config.ts b/src/constructs/construct-config.ts deleted file mode 100644 index aca6637..0000000 --- a/src/constructs/construct-config.ts +++ /dev/null @@ -1,13 +0,0 @@ -/** Options for the Satellite constructor. */ -export interface ISatelliteOptions { - /** Satellite name. */ - name?: string; -} - -/** Options for the GroundStation constructor. */ -export interface IGroundStationOptions { - /** Ground station name. */ - name?: string; - /** Site minimum elevation, in radians. */ - minEl?: number; -} diff --git a/src/constructs/ground-station.ts b/src/constructs/ground-station.ts deleted file mode 100644 index b903e49..0000000 --- a/src/constructs/ground-station.ts +++ /dev/null @@ -1,81 +0,0 @@ -import { sunPosition } from "../bodies"; -import { Geodetic } from "../coordinates/geodetic"; -import { J2000 } from "../coordinates/j2000"; -import { LookAngle } from "../coordinates/look-angle"; -import { IGroundStationOptions } from "./construct-config"; - -/** Default construct options. */ -const DEFAULT_OPTIONS: IGroundStationOptions = { - minEl: 0, - name: "" -}; - -/** Class representing a ground station. */ -export class GroundStation { - /** Ground station name. */ - public readonly name: string; - /** Geodetic location of the ground station. */ - public readonly location: Geodetic; - /** Site minimum elevation, in radians. */ - public readonly minEl: number; - - /** - * Create a new GroundStation object. If values are not specified in the - * options argument, the following defaults are used: - * - * name = "" - * minEl = 0 - * - * @param location geodetic location of the ground station - * @param opts ground station options - */ - constructor(location: Geodetic, opts?: IGroundStationOptions) { - this.location = location; - opts = opts || {}; - const mergeOpts = { ...DEFAULT_OPTIONS, ...opts }; - this.name = mergeOpts.name as string; - this.minEl = mergeOpts.minEl as number; - } - - /** Return a string representation of the object. */ - public toString(): string { - return `Ground Station: ${this.name}\n` + location.toString(); - } - - /** - * Calculate look angles for the ground station to a target state. - * - * @param state target state - */ - public lookAngles(state: J2000): LookAngle { - return state - .toECI() - .toECEF() - .toTopocentric(this.location) - .toLookAngle(); - } - - /** - * Return true if a target state is in view, otherwise return false. - * - * @param state target state - */ - public isVisible(state: J2000): boolean { - const { elevation } = this.lookAngles(state); - return elevation >= this.minEl; - } - - /** - * Calculate the angle between the Sun and a target state, in radians, using - * the ground station as the vertex. - */ - public sunAngle(state: J2000): number { - const sensor = this.location - .toECEF() - .toECI(state.epoch.millis) - .toJ2K().position; - const sun = sunPosition(state.epoch).changeOrigin(sensor); - const target = state.position.changeOrigin(sensor); - return target.angle(sun); - } -} diff --git a/src/constructs/satellite.ts b/src/constructs/satellite.ts deleted file mode 100644 index 85b2f82..0000000 --- a/src/constructs/satellite.ts +++ /dev/null @@ -1,87 +0,0 @@ -import { EARTH_RAD_MEAN } from "../constants"; -import { J2000 } from "../coordinates/j2000"; -import { IPropagator } from "../propagators/propagator-interface"; -import { ISatelliteOptions } from "./construct-config"; -import { GroundStation } from "./ground-station"; - -/** Default construct options. */ -const DEFAULT_OPTIONS: ISatelliteOptions = { - name: "" -}; - -/** Class representing a satellite. */ -export class Satellite { - /** Satellite name. */ - public readonly name: string; - /** Satellite ephemeris propagator. */ - public readonly propagator: IPropagator; - - /** Create a new Satellite object. If values are not specified in the - * options argument, the following defaults are used: - * - * name = "" - * - * @param propagator satellite ephemeris propagator - * @param opts satellite options - */ - constructor(propagator: IPropagator, opts?: ISatelliteOptions) { - this.propagator = propagator; - opts = opts || {}; - const mergeOpts = { ...DEFAULT_OPTIONS, ...opts }; - this.name = mergeOpts.name as string; - } - - /** Return a string representation of the object. */ - public toString(): string { - return [ - "[Satellite]", - ` Name: ${this.name}`, - ` Propagator: ${this.propagator.type}` - ].join("\n"); - } - - /** Convert to a GroundStation object, using current cached state. */ - public toGroundStation(): GroundStation { - return new GroundStation( - this.getState() - .toECI() - .toECEF() - .toGeodetic(), - { name: this.name, minEl: -Math.PI } - ); - } - - /** Propagate this to match the epoch of another Satellite object. */ - public matchEpoch(satellite: Satellite): Satellite { - return this.propagate(satellite.getState().epoch.millis); - } - - /** Return the propagator's cached state. */ - public getState(): J2000 { - return this.propagator.state; - } - - /** Calculate satellite footprint half-angle, in radians. */ - public footprint(): number { - const dist = this.getState().position.magnitude; - return Math.acos(EARTH_RAD_MEAN / dist); - } - - /** - * Calculate the Earth's angular radius using the current cached - * state, in radians. - */ - public earthRadius(): number { - return Math.asin(EARTH_RAD_MEAN / this.getState().position.magnitude); - } - - /** - * Propagate the satellite's state to a new epoch. - * - * @param millis milliseconds since 1 January 1970, 00:00 UTC - */ - public propagate(millis: number): Satellite { - this.propagator.propagate(millis); - return this; - } -} diff --git a/src/coordinates/keplerian-elements.ts b/src/coordinates/classical-elements.ts similarity index 70% rename from src/coordinates/keplerian-elements.ts rename to src/coordinates/classical-elements.ts index da1598c..567616f 100644 --- a/src/coordinates/keplerian-elements.ts +++ b/src/coordinates/classical-elements.ts @@ -1,15 +1,13 @@ -import { EARTH_MU, RAD2DEG, TWO_PI } from "../constants"; -import { Epoch } from "../epoch"; -import { Vector } from "../vector"; -import { CoordinateType, ICoordinate } from "./coordinate-config"; +import { EarthBody } from "../bodies/earth-body"; +import { RAD2DEG, TWO_PI } from "../math/constants"; +import { Vector3D } from "../math/vector-3d"; +import { EpochUTC } from "../time/epoch-utc"; import { J2000 } from "./j2000"; /** Class representing Keplerian orbital elements. */ -export class KeplerianElements implements ICoordinate { - /** Coordinate identifier string. */ - public readonly type: string; +export class ClassicalElements { /** Satellite state epoch. */ - public readonly epoch: Epoch; + public readonly epoch: EpochUTC; /** Semimajor axis, in kilometers. */ public readonly a: number; /** Orbit eccentricity (unitless). */ @@ -26,7 +24,7 @@ export class KeplerianElements implements ICoordinate { /** * Create a new Keplerian object. * - * @param millis milliseconds since 1 January 1970, 00:00 UTC + * @param epoch UTC epoch * @param a semimajor axis, in kilometers * @param e orbit eccentricity (unitless) * @param i inclination, in radians @@ -35,7 +33,7 @@ export class KeplerianElements implements ICoordinate { * @param v true anomaly, in radians */ constructor( - millis: number, + epoch: EpochUTC, a: number, e: number, i: number, @@ -43,8 +41,7 @@ export class KeplerianElements implements ICoordinate { w: number, v: number ) { - this.type = CoordinateType.KEPLERIAN_ELEMENTS; - this.epoch = new Epoch(millis); + this.epoch = epoch; this.a = a; this.e = e; this.i = i; @@ -75,35 +72,34 @@ export class KeplerianElements implements ICoordinate { ].join("\n"); } - /** Convert to the J2000 (J2K) inertial coordinate frame. */ - public toJ2K(): J2000 { + /** Calculate the satellite's mean motion, in radians per second. */ + public meanMotion(): number { + return Math.sqrt(EarthBody.MU / this.a ** 3); + } + + /** Calculate the number of revolutions the satellite completes per day. */ + public revsPerDay(): number { + return this.meanMotion() * (86400 / TWO_PI); + } + + /** Convert this to a J2000 state vector object. */ + public toJ2000() { const { epoch, a, e, i, o, w, v } = this; const { cos, sin, sqrt } = Math; - const rPqw = new Vector(cos(v), sin(v), 0).scale( + const rPQW = new Vector3D(cos(v), sin(v), 0).scale( (a * (1 - e ** 2)) / (1 + e * cos(v)) ); - const vPqw = new Vector(-sin(v), e + cos(v), 0).scale( - sqrt(EARTH_MU / (a * (1 - e ** 2))) + const vPQW = new Vector3D(-sin(v), e + cos(v), 0).scale( + sqrt(EarthBody.MU / (a * (1 - e ** 2))) ); - const rJ2k = rPqw + const rJ2k = rPQW .rot3(-w) .rot1(-i) .rot3(-o); - const vJ2k = vPqw + const vJ2k = vPQW .rot3(-w) .rot1(-i) .rot3(-o); - const [ri, rj, rk, vi, vj, vk] = rJ2k.concat(vJ2k).state; - return new J2000(epoch.millis, ri, rj, rk, vi, vj, vk); - } - - /** Calculate the satellite's mean motion, in radians per second. */ - public meanMotion(): number { - return Math.sqrt(EARTH_MU / this.a ** 3); - } - - /** Calculate the number of revolutions the satellite completes per day. */ - public revsPerDay(): number { - return this.meanMotion() * (86400 / TWO_PI); + return new J2000(epoch, rJ2k, vJ2k); } } diff --git a/src/coordinates/coordinate-config.ts b/src/coordinates/coordinate-config.ts deleted file mode 100644 index 9e88d6c..0000000 --- a/src/coordinates/coordinate-config.ts +++ /dev/null @@ -1,17 +0,0 @@ -/** Interface for coordinate objects. */ -export interface ICoordinate { - /** Coordinate identifier string. */ - type: string; -} - -/** Coordinate type identifiers. */ -export enum CoordinateType { - EARTH_CENTERED_FIXED = "ecef", - EARTH_CENTERED_INERTIAL = "eci", - GEODETIC = "geodetic", - J2000 = "j2k", - KEPLERIAN_ELEMENTS = "keplerian", - LOOK_ANGLE = "look-angle", - SPHERICAL = "spherical", - TOPOCENTRIC_HORIZON = "topocentric-horizon" -} diff --git a/src/coordinates/earth-centered-fixed.ts b/src/coordinates/earth-centered-fixed.ts deleted file mode 100644 index e35a7b3..0000000 --- a/src/coordinates/earth-centered-fixed.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { nutation } from "../bodies"; -import { EARTH_ECC_SQ, EARTH_RAD_EQ, EARTH_ROTATION } from "../constants"; -import { Epoch } from "../epoch"; -import { Vector } from "../vector"; -import { CoordinateType, ICoordinate } from "./coordinate-config"; -import { EarthCenteredInertial } from "./earth-centered-inertial"; -import { Geodetic } from "./geodetic"; -import { Spherical } from "./spherical"; -import { TopocentricHorizon } from "./topocentric-horizon"; - -/** Class representing Earth Centered Earth Fixed (ECEF) coordinates. */ -export class EarthCenteredFixed implements ICoordinate { - /** Coordinate identifier string. */ - public readonly type: string; - /** Position 3-vector, in kilometers. */ - public readonly position: Vector; - /** Velocity 3-vector, in kilometers per second. */ - public readonly velocity: Vector; - - /** - * Create a new EarthCenteredFixed object. - * - * @param rx x-axis position, in kilometers - * @param ry y-axis position, in kilometers - * @param rz z-axis position, in kilometers - * @param vx x-axis velocity, in kilometers per second (default = 0) - * @param vy y-axis velocity, in kilometers per second (default = 0) - * @param vz z-axis velocity, in kilometers per second (default = 0) - */ - constructor(rx: number, ry: number, rz: number, vx = 0, vy = 0, vz = 0) { - this.type = CoordinateType.EARTH_CENTERED_FIXED; - this.position = new Vector(rx, ry, rz); - this.velocity = new Vector(vx, vy, vz); - } - - /** Return a string representation of the object. */ - public toString(): string { - return [ - "[EarthCenteredFixed]", - ` Position: ${this.position.toString()} km`, - ` Velocity: ${this.velocity.toString()} km/s` - ].join("\n"); - } - - /** - * Convert to the Earth Centered Inertial (ECI) coordinate frame. - * - * @param millis milliseconds since 1 January 1970, 00:00 UTC - */ - public toECI(millis: number): EarthCenteredInertial { - const { position, velocity } = this; - const epoch = new Epoch(millis); - const [dLon, dObliq, mObliq] = nutation(epoch); - const obliq = mObliq + dObliq; - const ast = epoch.gmstAngle + dLon * Math.cos(obliq); - const rotVec = EARTH_ROTATION.cross(position); - const vpef = velocity.add(rotVec); - const rtod = position.rot3(-ast); - const vtod = vpef.rot3(-ast); - const [ri, rj, rk, vi, vj, vk] = rtod.concat(vtod).state; - return new EarthCenteredInertial(millis, ri, rj, rk, vi, vj, vk); - } - - /** Convert to the Geodetic (LLA) coordinate frame. */ - public toGeodetic(): Geodetic { - const [x, y, z] = this.position.state; - const sma = EARTH_RAD_EQ; - const esq = EARTH_ECC_SQ; - const lon = Math.atan2(y, x); - const r = Math.sqrt(x ** 2 + y ** 2); - let phi = Math.atan(z / r); - let lat = phi; - let c = 0; - for (let i = 0; i < 8; i++) { - phi = lat; - const slat = Math.sin(lat); - c = 1 / Math.sqrt(1 - esq * slat * slat); - lat = Math.atan((z + sma * c * esq * Math.sin(lat)) / r); - } - const alt = r / Math.cos(lat) - sma * c; - return new Geodetic(lat, lon, alt); - } - - /** Convert to the Spherical coordinate frame. */ - public toSpherical(): Spherical { - const [x, y, z] = this.position.state; - const radius = Math.sqrt(x * x + y * y + z * z); - const inclination = Math.acos(z / radius); - const azimuth = Math.atan(y / x); - return new Spherical(radius, inclination, azimuth); - } - - /** - * Convert to a Topocentric coordinate frame relative to an observer. - * - * @param observer coordinate frame origin - */ - public toTopocentric(observer: Geodetic): TopocentricHorizon { - const { latitude, longitude } = observer; - const { sin, cos } = Math; - const [oX, oY, oZ] = observer.toECEF().position.state; - const [tX, tY, tZ] = this.position.state; - const [rX, rY, rZ] = [tX - oX, tY - oY, tZ - oZ]; - const s = - sin(latitude) * cos(longitude) * rX + - sin(latitude) * sin(longitude) * rY - - cos(latitude) * rZ; - const e = -sin(longitude) * rX + cos(longitude) * rY; - const z = - cos(latitude) * cos(longitude) * rX + - cos(latitude) * sin(longitude) * rY + - sin(latitude) * rZ; - return new TopocentricHorizon(s, e, z); - } -} diff --git a/src/coordinates/earth-centered-inertial.ts b/src/coordinates/earth-centered-inertial.ts deleted file mode 100644 index 7123cc0..0000000 --- a/src/coordinates/earth-centered-inertial.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { nutation, precession } from "../bodies"; -import { EARTH_ROTATION } from "../constants"; -import { Epoch } from "../epoch"; -import { Vector } from "../vector"; -import { CoordinateType, ICoordinate } from "./coordinate-config"; -import { EarthCenteredFixed } from "./earth-centered-fixed"; -import { J2000 } from "./j2000"; - -/** Class representing Earth Centered Inertial (ECI) coordinates. */ -export class EarthCenteredInertial implements ICoordinate { - /** Coordinate identifier string. */ - public readonly type: string; - /** Satellite state epoch. */ - public readonly epoch: Epoch; - /** Position 3-vector, in kilometers. */ - public readonly position: Vector; - /** Velocity 3-vector, in kilometers per second. */ - public readonly velocity: Vector; - - /** - * Create a new EarthCenteredFixed object. - * - * @param millis milliseconds since 1 January 1970, 00:00 UTC - * @param ri i-axis position, in kilometers - * @param rj j-axis position, in kilometers - * @param rk k-axis position, in kilometers - * @param vi i-axis velocity, in kilometers per second - * @param vj j-axis velocity, in kilometers per second - * @param vk k-axis velocity, in kilometers per second - */ - constructor( - millis: number, - ri: number, - rj: number, - rk: number, - vi: number, - vj: number, - vk: number - ) { - this.type = CoordinateType.EARTH_CENTERED_INERTIAL; - this.epoch = new Epoch(millis); - this.position = new Vector(ri, rj, rk); - this.velocity = new Vector(vi, vj, vk); - } - - /** Return a string representation of the object. */ - public toString(): string { - return [ - "[EarthCenteredInertial]", - ` Epoch: ${this.epoch.toString()}`, - ` Position: ${this.position.toString()} km`, - ` Velocity: ${this.velocity.toString()} km/s` - ].join("\n"); - } - - /** Convert to the Earth Centered Earth Fixed (ECEF) coordinate frame. */ - public toECEF(): EarthCenteredFixed { - const { epoch, position, velocity } = this; - const [dLon, dObliq, mObliq] = nutation(epoch); - const obliq = mObliq + dObliq; - const ast = epoch.gmstAngle + dLon * Math.cos(obliq); - const rPef = position.rot3(ast); - let vPef = velocity.rot3(ast); - const rotVec = EARTH_ROTATION.cross(rPef); - vPef = vPef.add(rotVec.scale(-1)); - const [rx, ry, rz, vx, vy, vz] = rPef.concat(vPef).state; - return new EarthCenteredFixed(rx, ry, rz, vx, vy, vz); - } - - /** Convert to the J2000 (J2K) inertial coordinate frame. */ - public toJ2K(): J2000 { - const { epoch, position, velocity } = this; - const [zeta, theta, zed] = precession(epoch); - const [dLon, dObliq, mObliq] = nutation(epoch); - const obliq = mObliq + dObliq; - const rmod = position - .rot1(obliq) - .rot3(dLon) - .rot1(-mObliq); - const vmod = velocity - .rot1(obliq) - .rot3(dLon) - .rot1(-mObliq); - const rj2k = rmod - .rot3(zed) - .rot2(-theta) - .rot3(zeta); - const vj2k = vmod - .rot3(zed) - .rot2(-theta) - .rot3(zeta); - const [ri, rj, rk, vi, vj, vk] = rj2k.concat(vj2k).state; - return new J2000(epoch.millis, ri, rj, rk, vi, vj, vk); - } -} diff --git a/src/coordinates/geodetic.ts b/src/coordinates/geodetic.ts index d8fd1dd..1b4b0a7 100644 --- a/src/coordinates/geodetic.ts +++ b/src/coordinates/geodetic.ts @@ -1,11 +1,11 @@ -import { EARTH_ECC_SQ, EARTH_RAD_EQ, RAD2DEG } from "../constants"; -import { CoordinateType, ICoordinate } from "./coordinate-config"; -import { EarthCenteredFixed } from "./earth-centered-fixed"; +import { EarthBody } from "../bodies/earth-body"; +import { RAD2DEG } from "../math/constants"; +import { Vector3D } from "../math/vector-3d"; +import { EpochUTC } from "../time/epoch-utc"; +import { ITRF } from "./itrf"; /** Class representing Geodetic (LLA) coordinates. */ -export class Geodetic implements ICoordinate { - /** Coordinate identifier string. */ - public readonly type: string; +export class Geodetic { /** Geodetic latitude, in radians. */ public readonly latitude: number; /** Geodetic longitude, in radians. */ @@ -21,17 +21,11 @@ export class Geodetic implements ICoordinate { * @param altitude geodetic altitude, in kilometers */ constructor(latitude: number, longitude: number, altitude: number) { - this.type = CoordinateType.GEODETIC; this.latitude = latitude; this.longitude = longitude; this.altitude = altitude; } - /** Geocentric latitude of the object. */ - get geocentric(): number { - return Math.atan((1 - EARTH_ECC_SQ) * Math.tan(this.latitude)); - } - /** Return a string representation of the object. */ public toString(): string { const { latitude, longitude, altitude } = this; @@ -44,15 +38,16 @@ export class Geodetic implements ICoordinate { return output.join("\n"); } - /** Convert to the Earth Centered Earth Fixed (ECEF) coordinate frame. */ - public toECEF(): EarthCenteredFixed { + public toITRF(epoch: EpochUTC) { const { latitude, longitude, altitude } = this; const sLat = Math.sin(latitude); const cLat = Math.cos(latitude); - const nVal = EARTH_RAD_EQ / Math.sqrt(1 - EARTH_ECC_SQ * sLat * sLat); + const nVal = + EarthBody.RADIUS_EQUATOR / + Math.sqrt(1 - EarthBody.ECCENTRICITY_SQUARED * sLat * sLat); const rx = (nVal + altitude) * cLat * Math.cos(longitude); const ry = (nVal + altitude) * cLat * Math.sin(longitude); - const rz = (nVal * (1 - EARTH_ECC_SQ) + altitude) * sLat; - return new EarthCenteredFixed(rx, ry, rz); + const rz = (nVal * (1 - EarthBody.ECCENTRICITY_SQUARED) + altitude) * sLat; + return new ITRF(epoch, new Vector3D(rx, ry, rz)); } } diff --git a/src/coordinates/itrf.ts b/src/coordinates/itrf.ts new file mode 100644 index 0000000..47f6cf4 --- /dev/null +++ b/src/coordinates/itrf.ts @@ -0,0 +1,119 @@ +import { EarthBody } from "../bodies/earth-body"; +import { DataHandler } from "../data/data-handler"; +import { Vector3D } from "../math/vector-3d"; +import { EpochUTC } from "../time/epoch-utc"; +import { Geodetic } from "./geodetic"; +import { J2000 } from "./j2000"; +import { LookAngle } from "./look-angle"; + +/** Class representing ITRF Earth-Fixed coordinates. */ +export class ITRF { + /** Satellite state epoch. */ + public readonly epoch: EpochUTC; + /** Position 3-vector, in kilometers. */ + public readonly position: Vector3D; + /** Velocity 3-vector, in kilometers per second. */ + public readonly velocity: Vector3D; + + /** + * Create a new ITRF object. + * + * @param epoch UTC epoch + * @param position ITRF position, in kilometers + * @param velocity ITRF velocity, in kilometers per second + */ + constructor(epoch: EpochUTC, position: Vector3D, velocity?: Vector3D) { + this.epoch = epoch; + this.position = position; + this.velocity = velocity || Vector3D.origin(); + } + + /** Return a string representation of this object. */ + public toString(): string { + const { epoch, position, velocity } = this; + const output = [ + "[ITRF]", + ` Epoch: ${epoch.toString()}`, + ` Position: ${position.toString()} km`, + ` Velocity: ${velocity.toString()} km/s` + ]; + return output.join("\n"); + } + + /** Convert this to a J2000 state vector object. */ + public toJ2000() { + const { epoch, position, velocity } = this; + const finals = DataHandler.getFinalsData(epoch.toMjd()); + const pmX = finals.pmX; + const pmY = finals.pmY; + const rPEF = position.rot2(pmX).rot1(pmY); + const vPEF = velocity.rot2(pmX).rot1(pmY); + const nut = EarthBody.nutation(epoch); + const epsilon = nut[2] + nut[1]; + const ast = epoch.gmstAngle() + nut[0] * Math.cos(epsilon); + const rTOD = rPEF.rot3(-ast); + const vTOD = vPEF + .add(EarthBody.getRotation(this.epoch).cross(rPEF)) + .rot3(-ast); + const rMOD = rTOD + .rot1(epsilon) + .rot3(nut[0]) + .rot1(-nut[2]); + const vMOD = vTOD + .rot1(epsilon) + .rot3(nut[0]) + .rot1(-nut[2]); + const prec = EarthBody.precession(epoch); + const rJ2000 = rMOD + .rot3(prec[2]) + .rot2(-prec[1]) + .rot3(prec[0]); + const vJ2000 = vMOD + .rot3(prec[2]) + .rot2(-prec[1]) + .rot3(prec[0]); + return new J2000(epoch, rJ2000, vJ2000); + } + + /** Convert to a Geodetic coordinate object. */ + public toGeodetic() { + const { + position: { x, y, z } + } = this; + var sma = EarthBody.RADIUS_EQUATOR; + var esq = EarthBody.ECCENTRICITY_SQUARED; + var lon = Math.atan2(y, x); + var r = Math.sqrt(x * x + y * y); + var phi = Math.atan(z / r); + var lat = phi; + var c = 0.0; + for (var i = 0; i < 6; i++) { + var slat = Math.sin(lat); + c = 1 / Math.sqrt(1 - esq * slat * slat); + lat = Math.atan((z + sma * c * esq * Math.sin(lat)) / r); + } + var alt = r / Math.cos(lat) - sma * c; + return new Geodetic(lat, lon, alt); + } + + public toLookAngle(observer: Geodetic) { + const { latitude, longitude } = observer; + const { sin, cos } = Math; + const { x: oX, y: oY, z: oZ } = observer.toITRF(this.epoch).position; + const { x: tX, y: tY, z: tZ } = this.position; + const [rX, rY, rZ] = [tX - oX, tY - oY, tZ - oZ]; + const s = + sin(latitude) * cos(longitude) * rX + + sin(latitude) * sin(longitude) * rY - + cos(latitude) * rZ; + const e = -sin(longitude) * rX + cos(longitude) * rY; + const z = + cos(latitude) * cos(longitude) * rX + + cos(latitude) * sin(longitude) * rY + + sin(latitude) * rZ; + const range = Math.sqrt(s * s + e * e + z * z); + const elevation = Math.asin(z / range); + const azimuth = Math.atan2(-e, s) + Math.PI; + return new LookAngle(azimuth, elevation, range); + } +} diff --git a/src/coordinates/j2000.ts b/src/coordinates/j2000.ts index 5a4ced7..762ccef 100644 --- a/src/coordinates/j2000.ts +++ b/src/coordinates/j2000.ts @@ -1,49 +1,35 @@ -import { nutation, precession } from "../bodies"; -import { EARTH_MU, TWO_PI } from "../constants"; -import { Epoch } from "../epoch"; -import { Vector } from "../vector"; -import { CoordinateType, ICoordinate } from "./coordinate-config"; -import { EarthCenteredInertial } from "./earth-centered-inertial"; -import { KeplerianElements } from "./keplerian-elements"; +import { EarthBody } from "../bodies/earth-body"; +import { DataHandler } from "../data/data-handler"; +import { TWO_PI } from "../math/constants"; +import { Vector3D } from "../math/vector-3d"; +import { EpochUTC } from "../time/epoch-utc"; +import { ClassicalElements } from "./classical-elements"; +import { ITRF } from "./itrf"; +import { RIC } from "./ric"; /** Class representing J2000 (J2K) inertial coordinates. */ -export class J2000 implements ICoordinate { - /** Coordinate identifier string. */ - public readonly type: string; +export class J2000 { /** Satellite state epoch. */ - public readonly epoch: Epoch; + public readonly epoch: EpochUTC; /** Position 3-vector, in kilometers. */ - public readonly position: Vector; + public readonly position: Vector3D; /** Velocity 3-vector, in kilometers per second. */ - public readonly velocity: Vector; + public readonly velocity: Vector3D; /** * Create a new J2000 object. * - * @param millis milliseconds since 1 January 1970, 00:00 UTC - * @param ri i-axis position, in kilometers - * @param rj j-axis position, in kilometers - * @param rk j-axis position, in kilometers - * @param vi i-axis velocity, in kilometers per second - * @param vj j-axis velocity, in kilometers per second - * @param vk k-axis velocity, in kilometers per second + * @param epoch UTC epoch + * @param position J2000 position, in kilometers + * @param velocity J2000 velocity, in kilometers per second */ - constructor( - millis: number, - ri: number, - rj: number, - rk: number, - vi: number, - vj: number, - vk: number - ) { - this.type = CoordinateType.J2000; - this.epoch = new Epoch(millis); - this.position = new Vector(ri, rj, rk); - this.velocity = new Vector(vi, vj, vk); + constructor(epoch: EpochUTC, position: Vector3D, velocity?: Vector3D) { + this.epoch = epoch; + this.position = position; + this.velocity = velocity || Vector3D.origin(); } - /** Return a string representation of the object. */ + /** Return a string representation of this object. */ public toString(): string { const { epoch, position, velocity } = this; const output = [ @@ -55,57 +41,91 @@ export class J2000 implements ICoordinate { return output.join("\n"); } - /** Convert to the Earth Centered Inertial (ECI) coordinate frame. */ - public toECI(): EarthCenteredInertial { - const { epoch, position, velocity } = this; - const [zeta, theta, zed] = precession(epoch); - const [dLon, dObliq, mObliq] = nutation(epoch); - const obliq = mObliq + dObliq; - const rmod = position - .rot3(-zeta) - .rot2(theta) - .rot3(-zed); - const vmod = velocity - .rot3(-zeta) - .rot2(theta) - .rot3(-zed); - const rtod = rmod - .rot1(mObliq) - .rot3(-dLon) - .rot1(-obliq); - const vtod = vmod - .rot1(mObliq) - .rot3(-dLon) - .rot1(-obliq); - const [ri, rj, rk, vi, vj, vk] = rtod.concat(vtod).state; - return new EarthCenteredInertial(epoch.millis, ri, rj, rk, vi, vj, vk); + /** Calculate this orbit's mechanical energy, in km^2/s^2 */ + private mechanicalEnergy() { + const r = this.position.magnitude(); + const v = this.velocity.magnitude(); + return (v * v) / 2.0 - EarthBody.MU / r; } - /** Convert to Keplerian elements. */ - public toKeplerian(): KeplerianElements { - const { epoch, position, velocity } = this; - const [R, V] = [position.magnitude, velocity.magnitude]; - const energy = (V * V) / 2 - EARTH_MU / R; - const a = -(EARTH_MU / (2 * energy)); - const eVecA = position.scale(V * V - EARTH_MU / R); - const eVecB = velocity.scale(position.dot(velocity)); - const eVec = eVecA.add(eVecB.scale(-1)).scale(1 / EARTH_MU); - const e = eVec.magnitude; - const h = position.cross(velocity); - const i = Math.acos(h.state[2] / h.magnitude) % 180; - const n = new Vector(0, 0, 1).cross(h); - let o = Math.acos(n.state[0] / n.magnitude); - if (n.state[1] < 0) { + /** Convert to Classical Orbit Elements. */ + public toClassicalElements(): ClassicalElements { + const { epoch, position: pos, velocity: vel } = this; + var mu = EarthBody.MU; + var energy = this.mechanicalEnergy(); + var a = -(mu / (2 * energy)); + var eVecA = pos.scale(Math.pow(vel.magnitude(), 2) - mu / pos.magnitude()); + var eVecB = vel.scale(pos.dot(vel)); + var eVec = eVecA.add(eVecB.negate()).scale(1.0 / mu); + var e = eVec.magnitude(); + var h = pos.cross(vel); + var i = Math.acos(h.z / h.magnitude()); + var n = new Vector3D(0, 0, 1).cross(h); + var o = Math.acos(n.x / n.magnitude()); + if (n.y < 0) { o = TWO_PI - o; } - let w = Math.acos(n.dot(eVec) / (n.magnitude * e)); - if (eVec.state[2] < 0) { + var w = Math.acos(n.dot(eVec) / (n.magnitude() * eVec.magnitude())); + if (eVec.z < 0) { w = TWO_PI - w; } - let v = Math.acos(eVec.dot(position) / (e * R)); - if (position.dot(velocity) < 0) { + var v = Math.acos(eVec.dot(pos) / (eVec.magnitude() * pos.magnitude())); + if (pos.dot(vel) < 0) { v = TWO_PI - v; } - return new KeplerianElements(epoch.millis, a, e, i, o, w, v); + return new ClassicalElements(epoch, a, e, i, o, w, v); + } + + /** Convert this to a ITRF state vector object. */ + public toITRF() { + const { epoch, position, velocity } = this; + const prec = EarthBody.precession(epoch); + const rMOD = position + .rot3(-prec[0]) + .rot2(prec[1]) + .rot3(-prec[2]); + const vMOD = velocity + .rot3(-prec[0]) + .rot2(prec[1]) + .rot3(-prec[2]); + const nut = EarthBody.nutation(epoch); + const epsilon = nut[2] + nut[1]; + const rTOD = rMOD + .rot1(nut[2]) + .rot3(-nut[0]) + .rot1(-epsilon); + const vTOD = vMOD + .rot1(nut[2]) + .rot3(-nut[0]) + .rot1(-epsilon); + const ast = epoch.gmstAngle() + nut[0] * Math.cos(epsilon); + const rPEF = rTOD.rot3(ast); + const vPEF = vTOD.rot3(ast).add( + EarthBody.getRotation(this.epoch) + .negate() + .cross(rPEF) + ); + const { pmX, pmY } = DataHandler.getFinalsData(epoch.toMjd()); + const rITRF = rPEF.rot1(-pmY).rot2(-pmX); + const vITRF = vPEF.rot1(-pmY).rot2(-pmX); + return new ITRF(epoch, rITRF, vITRF); + } + + /** + * Convert this to a RIC relative motion object. + * + * @param reference target state for reference frame + */ + public toRIC(reference: J2000) { + const ru = this.position.normalized(); + const cu = this.position.cross(this.velocity).normalized(); + const iu = cu.cross(ru); + + const dp = this.position.changeOrigin(reference.position); + const dv = this.velocity.changeOrigin(reference.velocity); + return new RIC( + new Vector3D(ru.dot(dp), iu.dot(dp), cu.dot(dp)), + new Vector3D(ru.dot(dv), iu.dot(dv), cu.dot(dv)) + ); } } diff --git a/src/coordinates/look-angle.ts b/src/coordinates/look-angle.ts index 654e0e4..d21eca9 100644 --- a/src/coordinates/look-angle.ts +++ b/src/coordinates/look-angle.ts @@ -1,9 +1,5 @@ -import { CoordinateType, ICoordinate } from "./coordinate-config"; - /** Class representing look angles. */ -export class LookAngle implements ICoordinate { - /** Coordinate identifier string. */ - public readonly type: string; +export class LookAngle { /** Azimuth angle, in radians. */ public readonly azimuth: number; /** Elevation angle, in radians. */ @@ -19,7 +15,6 @@ export class LookAngle implements ICoordinate { * @param range slant range, in kilometers */ constructor(azimuth: number, elevation: number, range: number) { - this.type = CoordinateType.LOOK_ANGLE; this.azimuth = azimuth; this.elevation = elevation; this.range = range; diff --git a/src/coordinates/ric.ts b/src/coordinates/ric.ts new file mode 100644 index 0000000..5ffa288 --- /dev/null +++ b/src/coordinates/ric.ts @@ -0,0 +1,22 @@ +import { Vector3D } from "../math/vector-3d"; + +/** Class representing Radial-Intrack-Crosstrack (RIC) relative coordinates. */ +export class RIC { + /** Relative position, in kilometers. */ + public readonly relPosition: Vector3D; + + /** Relative velocity, in kilometers per second. */ + public readonly relVelocity: Vector3D; + + /** + * Create a new RIC object. + * + * @param epoch UTC epoch + * @param relPosition relative position, in kilometers + * @param relVelocity relative velocity, in kilometers per second + */ + constructor(relPosition: Vector3D, relVelocity: Vector3D) { + this.relPosition = relPosition; + this.relVelocity = relVelocity; + } +} diff --git a/src/coordinates/spherical.ts b/src/coordinates/spherical.ts deleted file mode 100644 index f8e2c2e..0000000 --- a/src/coordinates/spherical.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { RAD2DEG } from "../constants"; -import { CoordinateType, ICoordinate } from "./coordinate-config"; -import { EarthCenteredFixed } from "./earth-centered-fixed"; - -/** Class representing spherical coordinates. */ -export class Spherical implements ICoordinate { - /** Coordinate identifier string. */ - public readonly type: string; - /** Distance from origin, in kilometers. */ - public readonly radius: number; - /** Inclination angle, in radians. */ - public readonly inclination: number; - /** Azimuth angle, in radians. */ - public readonly azimuth: number; - - /** - * Create a new Spherical object. - * - * @param radius distance from origin, in kilometers - * @param inclination inclination angle, in radians - * @param azimuth azimuth angle, in radians - */ - constructor(radius: number, inclination: number, azimuth: number) { - this.type = CoordinateType.SPHERICAL; - this.radius = radius; - this.inclination = inclination; - this.azimuth = azimuth; - } - - /** Return a string representation of the object. */ - public toString(): string { - const { radius, inclination, azimuth } = this; - const phi = inclination * RAD2DEG; - const theta = azimuth * RAD2DEG; - return [ - "[Spherical]", - ` (r) Radius: ${radius.toFixed(3)} km`, - ` (\u03c6) Inclination: ${phi.toFixed(3)}\u00b0`, - ` (\u03b8) Azimuth: ${theta.toFixed(3)}\u00b0` - ].join("\n"); - } - - /** Convert to the Earth Centered Earth Fixed (ECEF) coordinate frame. */ - public toECEF(): EarthCenteredFixed { - const { radius, inclination, azimuth } = this; - const rx = radius * Math.sin(inclination) * Math.cos(azimuth); - const ry = radius * Math.sin(inclination) * Math.sin(azimuth); - const rz = radius * Math.cos(inclination); - return new EarthCenteredFixed(rx, ry, rz); - } -} diff --git a/src/coordinates/topocentric-horizon.ts b/src/coordinates/topocentric-horizon.ts deleted file mode 100644 index c51bf97..0000000 --- a/src/coordinates/topocentric-horizon.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { CoordinateType, ICoordinate } from "./coordinate-config"; -import { LookAngle } from "./look-angle"; - -/** Class representing topocentric-horizon coordinates. */ -export class TopocentricHorizon implements ICoordinate { - /** Coordinate identifier string. */ - public readonly type: string; - /** South component, in kilometers. */ - public readonly s: number; - /** East component, in kilometers. */ - public readonly e: number; - /** Surface-normal component, in kilometers. */ - public readonly z: number; - - /** - * Create a new Topocentric object. - * - * @param s south component, in kilometers - * @param e east component, in kilometers - * @param z zenith component, in kilometers - */ - constructor(s: number, e: number, z: number) { - this.type = CoordinateType.TOPOCENTRIC_HORIZON; - this.s = s; - this.e = e; - this.z = z; - } - - /** Return a string representation of the object. */ - public toString(): string { - const { s, e, z } = this; - return [ - "[Topocentric]", - ` (S)outh: ${s.toFixed(3)} km`, - ` (E)ast: ${e.toFixed(3)} km`, - ` (Z)enith: ${z.toFixed(3)} km` - ].join("\n"); - } - - /** Convert to look angles. */ - public toLookAngle(): LookAngle { - const { s, e, z } = this; - const range = Math.sqrt(s * s + e * e + z * z); - const elevation = Math.asin(z / range); - const azimuth = Math.atan2(-e, s) + Math.PI; - return new LookAngle(azimuth, elevation, range); - } -} diff --git a/src/data/data-handler.ts b/src/data/data-handler.ts new file mode 100644 index 0000000..10fb7b5 --- /dev/null +++ b/src/data/data-handler.ts @@ -0,0 +1,151 @@ +import { EarthBody } from "../bodies/earth-body"; +import { ASEC2RAD } from "../math/constants"; +import { Vector3D } from "../math/vector-3d"; +import { EGM_96_DENORMALIZED } from "./values/egm96"; +import { EXPONENTIAL_ATMOSPHERE } from "./values/exponential-atmosphere"; +import { clearFinals, FINALS, sortFinals, zeroFinal } from "./values/finals"; +import { LEAP_SECONDS } from "./values/leap-seconds"; + +export class DataHandler { + /** + * Fetch the number of leap seconds used in offset. + * + * @param jd julian date + */ + public static leapSecondsOffset(jd: number) { + if (jd > LEAP_SECONDS[LEAP_SECONDS.length - 1][0]) { + return LEAP_SECONDS[LEAP_SECONDS.length - 1][1]; + } + if (jd < LEAP_SECONDS[0][0]) { + return 0; + } + for (let i = 0; i < LEAP_SECONDS.length - 2; i++) { + if (LEAP_SECONDS[i][0] <= jd && jd < LEAP_SECONDS[i + 1][0]) { + return LEAP_SECONDS[i][1]; + } + } + return 0; + } + + /** + * Add a new entry to the leap seconds table. + * + * @param jd julian date + * @param offset leap seconds offset, in seconds + */ + public static addLeapSecond(jd: number, offset: number) { + LEAP_SECONDS.push([jd, offset]); + } + + /** + * Get finals data for a given MJD. + * + * @param mjd USNO modified julian date + */ + public static getFinalsData(mjd: number) { + const fmjd = Math.floor(mjd); + if ( + FINALS.length === 0 || + fmjd < FINALS[0].mjd || + fmjd > FINALS[FINALS.length - 1].mjd + ) { + return zeroFinal(fmjd); + } + let low = 0; + let high = FINALS.length - 1; + while (low <= high) { + const mid = (high + low) / 2; + const midVal = FINALS[mid].mjd; + if (fmjd < midVal) { + high = mid - 1; + } else if (fmjd > midVal) { + low = mid + 1; + } else { + return FINALS[mid]; + } + } + return zeroFinal(fmjd); + } + + /** + * Cache IERS finals.all data. + * + * @param lines list of finals.all lines + */ + public static setFinalsData(lines: string[]) { + clearFinals(); + for (let line of lines) { + const tLine = line.trimRight(); + if (tLine.length <= 68) { + continue; + } + const mjd = Math.floor(parseFloat(line.substring(7, 15))); + const pmX = parseFloat(line.substring(18, 27)) * ASEC2RAD; + const pmY = parseFloat(line.substring(37, 46)) * ASEC2RAD; + const dut1 = parseFloat(line.substring(58, 68)); + let lod = 0; + let dPsi = 0; + let dEps = 0; + if (tLine.length >= 86) { + lod = parseFloat(line.substring(79, 86)) * 1e-3; + } + if (tLine.length >= 125) { + dPsi = parseFloat(line.substring(97, 106)) * ASEC2RAD; + dEps = parseFloat(line.substring(116, 125)) * ASEC2RAD; + } + FINALS.push({ + mjd: mjd, + pmX: pmX, + pmY: pmY, + dut1: dut1, + lod: lod, + dPsi: dPsi, + dEps: dEps + }); + } + sortFinals(); + } + + /** + * Calculate the density of the Earth's atmosphere, in kg/m^3, for a given + * position using the exponential atmospheric density model. + * + * @param position satellite position 3-vector, in kilometers + */ + public static getExpAtmosphericDensity(position: Vector3D): number { + const rDist = position.magnitude() - EarthBody.RADIUS_EQUATOR; + const expAtm = EXPONENTIAL_ATMOSPHERE; + const maxVal = expAtm.length - 1; + let fields = [0.0, 0.0, 0.0]; + if (rDist <= expAtm[0][0]) { + fields = expAtm[0]; + } else if (rDist >= expAtm[maxVal][0]) { + fields = expAtm[maxVal]; + } else { + for (let i = 0; i < maxVal; i++) { + if (expAtm[i][0] <= rDist && rDist < expAtm[i + 1][0]) { + fields = expAtm[i]; + } + } + } + const base = fields[0]; + const density = fields[1]; + const height = fields[2]; + return density * Math.exp(-(rDist - base) / height); + } + + /** Calculate appropritate 1D index for 2D coefficient lookup. */ + private static egm96Index(l: number, m: number) { + return ((l - 2) * (l + 2) + l) / 2 - 1 + m; + } + + /** + * Lookup denormalized EGM96 coefficients. + * + * @param l first P index + * @param m second P index + */ + public static getEgm96Coeffs(l: number, m: number) { + return EGM_96_DENORMALIZED[DataHandler.egm96Index(l, m)]; + } +} diff --git a/src/data/values/egm96.ts b/src/data/values/egm96.ts new file mode 100644 index 0000000..3c671c6 --- /dev/null +++ b/src/data/values/egm96.ts @@ -0,0 +1,2583 @@ +import { factorial } from "../../math/operations"; + +export interface Egm96Data { + /** l-index */ + l: number; + /** m-index */ + m: number; + /** C[l][m] value */ + clm: number; + /** S[l][m] value */ + slm: number; +} + +/** Normalized EGM96 coefficients. */ +const EGM_96_NORMALIZED: [number, number, number, number][] = [ + [2, 0, -0.000484165371736, 0], + [2, 1, -1.86987635955e-10, 1.19528012031e-9], + [2, 2, 2.43914352398e-6, -1.40016683654e-6], + [3, 0, 9.57254173792e-7, 0], + [3, 1, 2.02998882184e-6, 2.48513158716e-7], + [3, 2, 9.04627768605e-7, -6.19025944205e-7], + [3, 3, 7.21072657057e-7, 1.41435626958e-6], + [4, 0, 5.39873863789e-7, 0], + [4, 1, -5.36321616971e-7, -4.73440265853e-7], + [4, 2, 3.50694105785e-7, 6.6267157254e-7], + [4, 3, 9.90771803829e-7, -2.00928369177e-7], + [4, 4, -1.88560802735e-7, 3.08853169333e-7], + [5, 0, 6.8532347563e-8, 0], + [5, 1, -6.21012128528e-8, -9.44226127525e-8], + [5, 2, 6.52438297612e-7, -3.23349612668e-7], + [5, 3, -4.51955406071e-7, -2.14847190624e-7], + [5, 4, -2.95301647654e-7, 4.96658876769e-8], + [5, 5, 1.74971983203e-7, -6.69384278219e-7], + [6, 0, -1.49957994714e-7, 0], + [6, 1, -7.60879384947e-8, 2.62890545501e-8], + [6, 2, 4.81732442832e-8, -3.73728201347e-7], + [6, 3, 5.71730990516e-8, 9.02694517163e-9], + [6, 4, -8.62142660109e-8, -4.71408154267e-7], + [6, 5, -2.6713332549e-7, -5.36488432483e-7], + [6, 6, 9.67616121092e-9, -2.37192006935e-7], + [7, 0, 9.0978937145e-8, 0], + [7, 1, 2.79872910488e-7, 9.54336911867e-8], + [7, 2, 3.29743816488e-7, 9.30667596042e-8], + [7, 3, 2.50398657706e-7, -2.17198608738e-7], + [7, 4, -2.75114355257e-7, -1.23800392323e-7], + [7, 5, 1.93765507243e-9, 1.77377719872e-8], + [7, 6, -3.58856860645e-7, 1.51789817739e-7], + [7, 7, 1.09185148045e-9, 2.44415707993e-8], + [8, 0, 4.96711667324e-8, 0], + [8, 1, 2.33422047893e-8, 5.90060493411e-8], + [8, 2, 8.02978722615e-8, 6.54175425859e-8], + [8, 3, -1.91877757009e-8, -8.63454445021e-8], + [8, 4, -2.44600105471e-7, 7.00233016934e-8], + [8, 5, -2.55352403037e-8, 8.91462164788e-8], + [8, 6, -6.57361610961e-8, 3.09238461807e-7], + [8, 7, 6.72811580072e-8, 7.47440473633e-8], + [8, 8, -1.24092493016e-7, 1.20533165603e-7], + [9, 0, 2.76714300853e-8, 0], + [9, 1, 1.43387502749e-7, 2.16834947618e-8], + [9, 2, 2.22288318564e-8, -3.22196647116e-8], + [9, 3, -1.60811502143e-7, -7.42287409462e-8], + [9, 4, -9.00179225336e-9, 1.94666779475e-8], + [9, 5, -1.66165092924e-8, -5.41113191483e-8], + [9, 6, 6.26941938248e-8, 2.22903525945e-7], + [9, 7, -1.18366323475e-7, -9.65152667886e-8], + [9, 8, 1.88436022794e-7, -3.08566220421e-9], + [9, 9, -4.77475386132e-8, 9.66412847714e-8], + [10, 0, 5.26222488569e-8, 0], + [10, 1, 8.35115775652e-8, -1.31314331796e-7], + [10, 2, -9.42413882081e-8, -5.1579165739e-8], + [10, 3, -6.89895048176e-9, -1.53768828694e-7], + [10, 4, -8.40764549716e-8, -7.92806255331e-8], + [10, 5, -4.93395938185e-8, -5.05370221897e-8], + [10, 6, -3.75885236598e-8, -7.95667053872e-8], + [10, 7, 8.11460540925e-9, -3.36629641314e-9], + [10, 8, 4.04927981694e-8, -9.18705975922e-8], + [10, 9, 1.25491334939e-7, -3.76516222392e-8], + [10, 10, 1.00538634409e-7, -2.4014844952e-8], + [11, 0, -5.09613707522e-8, 0], + [11, 1, 1.51687209933e-8, -2.68604146166e-8], + [11, 2, 1.86309749878e-8, -9.90693862047e-8], + [11, 3, -3.09871239854e-8, -1.4813180426e-7], + [11, 4, -3.89580205051e-8, -6.3666651198e-8], + [11, 5, 3.77848029452e-8, 4.94736238169e-8], + [11, 6, -1.18676592395e-9, 3.44769584593e-8], + [11, 7, 4.11565188074e-9, -8.98252808977e-8], + [11, 8, -5.984108413e-9, 2.43989612237e-8], + [11, 9, -3.14231072723e-8, 4.17731829829e-8], + [11, 10, -5.21882681927e-8, -1.83364561788e-8], + [11, 11, 4.60344448746e-8, -6.96662308185e-8], + [12, 0, 3.77252636558e-8, 0], + [12, 1, -5.40654977836e-8, -4.35675748979e-8], + [12, 2, 1.42979642253e-8, 3.20975937619e-8], + [12, 3, 3.93995876403e-8, 2.44264863505e-8], + [12, 4, -6.86908127934e-8, 4.15081109011e-9], + [12, 5, 3.0941112873e-8, 7.82536279033e-9], + [12, 6, 3.41523275208e-9, 3.91765484449e-8], + [12, 7, -1.86909958587e-8, 3.56131849382e-8], + [12, 8, -2.53769398865e-8, 1.69361024629e-8], + [12, 9, 4.22880630662e-8, 2.52692598301e-8], + [12, 10, -6.17619654902e-9, 3.08375794212e-8], + [12, 11, 1.12502994122e-8, -6.37946501558e-9], + [12, 12, -2.4953260739e-9, -1.117806019e-8], + [13, 0, 4.22982206413e-8, 0], + [13, 1, -5.13569699124e-8, 3.90510386685e-8], + [13, 2, 5.59217667099e-8, -6.27337565381e-8], + [13, 3, -2.19360927945e-8, 9.74829362237e-8], + [13, 4, -3.13762599666e-9, -1.19627874492e-8], + [13, 5, 5.90049394905e-8, 6.64975958036e-8], + [13, 6, -3.59038073075e-8, -6.57280613686e-9], + [13, 7, 2.53002147087e-9, -6.21470822331e-9], + [13, 8, -9.83150822695e-9, -1.04740222825e-8], + [13, 9, 2.47325771791e-8, 4.52870369936e-8], + [13, 10, 4.1032465393e-8, -3.6812102948e-8], + [13, 11, -4.43869677399e-8, -4.76507804288e-9], + [13, 12, -3.12622200222e-8, 8.78405809267e-8], + [13, 13, -6.12759553199e-8, 6.85261488594e-8], + [14, 0, -2.42786502921e-8, 0], + [14, 1, -1.86968616381e-8, 2.94747542249e-8], + [14, 2, -3.67789379502e-8, -5.16779392055e-9], + [14, 3, 3.58875097333e-8, 2.04618827833e-8], + [14, 4, 1.83865617792e-9, -2.26780613566e-8], + [14, 5, 2.87344273542e-8, -1.63882249728e-8], + [14, 6, -1.94810485574e-8, 2.47831272781e-9], + [14, 7, 3.75003839415e-8, -4.17291319429e-9], + [14, 8, -3.50946485865e-8, -1.53515265203e-8], + [14, 9, 3.20284939341e-8, 2.88804922064e-8], + [14, 10, 3.90329180008e-8, -1.44308452469e-9], + [14, 11, 1.53970516502e-8, -3.90548173245e-8], + [14, 12, 8.40829163869e-9, -3.11327189117e-8], + [14, 13, 3.22147043964e-8, 4.5189722496e-8], + [14, 14, -5.18980794309e-8, -4.81506636748e-9], + [15, 0, 1.47910068708e-9, 0], + [15, 1, 1.00817268177e-8, 1.09773066324e-8], + [15, 2, -2.13942673775e-8, -3.08914875777e-8], + [15, 3, 5.21392929041e-8, 1.72892926103e-8], + [15, 4, -4.08150084078e-8, 6.50174707794e-9], + [15, 5, 1.24935723108e-8, 8.08375563996e-9], + [15, 6, 3.31211643896e-8, -3.68246004304e-8], + [15, 7, 5.96210699259e-8, 5.31841171879e-9], + [15, 8, -3.22428691498e-8, 2.21523579587e-8], + [15, 9, 1.28788268085e-8, 3.75629820829e-8], + [15, 10, 1.04688722521e-8, 1.47222147015e-8], + [15, 11, -1.11675061934e-9, 1.80996198432e-8], + [15, 12, -3.23962134415e-8, 1.55243104746e-8], + [15, 13, -2.83933019117e-8, -4.22066791103e-9], + [15, 14, 5.1916885933e-9, -2.43752739666e-8], + [15, 15, -1.90930538322e-8, -4.71139421558e-9], + [16, 0, -3.15322986722e-9, 0], + [16, 1, 2.58360856231e-8, 3.25447560859e-8], + [16, 2, -2.33671404512e-8, 2.88799363439e-8], + [16, 3, -3.36019429391e-8, -2.2041898801e-8], + [16, 4, 4.02316284314e-8, 4.83837716909e-8], + [16, 5, -1.29501939245e-8, -3.19458578129e-9], + [16, 6, 1.40239252323e-8, -3.50760208303e-8], + [16, 7, -7.08412635136e-9, -8.81581561131e-9], + [16, 8, -2.09018868094e-8, 5.0052739053e-9], + [16, 9, -2.18588720643e-8, -3.95012419994e-8], + [16, 10, -1.17529900814e-8, 1.14211582961e-8], + [16, 11, 1.87574042592e-8, -3.03161919925e-9], + [16, 12, 1.95400194038e-8, 6.66983574071e-9], + [16, 13, 1.38196369576e-8, 1.02778499508e-9], + [16, 14, -1.93182168856e-8, -3.86174893776e-8], + [16, 15, -1.45149060142e-8, -3.27443078739e-8], + [16, 16, -3.79671710746e-8, 3.02155372655e-9], + [17, 0, 1.97605066395e-8, 0], + [17, 1, -2.54177575118e-8, -3.06630529689e-8], + [17, 2, -1.95988656721e-8, 6.4926589341e-9], + [17, 3, 5.64123066224e-9, 6.78327095529e-9], + [17, 4, 7.07457075637e-9, 2.49437600834e-8], + [17, 5, -1.54987006052e-8, 6.60021551851e-9], + [17, 6, -1.18194012847e-8, -2.89770975177e-8], + [17, 7, 2.42149702381e-8, -4.22222973697e-9], + [17, 8, 3.88442097559e-8, 3.58904095943e-9], + [17, 9, 3.81356493231e-9, -2.81466943714e-8], + [17, 10, -3.88216085542e-9, 1.81328176508e-8], + [17, 11, -1.57356600363e-8, 1.06560649404e-8], + [17, 12, 2.88013010655e-8, 2.03450136084e-8], + [17, 13, 1.65503425731e-8, 2.04667531435e-8], + [17, 14, -1.41983872649e-8, 1.14948025244e-8], + [17, 15, 5.42100361657e-9, 5.32610369811e-9], + [17, 16, -3.01992205043e-8, 3.65331918531e-9], + [17, 17, -3.43086856041e-8, -1.98523455381e-8], + [18, 0, 5.08691038332e-9, 0], + [18, 1, 7.21098449649e-9, -3.88714473013e-8], + [18, 2, 1.40631771205e-8, 1.00093396253e-8], + [18, 3, -5.07232520873e-9, -4.90865931335e-9], + [18, 4, 5.48759308217e-8, -1.3526711772e-9], + [18, 5, 5.48710485555e-9, 2.64338629459e-8], + [18, 6, 1.46570755271e-8, -1.36438019951e-8], + [18, 7, 6.75812328417e-9, 6.88577494235e-9], + [18, 8, 3.07619845144e-8, 4.17827734107e-9], + [18, 9, -1.8847060188e-8, 3.68302736953e-8], + [18, 10, 5.27535358934e-9, -4.66091535881e-9], + [18, 11, -7.2962851896e-9, 1.9521520802e-9], + [18, 12, -2.97449412422e-8, -1.64497878395e-8], + [18, 13, -6.27919717152e-9, -3.48383939938e-8], + [18, 14, -8.1560533641e-9, -1.28636585027e-8], + [18, 15, -4.05003412879e-8, -2.02684998021e-8], + [18, 16, 1.04141042028e-8, 6.61468817624e-9], + [18, 17, 3.58771586841e-9, 4.48065587564e-9], + [18, 18, 3.12351953717e-9, -1.09906032543e-8], + [19, 0, -3.25780965394e-9, 0], + [19, 1, -7.59903885319e-9, 1.26835472605e-9], + [19, 2, 3.53541528655e-8, -1.31346303514e-9], + [19, 3, -9.74103607309e-9, 1.50662259043e-9], + [19, 4, 1.57039009057e-8, -7.61677383811e-9], + [19, 5, 1.09629213379e-8, 2.83172176438e-8], + [19, 6, -4.08745178658e-9, 1.86219430719e-8], + [19, 7, 4.78275337044e-9, -7.172834559e-9], + [19, 8, 2.9490836428e-8, -9.93037002883e-9], + [19, 9, 3.07961427159e-9, 6.94110477214e-9], + [19, 10, -3.38415069043e-8, -7.37981767136e-9], + [19, 11, 1.60443652916e-8, 9.96673453483e-9], + [19, 12, -2.47106581581e-9, 9.16852310642e-9], + [19, 13, -7.4471737998e-9, -2.82584466742e-8], + [19, 14, -4.70502589215e-9, -1.29526697983e-8], + [19, 15, -1.76580549771e-8, -1.40350990039e-8], + [19, 16, -2.16950096188e-8, -7.24534721567e-9], + [19, 17, 2.90444936079e-8, -1.5345653107e-8], + [19, 18, 3.48382199593e-8, -9.54146344917e-9], + [19, 19, -2.5734934943e-9, 4.83151822363e-9], + [20, 0, 2.22384610651e-8, 0], + [20, 1, 5.16303125218e-9, 6.69626726966e-9], + [20, 2, 1.98831128238e-8, 1.75183843257e-8], + [20, 3, -3.62601436785e-9, 3.79590724141e-8], + [20, 4, 2.42238118652e-9, -2.11057611874e-8], + [20, 5, -1.07042562564e-8, -7.71860083169e-9], + [20, 6, 1.1047483757e-8, -2.17720365898e-9], + [20, 7, -2.10090282728e-8, -2.23491503969e-11], + [20, 8, 4.42419185637e-9, 1.83035804593e-9], + [20, 9, 1.78846216942e-8, -6.63940865358e-9], + [20, 10, -3.25394919988e-8, -5.12308873621e-9], + [20, 11, 1.38992707697e-8, -1.87706454942e-8], + [20, 12, -6.3575060075e-9, 1.80260853103e-8], + [20, 13, 2.75222725997e-8, 6.90887077588e-9], + [20, 14, 1.15841169405e-8, -1.43176160143e-8], + [20, 15, -2.60130744291e-8, -7.84379672413e-10], + [20, 16, -1.24137147118e-8, -2.77500443628e-10], + [20, 17, 4.3690966796e-9, -1.37420446198e-8], + [20, 18, 1.51842883022e-8, -8.08429903142e-10], + [20, 19, -3.14942002852e-9, 1.06505202245e-8], + [20, 20, 4.01448327968e-9, -1.20450644785e-8], + [21, 0, 5.87820252575e-9, 0], + [21, 1, -1.61000670141e-8, 2.84359400791e-8], + [21, 2, -6.54460482558e-9, 3.78474868508e-9], + [21, 3, 1.9549199526e-8, 2.26286963716e-8], + [21, 4, -5.76604339239e-9, 1.94493782631e-8], + [21, 5, 2.58856303016e-9, 1.70850368669e-9], + [21, 6, -1.40168810589e-8, -2.73814826381e-12], + [21, 7, -8.64357168475e-9, 4.42612277119e-9], + [21, 8, -1.70477278237e-8, 1.5071119263e-9], + [21, 9, 1.64489062394e-8, 8.30113196365e-9], + [21, 10, -1.09928976409e-8, -1.46913794684e-9], + [21, 11, 6.99300364214e-9, -3.53590565124e-8], + [21, 12, -3.19300109594e-9, 1.45786917947e-8], + [21, 13, -1.8985452459e-8, 1.40514791436e-8], + [21, 14, 2.03580785674e-8, 7.5577246284e-9], + [21, 15, 1.75530220278e-8, 1.04533886832e-8], + [21, 16, 7.86969109367e-9, -6.56089715279e-9], + [21, 17, -6.99484489981e-9, -7.36064901147e-9], + [21, 18, 2.59643291521e-8, -1.1156080613e-8], + [21, 19, -2.7374163641e-8, 1.63958190052e-8], + [21, 20, -2.68682473584e-8, 1.62086057168e-8], + [21, 21, 8.30374873932e-9, -3.75546121742e-9], + [22, 0, -1.13735124259e-8, 0], + [22, 1, 1.62309865679e-8, -3.77303475153e-9], + [22, 2, -2.64090261387e-8, -2.10832402428e-9], + [22, 3, 1.1658001654e-8, 1.06764617222e-8], + [22, 4, -2.70979141451e-9, 1.74980820565e-8], + [22, 5, -1.8645262501e-9, 7.44718166476e-10], + [22, 6, 9.64390704406e-9, -6.37316743908e-9], + [22, 7, 1.59715981795e-8, 4.39600942993e-9], + [22, 8, -2.35157426998e-8, 4.83673695086e-9], + [22, 9, 8.29435796737e-9, 8.73382159986e-9], + [22, 10, 6.00704037701e-9, 2.21854121109e-8], + [22, 11, -4.96078301539e-9, -1.78822672474e-8], + [22, 12, 2.13502315463e-9, -7.96120522503e-9], + [22, 13, -1.72631843979e-8, 1.97026896892e-8], + [22, 14, 1.09297133018e-8, 8.25280905301e-9], + [22, 15, 2.58410840629e-8, 4.60172998318e-9], + [22, 16, 1.41258558921e-10, -7.182380053e-9], + [22, 17, 8.89294096846e-9, -1.45618348246e-8], + [22, 18, 1.05047447464e-8, -1.64271275481e-8], + [22, 19, 1.41305509124e-8, -3.84537168599e-9], + [22, 20, -1.67617655441e-8, 1.99561513321e-8], + [22, 21, -2.50948756455e-8, 2.36151346133e-8], + [22, 22, -9.59596694809e-9, 2.49861413883e-9], + [23, 0, -2.26201075082e-8, 0], + [23, 1, 1.10870239758e-8, 1.6137915153e-8], + [23, 2, -1.35191027779e-8, -5.01411714852e-9], + [23, 3, -2.45128011445e-8, -1.60570438998e-8], + [23, 4, -2.39887874558e-8, 7.31536362289e-9], + [23, 5, 7.99636624146e-10, -1.6144974141e-10], + [23, 6, -1.26082781309e-8, 1.61308155632e-8], + [23, 7, -8.04132133762e-9, -1.11647197494e-9], + [23, 8, 7.53785326469e-9, -3.2967992522e-10], + [23, 9, 2.5505325495e-9, -1.28071525548e-8], + [23, 10, 1.65167929134e-8, -1.85239620853e-9], + [23, 11, 9.42656822725e-9, 1.52386181583e-8], + [23, 12, 1.63632625535e-8, -1.24098327824e-8], + [23, 13, -1.15107832808e-8, -4.84279171627e-9], + [23, 14, 6.75321602206e-9, -1.82899962212e-9], + [23, 15, 1.8689804286e-8, -3.60523754481e-9], + [23, 16, 6.13840121864e-9, 1.10362707266e-8], + [23, 17, -5.5372102391e-9, -1.2845906046e-8], + [23, 18, 8.43361263813e-9, -1.49115921605e-8], + [23, 19, -5.20848228342e-9, 1.07789593943e-8], + [23, 20, 8.60434396837e-9, -5.34641639372e-9], + [23, 21, 1.54578189867e-8, 1.15333325358e-8], + [23, 22, -1.78417206471e-8, 4.33092348903e-9], + [23, 23, 2.85393980111e-9, -1.1323294597e-8], + [24, 0, 7.63657386411e-10, 0], + [24, 1, -3.14943681427e-9, -1.77191190396e-9], + [24, 2, 1.38595572093e-9, 1.711040664e-8], + [24, 3, -4.76406913528e-9, -9.42329378125e-9], + [24, 4, 6.05108036341e-9, 5.49769910191e-9], + [24, 5, -7.2947904748e-9, -2.13826490504e-8], + [24, 6, 4.54210367535e-9, 1.85596665318e-9], + [24, 7, -6.14244489298e-9, 4.70081667951e-9], + [24, 8, 1.54822444425e-8, -4.34472097787e-9], + [24, 9, -9.76623425797e-9, -1.6275513762e-8], + [24, 10, 1.08934628974e-8, 2.09168783608e-8], + [24, 11, 1.45280775337e-8, 1.87398018797e-8], + [24, 12, 1.18970310717e-8, -6.2293309815e-9], + [24, 13, -2.89676673058e-9, 3.13251295024e-9], + [24, 14, -2.00006558603e-8, -1.87249636821e-9], + [24, 15, 6.10396350698e-9, -1.58957680563e-8], + [24, 16, 8.88750753375e-9, 2.96492703352e-9], + [24, 17, -1.19629964611e-8, -5.82074593955e-9], + [24, 18, -6.52630641555e-10, -1.01332355837e-8], + [24, 19, -4.38896550264e-9, -8.14552569977e-9], + [24, 20, -5.17551981851e-9, 8.90354942378e-9], + [24, 21, 6.03436755046e-9, 1.40116090741e-8], + [24, 22, 3.93640283055e-9, -4.28327655754e-9], + [24, 23, -6.1428347955e-9, -8.692679021e-9], + [24, 24, 1.23903921309e-8, -3.75059286959e-9], + [25, 0, 3.21309208115e-9, 0], + [25, 1, 6.89649208567e-9, -7.995518294e-9], + [25, 2, 2.19498139173e-8, 9.01370249111e-9], + [25, 3, -1.17774931587e-8, -1.26719024392e-8], + [25, 4, 9.4254362892e-9, 6.84937199311e-10], + [25, 5, -1.00497487339e-8, -9.2212239967e-10], + [25, 6, 1.66832871654e-8, 4.30583576199e-10], + [25, 7, 7.71426681671e-9, -4.11703290425e-9], + [25, 8, 3.1565194415e-9, -7.81960217669e-10], + [25, 9, -2.99385350515e-8, 2.12695473199e-8], + [25, 10, 8.81931818034e-9, -4.18041586166e-9], + [25, 11, 1.2340148568e-9, 1.08069128123e-8], + [25, 12, -7.65146786755e-9, 1.1747374286e-8], + [25, 13, 8.32308127158e-9, -1.13072604626e-8], + [25, 14, -1.97042124794e-8, 6.53183488635e-9], + [25, 15, -4.35732052985e-9, -7.35147227573e-9], + [25, 16, 9.18239548455e-10, -1.28124888592e-8], + [25, 17, -1.52176535379e-8, -3.21280397924e-9], + [25, 18, 1.21901534245e-9, -1.49040483259e-8], + [25, 19, 7.77589111757e-9, 9.92518771941e-9], + [25, 20, -7.50856670672e-9, -5.62826155305e-10], + [25, 21, 1.0723284068e-8, 8.16090174381e-9], + [25, 22, -1.39902235929e-8, 3.58546198324e-9], + [25, 23, 8.40270853655e-9, -1.23338407961e-8], + [25, 24, 4.12447134569e-9, -8.30716465317e-9], + [25, 25, 1.07484366767e-8, 4.72369913984e-9], + [26, 0, 5.05833635414e-9, 0], + [26, 1, -1.54756177965e-9, -7.70012788871e-9], + [26, 2, -3.58729876836e-9, 1.14484111182e-8], + [26, 3, 1.40505671267e-8, 4.30905534294e-9], + [26, 4, 1.90548709216e-8, -1.94161179658e-8], + [26, 5, 1.07190025408e-8, 9.08952851813e-9], + [26, 6, 1.13116909406e-8, -9.34393384449e-9], + [26, 7, -1.562282956e-9, 4.81168302477e-9], + [26, 8, 3.94920146317e-9, 1.153405253e-9], + [26, 9, -1.20371433638e-8, 4.75177058134e-10], + [26, 10, -1.41246124334e-8, -6.45217247294e-9], + [26, 11, -5.20385857649e-9, 2.12443340407e-9], + [26, 12, -1.75071176484e-8, 2.01974971938e-9], + [26, 13, -3.35708835245e-11, 1.50474091686e-9], + [26, 14, 7.96385051492e-9, 7.84704068835e-9], + [26, 15, -1.32388781089e-8, 8.03960091442e-9], + [26, 16, 1.29093226253e-9, -6.11434455706e-9], + [26, 17, -1.24494157564e-8, 7.8077484564e-9], + [26, 18, -1.30317424459e-8, 4.9998916257e-9], + [26, 19, -2.05807464595e-9, 3.54396135438e-9], + [26, 20, 6.55952144018e-9, -1.1687804118e-8], + [26, 21, -8.70038868454e-9, 1.68222257564e-9], + [26, 22, 1.01580452049e-8, 7.54358531576e-9], + [26, 23, 1.24105057436e-9, 1.08580088935e-8], + [26, 24, 8.58620351967e-9, 1.48288510099e-8], + [26, 25, 3.93441578873e-9, -5.97792415806e-10], + [26, 26, 3.93179749568e-10, 1.93894997772e-9], + [27, 0, 2.7717632236e-9, 0], + [27, 1, 2.48982909452e-9, 3.77378455357e-9], + [27, 2, 1.45270146453e-9, 5.03113268026e-10], + [27, 3, -3.62306812856e-10, 1.088457625e-8], + [27, 4, -5.99191537157e-10, 9.40517681233e-9], + [27, 5, 1.67690560888e-8, 1.38338587209e-8], + [27, 6, 3.64265989803e-9, 6.13032807744e-9], + [27, 7, -1.23459266009e-8, -3.86514075952e-9], + [27, 8, -6.1040764482e-9, -8.99504471581e-9], + [27, 9, 3.40113157078e-9, 1.10992938665e-8], + [27, 10, -1.33158893187e-8, 1.72832279915e-10], + [27, 11, 1.98322808107e-9, -9.69054254426e-9], + [27, 12, -1.13695413044e-8, 1.90072943781e-9], + [27, 13, -4.97224781272e-9, -4.14521559996e-9], + [27, 14, 1.55033957088e-8, 1.1882128969e-8], + [27, 15, -1.80057326196e-9, 1.1763698622e-9], + [27, 16, 2.7572995289e-9, 2.78770269194e-9], + [27, 17, 3.79281571763e-9, 3.14983101049e-10], + [27, 18, -2.87144071715e-9, 7.44190558718e-9], + [27, 19, -3.26518614707e-10, -2.93243500455e-9], + [27, 20, -8.55182561846e-10, 3.47617208115e-9], + [27, 21, 4.86877030983e-9, -7.0872528354e-9], + [27, 22, -5.74332100084e-9, 2.90056687384e-9], + [27, 23, -5.41033470941e-9, -1.10452433655e-8], + [27, 24, 4.16951885933e-10, -1.80038186307e-9], + [27, 25, 1.22815470212e-8, 5.62425137285e-9], + [27, 26, -6.59498075164e-9, -2.22838418639e-9], + [27, 27, 7.60067381059e-9, 6.9238741892e-10], + [28, 0, -9.10376375863e-9, 0], + [28, 1, -5.55484993587e-9, 7.9330019258e-9], + [28, 2, -1.5189131211e-8, -7.97957089012e-9], + [28, 3, 2.5318254224e-9, 1.11373049392e-8], + [28, 4, -1.99212752126e-9, 1.25054704704e-8], + [28, 5, 1.08871875702e-8, -4.22573826989e-9], + [28, 6, -5.22194316032e-9, 1.32656509709e-8], + [28, 7, -7.05588863746e-10, 5.12740997711e-9], + [28, 8, -4.23704976329e-9, -3.32584474553e-9], + [28, 9, 1.13842461859e-8, -1.04163010811e-8], + [28, 10, -9.22867885082e-9, 8.17851851593e-9], + [28, 11, -2.9809734257e-9, -1.45944538949e-9], + [28, 12, -4.83471863256e-10, 9.64951845027e-9], + [28, 13, 1.64993974957e-9, 6.63803768689e-9], + [28, 14, -8.23334828619e-9, -1.26939492243e-8], + [28, 15, -1.22774798187e-8, -1.97537366262e-9], + [28, 16, -3.57280690709e-9, -1.35890044766e-8], + [28, 17, 1.33742628184e-8, -4.72374226319e-9], + [28, 18, 5.62532322748e-9, -3.87230727328e-9], + [28, 19, 5.77104709635e-9, 2.35011734292e-8], + [28, 20, -1.15922189521e-9, 6.62939940662e-9], + [28, 21, 6.63154344375e-9, 6.33201211223e-9], + [28, 22, -1.94231451662e-9, -7.33725263107e-9], + [28, 23, 6.20158165102e-9, 2.61202437682e-9], + [28, 24, 1.11186270621e-8, -1.35606378769e-8], + [28, 25, 7.29495896149e-9, -1.76041477031e-8], + [28, 26, 1.23084992259e-8, 3.89251843939e-9], + [28, 27, -8.11971206724e-9, 1.3027922855e-9], + [28, 28, 6.9872587832e-9, 6.80526167979e-9], + [29, 0, -4.97406439473e-9, 0], + [29, 1, 4.98979084585e-9, -9.82512461189e-9], + [29, 2, -3.12119754621e-9, -2.63433487676e-9], + [29, 3, 1.82518120454e-9, -1.05769977751e-8], + [29, 4, -2.42786314995e-8, 2.26110758622e-9], + [29, 5, -6.8110306367e-9, 6.01242555817e-9], + [29, 6, 1.19592879211e-8, 9.7020069574e-9], + [29, 7, -5.91100934209e-9, -2.14599788734e-9], + [29, 8, -1.6946723555e-8, 1.11160276839e-8], + [29, 9, -1.2937116169e-9, 1.41793573226e-9], + [29, 10, 1.37184624798e-8, 1.79543486167e-9], + [29, 11, -5.96272885876e-9, 6.33350180946e-9], + [29, 12, -4.56278910357e-10, -5.01222008898e-9], + [29, 13, -1.09095923049e-9, -2.34179014389e-9], + [29, 14, -3.23718965114e-9, -4.58306325034e-9], + [29, 15, -9.57359749406e-9, -6.77546725808e-9], + [29, 16, 1.37450063496e-9, -1.4864526654e-8], + [29, 17, -1.57662415501e-9, -3.92506699434e-9], + [29, 18, -3.67597840865e-9, -2.58549575294e-9], + [29, 19, -6.30046143533e-9, 5.86840708296e-9], + [29, 20, -7.96446331531e-9, 5.74239983127e-9], + [29, 21, -9.8726430286e-9, -5.51700601596e-9], + [29, 22, 1.15574836058e-8, -1.47663300854e-9], + [29, 23, -1.84576717899e-9, 2.63546763516e-9], + [29, 24, 3.42199668119e-10, -2.38230581193e-9], + [29, 25, 5.85864038329e-9, 8.68333958543e-9], + [29, 26, 7.87039835357e-9, -6.92232980921e-9], + [29, 27, -7.98313300841e-9, -1.01903214091e-9], + [29, 28, 9.73355537526e-9, -5.71293958601e-9], + [29, 29, 1.28224843767e-8, -5.01548480482e-9], + [30, 0, 6.02882084759e-9, 0], + [30, 1, -5.57556615596e-10, 1.24285275602e-9], + [30, 2, -1.0370644769e-8, -2.61802322444e-9], + [30, 3, 2.14692300603e-9, -1.36464188501e-8], + [30, 4, -4.55090433473e-10, -3.91117213505e-9], + [30, 5, -4.36973977446e-9, -5.35558974983e-9], + [30, 6, 3.28451285815e-10, 3.17808233981e-9], + [30, 7, 4.04923220309e-9, 1.83962458779e-9], + [30, 8, 2.54952865236e-9, 4.62058281854e-9], + [30, 9, -7.32592511128e-9, -9.7277817424e-9], + [30, 10, 4.27609484555e-9, -4.10864961814e-9], + [30, 11, -1.04043005227e-8, 1.07581457651e-8], + [30, 12, 1.71622295302e-8, -1.08456775556e-8], + [30, 13, 1.42173587056e-8, 2.96806226352e-9], + [30, 14, 5.11505860834e-9, 8.07288811257e-9], + [30, 15, 2.10512146846e-10, -1.04541123836e-9], + [30, 16, -1.08921920457e-8, 4.35254063533e-9], + [30, 17, -6.14382436271e-9, -6.03140938575e-9], + [30, 18, -1.1114926509e-8, -7.65521957976e-9], + [30, 19, -1.2967398433e-8, 2.42005669694e-9], + [30, 20, -4.89261172033e-9, 1.27655684422e-8], + [30, 21, -1.0628473781e-8, -5.97537587412e-9], + [30, 22, -4.83763240001e-9, -9.37720111156e-9], + [30, 23, 5.7411388543e-9, -1.03756082222e-8], + [30, 24, -2.35238020789e-9, -2.7590933962e-9], + [30, 25, 3.04426404856e-9, -1.54853389229e-8], + [30, 26, 1.22149787623e-9, 1.24069551653e-8], + [30, 27, -7.95063844863e-9, 1.27529431593e-8], + [30, 28, -5.47120800289e-9, -7.96006293513e-9], + [30, 29, 4.1592295424e-9, 1.89489104417e-9], + [30, 30, 2.64794018006e-9, 8.12994755178e-9], + [31, 0, 7.33100089318e-9, 0], + [31, 1, 6.11169376734e-9, -1.60774540844e-8], + [31, 2, 7.49625106123e-9, 6.37776322444e-9], + [31, 3, -8.89920966189e-9, -7.6550294416e-9], + [31, 4, 1.22555580723e-8, -4.94466436575e-9], + [31, 5, -8.71279064045e-9, 3.08325747379e-9], + [31, 6, -1.68890803585e-9, 1.3703621527e-9], + [31, 7, -2.71996133536e-9, -6.8862512168e-10], + [31, 8, -7.50260355354e-10, 2.28102724239e-9], + [31, 9, -6.55840403272e-10, 5.24179002617e-9], + [31, 10, 3.99161675027e-9, -4.73500202132e-9], + [31, 11, 6.93506892777e-10, 2.08668068881e-8], + [31, 12, 5.5287540984e-10, 4.52042167068e-9], + [31, 13, 9.40389423562e-9, 4.6684078573e-9], + [31, 14, -7.88650771167e-9, 3.51952460147e-9], + [31, 15, 4.29954776132e-9, -2.80870684394e-9], + [31, 16, -7.19430261173e-9, 6.11805049979e-9], + [31, 17, -2.53821168958e-9, 6.83008216722e-9], + [31, 18, -6.02099321996e-10, -2.04187286905e-9], + [31, 19, 2.89086482301e-9, 4.43976791609e-9], + [31, 20, -1.75732193914e-9, 5.64081954558e-9], + [31, 21, -9.67143669208e-9, 7.09357408027e-9], + [31, 22, -9.0531201252e-9, -1.18308417466e-8], + [31, 23, 8.32234353898e-9, 4.51774572555e-9], + [31, 24, -2.81565064366e-9, -3.34369513768e-9], + [31, 25, -1.64574268169e-8, -2.20460908971e-9], + [31, 26, -1.26653070356e-8, 1.59189398991e-9], + [31, 27, -1.34953305827e-9, 1.07507650019e-8], + [31, 28, 1.04226918411e-8, 2.8072229491e-9], + [31, 29, -1.5812688103e-9, -2.18247510672e-9], + [31, 30, -9.47416722001e-10, -7.78077525656e-9], + [31, 31, -8.59193452715e-9, -1.85200316483e-9], + [32, 0, -2.33966288032e-9, 0], + [32, 1, -1.69210486076e-9, 1.27760467976e-9], + [32, 2, 1.13999662663e-8, -3.35609127916e-9], + [32, 3, -1.444433154e-10, 4.05424830941e-9], + [32, 4, 8.56367829112e-10, -6.75422476107e-9], + [32, 5, 8.60776205333e-9, 1.82572279646e-9], + [32, 6, -1.00402568672e-8, -7.6305617634e-9], + [32, 7, 1.37058613278e-9, 2.75465347035e-9], + [32, 8, 1.19653531908e-8, 4.91018212548e-9], + [32, 9, 7.332252213e-9, 7.18971591052e-10], + [32, 10, 9.12133506379e-11, -5.70680927495e-9], + [32, 11, -5.42043742127e-9, 7.583606425e-9], + [32, 12, -1.70289059214e-8, 1.40808168623e-8], + [32, 13, 4.02186822027e-9, 5.34936491964e-9], + [32, 14, -5.44420334437e-9, 2.20410694316e-9], + [32, 15, 5.1658020828e-9, -8.74727531741e-9], + [32, 16, 4.14867061294e-9, 4.27270420004e-9], + [32, 17, -6.46857778906e-9, 1.01916486215e-8], + [32, 18, 1.27286345117e-8, -1.12136888089e-9], + [32, 19, 7.55189536923e-10, -2.7754653073e-9], + [32, 20, 3.8161056442e-9, 3.19534855653e-10], + [32, 21, -2.33262996771e-9, 1.16411650251e-8], + [32, 22, -1.20880678762e-8, -2.72691793232e-9], + [32, 23, 8.18682122143e-9, -2.33549712722e-9], + [32, 24, -3.55036315667e-9, 6.54834763861e-10], + [32, 25, -1.89374992503e-8, -6.43429532848e-9], + [32, 26, 5.22535531492e-9, -3.68856221241e-9], + [32, 27, -4.53740085214e-9, -6.68075560111e-9], + [32, 28, 1.653041745e-9, -5.73130340772e-9], + [32, 29, 4.32768192965e-9, 2.88179889934e-9], + [32, 30, -6.74805866294e-9, 1.39346268546e-9], + [32, 31, -6.26740251766e-9, -2.18475608171e-10], + [32, 32, 3.3975660331e-9, 1.42646165155e-9], + [33, 0, -3.49357179498e-9, 0], + [33, 1, -1.39642913445e-9, -2.16391760811e-9], + [33, 2, -7.48774194896e-9, -5.0187208152e-10], + [33, 3, -1.99661955793e-9, 7.0930410268e-9], + [33, 4, -4.270199819e-9, 2.27426656698e-9], + [33, 5, 2.37784729729e-10, 3.74439169451e-9], + [33, 6, 1.22603039921e-9, -2.87328300836e-9], + [33, 7, -6.11215086076e-9, 2.49383366316e-9], + [33, 8, -8.23144405057e-10, 1.44915555407e-8], + [33, 9, 5.05097392033e-9, 7.4051746902e-9], + [33, 10, -2.39709923317e-9, 1.07022906758e-9], + [33, 11, 2.43388836443e-9, -8.67071813487e-9], + [33, 12, -2.33510532329e-9, 8.9435069891e-9], + [33, 13, 2.6041538193e-9, 3.13805750981e-9], + [33, 14, 4.92959662302e-9, 5.71204550617e-9], + [33, 15, -4.64145303396e-9, -3.47835302325e-9], + [33, 16, 7.39530517571e-9, 6.28613189283e-9], + [33, 17, -5.73064590551e-9, 1.28779114927e-8], + [33, 18, -9.74285933562e-9, -1.89598124592e-9], + [33, 19, 8.52447331156e-9, 2.07561717246e-9], + [33, 20, -3.32627500309e-9, -7.77689999053e-9], + [33, 21, 9.38761672387e-10, 8.17787598674e-10], + [33, 22, -1.05439940875e-8, -1.56190227392e-8], + [33, 23, 1.15896250314e-10, -1.01356350767e-8], + [33, 24, 1.11416074527e-8, -8.57153776484e-9], + [33, 25, 5.24730532375e-9, -1.04941656537e-8], + [33, 26, 1.09590005596e-8, 4.5404144025e-9], + [33, 27, -1.32772908147e-9, 1.26154161942e-9], + [33, 28, 1.75943381421e-9, -1.02060346415e-9], + [33, 29, -1.63075128633e-8, 5.72191328891e-9], + [33, 30, -1.56977064277e-9, -1.84579402264e-8], + [33, 31, 4.69481868853e-9, 1.02290050028e-9], + [33, 32, 6.56775919022e-9, -4.39711913398e-9], + [33, 33, -1.52043850303e-9, 8.31263004529e-9], + [34, 0, -9.08833340447e-9, 0], + [34, 1, -2.76889795047e-9, 6.3891897021e-9], + [34, 2, 6.7688190654e-9, 5.30082118696e-9], + [34, 3, 1.25429669786e-8, 8.11619669834e-9], + [34, 4, -8.30005417504e-9, 1.19586870272e-9], + [34, 5, -3.88131685638e-9, 3.54963449977e-9], + [34, 6, 4.84093709579e-10, 7.62975480293e-9], + [34, 7, 2.75125793239e-9, -6.56263573163e-9], + [34, 8, -9.83446807592e-9, 4.68751478021e-9], + [34, 9, 1.53042494664e-9, 2.10165697829e-9], + [34, 10, -7.52633242389e-9, 1.46544229781e-9], + [34, 11, -3.82043431506e-9, -1.07829735599e-9], + [34, 12, 1.42629362262e-8, -4.60063642968e-9], + [34, 13, -3.56240984255e-9, 1.03329523096e-9], + [34, 14, -2.50187664392e-9, 9.64686908241e-9], + [34, 15, 3.75939804157e-10, 6.2628624977e-9], + [34, 16, -1.45874042713e-9, -1.4938092908e-9], + [34, 17, -4.73747570512e-9, 3.93698829389e-9], + [34, 18, -1.47488701345e-8, -5.38197998817e-9], + [34, 19, -3.59837568897e-9, 7.15302015583e-9], + [34, 20, 3.64466859655e-9, -1.01824147346e-8], + [34, 21, -9.81980297066e-10, -7.42166456548e-9], + [34, 22, -3.18152215406e-9, 3.36620175035e-9], + [34, 23, -1.1297312057e-9, -1.18981902172e-8], + [34, 24, 8.78079044954e-9, 4.20436158037e-9], + [34, 25, 8.41097170248e-9, -9.86300815266e-9], + [34, 26, 3.99964384231e-9, -1.29360014691e-8], + [34, 27, 1.31566196208e-8, -3.91137836409e-9], + [34, 28, -1.65320604713e-10, -2.00370653858e-8], + [34, 29, 7.08151676681e-9, -4.31563574113e-9], + [34, 30, -2.05666035677e-8, -5.86948946952e-10], + [34, 31, -4.57411268111e-9, -1.60852780125e-9], + [34, 32, 9.14033593474e-9, 2.31645138264e-9], + [34, 33, 1.37617937967e-8, 4.3547198646e-9], + [34, 34, -8.54011998155e-9, 1.65364599023e-9], + [35, 0, 8.60443158492e-9, 0], + [35, 1, -1.07631176168e-8, -1.03576288219e-8], + [35, 2, -1.48166749807e-8, 7.47316845223e-9], + [35, 3, 1.88623900305e-9, 3.49967679465e-9], + [35, 4, -2.82338523108e-9, 9.20674937921e-9], + [35, 5, -7.23688443416e-9, -1.15478796146e-8], + [35, 6, 3.28708320436e-9, 7.90142264483e-9], + [35, 7, -3.45829826367e-9, 4.71386839716e-9], + [35, 8, 4.15911228686e-9, 9.21486965423e-9], + [35, 9, -7.83584593022e-10, -1.08780700595e-9], + [35, 10, -2.63078124596e-9, 1.14437669825e-8], + [35, 11, 3.1135284219e-9, -3.11508942142e-9], + [35, 12, 8.10432165903e-9, -6.4323395678e-9], + [35, 13, -1.60870380988e-9, 3.02852925442e-9], + [35, 14, -7.16511186947e-9, -7.02737046917e-9], + [35, 15, -1.53690564123e-8, 8.75984924717e-9], + [35, 16, -6.89772047703e-9, -7.36827047584e-9], + [35, 17, 7.03755899027e-10, -8.82920485773e-9], + [35, 18, -5.55247661498e-9, -1.14710477959e-8], + [35, 19, -1.07112499273e-9, -3.41854119412e-9], + [35, 20, 9.92702305837e-10, -1.13573745208e-10], + [35, 21, 1.29333785663e-8, -8.17657795386e-10], + [35, 22, 7.51479477595e-9, 5.7229930908e-9], + [35, 23, -8.16391242216e-9, -2.22442612532e-9], + [35, 24, 2.78435090517e-9, 6.38499607176e-9], + [35, 25, 7.16858934156e-9, 1.99781103645e-9], + [35, 26, -4.70300232305e-9, 4.61488943108e-9], + [35, 27, 1.09602089094e-8, -1.33812635796e-8], + [35, 28, 7.88159460716e-9, -1.53673024839e-8], + [35, 29, 7.70786810766e-9, 3.40140754669e-9], + [35, 30, -4.0519283993e-9, 2.87370616224e-9], + [35, 31, 7.84140204315e-9, 4.0412480788e-9], + [35, 32, -3.16267901777e-9, -7.41858064221e-9], + [35, 33, 5.8609633966e-9, -3.07739390905e-9], + [35, 34, -1.21632099674e-9, 2.66717400938e-9], + [35, 35, -5.8786572941e-9, -5.01230638002e-9], + [36, 0, -4.02590604243e-9, 0], + [36, 1, -1.13386686386e-9, 5.14982653283e-9], + [36, 2, -4.31575901448e-9, -3.40211031655e-9], + [36, 3, 7.00409280444e-11, -1.58895672921e-8], + [36, 4, 3.00961129935e-9, 1.38917218538e-9], + [36, 5, -7.42261535513e-9, 1.4033786019e-9], + [36, 6, 1.08546024568e-8, -3.16311943226e-9], + [36, 7, 1.70813806147e-9, 6.17680210154e-9], + [36, 8, 3.44939360246e-9, -5.03767857861e-9], + [36, 9, 2.92192219493e-9, -3.74028113708e-10], + [36, 10, 4.23119681703e-9, 6.83503143788e-9], + [36, 11, -4.10039232642e-9, 4.75118294475e-9], + [36, 12, 4.87204962837e-10, -9.84587714675e-9], + [36, 13, -6.15416963507e-9, 8.0318113556e-9], + [36, 14, -1.04141682764e-8, -5.94203574762e-9], + [36, 15, 9.54892409044e-10, 3.33310574172e-9], + [36, 16, 1.25505913598e-9, -1.60569406116e-10], + [36, 17, 4.95066186034e-9, -8.65314022477e-9], + [36, 18, 1.77184202015e-9, 4.4603340077e-9], + [36, 19, -5.25149217565e-9, -6.65319486115e-9], + [36, 20, -6.03793346956e-9, 3.52627660597e-9], + [36, 21, 1.0690892473e-8, -5.67948915026e-9], + [36, 22, 3.21356130034e-9, 1.61234121461e-9], + [36, 23, -3.61160199501e-10, 2.74891917069e-9], + [36, 24, 2.10662869987e-9, -4.24514998756e-9], + [36, 25, 4.3497929214e-9, 1.5607147346e-8], + [36, 26, 3.68762567031e-9, 9.37175113714e-9], + [36, 27, -7.91229464362e-9, 8.8299681063e-9], + [36, 28, 2.22637976824e-9, -4.34372617405e-9], + [36, 29, 1.84511675839e-9, 2.0734471834e-10], + [36, 30, -1.00411515955e-8, 6.05413293608e-9], + [36, 31, -8.39084442298e-9, -5.54047445598e-9], + [36, 32, 1.25654207109e-8, 2.30476235625e-9], + [36, 33, 3.89957606637e-9, -3.50340856893e-9], + [36, 34, -9.08693282663e-9, 4.35776976715e-9], + [36, 35, -1.38812503272e-10, -1.25527291076e-8], + [36, 36, 4.6014646572e-9, -5.94245336314e-9], + [37, 0, -6.26877957928e-9, 0], + [37, 1, -5.44321937673e-9, -1.11972040628e-9], + [37, 2, -4.22246992954e-9, -1.37653686495e-8], + [37, 3, -5.07190773652e-9, -7.09632763665e-10], + [37, 4, 5.63543416051e-9, 4.45226138939e-10], + [37, 5, -9.74378012077e-9, -5.57105900119e-10], + [37, 6, -2.07367453469e-9, 7.87327801001e-9], + [37, 7, 6.60599161587e-9, 8.67877271607e-9], + [37, 8, -2.13258525895e-9, -2.1492307811e-9], + [37, 9, 2.24091600442e-9, -1.86836328296e-9], + [37, 10, 2.04157744229e-9, 2.3982604686e-9], + [37, 11, 1.13497233805e-9, 3.68693317518e-9], + [37, 12, -3.26021093974e-9, -5.25122926097e-9], + [37, 13, -1.53850795393e-10, -8.31445713314e-9], + [37, 14, -2.55036581184e-9, -1.12426375494e-9], + [37, 15, 1.00390776044e-8, -9.42542010609e-10], + [37, 16, 3.49368560629e-9, 1.33918670303e-8], + [37, 17, 5.53414840336e-9, -4.2281622391e-9], + [37, 18, 1.73316172415e-9, 3.80532044735e-9], + [37, 19, -6.74770795135e-9, -5.73498587855e-10], + [37, 20, -7.21680758206e-9, -1.01104023109e-9], + [37, 21, 1.47579731962e-9, -1.50807662982e-9], + [37, 22, 6.4953816483e-9, 2.8865990482e-10], + [37, 23, -5.05603800386e-10, 4.15991942706e-9], + [37, 24, -8.28158239621e-9, -8.7318975493e-9], + [37, 25, 6.66433821456e-9, -1.98485329913e-9], + [37, 26, 4.87667405785e-9, 1.0485263927e-8], + [37, 27, -5.53507836078e-9, 4.40041559326e-9], + [37, 28, 1.2711139402e-8, 3.98526299108e-9], + [37, 29, 4.69346643521e-9, 6.80043694906e-9], + [37, 30, -8.95069849852e-9, 1.25778887176e-8], + [37, 31, 3.75470216864e-9, -9.24205129866e-9], + [37, 32, -3.6924875074e-11, 3.99721827179e-9], + [37, 33, 1.8187509055e-9, -1.66497614164e-8], + [37, 34, 2.60762275923e-9, 5.18793036302e-10], + [37, 35, -1.01969295005e-8, -8.48165557215e-9], + [37, 36, -3.57377514832e-9, -4.80019536638e-9], + [37, 37, 6.00401989218e-9, -4.34138083363e-9], + [38, 0, -2.50215563904e-9, 0], + [38, 1, 3.09466265187e-9, 4.69976367846e-9], + [38, 2, 8.19190642499e-9, -2.92168742572e-10], + [38, 3, -2.52647630895e-9, -9.33025608907e-10], + [38, 4, 5.0736001792e-9, -4.18473896587e-9], + [38, 5, -9.25037323666e-9, 7.38633376489e-9], + [38, 6, -1.40048815273e-8, 3.14176171759e-9], + [38, 7, 1.54501049189e-9, -2.78047841851e-9], + [38, 8, 3.14019810906e-9, 4.33315196098e-9], + [38, 9, 4.65473822686e-9, -7.83751300143e-10], + [38, 10, -1.7720286584e-9, -6.3036900059e-9], + [38, 11, 2.85477747534e-11, 8.94470323502e-9], + [38, 12, -3.6131714659e-9, -6.75700770885e-9], + [38, 13, 1.49004924856e-9, -1.04709970229e-8], + [38, 14, -6.89357445422e-9, 3.94757501829e-9], + [38, 15, 2.72024334119e-9, -3.29453926634e-9], + [38, 16, -5.38417749949e-9, 9.7587426523e-9], + [38, 17, 3.89428358456e-9, 2.01423843172e-9], + [38, 18, 1.00538805145e-8, -2.61647337975e-9], + [38, 19, 9.92881044511e-10, -6.15051964331e-10], + [38, 20, 4.03103560658e-9, -2.09499348411e-9], + [38, 21, -1.62423077972e-9, 3.92737997494e-9], + [38, 22, 1.02706233144e-9, 7.86969415161e-9], + [38, 23, -1.77955537988e-9, 5.41737892876e-9], + [38, 24, -1.27705450894e-8, 1.14583893203e-9], + [38, 25, -2.69917785699e-9, -2.26421240791e-9], + [38, 26, -2.73518174387e-9, 6.15998595051e-9], + [38, 27, -1.9219330356e-9, 8.73977778544e-9], + [38, 28, -4.82197724567e-9, -5.18926025463e-9], + [38, 29, 6.33489771869e-9, 3.2711837794e-9], + [38, 30, -1.28143586175e-10, 2.16956419247e-9], + [38, 31, 3.87663613104e-9, -7.68254138198e-9], + [38, 32, 8.28751981049e-9, 1.78693515151e-9], + [38, 33, 2.52385804563e-9, 1.42558825117e-8], + [38, 34, -9.55299702793e-9, 3.2827417618e-9], + [38, 35, 4.8092501395e-9, 2.33835491707e-9], + [38, 36, 1.15090381132e-9, -6.84242268214e-10], + [38, 37, -3.40978531559e-9, 2.06994207167e-9], + [38, 38, 3.06349232433e-9, -2.13887850477e-9], + [39, 0, 1.74080683553e-9, 0], + [39, 1, -2.57053135612e-9, 5.38483681001e-9], + [39, 2, 2.77228360729e-9, 7.04358259614e-9], + [39, 3, -3.3235411877e-9, 6.24116116403e-9], + [39, 4, -5.51535994529e-9, -4.91342654795e-9], + [39, 5, 5.47040375439e-9, 1.66010698351e-9], + [39, 6, -4.45909927931e-9, 2.79733582782e-9], + [39, 7, 1.75001339201e-9, -1.65033123845e-9], + [39, 8, 2.31145621942e-9, 1.15403393396e-8], + [39, 9, 7.00349611111e-9, 3.7403056209e-9], + [39, 10, 6.19713424433e-10, -2.78502502427e-10], + [39, 11, 1.48793575424e-8, -2.39801529813e-9], + [39, 12, -4.06774338685e-9, 8.93957638062e-9], + [39, 13, -1.95237351388e-9, -7.71937180618e-9], + [39, 14, -3.65216328534e-9, 2.78768320487e-9], + [39, 15, -5.49236816801e-9, -3.97721347261e-10], + [39, 16, 1.45206835528e-9, -1.85494879738e-9], + [39, 17, -8.46839283593e-10, -1.46956096573e-9], + [39, 18, 2.71275895976e-9, -8.67587317274e-10], + [39, 19, 5.11240330583e-9, 6.2472795357e-9], + [39, 20, -6.46282165404e-11, -9.92882773891e-9], + [39, 21, -5.16094193773e-9, 1.94235688059e-9], + [39, 22, -6.71243623487e-9, -8.06125497664e-10], + [39, 23, -3.22921227535e-9, 5.92701141337e-9], + [39, 24, -1.01882322024e-8, 7.75027644112e-9], + [39, 25, -5.1284134163e-9, -6.30012789774e-9], + [39, 26, -3.82452568811e-9, 8.65864300194e-9], + [39, 27, -8.22525852368e-9, -2.01288638784e-9], + [39, 28, -2.82378154145e-9, -1.06636607576e-8], + [39, 29, -2.16515268074e-10, -3.06411648657e-9], + [39, 30, 4.39099797319e-9, -1.05144274362e-8], + [39, 31, 1.43579138969e-9, -1.13155001982e-8], + [39, 32, 3.09632041312e-9, 5.55656199528e-9], + [39, 33, -5.55441416143e-9, 3.56222456971e-9], + [39, 34, -1.98688349566e-9, 3.36649788026e-9], + [39, 35, -1.36024644629e-8, 2.22281004959e-9], + [39, 36, 3.80530910326e-9, -3.45300476533e-9], + [39, 37, 1.32324029653e-9, -4.53704470766e-9], + [39, 38, -1.49988360222e-9, 6.44710228196e-9], + [39, 39, -8.75284533601e-10, 1.3247277018e-9], + [40, 0, -6.69712941605e-9, 0], + [40, 1, 2.98119206129e-9, -1.67671602321e-10], + [40, 2, -5.51229838204e-10, -1.11120907382e-9], + [40, 3, 1.00967033874e-10, -2.06645039278e-9], + [40, 4, 5.67371495728e-9, -7.21819587159e-9], + [40, 5, 1.34270999896e-8, -1.89035912501e-10], + [40, 6, -3.48436245779e-10, 4.26022856296e-9], + [40, 7, -2.47450695737e-9, 2.38870112778e-9], + [40, 8, 6.80794565632e-9, 3.82071234423e-9], + [40, 9, -6.90490165958e-10, 1.97015196606e-9], + [40, 10, -5.24806255604e-9, 3.06298214583e-9], + [40, 11, 3.47677807871e-9, -4.16659562949e-9], + [40, 12, 6.5461957328e-9, 1.94884088889e-10], + [40, 13, -2.49110593073e-9, -4.29803550442e-9], + [40, 14, -5.31990094342e-10, 9.00889321668e-10], + [40, 15, -4.95474634955e-9, -5.73605310655e-10], + [40, 16, -8.08969466066e-10, -3.3234849529e-9], + [40, 17, 1.13076685092e-9, 1.87448317014e-9], + [40, 18, -4.41879377259e-10, 7.15396759385e-10], + [40, 19, -2.31075778003e-9, 7.40677714867e-10], + [40, 20, -7.89936899784e-9, 6.9843429008e-9], + [40, 21, -4.41475103069e-9, -6.44032174041e-10], + [40, 22, -1.47137946197e-8, -1.57204038521e-8], + [40, 23, -6.25564722188e-10, -1.23258449268e-8], + [40, 24, 4.04206740773e-9, 3.83294965319e-9], + [40, 25, 4.0630055543e-10, -4.16803630319e-9], + [40, 26, 6.77364070024e-9, -4.63296622041e-9], + [40, 27, -1.96935067826e-9, 1.67788741927e-9], + [40, 28, 2.02303536054e-9, 7.02744988957e-9], + [40, 29, 2.44543058163e-9, 2.15388613016e-9], + [40, 30, 1.11163452352e-10, 1.06054076662e-9], + [40, 31, -6.07985990106e-9, -1.40699197628e-9], + [40, 32, -2.42536238693e-9, -5.77392178963e-9], + [40, 33, -1.50936507352e-9, -9.12831329929e-10], + [40, 34, 6.78276645979e-10, 9.66297773764e-10], + [40, 35, 7.62262076875e-9, -8.42037138778e-9], + [40, 36, 4.76306921308e-9, 5.09933668609e-9], + [40, 37, -5.93199511085e-9, 1.63782612718e-9], + [40, 38, 4.43681584183e-10, 4.45230470779e-9], + [40, 39, 6.73138158452e-9, 3.1821410438e-9], + [40, 40, -1.12228065052e-9, -2.25885618094e-10], + [41, 0, -4.13525437499e-9, 0], + [41, 1, -4.90274680015e-9, -4.1342146548e-9], + [41, 2, 2.89052309474e-9, 1.77080262581e-9], + [41, 3, 5.2084787981e-9, 2.62910180729e-9], + [41, 4, -1.91230313597e-9, 4.99520425513e-9], + [41, 5, 4.43964510122e-9, -3.40520164639e-9], + [41, 6, 3.37316558839e-9, 2.0898518817e-9], + [41, 7, 2.06227831355e-10, 3.27019848148e-9], + [41, 8, -2.15120846029e-9, -4.24645658621e-9], + [41, 9, -5.91413129556e-10, 3.43780205286e-9], + [41, 10, 4.97937264743e-9, 1.52629699723e-9], + [41, 11, 5.1207311293e-9, -6.76355555964e-9], + [41, 12, 4.56242438597e-9, 4.26145632589e-10], + [41, 13, -1.9035041822e-9, 4.24220010125e-9], + [41, 14, 4.13463016104e-9, -1.22583182109e-9], + [41, 15, -1.24689685661e-9, 3.06681470819e-9], + [41, 16, -6.34747121526e-10, -4.30865119854e-9], + [41, 17, -2.0687663455e-9, 3.54231837608e-9], + [41, 18, -2.25848220691e-9, 4.38915638181e-9], + [41, 19, -2.87905409333e-9, -6.98556578723e-10], + [41, 20, -2.22610632963e-9, -6.84339949215e-10], + [41, 21, -1.35557598574e-9, -3.86965990217e-9], + [41, 22, -1.08213659346e-8, -3.18900609762e-9], + [41, 23, 9.05820361427e-10, -1.56187984663e-8], + [41, 24, 6.16778124863e-9, -1.60878624414e-9], + [41, 25, 3.53851984061e-10, 3.05984309642e-9], + [41, 26, 7.54848875117e-9, -8.45787453799e-9], + [41, 27, 1.64116433803e-9, -4.05578278772e-10], + [41, 28, -1.65098951199e-9, -4.69639162983e-9], + [41, 29, -5.44379585832e-9, 6.37658266351e-9], + [41, 30, 2.22402442097e-9, -4.31030185329e-10], + [41, 31, 1.07361998502e-8, 1.05556071175e-9], + [41, 32, -2.67267671294e-9, 3.89646604453e-9], + [41, 33, -3.34120765867e-9, 1.05367869266e-8], + [41, 34, -2.88895264308e-9, 4.05911712157e-9], + [41, 35, -1.37509044416e-8, 2.84446968017e-9], + [41, 36, 3.63761204387e-9, -3.62427981439e-9], + [41, 37, 1.80748235308e-9, -1.08907704575e-8], + [41, 38, -1.05887784161e-8, -5.38192890554e-10], + [41, 39, -5.23876130159e-9, -3.06101814034e-9], + [41, 40, 4.2197139814e-9, -4.81844784939e-9], + [41, 41, 4.33049994846e-9, 7.11601184478e-9], + [42, 0, -1.33354792115e-9, 0], + [42, 1, -2.91339767022e-9, 2.0672296144e-9], + [42, 2, -2.25762740342e-9, -1.91350575326e-9], + [42, 3, 1.00425868132e-9, 8.90566423709e-9], + [42, 4, 5.4929304912e-9, 1.46033051568e-9], + [42, 5, -9.14060768047e-9, -4.05025465516e-9], + [42, 6, 2.51909112593e-9, -8.30414001349e-10], + [42, 7, 4.33149903326e-9, -1.81867645319e-9], + [42, 8, 2.3146703672e-9, 6.46886557966e-10], + [42, 9, 5.80415766535e-10, 2.63924873014e-9], + [42, 10, 5.35861538963e-9, 6.87237624774e-9], + [42, 11, -8.10356263273e-10, 2.77288086748e-9], + [42, 12, 5.18833931987e-9, -1.0630088118e-8], + [42, 13, 6.96174131569e-10, 5.52240053377e-9], + [42, 14, -6.83414603737e-9, 5.97533344532e-9], + [42, 15, -1.15265842427e-9, 6.35337004364e-9], + [42, 16, 2.71346710242e-9, -2.38502668497e-9], + [42, 17, -1.79870822529e-9, -4.10981715056e-9], + [42, 18, -1.31441814882e-8, 1.7880048219e-9], + [42, 19, -2.80886446365e-9, -5.88853392034e-9], + [42, 20, 5.67492620331e-9, 6.40791629469e-10], + [42, 21, 2.41505414934e-9, -5.60737090588e-9], + [42, 22, 1.51381190151e-9, -3.40250947394e-9], + [42, 23, -3.27844335846e-9, -5.63629938986e-9], + [42, 24, 4.82256426682e-9, 1.2093961296e-9], + [42, 25, -4.25447876888e-9, 4.34304889131e-9], + [42, 26, -1.78154712795e-9, -6.25459866853e-9], + [42, 27, 8.06048401324e-9, -2.34473408874e-9], + [42, 28, -3.52264845834e-9, 1.96484652934e-9], + [42, 29, -6.52976748285e-9, -1.27865281867e-9], + [42, 30, 2.96168915407e-9, 1.45345501063e-9], + [42, 31, 5.22771935211e-9, 4.84294083994e-9], + [42, 32, 7.00967483397e-9, 5.21635005469e-9], + [42, 33, 5.68419870673e-9, 5.8209226949e-9], + [42, 34, 2.49133780205e-9, 1.11560909802e-8], + [42, 35, -5.42518392886e-9, -1.14422610701e-9], + [42, 36, 4.43062694275e-9, -5.4015923669e-9], + [42, 37, -5.90537874418e-9, 2.38447105699e-9], + [42, 38, 2.61875328309e-9, -1.31646034318e-8], + [42, 39, 4.31141960605e-9, 1.02533250717e-8], + [42, 40, 1.48071523979e-9, -2.90013620439e-9], + [42, 41, 1.46208018106e-9, 2.15712294638e-11], + [42, 42, -7.17896151918e-9, 3.05774241943e-9], + [43, 0, 4.80016559571e-9, 0], + [43, 1, -2.99163512748e-9, 1.40510371892e-9], + [43, 2, -9.95536520455e-9, -6.78259699473e-10], + [43, 3, 3.1691808399e-9, -1.5749811091e-10], + [43, 4, 1.18935531794e-9, 1.81393420291e-9], + [43, 5, -8.80529783351e-9, 7.1635769111e-9], + [43, 6, 5.97894057386e-9, 2.94590894949e-10], + [43, 7, -1.52227392816e-9, 4.89580125606e-9], + [43, 8, 5.57502878273e-11, 2.79898709198e-10], + [43, 9, -2.42188694717e-9, -7.0904649618e-9], + [43, 10, 2.87637569429e-10, 1.9008191519e-9], + [43, 11, -3.43518224791e-9, 5.95350214203e-9], + [43, 12, -2.47269924155e-9, 1.92210904294e-9], + [43, 13, 1.96966119784e-9, -3.46114343345e-9], + [43, 14, -5.66818876142e-9, 3.25629579061e-9], + [43, 15, 3.54766446436e-9, 5.99511981789e-9], + [43, 16, 2.73311624814e-10, 2.77229088669e-10], + [43, 17, 3.94232906593e-9, -4.53197550515e-9], + [43, 18, -3.66329200365e-9, -5.14114571097e-9], + [43, 19, -4.35166062861e-9, -7.09815995277e-9], + [43, 20, -6.95761972986e-10, 3.54067077072e-10], + [43, 21, 3.89994250134e-9, 4.95534624419e-9], + [43, 22, 6.92777454917e-9, -1.96608582659e-9], + [43, 23, 4.67099532626e-10, -6.08055780558e-9], + [43, 24, 6.38614148731e-9, -1.7118365038e-9], + [43, 25, 4.2200639481e-10, 3.20173896008e-9], + [43, 26, -3.49775086562e-9, 3.5714429196e-9], + [43, 27, 4.3488792847e-9, 8.99989867635e-10], + [43, 28, -9.57727739574e-10, 7.92898192789e-9], + [43, 29, -1.05147757759e-9, 1.14886926559e-9], + [43, 30, -1.03596839492e-8, -8.23488791643e-9], + [43, 31, -4.53706035433e-9, -8.68509261457e-10], + [43, 32, -3.64072761092e-9, 5.35143529179e-9], + [43, 33, 6.05006717058e-9, -1.14065559763e-9], + [43, 34, 2.98956472143e-9, 4.16161397827e-10], + [43, 35, -1.28808244727e-9, 5.5058202819e-9], + [43, 36, 6.52903431778e-10, -3.62994807787e-9], + [43, 37, 3.17344593362e-9, 6.0114715157e-9], + [43, 38, -5.81895814117e-9, 1.74812579571e-10], + [43, 39, 4.9632420451e-9, -2.39546876633e-9], + [43, 40, 1.15985754714e-8, 5.03199216333e-11], + [43, 41, -3.16787886818e-9, 3.1247340099e-9], + [43, 42, -7.44030943275e-9, 4.27834690972e-9], + [43, 43, -2.08475180681e-9, -8.96658973671e-9], + [44, 0, 7.16597271169e-10, 0], + [44, 1, 4.35359549773e-9, -8.03476202214e-10], + [44, 2, -3.79120724365e-10, 2.3666343415e-9], + [44, 3, -1.9504287923e-10, -3.50189431483e-9], + [44, 4, 2.63812172722e-9, -2.14241109485e-9], + [44, 5, 1.22484173172e-9, 3.33912238312e-9], + [44, 6, -8.21665290321e-9, 3.4257080463e-9], + [44, 7, 2.98851621414e-9, 1.04600848746e-8], + [44, 8, -2.65553732502e-9, 3.88452130213e-10], + [44, 9, -4.01226877626e-10, -6.42838063306e-9], + [44, 10, -5.27891450116e-9, -6.09599870123e-9], + [44, 11, -2.17005646338e-9, -1.09791269121e-9], + [44, 12, -4.43983695521e-9, -2.18899413884e-9], + [44, 13, 2.53662498828e-9, -4.26751504379e-9], + [44, 14, -5.40774676176e-9, -3.74724128584e-9], + [44, 15, 2.20273327242e-9, -6.38441090011e-9], + [44, 16, 4.56597166511e-9, 4.84573915246e-9], + [44, 17, 4.41544557049e-9, 1.54202418543e-9], + [44, 18, 5.67906570443e-9, -4.17559338192e-9], + [44, 19, -6.73447447471e-10, -4.67189791645e-9], + [44, 20, -4.56157353263e-10, 6.30312848084e-10], + [44, 21, -7.37736788113e-9, 1.98663767921e-10], + [44, 22, 6.92875962848e-9, 2.07109499562e-9], + [44, 23, 1.01550408795e-9, 9.64945379654e-9], + [44, 24, 3.01922142612e-10, -6.513423277e-9], + [44, 25, 2.90361579607e-9, 1.10661300138e-9], + [44, 26, -4.47876001353e-9, 1.27891412067e-9], + [44, 27, 2.51551011801e-9, -2.77043411393e-9], + [44, 28, -9.05678632717e-10, 5.54494660787e-9], + [44, 29, -6.98866052227e-9, 4.49026748788e-9], + [44, 30, 4.7898160503e-9, 1.82143100801e-9], + [44, 31, -6.34603270453e-10, 2.65129335221e-9], + [44, 32, -4.23584657112e-9, 7.9819136238e-10], + [44, 33, -3.75671392995e-9, 2.89954282777e-10], + [44, 34, -3.34592062957e-9, 5.90112277368e-9], + [44, 35, -7.42209126379e-9, -3.12651333437e-9], + [44, 36, 3.53465103361e-9, -7.50792765314e-9], + [44, 37, 9.77743329493e-9, 7.49175946104e-9], + [44, 38, 4.50523562078e-9, -6.07722887364e-9], + [44, 39, 6.82723600826e-9, 2.67191354166e-9], + [44, 40, -3.60229735e-9, 7.43640660818e-9], + [44, 41, 3.05918358946e-9, -2.19975922856e-9], + [44, 42, -8.04752620611e-10, -7.48815852958e-10], + [44, 43, 2.63803620047e-9, -3.00616063432e-9], + [44, 44, 3.0291478328e-9, -1.61647243103e-9], + [45, 0, -4.20562194155e-9, 0], + [45, 1, 4.4379040152e-9, -5.51664132292e-9], + [45, 2, 1.18458145711e-9, -2.84426726042e-9], + [45, 3, -3.07024006065e-10, -6.08323666779e-9], + [45, 4, -4.17074572514e-10, 1.04795469653e-9], + [45, 5, 3.13251669316e-9, -1.38672272733e-9], + [45, 6, -5.58127842237e-9, -4.54711073566e-10], + [45, 7, 1.44970124311e-12, 2.60316093604e-9], + [45, 8, -3.54978919718e-9, 4.56563662187e-10], + [45, 9, 6.83145300281e-9, -4.64843734135e-9], + [45, 10, -1.37244511558e-9, -2.43311008683e-9], + [45, 11, 1.14821963863e-9, -2.97387745235e-9], + [45, 12, -4.8209597262e-9, -2.34153494603e-9], + [45, 13, -4.91603699064e-9, -2.88944934821e-9], + [45, 14, 2.19473571181e-9, -5.06957047369e-9], + [45, 15, -3.14892757709e-9, -1.49587086033e-12], + [45, 16, 6.63161850196e-9, 4.6755213631e-10], + [45, 17, 2.49597156408e-9, -1.67690334522e-9], + [45, 18, 2.45467637342e-9, -4.28899068529e-9], + [45, 19, -5.13137394149e-9, -2.2131490841e-9], + [45, 20, 5.56074699836e-9, 4.14250381261e-9], + [45, 21, -3.4690949332e-9, -5.58876832906e-10], + [45, 22, 3.18548582181e-9, 5.02694389287e-9], + [45, 23, 2.22520273984e-9, 5.15834114168e-9], + [45, 24, -1.10386430944e-8, 4.66294947782e-9], + [45, 25, 8.186396108e-9, -3.38119094674e-9], + [45, 26, -2.17829767335e-9, 5.90422271735e-9], + [45, 27, -6.37212275736e-9, 3.42683611366e-10], + [45, 28, 5.55768024188e-9, -1.53492742026e-10], + [45, 29, -7.56151876206e-9, -2.5200914351e-9], + [45, 30, -1.78204385866e-9, -1.16576354142e-10], + [45, 31, -1.81647075569e-9, -4.89659964022e-9], + [45, 32, -2.17318403448e-9, -2.98137538631e-9], + [45, 33, -1.67787477837e-9, -2.76303095452e-9], + [45, 34, -2.45868539182e-9, 6.10049182142e-9], + [45, 35, -7.25160877101e-9, 7.14795060372e-9], + [45, 36, -8.31520827869e-9, 6.91473231707e-9], + [45, 37, -5.90075989395e-9, 3.86510419611e-9], + [45, 38, -4.5757545766e-9, 3.51994877415e-9], + [45, 39, -2.35206857136e-10, -8.14244952898e-9], + [45, 40, 4.12959194689e-9, -3.33153350192e-9], + [45, 41, 1.15177501806e-9, 1.23563176111e-9], + [45, 42, -1.47954611149e-9, -1.19573121446e-8], + [45, 43, 4.29208492389e-9, 2.4169691253e-9], + [45, 44, 1.16896020112e-8, 3.79338157974e-9], + [45, 45, -2.11611455548e-9, -1.86268283322e-10], + [46, 0, -2.70012415043e-9, 0], + [46, 1, 1.80310534813e-9, 1.01975529719e-9], + [46, 2, 5.49858950643e-9, 1.69386192791e-9], + [46, 3, -2.17227347292e-9, 3.13551620449e-11], + [46, 4, 5.66307366242e-10, -7.33552916811e-9], + [46, 5, -3.92225673604e-9, -9.87938446292e-9], + [46, 6, -5.19790587846e-9, -3.66545255275e-9], + [46, 7, 5.4928302123e-9, -7.68195997713e-9], + [46, 8, 2.17033095777e-9, 3.17787787443e-9], + [46, 9, 9.96299925061e-9, 5.93033350714e-9], + [46, 10, 2.10682665579e-9, -7.49320315546e-10], + [46, 11, -3.67331003264e-9, -3.29875222753e-9], + [46, 12, -9.89004146632e-10, -7.70280415669e-10], + [46, 13, -5.4749365389e-9, -9.89789200776e-10], + [46, 14, -4.11711385409e-10, 2.899684764e-10], + [46, 15, -5.64698395869e-9, -2.33049143886e-9], + [46, 16, 2.90741518386e-9, 5.43626943521e-9], + [46, 17, -3.72824213792e-9, -6.68397143095e-10], + [46, 18, 2.54614482597e-9, -5.15577393539e-9], + [46, 19, -5.09322881303e-10, -2.19142742197e-9], + [46, 20, -3.2604694877e-9, -4.45892855672e-9], + [46, 21, -5.44320195164e-9, 4.86393178127e-9], + [46, 22, 6.01189717955e-9, 1.1853935729e-9], + [46, 23, 2.49813551913e-9, 4.72263592598e-9], + [46, 24, -4.67893359545e-9, -3.01740256772e-10], + [46, 25, 4.11819342344e-9, -7.98076733908e-9], + [46, 26, 3.90445251962e-9, 1.09137918441e-8], + [46, 27, -2.31459572299e-9, -1.31245150309e-10], + [46, 28, -5.12497482609e-10, -5.28211928064e-9], + [46, 29, -2.20883312544e-9, -2.10749632839e-9], + [46, 30, -5.25781051372e-9, -7.85075749498e-9], + [46, 31, -2.42154487807e-9, 8.85282307696e-11], + [46, 32, -1.70076318965e-9, -3.12034919855e-9], + [46, 33, 1.49941290882e-8, -2.89411008422e-10], + [46, 34, -1.77925513543e-9, 4.03871357436e-9], + [46, 35, -6.42883444376e-9, 9.61561249861e-10], + [46, 36, -2.62783231385e-10, -2.29487440393e-9], + [46, 37, -3.72932026305e-9, 6.20601539446e-9], + [46, 38, -6.23587949535e-9, -2.84455158644e-9], + [46, 39, 7.90167444535e-9, -6.70704239494e-10], + [46, 40, 1.17802075978e-9, -1.17881775587e-9], + [46, 41, -3.7054949246e-10, -5.22404669093e-9], + [46, 42, 9.59291977084e-10, 6.55323402052e-9], + [46, 43, -2.40852741746e-9, 1.17616421703e-8], + [46, 44, 2.23574532165e-9, -3.22855904393e-9], + [46, 45, -1.71783716222e-9, 5.66851692385e-9], + [46, 46, -4.19103472438e-10, -2.96575033763e-9], + [47, 0, -1.90154208615e-10, 0], + [47, 1, -6.27233433754e-9, -1.5151751449e-9], + [47, 2, 4.016915657e-9, -1.00085045221e-9], + [47, 3, 2.59377856501e-9, 2.47231037816e-9], + [47, 4, -1.04443325244e-9, 9.34975462359e-10], + [47, 5, -4.31347537978e-10, -2.20359402651e-9], + [47, 6, 2.57405615983e-9, -3.41622421012e-9], + [47, 7, 3.52747810143e-10, -3.93728849468e-9], + [47, 8, 5.37524591361e-9, -1.23956249318e-9], + [47, 9, -1.29987202635e-9, 2.95555821523e-9], + [47, 10, 6.40767701595e-9, 3.68885075423e-9], + [47, 11, 1.23519925844e-9, -4.72211607105e-9], + [47, 12, 1.04380948619e-8, 2.75422690346e-9], + [47, 13, -2.71006312178e-9, -3.33560490463e-9], + [47, 14, 1.07598358729e-9, 4.79188752249e-10], + [47, 15, -1.85179314652e-9, 1.00741967568e-9], + [47, 16, -2.04122754813e-9, -7.74824254825e-10], + [47, 17, -1.85094389869e-9, 4.70534852733e-9], + [47, 18, -1.75664412977e-9, 7.51634026147e-9], + [47, 19, 2.57958630199e-9, 3.90203858436e-9], + [47, 20, -1.11333666318e-8, 1.9693962829e-10], + [47, 21, -5.99568152704e-9, 1.11135984769e-10], + [47, 22, -7.56627176425e-9, -9.65217141462e-10], + [47, 23, 3.09665406126e-9, 9.94928294714e-10], + [47, 24, -1.17285978776e-9, -1.1322436378e-9], + [47, 25, -2.64542435507e-9, -9.91886685629e-9], + [47, 26, 8.3971878012e-9, 2.93025050389e-10], + [47, 27, -6.10514707418e-9, -2.63190397426e-9], + [47, 28, 1.67058013297e-9, -6.84529247699e-9], + [47, 29, 5.86653254012e-9, 1.39919470636e-11], + [47, 30, -2.42054755734e-9, 2.4590389349e-9], + [47, 31, 5.19770268779e-10, 9.51714424649e-10], + [47, 32, -1.60020222792e-9, -1.57189568068e-10], + [47, 33, -4.66270294962e-9, 2.69393960951e-9], + [47, 34, 1.86438558801e-9, 3.68745885093e-9], + [47, 35, -9.09257444193e-9, 1.08683931287e-9], + [47, 36, 7.40829517963e-9, -4.3469106059e-9], + [47, 37, 8.22769659281e-9, 1.65695541642e-9], + [47, 38, 6.47827986587e-11, 1.36944595156e-9], + [47, 39, -1.85449646925e-9, 7.6698755501e-9], + [47, 40, -8.50173620087e-9, 7.89172031519e-9], + [47, 41, -3.6893598523e-9, 4.90097673006e-9], + [47, 42, -1.59039873565e-9, -5.52446047641e-9], + [47, 43, 2.23824882871e-9, 2.73410283112e-9], + [47, 44, -3.41312191572e-9, 1.04347201947e-8], + [47, 45, 6.21033825189e-9, 2.30263608837e-9], + [47, 46, -2.58602557996e-10, -4.32960943537e-9], + [47, 47, 3.28878760211e-9, -5.01440887217e-9], + [48, 0, 3.57681178108e-9, 0], + [48, 1, 1.14968699435e-9, 3.02657013283e-9], + [48, 2, 4.52034385436e-9, 3.63393017349e-10], + [48, 3, -1.22927584235e-9, 2.57979302487e-9], + [48, 4, 4.09341959566e-10, -1.22080534781e-9], + [48, 5, 5.43663455799e-9, -2.35605380481e-9], + [48, 6, 4.74904020601e-9, 7.84843721779e-9], + [48, 7, -3.98978873322e-10, 2.48163262176e-9], + [48, 8, 2.55845111826e-9, 5.47396371892e-9], + [48, 9, 2.24130678348e-10, 3.98795187238e-9], + [48, 10, -3.53158299606e-9, 3.04470802332e-9], + [48, 11, 1.38179707639e-9, 1.07320251723e-9], + [48, 12, 9.19794499549e-11, -3.8310242456e-9], + [48, 13, 2.8444543846e-9, 1.67644943899e-9], + [48, 14, -4.17415239884e-10, -5.20890517219e-10], + [48, 15, 4.62182206593e-9, 1.74541145074e-9], + [48, 16, 8.55310905864e-10, 9.6417817961e-10], + [48, 17, 1.03882489053e-9, 3.58612272501e-9], + [48, 18, -6.51833456414e-10, 1.74602237769e-9], + [48, 19, -2.27428315047e-9, 4.71978277111e-9], + [48, 20, -5.25895902263e-9, 5.05947018014e-9], + [48, 21, 4.19950564694e-10, -3.37394929243e-9], + [48, 22, -7.46739493756e-9, 2.78688711358e-9], + [48, 23, -2.06870163398e-9, -2.40698779384e-9], + [48, 24, -4.28479149016e-9, -9.29222791824e-10], + [48, 25, -3.13816367488e-9, 3.53860016527e-10], + [48, 26, 6.75317050852e-10, -5.81365414694e-9], + [48, 27, -8.14262299853e-9, 4.75300683514e-9], + [48, 28, 6.19117211259e-10, -7.45017826902e-9], + [48, 29, 2.08270824932e-9, -6.70725670829e-9], + [48, 30, -1.21014652961e-9, -1.35952580674e-9], + [48, 31, 2.1892623948e-10, -3.84588314583e-9], + [48, 32, 1.75493280857e-9, -1.71734501643e-9], + [48, 33, 2.03034126664e-9, -1.19209199438e-10], + [48, 34, 7.36341492206e-10, 7.2488084141e-9], + [48, 35, -5.46003431694e-9, 1.26320884899e-9], + [48, 36, -4.57823041568e-9, -6.44850201282e-10], + [48, 37, -1.77867917025e-9, -4.54304954485e-9], + [48, 38, -8.7354735732e-9, -1.03193513201e-9], + [48, 39, 5.12226006557e-9, -8.69537994667e-9], + [48, 40, 1.43385239699e-9, 4.95029164361e-9], + [48, 41, -2.36089936238e-9, -9.76362693271e-9], + [48, 42, 1.91874768918e-9, 2.84547987611e-9], + [48, 43, 4.86940216197e-9, 5.83862929544e-9], + [48, 44, 6.53859055177e-10, -1.20865612683e-10], + [48, 45, 5.62863159319e-9, 4.73507339015e-9], + [48, 46, -3.68918092552e-9, 8.75444855625e-9], + [48, 47, 3.19161830766e-9, 4.52954726663e-9], + [48, 48, 6.09574598027e-9, -1.46002611039e-9], + [49, 0, -1.32381251748e-10, 0], + [49, 1, 6.47068277627e-9, -2.37896141041e-10], + [49, 2, 1.30200427546e-10, 3.00456443547e-9], + [49, 3, 1.43748218598e-9, 1.44670309978e-9], + [49, 4, -3.92329568744e-10, 9.70388035448e-9], + [49, 5, 2.55429460233e-9, -1.47768022073e-10], + [49, 6, -2.11376664553e-9, 3.43832599943e-9], + [49, 7, 3.15330040886e-9, 3.41943534957e-9], + [49, 8, -1.06674914362e-9, 3.72669749638e-9], + [49, 9, -8.15488716734e-10, 5.5538171239e-9], + [49, 10, -4.96678560171e-9, -3.87168385069e-10], + [49, 11, 4.84062216988e-9, 2.23790617673e-9], + [49, 12, -3.20337407762e-9, -2.02737537475e-9], + [49, 13, 2.49812725043e-9, 3.72762188228e-9], + [49, 14, 6.34349028568e-10, -1.58167593564e-9], + [49, 15, -1.99198762809e-9, 1.1277422647e-9], + [49, 16, -1.23336400479e-9, -5.94456540806e-9], + [49, 17, -2.65699702032e-9, -6.1024816469e-10], + [49, 18, -1.31402173323e-9, -2.43782519231e-9], + [49, 19, -2.29688343083e-9, -4.94180521317e-10], + [49, 20, 4.66871394808e-9, 3.07127632185e-10], + [49, 21, -2.08989346555e-9, -5.88434524195e-9], + [49, 22, 1.91135216096e-10, 4.43491281302e-9], + [49, 23, 2.99871273075e-9, -1.06379105793e-9], + [49, 24, 4.3599603262e-9, 1.42678862473e-9], + [49, 25, -4.6015682674e-9, 5.38503141399e-9], + [49, 26, -7.84845559049e-9, -9.76933411644e-10], + [49, 27, -3.04318299143e-9, 2.74872232195e-9], + [49, 28, -3.23017753759e-9, -1.12284746533e-8], + [49, 29, 6.64106165101e-10, -5.71670663706e-10], + [49, 30, 2.48126870469e-9, 2.85895832102e-9], + [49, 31, -2.48689123925e-10, -6.18384284875e-9], + [49, 32, 1.37336318711e-9, -5.66667653145e-9], + [49, 33, 1.5107853166e-9, -1.8527574247e-9], + [49, 34, 4.48621700339e-9, -5.35447038422e-10], + [49, 35, 2.84135954695e-9, 5.53605102488e-9], + [49, 36, -4.73460942936e-9, 5.77800653513e-10], + [49, 37, -1.00375346312e-9, 9.2788284134e-10], + [49, 38, 3.10296657267e-9, -2.41249789431e-9], + [49, 39, 2.82835885902e-9, 2.26214345333e-9], + [49, 40, -1.76894208328e-9, 1.90525031142e-9], + [49, 41, -1.78869741196e-9, -1.47482017451e-9], + [49, 42, -2.88796879506e-9, -4.84058674322e-10], + [49, 43, 5.04557010898e-9, -6.87856526043e-9], + [49, 44, 5.93483174278e-9, 8.10527467719e-9], + [49, 45, 8.78294012586e-10, -1.5462879946e-9], + [49, 46, 3.32223141812e-9, 1.32061609167e-9], + [49, 47, 2.19546558739e-9, 4.45577322906e-10], + [49, 48, -3.19934645334e-9, 5.29796611163e-10], + [49, 49, 3.53298458012e-9, 1.15517660073e-9], + [50, 0, -3.7612715508e-9, 0], + [50, 1, 4.23888304609e-9, -1.50227955046e-9], + [50, 2, -8.61644685578e-9, -3.18340545864e-9], + [50, 3, 6.5481484883e-10, -1.0655411174e-9], + [50, 4, -8.48878564001e-9, 4.0721357789e-10], + [50, 5, -7.58945358323e-10, -2.79474626471e-9], + [50, 6, -8.05947626804e-11, 1.79661231497e-9], + [50, 7, 2.14183539023e-9, 4.51809743818e-9], + [50, 8, -2.72537670208e-9, 1.14829252929e-9], + [50, 9, -1.44509891184e-9, 2.53472803309e-9], + [50, 10, -4.89799910812e-9, -3.57698633382e-10], + [50, 11, -2.94734601071e-9, 1.94786708736e-9], + [50, 12, -4.05382587198e-9, 5.023916574e-9], + [50, 13, -6.35513582256e-10, 1.3970525603e-9], + [50, 14, -3.79816827726e-9, 4.20446479492e-9], + [50, 15, -3.40693142635e-9, -1.76525731032e-9], + [50, 16, -2.12579920433e-9, -4.97850923583e-9], + [50, 17, 1.69417034762e-10, -3.84471197721e-9], + [50, 18, 6.36885232786e-10, -4.4988101164e-9], + [50, 19, 6.43391947467e-10, 3.15512282312e-11], + [50, 20, 2.08558685488e-9, -2.37194017815e-9], + [50, 21, -6.27546236058e-10, -8.81913916952e-10], + [50, 22, 2.61749141861e-9, -4.96032655871e-10], + [50, 23, -1.67352954824e-9, -5.5835171504e-9], + [50, 24, 1.04263288641e-8, 5.32645409553e-11], + [50, 25, 4.58248696956e-9, 3.39769216723e-9], + [50, 26, -8.4872906046e-9, -1.81083249791e-9], + [50, 27, 5.47669956008e-9, -2.51696510797e-9], + [50, 28, -7.44617458853e-10, 5.58609205114e-9], + [50, 29, 6.06026089459e-9, 2.80947566572e-9], + [50, 30, 4.31969594552e-9, 6.41393913595e-9], + [50, 31, -2.84620436283e-9, 5.88802189362e-9], + [50, 32, -1.62497922734e-9, 2.05646822412e-9], + [50, 33, -4.60525159016e-9, -2.82170522547e-9], + [50, 34, -8.46646934969e-10, -2.72923357121e-9], + [50, 35, 1.19140447708e-9, 2.06743519414e-11], + [50, 36, 2.13633970167e-11, 4.5086936057e-11], + [50, 37, -7.33835011531e-10, -1.41287700458e-9], + [50, 38, -1.02410062837e-9, -5.63553141539e-9], + [50, 39, -5.29540912171e-9, 9.19458922215e-9], + [50, 40, 2.8748648716e-9, 6.34128761784e-9], + [50, 41, -6.35872270084e-9, -4.96647387289e-9], + [50, 42, 5.69964345835e-9, -4.0966438718e-9], + [50, 43, -5.25670953923e-10, -2.39743492902e-9], + [50, 44, 8.10754440067e-11, -1.0456062211e-9], + [50, 45, -3.14926097646e-9, 5.12174359323e-9], + [50, 46, -4.25352776842e-9, 1.83310979154e-9], + [50, 47, -5.60348447199e-9, -1.12656390145e-8], + [50, 48, 9.53309070729e-10, -3.0274013527e-10], + [50, 49, 2.27056130491e-9, -4.59809288584e-9], + [50, 50, 5.43852125284e-9, 1.48027432095e-9], + [51, 0, -4.78852906152e-9, 0], + [51, 1, 1.65448879203e-9, 3.0949690017e-9], + [51, 2, -6.91163230511e-9, -1.02424145195e-9], + [51, 3, -4.45072990548e-9, -7.397839007e-9], + [51, 4, 1.0786209386e-9, 2.38350141509e-9], + [51, 5, -2.99281893891e-9, -3.75648728774e-9], + [51, 6, 9.69683625382e-10, -3.24821242044e-9], + [51, 7, -1.33631031315e-9, 3.13043952153e-9], + [51, 8, 1.40076132569e-9, 4.31755870883e-9], + [51, 9, -9.80604470473e-10, -3.70145819407e-9], + [51, 10, 3.78436368064e-9, -2.65266824717e-9], + [51, 11, -3.74059224395e-9, 2.01615715509e-10], + [51, 12, -4.46097494783e-9, 1.95046274671e-9], + [51, 13, -1.00647188903e-8, -9.35483871177e-10], + [51, 14, 1.59662682825e-9, 3.09998025659e-10], + [51, 15, 8.69325090323e-10, -7.1324238697e-10], + [51, 16, -1.55429120706e-9, -1.71810008494e-9], + [51, 17, 3.68342905878e-9, -7.85957237694e-10], + [51, 18, 1.46813444457e-9, -7.16778610111e-10], + [51, 19, 7.80408755157e-10, -2.37742618011e-10], + [51, 20, 5.47640650181e-10, 3.14260512103e-11], + [51, 21, 1.57213788884e-9, 9.43981648887e-10], + [51, 22, -2.93201598437e-9, -2.68766846418e-9], + [51, 23, -2.2669618668e-9, 2.44336906441e-9], + [51, 24, 3.59980107911e-9, -6.25545175651e-9], + [51, 25, 6.79169423684e-9, -9.23894591596e-10], + [51, 26, -1.29912779158e-9, -3.69475569102e-9], + [51, 27, 4.83522731978e-9, -8.5647657332e-9], + [51, 28, 3.58441313397e-9, 6.6754647893e-9], + [51, 29, -2.42183222058e-9, 1.47517738461e-9], + [51, 30, 1.72557928699e-9, 3.32303426609e-9], + [51, 31, 3.69498751102e-11, 5.06414192921e-9], + [51, 32, 2.44832382029e-9, 2.15016597641e-9], + [51, 33, -2.60951560956e-9, 1.52467819183e-9], + [51, 34, -4.45744930366e-9, -8.63806533372e-10], + [51, 35, 3.69235278447e-9, 2.35190616e-9], + [51, 36, -6.29900505072e-9, 3.09623528058e-9], + [51, 37, -2.42400438574e-9, -5.67725678009e-9], + [51, 38, 1.93754531091e-9, -3.78749955299e-9], + [51, 39, 5.18352079008e-9, 7.1943364306e-10], + [51, 40, -3.75486240128e-9, -3.93594099185e-10], + [51, 41, 1.59750736122e-9, 1.84347565682e-9], + [51, 42, 1.08532103906e-10, 3.38187726465e-9], + [51, 43, -4.70417318861e-9, 2.05620529202e-9], + [51, 44, 5.84039476486e-11, 1.78729403019e-10], + [51, 45, -9.27158699375e-9, -6.78445566504e-9], + [51, 46, 4.43259167266e-10, -2.46157692683e-10], + [51, 47, 3.98850604058e-9, -7.60135354959e-10], + [51, 48, 3.82558746574e-9, 7.30210650201e-10], + [51, 49, -1.81638949324e-9, -2.53318816235e-9], + [51, 50, -1.72644351841e-9, 6.31693515247e-9], + [51, 51, -5.82872452602e-10, 3.54595341491e-9], + [52, 0, 8.76798415038e-10, 0], + [52, 1, -1.38149504612e-9, -5.66141032087e-9], + [52, 2, 3.4836432635e-9, 5.28635614369e-10], + [52, 3, 1.04639112365e-9, -1.5228564215e-9], + [52, 4, 3.56882248468e-9, 1.39421708045e-9], + [52, 5, -1.63843059269e-10, -1.82640064987e-9], + [52, 6, -5.63235939456e-9, -9.11110911449e-10], + [52, 7, -4.13416223316e-9, -1.98030857354e-9], + [52, 8, 1.08089612653e-9, -1.05065267547e-9], + [52, 9, -2.25309257496e-9, -4.90274273266e-9], + [52, 10, 4.91656770818e-10, -2.31790903351e-9], + [52, 11, 8.49623162948e-10, 8.98170634527e-10], + [52, 12, -6.91730485478e-10, -3.9659666136e-9], + [52, 13, -2.80416862125e-9, 4.12310466404e-9], + [52, 14, 2.97139900464e-9, -8.19405857264e-10], + [52, 15, 3.06839598366e-9, 1.73170730103e-9], + [52, 16, 1.07700561094e-9, 2.15016768756e-9], + [52, 17, 5.61929147521e-10, 8.1048532177e-10], + [52, 18, 6.75741259998e-11, -1.07335546225e-10], + [52, 19, -1.73138045774e-10, 2.00872122499e-9], + [52, 20, 2.51637593884e-9, -2.89273296191e-9], + [52, 21, 9.37180963914e-10, 7.74653352356e-10], + [52, 22, -2.89525384544e-9, 3.70971902518e-9], + [52, 23, 4.80122048791e-9, 1.55755670903e-9], + [52, 24, -2.08857463529e-10, 3.49443560599e-10], + [52, 25, 2.73016605838e-9, -1.93509914465e-9], + [52, 26, -6.189339704e-9, -3.00014001463e-9], + [52, 27, 1.89914827584e-10, -6.2774489378e-9], + [52, 28, 2.34014763514e-9, 1.68041304691e-9], + [52, 29, -6.15123463755e-9, -3.67669689958e-9], + [52, 30, -1.95803506717e-9, 4.3482414052e-10], + [52, 31, 2.00437807228e-9, -2.04131283777e-9], + [52, 32, 4.08993889535e-9, -5.23524692142e-9], + [52, 33, 7.23079678391e-10, -2.91243158525e-10], + [52, 34, 5.34859301188e-9, -1.19616795311e-9], + [52, 35, 7.26948679527e-9, 6.73138495306e-9], + [52, 36, 1.17843147736e-9, 5.69157012149e-9], + [52, 37, -9.48668092726e-9, 2.98854532104e-9], + [52, 38, -1.11739091298e-9, -1.24860923571e-9], + [52, 39, -1.67662613749e-9, -1.06068350465e-9], + [52, 40, -1.13236137208e-8, -1.83763617102e-9], + [52, 41, -2.93883842917e-9, -3.82351912283e-9], + [52, 42, -7.90417692905e-10, -6.32294388707e-9], + [52, 43, 5.11631394838e-9, -2.52698911853e-9], + [52, 44, -1.03301111307e-9, -1.71435313965e-10], + [52, 45, 2.30203733625e-9, -1.01649106263e-9], + [52, 46, 3.30713738381e-10, 3.38338658619e-9], + [52, 47, -3.42160762848e-9, 5.02983249995e-9], + [52, 48, 2.65608159513e-9, 3.39022454564e-9], + [52, 49, -7.54977682827e-9, 5.93284589932e-9], + [52, 50, -4.29943770193e-9, -1.39840789316e-9], + [52, 51, -5.41323422773e-9, -2.49975427841e-9], + [52, 52, -3.36745901588e-9, -4.30724346481e-9], + [53, 0, 7.39414500534e-9, 0], + [53, 1, -3.04714121131e-10, 8.8215890315e-10], + [53, 2, 7.28838690522e-9, -6.52238121107e-10], + [53, 3, -2.12399359799e-9, 2.24066337671e-9], + [53, 4, 3.58717617839e-9, 7.96897102454e-10], + [53, 5, -6.80147649549e-11, -3.30758922189e-9], + [53, 6, 9.44316471102e-10, 5.79133262935e-11], + [53, 7, 1.3406472307e-9, -5.81577428182e-9], + [53, 8, 2.10280419261e-9, -2.75802191871e-10], + [53, 9, 1.42087015325e-9, -2.15146201705e-9], + [53, 10, 1.11943104826e-8, -4.06468761962e-9], + [53, 11, 2.14433930045e-9, -4.14953157237e-11], + [53, 12, -3.71500888101e-10, -5.00637453903e-9], + [53, 13, 4.10155822309e-9, 2.49015949605e-9], + [53, 14, 3.31222863068e-9, -1.27009360724e-10], + [53, 15, 5.72510148935e-9, 4.1725129511e-9], + [53, 16, -7.52500326838e-10, 6.04404526863e-9], + [53, 17, -3.73377656741e-9, 1.78687083274e-9], + [53, 18, 4.02996320836e-9, 2.4657721752e-9], + [53, 19, 4.0498570533e-9, -1.08755861495e-9], + [53, 20, -2.21359989072e-9, -1.50377589353e-9], + [53, 21, -2.2131176844e-9, 2.61974358958e-9], + [53, 22, 3.09403878851e-10, 5.98902367107e-9], + [53, 23, 3.97356356698e-9, -4.70495102021e-9], + [53, 24, -5.76088117962e-9, 5.75114156525e-9], + [53, 25, 6.11403651036e-10, -6.50681640058e-9], + [53, 26, -1.66751531536e-9, 2.71923696222e-9], + [53, 27, 3.18331377085e-10, -3.16805881777e-9], + [53, 28, 9.65637477157e-10, 3.28935502086e-9], + [53, 29, -6.85396185457e-9, -1.68422797685e-9], + [53, 30, -5.25371139751e-9, -6.32579167986e-9], + [53, 31, -3.12617962003e-9, 2.64208621023e-9], + [53, 32, 2.64522150816e-9, -1.79270110503e-9], + [53, 33, -9.82876370374e-10, 2.67682650237e-9], + [53, 34, -4.99020528324e-9, -7.47799760824e-9], + [53, 35, 1.27630262449e-9, -3.82799570433e-9], + [53, 36, 3.34864016333e-9, 2.4776692672e-9], + [53, 37, -2.36880526065e-9, 6.84918482541e-10], + [53, 38, 1.81251969469e-9, -2.58686721606e-9], + [53, 39, -2.2299243907e-9, -2.22626260082e-9], + [53, 40, -3.53715648948e-10, -1.17670852432e-9], + [53, 41, 7.3844499114e-9, -6.5016347931e-9], + [53, 42, 5.05700211397e-9, 2.70769985181e-9], + [53, 43, -8.69327874384e-10, 4.47494835684e-9], + [53, 44, 1.88549992134e-9, -1.92998657957e-10], + [53, 45, -7.17045019834e-9, 2.66972378251e-9], + [53, 46, -1.88345296316e-10, -5.39599318434e-9], + [53, 47, -5.39807588885e-10, 5.57888382466e-9], + [53, 48, -3.23947926918e-9, -3.23766274929e-9], + [53, 49, -1.19368777918e-9, -3.85656430328e-9], + [53, 50, 8.23580014839e-9, 1.6439821637e-9], + [53, 51, 2.66743822325e-9, 6.24216504149e-10], + [53, 52, 5.9453716685e-9, 7.88573350628e-11], + [53, 53, 3.06538339589e-9, 5.3341969402e-9], + [54, 0, 2.34445433733e-9, 0], + [54, 1, -1.63325750131e-9, 2.72579797239e-9], + [54, 2, 6.21065924844e-10, -1.53344334067e-9], + [54, 3, 6.17655726607e-9, 1.72231850265e-9], + [54, 4, -1.53756024938e-9, -5.38503215163e-9], + [54, 5, 1.71025148024e-9, -2.10045694038e-9], + [54, 6, 2.71712290141e-9, -4.00601085224e-9], + [54, 7, 2.49375278882e-9, 1.66739205495e-9], + [54, 8, 3.09536123212e-9, -2.20912248616e-9], + [54, 9, 3.9454479358e-9, 7.97083290065e-9], + [54, 10, 1.75731695302e-9, -1.1132382592e-9], + [54, 11, 4.87117619523e-9, 7.52762912362e-10], + [54, 12, -6.63046613101e-10, -1.93330478441e-9], + [54, 13, 3.67538937609e-9, 3.80757774933e-10], + [54, 14, -3.49951073582e-9, 1.0565160883e-9], + [54, 15, 3.56355689655e-9, -3.87379098933e-9], + [54, 16, -2.63366819981e-9, 1.42492006524e-9], + [54, 17, -8.33782483479e-10, 5.59438560117e-9], + [54, 18, 2.2919525377e-9, -1.08492585917e-9], + [54, 19, 8.14671390685e-9, -1.25445329655e-9], + [54, 20, -2.00947462688e-9, -5.07703414709e-10], + [54, 21, -3.55057635353e-9, 2.33962811701e-9], + [54, 22, -2.41081442258e-9, 3.47823958258e-9], + [54, 23, 2.71765348294e-10, -1.67141963556e-9], + [54, 24, 2.64677470591e-9, 4.41949360703e-9], + [54, 25, -3.32077069935e-9, -2.97584290355e-9], + [54, 26, 4.16470815837e-9, -2.16171935118e-9], + [54, 27, -8.85142158375e-11, 5.13309529866e-9], + [54, 28, -1.59440736943e-9, -8.2197642849e-10], + [54, 29, -2.5924626518e-9, 1.48856515604e-9], + [54, 30, 2.0498752606e-9, 1.47028551165e-9], + [54, 31, 4.72639113262e-11, 4.4006947227e-9], + [54, 32, -2.0335622875e-9, 1.76053276479e-9], + [54, 33, -5.89151694068e-9, 9.87055800376e-10], + [54, 34, -8.25136356724e-9, -3.75714117336e-9], + [54, 35, 6.09892821968e-10, -8.38514526043e-9], + [54, 36, 2.15656594032e-9, -6.44497084335e-9], + [54, 37, 2.0605327412e-9, 1.76198487716e-9], + [54, 38, -5.48211323718e-10, -7.91954907407e-10], + [54, 39, 7.94629016052e-9, -1.78556545348e-9], + [54, 40, 2.56945921061e-9, 7.09146429051e-10], + [54, 41, 5.99241321284e-9, 3.5382152859e-9], + [54, 42, 6.09090280984e-9, 6.24258654012e-9], + [54, 43, -2.00658210931e-9, 3.84550094672e-9], + [54, 44, -2.27399790479e-9, 3.69030540504e-9], + [54, 45, -1.72329669734e-9, -5.59133662137e-9], + [54, 46, 1.35943570556e-9, -4.55557936708e-9], + [54, 47, -2.28466276628e-9, 3.05954138516e-9], + [54, 48, 3.70267003252e-9, 1.73978075968e-9], + [54, 49, -1.17939203022e-10, 3.69808287361e-10], + [54, 50, -1.93513576999e-9, -7.5730375747e-10], + [54, 51, 4.81956704621e-9, 3.7844372781e-9], + [54, 52, 1.50120526365e-9, -2.15128841698e-9], + [54, 53, -4.12854244119e-9, 2.98108912543e-9], + [54, 54, -7.55485762212e-9, 5.65281315607e-9], + [55, 0, 1.11500556632e-9, 0], + [55, 1, -1.60872597407e-9, 5.06314867009e-9], + [55, 2, -2.07675413854e-9, -2.0293274499e-9], + [55, 3, 4.78360486889e-9, 3.16338271835e-9], + [55, 4, -2.80572537025e-10, 1.74272743901e-9], + [55, 5, 6.41513424294e-9, 4.32492098613e-9], + [55, 6, -3.01434563476e-9, -1.83270290375e-9], + [55, 7, 2.07489314991e-9, 3.43334353979e-9], + [55, 8, -3.7520728304e-9, 3.92255136258e-10], + [55, 9, 2.75263092641e-9, 2.04139708981e-9], + [55, 10, -3.21784480116e-10, 3.79120101535e-9], + [55, 11, 1.95737046947e-9, 2.68965956784e-9], + [55, 12, 1.19490109098e-9, 3.82865321011e-9], + [55, 13, 1.25350979551e-9, -5.99559166554e-10], + [55, 14, -9.45489519281e-10, 6.67858672733e-10], + [55, 15, -1.86643859266e-9, -5.2827910694e-9], + [55, 16, -4.14012310247e-9, 1.18191255826e-11], + [55, 17, -1.67262783538e-9, -4.20372330524e-10], + [55, 18, -1.17378265358e-9, 7.18757033512e-9], + [55, 19, 1.15880262798e-9, -4.88672190986e-10], + [55, 20, -1.09134081955e-9, 1.12852704124e-9], + [55, 21, 7.63011490955e-10, -3.07131265813e-9], + [55, 22, 3.67528505661e-9, -2.2170875874e-9], + [55, 23, 1.72904178175e-9, 5.65769224107e-9], + [55, 24, 6.47552695616e-9, 4.04132843393e-9], + [55, 25, -4.80503497105e-9, 1.148635688e-9], + [55, 26, -9.15506578401e-10, -1.57512079402e-9], + [55, 27, -4.09805539164e-9, 3.58860394496e-9], + [55, 28, 7.32641207577e-10, 1.6884711712e-10], + [55, 29, 2.34535030056e-9, -5.81713354439e-10], + [55, 30, 4.86390626966e-9, -5.45654234076e-10], + [55, 31, -6.94349724743e-11, 1.45812620579e-9], + [55, 32, -5.40225256568e-10, 1.27646466703e-9], + [55, 33, 2.43334203217e-9, -5.02404069993e-10], + [55, 34, -1.98951749851e-9, 1.01116253467e-9], + [55, 35, 2.85139793612e-9, -3.05282697978e-9], + [55, 36, 1.91380314399e-9, 4.98852051077e-9], + [55, 37, -3.15219070359e-9, 5.93331277835e-9], + [55, 38, -7.56041746326e-9, 9.84901693652e-10], + [55, 39, -1.06689496608e-9, -4.3748204846e-9], + [55, 40, 2.03535952813e-9, -4.66387996652e-9], + [55, 41, 3.93834082651e-9, -2.19387599178e-10], + [55, 42, 2.75834297118e-9, -2.79628803078e-9], + [55, 43, 9.07957899493e-10, 8.40868060464e-10], + [55, 44, 8.00817837274e-9, -2.4147812832e-9], + [55, 45, 1.18785037967e-9, 4.26953178683e-9], + [55, 46, -3.06732675697e-9, -2.15810894136e-9], + [55, 47, 3.41200900365e-9, 3.41423275214e-10], + [55, 48, -4.78930228198e-9, -2.05983243604e-9], + [55, 49, 2.79038478352e-9, -1.88984039871e-9], + [55, 50, -3.41046654256e-9, 8.86594689152e-10], + [55, 51, -3.23203516496e-10, 4.71644852681e-9], + [55, 52, -4.05016326974e-9, -3.01198652842e-9], + [55, 53, 7.26972758344e-10, 2.07297807512e-9], + [55, 54, -5.60482631431e-9, -5.70982039368e-9], + [55, 55, 2.0912126542e-9, -7.07073270661e-9], + [56, 0, -4.72339389186e-9, 0], + [56, 1, 3.93187516478e-9, 3.37742314575e-9], + [56, 2, -4.91199959679e-9, 4.84133406549e-9], + [56, 3, -1.12307325e-9, 1.54654210299e-9], + [56, 4, -1.90960361942e-9, 6.0662196543e-9], + [56, 5, 2.39124727679e-9, 7.24440138913e-10], + [56, 6, -7.97825586227e-9, 7.30944564463e-10], + [56, 7, 2.12416853387e-9, -8.57976125108e-10], + [56, 8, -4.72264552586e-9, -3.62688140057e-9], + [56, 9, 4.17406631345e-9, 8.89209706279e-10], + [56, 10, -4.4161564875e-9, 1.22951687667e-9], + [56, 11, 2.9856756475e-10, 3.11918333619e-9], + [56, 12, 4.22220007761e-10, 4.13537925932e-9], + [56, 13, 3.63075203614e-10, 5.57427443402e-9], + [56, 14, -1.20038874868e-9, 3.59461966057e-9], + [56, 15, -2.43193187397e-9, 1.50784402128e-9], + [56, 16, 1.76375553852e-9, -3.48352623489e-9], + [56, 17, -8.27228754412e-9, -2.45109719712e-10], + [56, 18, -2.96687367692e-9, 3.3502264984e-9], + [56, 19, -1.4569590902e-9, 7.52664839174e-10], + [56, 20, 4.95674336378e-9, -1.24093608223e-9], + [56, 21, 4.34010132857e-10, -3.62599395105e-9], + [56, 22, 1.02903480851e-9, 3.66768421992e-10], + [56, 23, 2.18140248955e-9, 4.02218260274e-9], + [56, 24, 1.48670018695e-9, -2.34022367466e-10], + [56, 25, -2.02983225226e-9, 2.662861669e-9], + [56, 26, 2.35098396283e-9, -4.80905595577e-9], + [56, 27, 7.69884673858e-10, 3.6589760993e-9], + [56, 28, -3.47706836778e-9, 1.21392534223e-9], + [56, 29, 4.58476012609e-9, -3.30989008906e-9], + [56, 30, -8.90571422954e-10, 1.91903209074e-9], + [56, 31, 6.23190857099e-11, -6.00634153014e-9], + [56, 32, 3.36744529472e-9, -2.46952130176e-9], + [56, 33, 6.00258596104e-9, 1.83850057556e-9], + [56, 34, 2.38699258827e-9, 1.05704445326e-9], + [56, 35, -1.2650662423e-9, 2.04344608836e-10], + [56, 36, 3.3648761478e-9, -1.76634400966e-9], + [56, 37, 2.65007318281e-9, 5.47726339379e-9], + [56, 38, 1.34152886307e-9, 4.30628684803e-9], + [56, 39, -1.11997228481e-9, -3.74794567494e-9], + [56, 40, 2.60773503449e-9, 3.84145713821e-9], + [56, 41, -8.41413420568e-10, 2.38307078957e-9], + [56, 42, -4.57278944483e-9, -1.67354031195e-10], + [56, 43, -7.0867933999e-10, -4.64484669076e-9], + [56, 44, 1.46770567139e-9, 2.33734816689e-9], + [56, 45, 4.3603629917e-9, -7.66352488156e-10], + [56, 46, 3.83046528394e-9, -4.64542462872e-9], + [56, 47, 7.60128547162e-9, 2.63665894884e-9], + [56, 48, -1.93561135253e-9, -3.14425423758e-9], + [56, 49, 5.13841446824e-9, 6.12618507594e-9], + [56, 50, -4.24203285154e-9, 1.10142149502e-9], + [56, 51, 2.60851617544e-9, -1.11959453734e-9], + [56, 52, -3.97720336952e-9, -2.0036996774e-9], + [56, 53, -9.47121716778e-9, -3.55057178782e-10], + [56, 54, -6.94814016529e-9, -1.69137671201e-9], + [56, 55, 7.98865468552e-11, -3.1173521588e-9], + [56, 56, 1.47399949068e-9, -1.45242215051e-9], + [57, 0, -3.21170195605e-9, 0], + [57, 1, 3.21316836111e-9, -2.88667726745e-9], + [57, 2, -2.69363244343e-9, 1.89537069823e-9], + [57, 3, -5.68390427578e-9, 3.99187444828e-9], + [57, 4, -7.60632653945e-9, -1.49323176287e-9], + [57, 5, -3.24700065576e-9, 1.15421916053e-9], + [57, 6, 6.61702166546e-11, -3.38009595419e-10], + [57, 7, -4.48989081521e-10, -3.99713445387e-10], + [57, 8, 4.46417839566e-9, 9.96642939907e-9], + [57, 9, 4.99167409253e-10, -4.98881717263e-9], + [57, 10, -1.3852416459e-9, 3.44921406019e-9], + [57, 11, -5.19522955267e-9, -7.54439426466e-9], + [57, 12, 4.37374747378e-9, 5.79072594074e-9], + [57, 13, 1.44772887449e-9, -1.98649438294e-9], + [57, 14, -5.77964835255e-10, 6.27215648109e-9], + [57, 15, 3.94955380257e-10, 3.67834142727e-9], + [57, 16, -8.95734559548e-10, -4.28575969194e-9], + [57, 17, -1.12217369185e-9, -2.15050942731e-10], + [57, 18, 1.48732682437e-9, 3.74728890857e-11], + [57, 19, -4.27202539236e-9, 4.14527968236e-9], + [57, 20, 2.97692629891e-9, 2.17910165146e-9], + [57, 21, -2.85791328884e-10, 1.29265392075e-10], + [57, 22, 2.72556998882e-9, 1.25406361653e-10], + [57, 23, -2.72373503201e-9, -4.70603169853e-10], + [57, 24, -1.72321207592e-9, -2.49534066392e-9], + [57, 25, 6.9246298552e-9, -2.15145597759e-9], + [57, 26, -2.11476949688e-9, -4.8633974229e-9], + [57, 27, 6.70002950588e-10, 7.02037588492e-10], + [57, 28, -3.93997936578e-9, -4.81797938235e-10], + [57, 29, 3.08242394642e-10, -2.08250614945e-9], + [57, 30, 6.38671671001e-9, 3.02153834789e-9], + [57, 31, -7.82870397906e-10, -2.6008882452e-9], + [57, 32, 3.15570240884e-10, -1.37701877645e-9], + [57, 33, 1.01302715301e-9, 3.32687130304e-9], + [57, 34, -2.37378898142e-9, 1.66067712161e-9], + [57, 35, -3.87135453191e-10, -3.90074040579e-9], + [57, 36, -7.76337112424e-10, -6.19562839282e-9], + [57, 37, 2.35898417363e-9, 2.88691601848e-9], + [57, 38, 4.71900941691e-9, 3.88845627051e-9], + [57, 39, 1.9577126687e-9, 1.39326869442e-10], + [57, 40, 1.63204331066e-9, 7.61024587558e-10], + [57, 41, -1.23608606742e-9, 1.48398991073e-9], + [57, 42, -8.01739032031e-9, 1.65925084437e-9], + [57, 43, -1.9472118231e-9, -6.96223907704e-9], + [57, 44, 1.48545488699e-9, 6.0847510663e-10], + [57, 45, -1.28048424926e-9, 3.9397941201e-9], + [57, 46, -4.36866174492e-9, 2.62332157302e-9], + [57, 47, 5.46502666692e-10, -1.49261021303e-9], + [57, 48, -1.22176218276e-9, 4.76252215549e-9], + [57, 49, 5.9421017778e-10, -2.95814148934e-9], + [57, 50, -1.26176074296e-9, -4.07107776326e-9], + [57, 51, -2.89691401244e-9, -3.54285578396e-9], + [57, 52, 2.82291628743e-9, -5.93637790965e-10], + [57, 53, 3.26879105716e-9, -1.86559579312e-9], + [57, 54, -6.21522105116e-9, 2.85042203396e-9], + [57, 55, 2.69124869207e-9, 8.78840270571e-10], + [57, 56, 8.17472289691e-10, 2.43710618039e-9], + [57, 57, -2.8798869729e-9, -3.27463131606e-9], + [58, 0, -3.04026167193e-9, 0], + [58, 1, -1.08478222238e-9, -1.32928017843e-9], + [58, 2, 9.23188476856e-10, 4.80603297668e-9], + [58, 3, -2.06649260359e-9, -6.95744636399e-9], + [58, 4, -3.27865597852e-9, 5.32278571511e-11], + [58, 5, 2.12675298762e-9, -2.92812252454e-9], + [58, 6, 8.33902828255e-10, 5.51974543542e-10], + [58, 7, -6.67899299463e-9, 2.59007304356e-9], + [58, 8, 3.29236954324e-9, 5.33880910177e-9], + [58, 9, -4.61158209822e-9, -6.27355092632e-9], + [58, 10, 2.9132704923e-10, -2.26859359435e-9], + [58, 11, -2.61942590593e-9, -4.47355541188e-9], + [58, 12, 1.78221947371e-9, -4.7735401558e-10], + [58, 13, -3.96530233357e-9, -1.32965315696e-9], + [58, 14, 3.48940083326e-9, -2.68100081998e-9], + [58, 15, 1.16488140214e-9, 8.90751460346e-10], + [58, 16, 2.57363716205e-9, -3.19905406084e-9], + [58, 17, 4.02538157319e-9, 1.85694240803e-9], + [58, 18, 2.82093688921e-9, -1.06405390043e-9], + [58, 19, 1.7012607163e-9, -3.34731919564e-10], + [58, 20, -2.51187789653e-9, 1.42719074798e-9], + [58, 21, -9.58199433933e-10, 4.67151219042e-9], + [58, 22, 3.58477651027e-9, -3.01829681057e-9], + [58, 23, -2.31450839572e-10, 1.93661530796e-9], + [58, 24, -3.78325445015e-9, -1.69872441251e-9], + [58, 25, 2.56044797918e-9, -2.54378658689e-9], + [58, 26, -1.27782193538e-9, 1.73767371058e-10], + [58, 27, -3.23354377687e-9, -5.04501281974e-9], + [58, 28, -2.59227169682e-9, -2.36734585774e-9], + [58, 29, 2.97554666907e-9, -2.85652687635e-9], + [58, 30, 6.04569531877e-9, 3.75516024362e-9], + [58, 31, -3.43248065391e-9, 1.46238074061e-9], + [58, 32, 2.37476582107e-9, 1.45244777155e-9], + [58, 33, -7.52607182802e-10, 1.05308043232e-9], + [58, 34, -8.65323753819e-10, 2.04104334763e-9], + [58, 35, -2.77001345849e-9, -5.52538116119e-10], + [58, 36, -3.32562035783e-9, -2.15376532524e-9], + [58, 37, 3.12471423796e-9, -3.01068285636e-9], + [58, 38, -5.36442273703e-9, 2.08224214773e-9], + [58, 39, 6.47653277498e-10, -1.42910140132e-9], + [58, 40, 1.50460554912e-9, -4.24935039663e-9], + [58, 41, 1.15092601553e-9, 3.32051250227e-9], + [58, 42, 9.60297889844e-10, -2.27838795598e-9], + [58, 43, -5.41112669807e-10, -2.35418031119e-9], + [58, 44, 6.15805210195e-9, 1.87828424448e-10], + [58, 45, -5.20846410811e-10, 4.70659085081e-9], + [58, 46, 1.21774908189e-9, 2.29075575035e-9], + [58, 47, 6.2757629345e-10, 1.42648810667e-12], + [58, 48, -1.66101437469e-9, -3.67587707399e-9], + [58, 49, 1.86732868852e-9, -5.66898467398e-10], + [58, 50, -7.42645959521e-11, 6.85663459878e-9], + [58, 51, 1.14891050865e-9, -2.25897684441e-9], + [58, 52, -4.82025203156e-10, 5.29942225131e-9], + [58, 53, -4.87462818405e-9, -2.49783280379e-9], + [58, 54, -2.51333548471e-9, -6.16985109964e-10], + [58, 55, 7.59018979346e-10, -3.0925586192e-9], + [58, 56, -1.10867227254e-9, -1.66085135977e-10], + [58, 57, -2.28410674649e-9, -5.04239243654e-11], + [58, 58, -5.64538331798e-11, 4.01348376492e-10], + [59, 0, 1.84005018738e-9, 0], + [59, 1, -4.30730603856e-9, -2.16359686553e-9], + [59, 2, 5.95774155105e-9, 1.0325005577e-9], + [59, 3, -2.7942573153e-9, -5.47527651961e-9], + [59, 4, 3.42609272674e-9, 2.16523988709e-9], + [59, 5, -6.12026756307e-10, -2.62667061889e-9], + [59, 6, -5.72183306744e-9, -6.18209980288e-10], + [59, 7, -3.16077742158e-9, 1.45699524002e-9], + [59, 8, 3.90720086374e-9, 1.31751660683e-10], + [59, 9, -1.94638915066e-9, -4.2437640733e-10], + [59, 10, 5.38522927253e-9, -5.23977027157e-9], + [59, 11, 3.71827948125e-10, 1.19995874003e-9], + [59, 12, 2.52165719682e-9, -3.72136186831e-9], + [59, 13, -4.89966078375e-9, -7.49361004805e-10], + [59, 14, 4.44396886733e-10, -5.79434523422e-9], + [59, 15, 6.51777807787e-12, -3.70360709563e-9], + [59, 16, -2.36862263524e-9, -6.79732453768e-10], + [59, 17, 2.94401448351e-9, 5.16256822799e-12], + [59, 18, 3.56280802208e-9, 2.5662982814e-10], + [59, 19, -2.25211043514e-10, -3.64892538339e-9], + [59, 20, -4.06561794516e-9, -1.46977612614e-9], + [59, 21, 4.37576687887e-9, 1.44078004641e-10], + [59, 22, 1.07081104606e-9, -3.60055970698e-9], + [59, 23, 4.55862213443e-9, 3.44192591105e-9], + [59, 24, 5.46932841364e-10, -4.21932442293e-10], + [59, 25, 1.27842334291e-9, -1.93946585452e-9], + [59, 26, 7.30577396232e-10, 9.86497764193e-9], + [59, 27, -2.20629326241e-9, -1.47362403917e-9], + [59, 28, 6.43123404123e-10, -1.9623232343e-10], + [59, 29, -3.71544563337e-9, -1.22550888905e-9], + [59, 30, -2.68565202994e-9, -1.24940890701e-9], + [59, 31, -2.07613642361e-9, 4.00778058367e-9], + [59, 32, 1.21731266443e-9, -1.50178902545e-10], + [59, 33, -7.84371886852e-10, -5.68998710094e-10], + [59, 34, 2.43208998238e-9, 1.36247407312e-10], + [59, 35, -1.4181774736e-9, -6.53346491469e-10], + [59, 36, 2.02347644318e-10, 8.31447453024e-10], + [59, 37, -9.23895659751e-10, -2.34310018371e-9], + [59, 38, -1.39281956666e-9, 4.6506463506e-9], + [59, 39, -1.94835135401e-9, 1.03150695653e-9], + [59, 40, -8.43612810676e-9, 1.67520306335e-9], + [59, 41, -1.74413081545e-9, 1.61990099703e-9], + [59, 42, -2.23434078315e-9, -1.9197190837e-9], + [59, 43, -2.5297036296e-9, -2.47765221813e-9], + [59, 44, 5.71900132781e-9, -3.48662561791e-9], + [59, 45, 6.61643059435e-9, -1.67206511864e-9], + [59, 46, 4.70987199525e-9, 1.54226897685e-9], + [59, 47, -1.95302174379e-10, 5.48211295739e-9], + [59, 48, 3.01958964219e-9, 6.14997097285e-9], + [59, 49, -2.06991305996e-9, 3.40548763489e-9], + [59, 50, -4.11924401562e-9, 2.6593773179e-9], + [59, 51, -3.83283085075e-10, -4.99876420993e-10], + [59, 52, -5.94199746286e-9, -8.61782585181e-10], + [59, 53, -3.87109442684e-10, -3.44263672292e-9], + [59, 54, -2.95940307214e-9, -2.23449633871e-9], + [59, 55, -6.95084157022e-10, 1.92258240027e-9], + [59, 56, 3.65564741882e-9, -2.51518218787e-9], + [59, 57, 3.44982010469e-9, -2.31599725831e-9], + [59, 58, 8.16880688302e-10, -2.4374373583e-9], + [59, 59, 2.50955492584e-9, 6.95639719744e-10], + [60, 0, -4.37107330818e-10, 0], + [60, 1, 1.35037939308e-9, 2.27325905103e-10], + [60, 2, 3.54148990661e-9, -2.09618034496e-9], + [60, 3, 2.94252688874e-9, 2.82304181314e-11], + [60, 4, 7.13911472626e-9, 5.42786835988e-12], + [60, 5, -2.14648651625e-9, -5.0840220659e-10], + [60, 6, -4.31103089415e-9, -2.9507366025e-9], + [60, 7, -1.85258364164e-9, -2.53159133173e-9], + [60, 8, 2.57762138479e-9, -1.12968653689e-9], + [60, 9, 6.22513383718e-10, 2.1529742175e-9], + [60, 10, 4.35474215331e-10, -2.63640978613e-9], + [60, 11, 2.65279568549e-9, 4.26794283564e-9], + [60, 12, 9.19528355618e-10, -3.15789781771e-9], + [60, 13, -5.14191599279e-10, -7.46402264962e-10], + [60, 14, -2.47185393426e-9, -1.37176619352e-9], + [60, 15, 1.09604770699e-9, 1.31271073866e-10], + [60, 16, -3.3491119957e-9, -8.90593127112e-10], + [60, 17, -4.96588408804e-9, 1.63819818821e-9], + [60, 18, -2.31564319275e-9, -2.65425713522e-9], + [60, 19, 3.58477719971e-9, -2.11652530221e-9], + [60, 20, -9.65281468037e-10, 4.71648908653e-11], + [60, 21, 1.13735842658e-9, -4.65494517033e-9], + [60, 22, 3.19231598114e-9, 3.8218991247e-9], + [60, 23, 6.47045604201e-9, -2.6683837737e-9], + [60, 24, -1.91270019584e-9, 1.20485640133e-9], + [60, 25, 1.41091285156e-9, 5.69978420103e-10], + [60, 26, 3.69920738748e-9, 4.03654982377e-9], + [60, 27, -4.33668934222e-9, 2.00533142094e-9], + [60, 28, 1.40330308999e-9, -1.51901856059e-9], + [60, 29, 2.05208494076e-9, 2.93958904408e-9], + [60, 30, -4.41072085568e-9, -2.59255339113e-9], + [60, 31, 3.95452765995e-9, 4.67851945535e-10], + [60, 32, -6.53222531186e-10, -3.15564592724e-10], + [60, 33, -4.72827010055e-9, 4.0228503116e-9], + [60, 34, 4.59026806936e-9, -2.36928246359e-9], + [60, 35, 1.42971814932e-9, 5.61852956581e-10], + [60, 36, 8.71633328024e-10, -4.91677668181e-11], + [60, 37, -2.90019034808e-9, 7.12651714058e-10], + [60, 38, 1.31594119427e-9, -1.32657347622e-11], + [60, 39, -2.24306948157e-9, -5.36564726301e-9], + [60, 40, -6.00658998713e-10, 9.5446989847e-10], + [60, 41, -7.89338924393e-10, -1.04686250574e-9], + [60, 42, 1.71092096933e-9, 3.10437318149e-9], + [60, 43, 4.43542188328e-9, 7.96344058695e-10], + [60, 44, 1.43059991847e-9, -8.08503442174e-10], + [60, 45, 4.13939240764e-9, -3.91776207592e-9], + [60, 46, 1.18713985523e-9, 3.48857058951e-10], + [60, 47, 7.79446801294e-10, 1.97923464992e-9], + [60, 48, -4.479064558e-9, -3.72644360805e-9], + [60, 49, 5.94065668151e-9, -4.46389160256e-9], + [60, 50, 3.56705231468e-9, 3.84698960264e-9], + [60, 51, -2.95789519005e-9, -5.80274740616e-10], + [60, 52, 3.33304351432e-9, 5.36871064211e-9], + [60, 53, -8.90121478107e-10, 5.68046802894e-9], + [60, 54, 4.75133911772e-9, -2.71008321877e-9], + [60, 55, 2.38809469672e-9, 2.89374229409e-9], + [60, 56, -1.45525193506e-9, -3.54195525281e-9], + [60, 57, -1.74421953297e-9, -3.22491239477e-10], + [60, 58, -1.4408546551e-9, 2.3162527247e-9], + [60, 59, -2.32041311232e-9, 1.20585444605e-9], + [60, 60, 4.23068069789e-9, 3.92983780545e-10], + [61, 0, 2.91887463429e-9, 0], + [61, 1, 1.27100640554e-9, 1.1527802968e-9], + [61, 2, 1.46481071771e-10, -1.45575130609e-9], + [61, 3, -3.68191723212e-10, 5.88826753023e-9], + [61, 4, 1.8759263652e-10, -2.32339117817e-9], + [61, 5, 5.66311223183e-10, -6.80700970491e-11], + [61, 6, 3.82420801812e-9, -2.25351133926e-9], + [61, 7, 6.60129802478e-10, 1.24419034443e-9], + [61, 8, 1.65261866822e-9, -7.3219117806e-10], + [61, 9, 2.31920165264e-9, 4.09650329931e-9], + [61, 10, -4.98575740811e-11, 1.1526211454e-9], + [61, 11, 2.14406016667e-9, 3.75488837062e-9], + [61, 12, -7.95905785958e-10, -1.46438312123e-9], + [61, 13, 4.28581019782e-9, -1.47641757488e-9], + [61, 14, -1.1402053676e-9, 1.13045597617e-9], + [61, 15, 2.25602914427e-9, -1.33254977828e-9], + [61, 16, -2.61306665773e-9, -3.27265930812e-10], + [61, 17, -1.11154836346e-9, 1.54668158602e-9], + [61, 18, -3.84844407383e-9, -3.71574325194e-9], + [61, 19, 1.14729122988e-9, 1.86094245281e-9], + [61, 20, 3.58697501171e-9, 1.22711361558e-9], + [61, 21, -3.30713394959e-9, 2.95584825461e-9], + [61, 22, 1.61709639793e-9, 2.28492854556e-9], + [61, 23, -5.37091465296e-9, -7.24986447496e-10], + [61, 24, 3.8743101467e-9, 3.47911082821e-9], + [61, 25, 7.39109788472e-10, -2.45196023626e-9], + [61, 26, 1.04840831653e-9, -4.43478517383e-9], + [61, 27, -1.55773079848e-10, 7.96767958532e-10], + [61, 28, 6.10151064993e-9, -1.94880328424e-9], + [61, 29, -9.31170259035e-10, 2.76205645541e-9], + [61, 30, -8.53996273305e-11, 1.0091217904e-9], + [61, 31, 2.82556619158e-9, 2.55162418629e-10], + [61, 32, -7.13300947942e-11, 5.34962387181e-9], + [61, 33, -3.34181483128e-9, -2.52817172663e-13], + [61, 34, 1.53688926359e-9, -2.66572762194e-9], + [61, 35, -2.27754986539e-9, 1.84788936469e-9], + [61, 36, -1.38831515254e-9, 1.43770460288e-9], + [61, 37, -3.78606444153e-9, -1.18351157417e-9], + [61, 38, -4.38270549644e-10, -7.02424824444e-9], + [61, 39, 3.41992301732e-9, -2.84531817267e-9], + [61, 40, 3.57186601972e-9, -2.63385467123e-9], + [61, 41, -2.69438012199e-10, -3.29472468104e-9], + [61, 42, 3.89064894105e-9, 3.17710263497e-9], + [61, 43, 2.74882592267e-9, 4.36628365878e-9], + [61, 44, 8.97736938972e-10, 5.29923435682e-9], + [61, 45, 2.08983766357e-9, 2.48661289187e-9], + [61, 46, -7.72928757681e-10, 1.74006708418e-9], + [61, 47, -4.25987363821e-10, 3.77167302466e-9], + [61, 48, 1.50264740771e-10, 2.48850110599e-10], + [61, 49, 1.17185140367e-9, -1.05779456409e-9], + [61, 50, -1.35609966818e-9, 2.8200215902e-9], + [61, 51, -3.86623269653e-10, 2.40839662032e-9], + [61, 52, -4.21687251964e-9, -1.1363410179e-9], + [61, 53, -2.45536806531e-9, -4.4665590786e-9], + [61, 54, 2.88866558053e-9, 4.90645309938e-10], + [61, 55, 5.34543115729e-10, -1.30335923758e-9], + [61, 56, 3.27747235568e-9, 2.99329733172e-9], + [61, 57, 5.13363616131e-9, 3.1868386279e-9], + [61, 58, -1.99497016106e-9, 6.40896831887e-9], + [61, 59, -4.40785716237e-9, -2.11143899502e-9], + [61, 60, -2.83484430391e-9, -3.23756290223e-9], + [61, 61, -1.62902793279e-9, 8.57870721552e-10], + [62, 0, 2.6020748123e-9, 0], + [62, 1, 1.16017629665e-9, 3.37733908336e-9], + [62, 2, -5.01970222671e-9, 4.84997931443e-9], + [62, 3, 5.51834864324e-9, 1.51730880202e-9], + [62, 4, -3.16971201208e-9, -3.18759682781e-10], + [62, 5, 3.75210299244e-9, 1.72747428774e-9], + [62, 6, 1.758796205e-9, -5.99162691156e-9], + [62, 7, -1.84017411521e-9, 2.39854854243e-9], + [62, 8, 5.93805348645e-10, 1.46920502501e-9], + [62, 9, 2.63026066055e-9, -1.59005126125e-9], + [62, 10, -1.86264804107e-9, 5.71819426307e-9], + [62, 11, 1.59410801301e-9, 2.45364835475e-9], + [62, 12, 3.77058963932e-9, 3.12148130027e-10], + [62, 13, 3.25613324726e-9, -2.96045940208e-9], + [62, 14, 1.91133253419e-9, 7.36632375917e-9], + [62, 15, -1.48003576869e-9, -3.9576199058e-11], + [62, 16, 2.0836018328e-9, -3.19414110768e-10], + [62, 17, -1.23513343836e-10, -2.29274795014e-9], + [62, 18, -3.65408431933e-10, 6.49530111016e-10], + [62, 19, 2.10667182582e-9, 6.20977993584e-10], + [62, 20, 2.66783108091e-9, 3.55242602025e-9], + [62, 21, -2.17727237689e-9, 1.53900421823e-10], + [62, 22, 1.65181871911e-10, -1.15377345316e-9], + [62, 23, -3.56900495656e-9, -1.22778901526e-9], + [62, 24, 4.1671919004e-9, 1.02075915808e-9], + [62, 25, -2.07765023478e-9, -6.13622564554e-10], + [62, 26, -2.24856322953e-9, -2.13075979834e-10], + [62, 27, 5.34667998788e-10, 2.1549958035e-9], + [62, 28, 8.28523980308e-10, -9.55817031537e-10], + [62, 29, 1.24438608514e-9, 3.56026512891e-9], + [62, 30, -4.72678574359e-9, -1.64089488542e-9], + [62, 31, -2.50140516558e-10, -3.40327894339e-9], + [62, 32, 5.8659536881e-10, 6.04913535906e-9], + [62, 33, -3.35518053404e-9, -3.89797338173e-9], + [62, 34, -6.34892133651e-10, -2.68418874835e-9], + [62, 35, 4.81220188647e-9, -1.1050809121e-9], + [62, 36, 1.98835694401e-10, 1.45607681621e-9], + [62, 37, 3.1989344437e-9, 2.14678064239e-9], + [62, 38, -1.9204038709e-9, 6.16716406564e-10], + [62, 39, 3.34515812506e-9, 4.14641645868e-10], + [62, 40, -1.97564343514e-9, -3.01796072455e-9], + [62, 41, -3.46235533318e-9, -2.28801858484e-9], + [62, 42, 3.05698466749e-9, -3.75496202482e-9], + [62, 43, -1.49676292878e-9, -6.29497016877e-10], + [62, 44, 2.14448524507e-9, 1.88523590489e-9], + [62, 45, -8.34405746235e-10, -3.14473935361e-9], + [62, 46, -2.93265106212e-10, 7.32113148782e-10], + [62, 47, -1.61097027092e-9, 2.36067104981e-9], + [62, 48, -1.22663422627e-9, 2.26863893585e-9], + [62, 49, -4.35640931502e-9, -1.16615535583e-9], + [62, 50, -1.63330757231e-10, 2.1498411047e-9], + [62, 51, -4.38726738595e-9, -3.96802276471e-9], + [62, 52, 3.93436610456e-9, -5.09667879958e-9], + [62, 53, -1.00799950303e-9, -2.80999022062e-9], + [62, 54, 3.34171653799e-9, 4.31980290801e-9], + [62, 55, 4.15162955519e-9, 2.89217219326e-11], + [62, 56, -3.15377993659e-9, -4.24081055503e-10], + [62, 57, 1.0586595415e-9, -4.61880778887e-9], + [62, 58, -1.40569643369e-9, -1.53613608049e-9], + [62, 59, -5.5231419587e-10, -2.48370856354e-9], + [62, 60, 1.04592888237e-9, 1.33802317625e-9], + [62, 61, 4.08644238679e-9, 2.25718184321e-9], + [62, 62, -2.00900822244e-9, 1.78784558995e-10], + [63, 0, -3.11323188816e-9, 0], + [63, 1, -2.51686189527e-9, 1.62316204256e-9], + [63, 2, -8.90843192658e-10, 6.81718264686e-10], + [63, 3, -8.39031301916e-10, -2.44548956892e-9], + [63, 4, -2.10000366689e-9, 5.43749942547e-9], + [63, 5, 6.08074122005e-10, 4.96799913037e-10], + [63, 6, 1.85063953353e-9, 3.98143826469e-9], + [63, 7, -9.4591724858e-10, 2.40472808521e-9], + [63, 8, -2.89932004112e-9, 3.38613792663e-9], + [63, 9, -1.74572409463e-10, -6.29234474447e-9], + [63, 10, 2.91384908681e-10, 1.86055697008e-9], + [63, 11, 2.02338901184e-9, 2.83416273653e-9], + [63, 12, 3.22282127238e-10, -2.83718782931e-10], + [63, 13, 1.9165546e-9, 2.91987267964e-10], + [63, 14, 6.85614070457e-9, 7.44701298692e-10], + [63, 15, -2.22292094265e-9, -1.46986358223e-10], + [63, 16, 5.45586135526e-9, 2.5447107979e-9], + [63, 17, 8.19242799659e-10, -3.47276845232e-9], + [63, 18, 3.2452033461e-10, 9.58039385266e-10], + [63, 19, -3.49311292523e-9, 1.04309515111e-9], + [63, 20, 1.08548702371e-9, -6.20691942833e-10], + [63, 21, 2.26077252841e-9, -1.71675559459e-9], + [63, 22, -1.95621527664e-9, -3.40025771807e-10], + [63, 23, 1.55066871055e-10, 1.22701010925e-9], + [63, 24, -2.9982830601e-10, -3.1587944662e-9], + [63, 25, -2.17502892099e-9, 4.91124128506e-9], + [63, 26, -9.763699194e-10, -2.98419489564e-9], + [63, 27, 4.61914842747e-10, 1.1513783027e-9], + [63, 28, -4.01774085142e-9, 2.92361907954e-9], + [63, 29, 1.85891977799e-10, 2.08480055661e-9], + [63, 30, -3.38969251367e-9, -2.27319487981e-9], + [63, 31, -8.39426059679e-10, -1.64619521455e-9], + [63, 32, -1.79567462932e-9, 2.46176880048e-9], + [63, 33, -4.56754551113e-9, -5.00039494134e-10], + [63, 34, 1.44503634241e-9, -1.81547180804e-9], + [63, 35, 2.54403585631e-9, 7.06024902233e-10], + [63, 36, 5.47662420889e-10, -2.87410509536e-9], + [63, 37, 1.27402191828e-9, 4.68706935937e-9], + [63, 38, 3.98567841752e-10, -1.39609037746e-9], + [63, 39, 7.55740940248e-10, 1.60521678824e-9], + [63, 40, 8.55632113051e-10, 2.57008846341e-9], + [63, 41, -2.2719079497e-9, -1.01168365732e-9], + [63, 42, -2.60989370838e-10, 3.0737496207e-10], + [63, 43, -4.59413092619e-9, 2.90292831222e-9], + [63, 44, -6.66532828203e-9, -2.48516212233e-9], + [63, 45, -2.13918101329e-9, -2.93616863524e-9], + [63, 46, 3.10023035748e-10, -9.932197143e-10], + [63, 47, 2.2326087612e-9, -1.06199908232e-9], + [63, 48, 5.77103738401e-9, -1.66141662191e-9], + [63, 49, 1.15879077421e-9, 2.19039630221e-9], + [63, 50, 8.01745944296e-11, 1.39194165977e-9], + [63, 51, 1.33134320356e-9, 4.10408662176e-10], + [63, 52, -1.23729693773e-9, 5.29634041035e-9], + [63, 53, -2.77068914768e-9, -1.02325243932e-10], + [63, 54, 4.00851845763e-9, -3.97139234308e-9], + [63, 55, -6.75281686388e-9, 1.20594134079e-10], + [63, 56, -6.71257955046e-12, -5.72047929224e-9], + [63, 57, -1.335086838e-9, 1.47700036159e-9], + [63, 58, 8.43695126698e-10, -1.1286807311e-9], + [63, 59, 1.28568220684e-9, -4.13530494791e-9], + [63, 60, 3.50937997067e-9, -1.10201123137e-9], + [63, 61, -2.80180636796e-9, 4.20279339499e-9], + [63, 62, -4.67509914354e-9, 2.23124114357e-10], + [63, 63, -6.30771369746e-10, -1.76523876748e-10], + [64, 0, -3.73169621228e-9, 0], + [64, 1, 3.76376213548e-9, -5.07180055734e-10], + [64, 2, -9.24862842874e-10, 3.1920267792e-9], + [64, 3, -1.72270494949e-9, -1.62119696086e-9], + [64, 4, -3.68668072276e-9, 2.41834589704e-9], + [64, 5, -2.51488310983e-9, -2.94487537751e-9], + [64, 6, -2.01024929819e-9, -6.39724799361e-10], + [64, 7, -3.41586606618e-10, 6.17262972614e-10], + [64, 8, -7.8471613681e-10, 1.03154245061e-9], + [64, 9, -2.07689776845e-9, -2.88087764543e-9], + [64, 10, 1.73326339943e-9, -2.83320535995e-10], + [64, 11, -3.35846603846e-9, -4.90343305614e-9], + [64, 12, 2.5446167118e-9, 2.00999167356e-9], + [64, 13, -4.04870106251e-10, 3.49166719926e-10], + [64, 14, -1.0847577208e-9, -1.34098578078e-9], + [64, 15, -1.65459286344e-9, -9.73528542599e-10], + [64, 16, 1.71443877312e-9, -1.75119041967e-9], + [64, 17, -1.42072942905e-9, -9.67144104235e-10], + [64, 18, 2.21883045993e-10, 2.57433234317e-9], + [64, 19, 7.61917411362e-10, 1.16159259563e-9], + [64, 20, -3.5702458407e-9, -2.01669668151e-9], + [64, 21, 6.40338941823e-10, -3.45409876865e-10], + [64, 22, 2.19732276428e-9, 1.53596119755e-9], + [64, 23, -3.74339752252e-9, -4.24709371318e-10], + [64, 24, -3.97595261711e-9, -3.03420483296e-9], + [64, 25, 8.46185574611e-10, 6.48412688994e-10], + [64, 26, -1.14267224817e-9, -1.93150140378e-9], + [64, 27, -5.1645342642e-10, -2.43656363976e-9], + [64, 28, -1.23284404405e-9, 4.01583362155e-9], + [64, 29, 4.02684008899e-11, -3.00728871328e-9], + [64, 30, -2.92004796971e-9, 1.02150517616e-9], + [64, 31, 2.18474041911e-9, 4.48655283674e-10], + [64, 32, 8.75987820485e-10, 2.52893755341e-9], + [64, 33, -1.87912322554e-9, 1.71603401009e-10], + [64, 34, 1.79621994755e-9, -1.31901490212e-9], + [64, 35, -6.33646126499e-9, 1.13591245202e-9], + [64, 36, -9.96582328624e-10, -1.14185529689e-9], + [64, 37, 1.66437720718e-9, 1.81218712015e-10], + [64, 38, 1.98963395542e-9, -1.97920702361e-9], + [64, 39, -9.125460243e-11, -3.30817398171e-9], + [64, 40, 4.43435618785e-9, 1.136074619e-9], + [64, 41, 6.34456764915e-10, 2.43348147864e-11], + [64, 42, 1.71084432122e-9, -8.03950943e-10], + [64, 43, 8.10031367696e-10, 1.44584750275e-9], + [64, 44, -4.67665458327e-9, 2.16848162797e-9], + [64, 45, -1.18748463091e-9, -1.40730693063e-9], + [64, 46, 2.16017450352e-9, 4.72682080065e-10], + [64, 47, -2.68013474895e-9, 3.37431149754e-10], + [64, 48, 1.17426333143e-9, -2.71445739102e-9], + [64, 49, -2.7971431255e-10, 2.20184368706e-9], + [64, 50, -5.77048712893e-9, -3.46186122046e-9], + [64, 51, 1.43171268392e-10, 4.34194817246e-10], + [64, 52, 4.09697345325e-9, -4.74094979041e-9], + [64, 53, 2.8709974537e-9, 7.70846474676e-10], + [64, 54, 1.08666921932e-10, -1.57408401726e-9], + [64, 55, 1.82625588706e-9, 2.51549344391e-9], + [64, 56, 1.98086149943e-9, 3.68123411897e-9], + [64, 57, -2.45549869317e-9, -4.62008838509e-10], + [64, 58, -9.8827803031e-11, -3.88970334422e-10], + [64, 59, -8.20562102321e-9, -3.89634437444e-10], + [64, 60, -3.57181043853e-10, 1.29284413577e-9], + [64, 61, -4.16773169308e-9, -2.46899990294e-9], + [64, 62, -1.4531395877e-9, -9.3731634589e-10], + [64, 63, 2.13192209173e-9, -5.20127627973e-9], + [64, 64, 4.73473307973e-9, -1.22580782542e-9], + [65, 0, -4.49700157417e-10, 0], + [65, 1, -2.58252024183e-9, -4.15450712677e-9], + [65, 2, -2.2104270434e-10, 4.83397052848e-10], + [65, 3, -2.36678018155e-9, 3.20183068444e-11], + [65, 4, 5.2100168159e-10, -2.07353402035e-9], + [65, 5, -3.37318578285e-9, -9.80828952124e-10], + [65, 6, 1.77113417665e-9, 2.65458974323e-10], + [65, 7, -2.80195644682e-9, -3.81524978856e-10], + [65, 8, 9.18508312373e-10, 1.46877084573e-9], + [65, 9, 4.09291433793e-10, 1.70293430933e-9], + [65, 10, 1.17202785935e-9, -1.82734012829e-9], + [65, 11, -3.45390399841e-9, -1.30446444472e-9], + [65, 12, 8.78057582595e-11, 1.53944173183e-9], + [65, 13, -8.39253328685e-10, 1.37821378529e-9], + [65, 14, -6.79335041424e-9, -4.10228968157e-9], + [65, 15, 1.04636810014e-9, 1.28072126503e-9], + [65, 16, -2.22500917889e-9, -4.68241234575e-9], + [65, 17, -1.94176523451e-9, -3.21800497765e-9], + [65, 18, -1.57811301525e-9, -1.9004772194e-9], + [65, 19, -3.99314337913e-9, -2.07946712601e-10], + [65, 20, -3.09733922649e-9, -7.29286676998e-10], + [65, 21, 2.13441992479e-9, -3.95401029335e-10], + [65, 22, 2.78219752005e-9, -1.62660900267e-10], + [65, 23, 9.79585870986e-10, 4.1820999658e-9], + [65, 24, -1.33788962497e-9, 1.0848317985e-10], + [65, 25, 6.30777406339e-10, -2.71766913018e-9], + [65, 26, -3.13474520827e-9, -1.30761274631e-9], + [65, 27, -5.80708325406e-10, -2.86664407159e-9], + [65, 28, -5.43137361736e-11, 5.12383601723e-10], + [65, 29, -9.94050537128e-10, -3.27026311337e-9], + [65, 30, 4.88503726153e-9, -3.69337655843e-12], + [65, 31, 1.34169586141e-9, 8.2319848075e-11], + [65, 32, -1.00790417787e-9, 1.34426957565e-9], + [65, 33, 1.40894367868e-9, -3.26567943193e-10], + [65, 34, 1.33546938004e-9, -1.88502484312e-9], + [65, 35, -2.33702467742e-9, 3.52419338735e-9], + [65, 36, -1.71328973912e-9, -2.60753316393e-9], + [65, 37, 4.69236054434e-9, -1.41853467166e-9], + [65, 38, -1.48717409763e-9, 4.60043687618e-9], + [65, 39, -1.7482048758e-9, 9.01873043733e-10], + [65, 40, -1.06693552129e-9, -1.33561086842e-10], + [65, 41, 1.17477093691e-9, -1.43166580606e-9], + [65, 42, 3.22470451029e-9, -4.06953175811e-9], + [65, 43, 2.19284640134e-9, 2.53498415372e-10], + [65, 44, 1.63348352736e-9, 1.9878281002e-9], + [65, 45, -1.74013929931e-9, 1.60635944849e-9], + [65, 46, 3.27076453121e-9, 1.78940435427e-9], + [65, 47, 8.71190196918e-10, 2.43618421166e-9], + [65, 48, 1.14717202955e-9, -6.14373757975e-10], + [65, 49, -2.82120730113e-10, 1.61953979687e-9], + [65, 50, -5.97595871229e-9, 1.05926972566e-9], + [65, 51, 9.29243945476e-10, -2.83214662335e-9], + [65, 52, -6.92950682227e-10, 1.75202265903e-9], + [65, 53, -4.45601414026e-9, -6.69013561037e-10], + [65, 54, 2.57788799305e-9, 1.56043265018e-9], + [65, 55, -3.08573779721e-9, 4.28018701586e-9], + [65, 56, -1.22162660378e-9, -3.51405424115e-9], + [65, 57, -6.97477432819e-10, 2.80824482607e-10], + [65, 58, -8.15095777111e-10, -9.49109002564e-10], + [65, 59, 3.01627691047e-9, -2.22014114762e-9], + [65, 60, 5.837589064e-10, 2.10135997859e-9], + [65, 61, -3.73468905093e-9, 2.7588051257e-9], + [65, 62, 9.54228600032e-10, 5.20758598302e-10], + [65, 63, 4.6276034765e-11, -3.55002565884e-9], + [65, 64, 1.0700400242e-9, 4.06400819266e-9], + [65, 65, 4.39724757879e-10, 2.07365336654e-9], + [66, 0, -2.46080003028e-10, 0], + [66, 1, -1.28065746519e-9, -1.57412839904e-9], + [66, 2, 2.34745365439e-9, -8.04093108405e-10], + [66, 3, 1.64372527654e-9, -1.25663719403e-9], + [66, 4, 1.49077004447e-10, -3.67316716915e-9], + [66, 5, 5.59171551078e-9, 4.14147390335e-9], + [66, 6, 2.07017985399e-9, -2.55120536295e-9], + [66, 7, -8.12659019352e-10, 2.61708049597e-9], + [66, 8, -8.19626488906e-10, 6.57427903212e-10], + [66, 9, 3.44914762848e-10, 4.80665530774e-9], + [66, 10, -8.92356816687e-10, -4.17660342112e-9], + [66, 11, -7.34735206563e-10, 6.45722272265e-10], + [66, 12, 2.40361383606e-9, -4.39247384868e-9], + [66, 13, -3.80151814177e-9, 2.08797347339e-9], + [66, 14, -3.71560143727e-9, -1.61013083285e-9], + [66, 15, 2.03456172266e-9, -2.02940527474e-9], + [66, 16, -2.15299949683e-9, 1.07601267969e-10], + [66, 17, -1.533446216e-9, -8.01648652589e-10], + [66, 18, -9.23201640766e-10, -2.27991476957e-9], + [66, 19, -1.85878907062e-9, -2.02876213355e-9], + [66, 20, -1.35598488141e-9, -9.49723141818e-10], + [66, 21, -3.39054996066e-10, -2.2869485706e-9], + [66, 22, 3.05070268661e-9, 1.80845190814e-9], + [66, 23, 3.26511997039e-9, 2.6870080805e-9], + [66, 24, -4.22613583813e-10, 3.66433428177e-10], + [66, 25, 2.31776769093e-9, -1.26691797154e-9], + [66, 26, 3.15505637998e-9, 4.66754632974e-11], + [66, 27, 3.0801881097e-9, -1.80875685191e-9], + [66, 28, 8.88888507814e-10, -2.49407088085e-9], + [66, 29, -2.83888509233e-9, 2.14250673403e-9], + [66, 30, 3.59861088413e-9, -2.19173977704e-9], + [66, 31, -2.50452549834e-9, 5.5058973509e-10], + [66, 32, -1.2283025383e-9, 8.66202505229e-10], + [66, 33, 1.62809319304e-10, -4.05313499364e-9], + [66, 34, 1.01641044049e-10, 1.61083907079e-9], + [66, 35, 2.26749821285e-9, -2.59091286461e-10], + [66, 36, -1.74492944838e-9, -2.94892711725e-9], + [66, 37, 5.37220534397e-10, 2.10366324147e-9], + [66, 38, 1.216739408e-9, 3.50806535047e-9], + [66, 39, -7.47245877963e-10, 4.75757362048e-9], + [66, 40, -2.6148818883e-9, -3.05295489507e-9], + [66, 41, -1.34263034623e-9, 3.51016861251e-9], + [66, 42, -4.07115980951e-9, -2.75323134714e-9], + [66, 43, -5.11700482594e-10, -1.95881197689e-9], + [66, 44, 9.2810507186e-10, -4.17578472252e-9], + [66, 45, 7.97009080411e-10, -6.181933191e-10], + [66, 46, -3.02469342318e-10, -3.21816833857e-9], + [66, 47, 4.43898274216e-9, -1.29092928467e-9], + [66, 48, 4.32302925677e-9, 8.72002315022e-10], + [66, 49, 1.1256303067e-9, 3.11853480981e-9], + [66, 50, -2.90736749125e-9, 1.21990539613e-9], + [66, 51, -1.52977232346e-9, -2.22741147051e-9], + [66, 52, -1.9410318709e-9, -7.54379990197e-10], + [66, 53, -2.28531717671e-9, -4.79961192884e-9], + [66, 54, -9.90575278445e-10, -2.75065849164e-9], + [66, 55, -9.16359078237e-10, -2.59784718191e-9], + [66, 56, -1.48822320099e-9, 5.37962756137e-10], + [66, 57, 1.81191688288e-9, 4.29611183844e-9], + [66, 58, -1.39216439838e-9, -1.19813455446e-9], + [66, 59, 2.24314087244e-9, 3.60067998522e-9], + [66, 60, -6.91709045474e-10, -3.15025079306e-9], + [66, 61, 4.60170257846e-10, -2.06501520839e-10], + [66, 62, 6.47779303293e-9, 1.12238545137e-9], + [66, 63, 1.73411427612e-9, 4.57782363596e-9], + [66, 64, 1.78967452006e-9, -1.57855506169e-9], + [66, 65, -2.45456112119e-9, 4.44671335257e-9], + [66, 66, -3.47054036103e-9, -6.7767854956e-10], + [67, 0, -9.70600910807e-11, 0], + [67, 1, -2.29081976138e-9, 1.83069076028e-9], + [67, 2, -8.93767112479e-11, -4.4531896111e-9], + [67, 3, 4.79528821744e-10, 1.41611633919e-10], + [67, 4, -1.3010111803e-9, 1.6708730767e-9], + [67, 5, 1.27549289916e-9, 2.83541771197e-9], + [67, 6, -8.56200869439e-10, 2.99565427775e-11], + [67, 7, -4.16600419272e-9, -1.9656227656e-9], + [67, 8, 2.42099295921e-9, -2.50333448071e-9], + [67, 9, 2.94090279351e-9, 3.24401108141e-9], + [67, 10, 1.20334564166e-9, -8.11985361739e-11], + [67, 11, 2.56182981127e-9, 6.6985674784e-11], + [67, 12, -3.08184864088e-9, -1.67641150508e-9], + [67, 13, 3.49595124999e-9, -1.97298991279e-9], + [67, 14, 1.71807449095e-9, 7.86238154089e-10], + [67, 15, 1.63712062651e-9, -1.24369833755e-9], + [67, 16, 6.43651337235e-10, 1.38851723951e-9], + [67, 17, -2.12956795961e-9, -1.52672910521e-9], + [67, 18, -6.47845364648e-10, 1.53480409772e-9], + [67, 19, -5.12794034098e-10, 2.53182474384e-10], + [67, 20, 3.20858111688e-9, -2.11272787851e-9], + [67, 21, -2.17998313799e-9, 1.12446974143e-10], + [67, 22, -3.49742528914e-9, 4.59811942642e-9], + [67, 23, 3.4098842644e-9, -6.89624268719e-10], + [67, 24, 2.27899679676e-9, -2.57735858851e-9], + [67, 25, 3.87394808496e-9, 5.15092550916e-10], + [67, 26, 3.97718098592e-9, 3.43669823837e-10], + [67, 27, 1.55115582914e-9, 5.41029455653e-10], + [67, 28, -1.29235783455e-9, -1.97556344252e-9], + [67, 29, -6.47188363153e-10, 9.87198851228e-10], + [67, 30, 1.2511202801e-9, -1.18881541506e-9], + [67, 31, -1.21695629788e-9, 4.05088510438e-9], + [67, 32, -1.03723838016e-9, -2.78412570445e-9], + [67, 33, -1.66917319833e-9, 3.90247938573e-10], + [67, 34, 5.53318831088e-10, 2.00120482971e-9], + [67, 35, -2.18415383088e-9, -2.19431098073e-9], + [67, 36, -2.12886983784e-9, -1.29816163047e-9], + [67, 37, -3.1221499799e-9, -7.40146127614e-10], + [67, 38, 1.77793883256e-9, 6.54974300427e-11], + [67, 39, -1.01847352521e-9, -5.00107072625e-10], + [67, 40, -6.00263408446e-10, -2.57662776533e-10], + [67, 41, -8.37215400184e-11, -2.17071138968e-9], + [67, 42, -7.13914481263e-10, 2.24217183671e-9], + [67, 43, 2.73853766349e-9, -2.31213529448e-9], + [67, 44, -5.88852767581e-10, 4.98869264517e-10], + [67, 45, -1.68320299458e-9, 1.84663341563e-9], + [67, 46, -3.50379312535e-9, -5.93655184371e-11], + [67, 47, -1.25936184153e-9, -2.59457961533e-9], + [67, 48, 3.89025031566e-9, -2.9258716078e-9], + [67, 49, 2.48429469418e-10, 2.49247839939e-9], + [67, 50, 1.54518367755e-9, -1.35102427225e-9], + [67, 51, 5.42093470358e-9, -2.41251010782e-9], + [67, 52, 5.6358963472e-9, 1.18281309422e-9], + [67, 53, 1.14286262595e-9, 2.48345077696e-10], + [67, 54, 9.70571114173e-10, -6.73506051992e-10], + [67, 55, 7.94794713622e-11, 8.45590167352e-9], + [67, 56, -4.30248334908e-9, -4.49145126159e-9], + [67, 57, 2.64068400942e-9, -2.33006032025e-9], + [67, 58, -2.21100358212e-9, -1.7747510894e-9], + [67, 59, 8.51075248646e-10, -3.0677447471e-9], + [67, 60, 3.33062636434e-9, 5.4350350605e-10], + [67, 61, 3.24810670649e-9, -2.86230086602e-9], + [67, 62, 4.60475441645e-9, -5.35741788057e-9], + [67, 63, 1.61734805988e-9, 6.07172241858e-9], + [67, 64, 2.37434931475e-10, -2.52570973448e-9], + [67, 65, -9.28328734397e-10, 1.64390058476e-10], + [67, 66, 6.55002006029e-10, -9.09600278796e-10], + [67, 67, -9.50180598953e-10, 3.01607088542e-9], + [68, 0, 4.622867674e-10, 0], + [68, 1, 2.14389674388e-10, 2.89815535129e-9], + [68, 2, -2.37512902633e-9, -1.4364671025e-9], + [68, 3, -3.56686339804e-9, 1.68884850602e-9], + [68, 4, 1.99011722043e-9, -3.00148260597e-10], + [68, 5, -4.59846510744e-10, 1.63949808477e-10], + [68, 6, 1.19909005894e-9, 9.93918144753e-10], + [68, 7, 1.60259621356e-10, -4.62044972394e-9], + [68, 8, -2.49131338946e-9, 1.13358666599e-9], + [68, 9, 1.35011786475e-9, -1.02222266629e-9], + [68, 10, -9.07282679631e-10, 1.98941003067e-9], + [68, 11, 4.55131313295e-9, -2.82933353176e-9], + [68, 12, 1.62386503597e-9, 4.79842004824e-10], + [68, 13, 1.30142879772e-9, -2.97295561864e-9], + [68, 14, -3.99914489776e-10, -6.06613397759e-10], + [68, 15, 3.13432101427e-9, -4.46153095223e-10], + [68, 16, 1.11243292176e-9, -3.49524061965e-9], + [68, 17, -1.64516717866e-9, -1.94954009834e-10], + [68, 18, -6.1046895199e-10, 1.2346216227e-9], + [68, 19, 5.76269396455e-9, 5.90400376681e-10], + [68, 20, 3.72514825591e-9, -1.01123073591e-9], + [68, 21, -2.12124079126e-9, 2.8035922654e-9], + [68, 22, -2.91851474027e-9, -2.55665889195e-9], + [68, 23, -2.98926892706e-9, 5.03312299296e-10], + [68, 24, 2.80539054764e-9, 9.92106952572e-10], + [68, 25, -5.3456271182e-10, 2.828677668e-9], + [68, 26, -1.29487951875e-9, 7.84713085411e-10], + [68, 27, -1.45580303513e-9, -1.78251331664e-10], + [68, 28, 8.56958052323e-10, 4.74930598993e-12], + [68, 29, 1.85693685103e-9, -2.13352830826e-9], + [68, 30, 8.51586406583e-10, 1.22243340175e-9], + [68, 31, 8.09758005105e-10, 3.21126059116e-11], + [68, 32, -3.74151227867e-9, 1.38253707945e-9], + [68, 33, 2.95585410206e-9, -5.08867565026e-10], + [68, 34, -1.1511407971e-9, 2.5288100685e-9], + [68, 35, -2.47359448852e-9, -5.7190507076e-10], + [68, 36, 3.8353605107e-9, 2.18682851374e-9], + [68, 37, -4.44495964019e-9, 3.21409235524e-9], + [68, 38, -2.92119501854e-9, -3.13656586965e-9], + [68, 39, -2.14645663214e-9, -1.32509636217e-10], + [68, 40, 3.74676075468e-10, -1.15470256723e-9], + [68, 41, 4.49796214496e-9, -5.19779580556e-9], + [68, 42, -1.68396305652e-9, 2.22930554963e-9], + [68, 43, 1.81911859588e-9, -1.47054826998e-9], + [68, 44, 2.28359889578e-9, 3.78535230123e-9], + [68, 45, -1.35348411074e-9, 1.9282466118e-9], + [68, 46, -3.55990977948e-9, -3.04004180215e-10], + [68, 47, -1.69026318159e-9, -1.2307994624e-9], + [68, 48, -9.82869768453e-10, -4.99616501979e-10], + [68, 49, -1.39389634883e-10, 2.2099814424e-9], + [68, 50, -2.95325598076e-9, 1.67830147109e-10], + [68, 51, 3.83992802073e-9, -1.95341587325e-9], + [68, 52, -1.62157993428e-9, 7.319588969e-10], + [68, 53, -2.18473305067e-9, 9.88184535213e-11], + [68, 54, -1.22279421158e-9, -7.94633823961e-11], + [68, 55, 2.3893626516e-10, -2.97714708723e-9], + [68, 56, 2.51796520839e-9, -5.59608521466e-9], + [68, 57, 3.24416409777e-9, 8.57865506596e-10], + [68, 58, 1.67555546432e-9, 7.91667114823e-10], + [68, 59, 5.9401839327e-9, 4.24238464488e-9], + [68, 60, -2.00991284287e-9, 1.76503569831e-9], + [68, 61, 9.15003757775e-11, 5.24523070638e-10], + [68, 62, 3.34298236266e-9, 1.49076627872e-9], + [68, 63, 3.51331088148e-10, -4.69838516852e-9], + [68, 64, -3.5937231919e-9, -3.1551468217e-9], + [68, 65, 2.57230439055e-9, -1.70007563881e-10], + [68, 66, 7.64376811898e-10, -1.19675114041e-9], + [68, 67, 3.97516337811e-9, -1.25148542112e-9], + [68, 68, -1.24227662661e-9, 1.60834722967e-9], + [69, 0, 9.63993353786e-10, 0], + [69, 1, 1.92526606206e-9, -2.8133913213e-9], + [69, 2, -2.8935827017e-9, 1.76152264336e-9], + [69, 3, 3.34285932041e-9, -2.86282518908e-9], + [69, 4, -1.69394355265e-9, 3.11294310992e-10], + [69, 5, 2.6461204935e-9, 2.39401047688e-9], + [69, 6, 1.774821922e-9, 3.01493117393e-9], + [69, 7, 1.44494812935e-9, -5.17419313015e-10], + [69, 8, -1.32528306016e-9, 2.54606090264e-9], + [69, 9, -1.49404008265e-9, 5.89991830024e-10], + [69, 10, 3.32081797198e-10, -2.02658661512e-10], + [69, 11, -1.43251299307e-9, 2.61526439472e-9], + [69, 12, 9.51227112014e-10, 1.1959073126e-9], + [69, 13, 3.153562295e-10, -5.82253635242e-9], + [69, 14, 9.33653438236e-10, 1.25780802552e-9], + [69, 15, 4.66883441717e-11, -4.27931736764e-9], + [69, 16, -2.65763987804e-9, -4.21789208734e-9], + [69, 17, 1.12900714413e-9, -3.70550920353e-9], + [69, 18, -6.04412438452e-10, -1.45386268446e-9], + [69, 19, 2.46582140419e-9, 2.60052302148e-9], + [69, 20, 4.02398095005e-9, -7.75925005443e-10], + [69, 21, -2.06255752376e-9, 3.28241838767e-9], + [69, 22, -3.67140285211e-9, -1.25090935129e-9], + [69, 23, -1.36236915424e-9, 1.27800489685e-9], + [69, 24, 2.6733597038e-9, 2.6628067101e-9], + [69, 25, -1.60703311015e-9, -9.06417794325e-10], + [69, 26, -5.27392627157e-9, 3.35712999267e-9], + [69, 27, -2.75782645738e-9, -1.21186122033e-10], + [69, 28, -5.9796767821e-10, -1.83094536519e-10], + [69, 29, -7.96856441546e-10, -9.50794257622e-10], + [69, 30, -8.32913895383e-10, 1.39518191574e-9], + [69, 31, -1.14925576425e-9, -1.33033646108e-9], + [69, 32, 4.53032712519e-10, -5.86278587798e-10], + [69, 33, 4.33790565334e-9, 1.6729242647e-10], + [69, 34, -1.42850247379e-9, 1.87004795004e-9], + [69, 35, -1.99678038855e-9, 1.75746889352e-9], + [69, 36, 3.12966485288e-9, 1.23258762222e-9], + [69, 37, -1.54550507614e-9, 5.79711088717e-9], + [69, 38, -3.80614320102e-9, -9.73592892592e-10], + [69, 39, -6.15275945642e-10, -3.80756590592e-10], + [69, 40, -7.19309221802e-10, -3.99138103532e-9], + [69, 41, -1.24977041744e-9, -6.70895165055e-10], + [69, 42, -2.43832760013e-9, 2.04630503984e-9], + [69, 43, -9.13698487452e-10, 4.52883310127e-10], + [69, 44, 1.89469835595e-9, -1.97186470672e-9], + [69, 45, 1.65118718058e-9, 6.09100767657e-10], + [69, 46, -6.4839573879e-10, -1.65450131078e-9], + [69, 47, 1.2140409732e-9, 1.6557251096e-9], + [69, 48, -3.41539585753e-10, 9.17817197774e-10], + [69, 49, 2.63575298368e-9, 1.40568990624e-9], + [69, 50, -3.22601530758e-10, -7.6308861688e-10], + [69, 51, 1.20621592065e-9, -1.51579359894e-9], + [69, 52, -2.24673502188e-9, 5.54730952319e-10], + [69, 53, -3.10720876998e-9, -4.1612253675e-9], + [69, 54, 2.93359257365e-9, -3.22442493457e-9], + [69, 55, 2.93178903783e-9, -2.09539406352e-9], + [69, 56, -9.53111140964e-10, -1.55097658547e-9], + [69, 57, 2.7450334232e-9, -1.13045216393e-9], + [69, 58, -3.19656528832e-9, 2.19720503411e-9], + [69, 59, -1.67298931099e-9, -5.01099598366e-9], + [69, 60, -1.98562528429e-10, -1.29846121033e-9], + [69, 61, 2.55087831644e-9, -4.69351095909e-9], + [69, 62, -6.2232159098e-10, -2.68462163107e-12], + [69, 63, 2.3387371477e-9, 1.9728626085e-9], + [69, 64, -3.52429015789e-9, 2.87520786627e-9], + [69, 65, 1.7081215097e-9, -8.33404969847e-10], + [69, 66, -8.31341739423e-9, 7.93134556226e-10], + [69, 67, 3.44107294401e-10, 3.26994561866e-9], + [69, 68, -8.85030034956e-10, 1.66551866504e-9], + [69, 69, 1.70476744606e-9, -2.26235749288e-9], + [70, 0, -1.71482882924e-9, 0], + [70, 1, -3.38928907067e-10, -2.88456331103e-9], + [70, 2, 1.21603976762e-9, 1.2870504057e-9], + [70, 3, 1.48336168294e-9, -5.76144683588e-10], + [70, 4, 2.17979853929e-9, 2.18513828706e-9], + [70, 5, 3.84014508872e-11, 2.84702883631e-9], + [70, 6, -1.27905563633e-9, 2.67940253701e-10], + [70, 7, -3.08665924605e-10, 1.53919081163e-9], + [70, 8, 2.52323197847e-9, -6.70150204256e-10], + [70, 9, -3.50491149039e-10, -7.66123521311e-10], + [70, 10, -3.93137957749e-10, -7.77999857261e-10], + [70, 11, -1.607623497e-9, 3.57436902821e-9], + [70, 12, 7.29456777131e-10, 1.81327042928e-9], + [70, 13, 1.52921431659e-9, -9.08141016609e-10], + [70, 14, 3.11544958374e-9, 1.75752396627e-10], + [70, 15, -1.8882318919e-9, 1.72257715142e-9], + [70, 16, -9.29141700559e-10, -6.55653978482e-10], + [70, 17, 5.56236170485e-10, -6.28514435912e-12], + [70, 18, -3.43063253068e-9, -1.75414855846e-10], + [70, 19, 4.90184567036e-10, -1.46152045815e-9], + [70, 20, -3.88744196496e-9, 4.90515540198e-10], + [70, 21, 1.4947338297e-9, -1.15148223093e-9], + [70, 22, -1.4755207082e-9, -1.1629059083e-9], + [70, 23, 1.34163029601e-9, -9.37018449968e-10], + [70, 24, -1.35492495877e-9, 2.0580759896e-9], + [70, 25, -1.18306589565e-9, -7.65844602451e-10], + [70, 26, -2.37013864226e-9, 1.20108315983e-9], + [70, 27, -1.43529853423e-9, -5.59311641806e-10], + [70, 28, -2.05168494367e-9, 1.4707492301e-9], + [70, 29, 8.7712658066e-10, 2.47071775335e-9], + [70, 30, 6.97060334644e-10, 1.12187714868e-9], + [70, 31, -1.8649358863e-9, -1.64032595079e-9], + [70, 32, -7.24413367948e-10, -3.03848768417e-10], + [70, 33, -3.68285551517e-10, 1.95832177686e-10], + [70, 34, 1.6798458485e-9, 7.73871270488e-10], + [70, 35, -5.13445081164e-9, -3.237743274e-9], + [70, 36, 1.47021864039e-9, -9.60525481357e-10], + [70, 37, -2.48993292727e-9, 1.71706585516e-9], + [70, 38, -9.19590434285e-10, -2.16822987322e-9], + [70, 39, 3.77157596281e-9, -2.51912367651e-9], + [70, 40, -1.89559561315e-9, 6.18448239263e-10], + [70, 41, 3.95017120086e-9, 1.1275245648e-9], + [70, 42, -1.03691130162e-9, 1.60153939732e-9], + [70, 43, -2.80832451521e-9, -1.68977517117e-9], + [70, 44, 1.07181018831e-9, 1.13996612143e-10], + [70, 45, -1.56477184271e-9, 2.94803771873e-9], + [70, 46, -2.39645581194e-9, -1.35792029683e-9], + [70, 47, -2.90231881102e-11, -2.44277059227e-9], + [70, 48, 1.36615152338e-9, -2.97077558552e-9], + [70, 49, 4.6560135101e-10, -5.53665111283e-10], + [70, 50, 5.46237634132e-9, 3.19942965724e-10], + [70, 51, 1.39550464898e-9, 2.60046110695e-9], + [70, 52, -2.84537646237e-10, 3.67154593291e-9], + [70, 53, -3.55081182197e-9, 4.39207589998e-10], + [70, 54, 2.56776114205e-9, 2.34322445827e-9], + [70, 55, -2.24518440142e-9, 2.26909500111e-9], + [70, 56, 2.52200475493e-9, 2.48728106737e-9], + [70, 57, 3.1954224154e-10, -1.49352336318e-9], + [70, 58, -2.90160070799e-9, -2.88470834933e-9], + [70, 59, 5.61008849453e-9, -2.43866394761e-9], + [70, 60, -8.19756085699e-10, 3.66291140634e-9], + [70, 61, 1.09976091083e-9, -1.99501732281e-9], + [70, 62, 1.43884022365e-9, 2.20176786716e-9], + [70, 63, -2.92835943703e-9, 1.74427149136e-9], + [70, 64, -2.06939325906e-9, 1.50580174247e-9], + [70, 65, 1.01927742435e-9, 1.77562303694e-9], + [70, 66, -2.01747264436e-9, 1.99936625532e-9], + [70, 67, 9.15317043771e-10, -3.61346894585e-10], + [70, 68, -3.18317122673e-9, 1.84447016699e-9], + [70, 69, -2.20353040552e-9, 9.94013069152e-10], + [70, 70, -4.70375138826e-10, -6.48306137833e-10] +]; + +/** Denormalized EGM96 coefficients. */ +export const EGM_96_DENORMALIZED = (() => { + const output: Egm96Data[] = []; + for (const coeffs of EGM_96_NORMALIZED) { + const [l, m, clm, slm] = coeffs; + const k = m === 0 ? 1 : 2; + const a = factorial(l + m); + const b = factorial(l - m) * k * (2 * l + 1); + const nFac = Math.sqrt(a / b); + output.push({ l: l, m: m, clm: clm / nFac, slm: slm / nFac }); + } + return output; +})(); diff --git a/src/data/values/exponential-atmosphere.ts b/src/data/values/exponential-atmosphere.ts new file mode 100644 index 0000000..ef413ea --- /dev/null +++ b/src/data/values/exponential-atmosphere.ts @@ -0,0 +1,34 @@ +/** base altitude (km), nominal density (kg/m^3), scale height (km) */ +export type ExponentialAtmosphereData = [number, number, number]; + +/** Exponential Atmospheric Model values. */ +export const EXPONENTIAL_ATMOSPHERE: ExponentialAtmosphereData[] = [ + [0, 1.225, 7.249], + [25, 3.899e-2, 6.349], + [30, 1.774e-2, 6.682], + [40, 3.972e-3, 7.554], + [50, 1.057e-3, 8.382], + [60, 3.206e-4, 7.714], + [70, 8.77e-5, 6.549], + [80, 1.905e-5, 5.799], + [90, 3.396e-6, 5.382], + [100, 5.297e-7, 5.877], + [110, 9.661e-8, 7.263], + [120, 2.438e-8, 9.473], + [130, 8.484e-9, 12.636], + [140, 3.845e-9, 16.149], + [150, 2.07e-9, 22.523], + [180, 5.464e-10, 29.74], + [200, 2.789e-10, 37.105], + [250, 7.248e-11, 45.546], + [300, 2.418e-11, 53.628], + [350, 9.518e-12, 53.298], + [400, 3.725e-12, 58.515], + [450, 1.585e-12, 60.828], + [500, 6.967e-13, 63.822], + [600, 1.454e-13, 71.835], + [700, 3.614e-14, 88.667], + [800, 1.17e-14, 124.64], + [900, 5.245e-15, 181.05], + [1000, 3.019e-15, 268.0] +]; diff --git a/src/data/values/finals.ts b/src/data/values/finals.ts new file mode 100644 index 0000000..63b2c30 --- /dev/null +++ b/src/data/values/finals.ts @@ -0,0 +1,34 @@ +export interface FinalsData { + /** USNO modified julaian date */ + mjd: number; + /** polar motion x-component (degrees) */ + pmX: number; + /** polar motion y-component (degrees) */ + pmY: number; + /** delta ut1 time (seconds) */ + dut1: number; + /** length of day (seconds) */ + lod: number; + /** delta psi (degrees) */ + dPsi: number; + /** delta epsilon (degrees) */ + dEps: number; +} + +/** IERS finals.all data. */ +export let FINALS: FinalsData[] = []; + +/** Clear cached finals.all data. */ +export function clearFinals() { + FINALS = []; +} + +/** Sort finals.all data by modified julian date. */ +export function sortFinals() { + FINALS.sort((a, b) => a.mjd - b.mjd); +} + +/** Return a finals entry with all values set to zero. */ +export function zeroFinal(fmjd: number): FinalsData { + return { mjd: fmjd, pmX: 0, pmY: 0, dut1: 0, lod: 0, dPsi: 0, dEps: 0 }; +} diff --git a/src/data/values/iau1980.ts b/src/data/values/iau1980.ts new file mode 100644 index 0000000..1ebfd4c --- /dev/null +++ b/src/data/values/iau1980.ts @@ -0,0 +1,122 @@ +/**a1, a2, a3, a4, a5, Ai, Bi, Ci, Di */ +export type Iau1980Data = [ + number, + number, + number, + number, + number, + number, + number, + number, + number +]; + +/** IAU1980 coefficients. */ +export const IAU_1980: Iau1980Data[] = [ + [0, 0, 0, 0, 1, -171996, -174.2, 92025, 8.9], + [0, 0, 2, -2, 2, -13187, -1.6, 5736, -3.1], + [0, 0, 2, 0, 2, -2274, -0.2, 977, -0.5], + [0, 0, 0, 0, 2, 2062, 0.2, -895, 0.5], + [0, 1, 0, 0, 0, 1426, -3.4, 54, -0.1], + [1, 0, 0, 0, 0, 712, 0.1, -7, 0], + [0, 1, 2, -2, 2, -517, 1.2, 224, -0.6], + [0, 0, 2, 0, 1, -386, -0.4, 200, 0], + [1, 0, 2, 0, 2, -301, 0, 129, -0.1], + [0, -1, 2, -2, 2, 217, -0.5, -95, 0.3], + [1, 0, 0, -2, 0, -158, 0, -1, 0], + [0, 0, 2, -2, 1, 129, 0.1, -70, 0], + [-1, 0, 2, 0, 2, 123, 0, -53, 0], + [1, 0, 0, 0, 1, 63, 0.1, -33, 0], + [0, 0, 0, 2, 0, 63, 0, -2, 0], + [-1, 0, 2, 2, 2, -59, 0, 26, 0], + [-1, 0, 0, 0, 1, -58, -0.1, 32, 0], + [1, 0, 2, 0, 1, -51, 0, 27, 0], + [2, 0, 0, -2, 0, 48, 0, 1, 0], + [-2, 0, 2, 0, 1, 46, 0, -24, 0], + [0, 0, 2, 2, 2, -38, 0, 16, 0], + [2, 0, 2, 0, 2, -31, 0, 13, 0], + [2, 0, 0, 0, 0, 29, 0, -1, 0], + [1, 0, 2, -2, 2, 29, 0, -12, 0], + [0, 0, 2, 0, 0, 26, 0, -1, 0], + [0, 0, 2, -2, 0, -22, 0, 0, 0], + [-1, 0, 2, 0, 1, 21, 0, -10, 0], + [0, 2, 0, 0, 0, 17, -0.1, 0, 0], + [0, 2, 2, -2, 2, -16, 0.1, 7, 0], + [-1, 0, 0, 2, 1, 16, 0, -8, 0], + [0, 1, 0, 0, 1, -15, 0, 9, 0], + [1, 0, 0, -2, 1, -13, 0, 7, 0], + [0, -1, 0, 0, 1, -12, 0, 6, 0], + [2, 0, -2, 0, 0, 11, 0, 0, 0], + [-1, 0, 2, 2, 1, -10, 0, 5, 0], + [1, 0, 2, 2, 2, -8, 0, 3, 0], + [0, -1, 2, 0, 2, -7, 0, 3, 0], + [0, 0, 2, 2, 1, -7, 0, 3, 0], + [1, 1, 0, -2, 0, -7, 0, 0, 0], + [0, 1, 2, 0, 2, 7, 0, -3, 0], + [-2, 0, 0, 2, 1, -6, 0, 3, 0], + [0, 0, 0, 2, 1, -6, 0, 3, 0], + [2, 0, 2, -2, 2, 6, 0, -3, 0], + [1, 0, 0, 2, 0, 6, 0, 0, 0], + [1, 0, 2, -2, 1, 6, 0, -3, 0], + [0, 0, 0, -2, 1, -5, 0, 3, 0], + [0, -1, 2, -2, 1, -5, 0, 3, 0], + [2, 0, 2, 0, 1, -5, 0, 3, 0], + [1, -1, 0, 0, 0, 5, 0, 0, 0], + [1, 0, 0, -1, 0, -4, 0, 0, 0], + [0, 0, 0, 1, 0, -4, 0, 0, 0], + [0, 1, 0, -2, 0, -4, 0, 0, 0], + [1, 0, -2, 0, 0, 4, 0, 0, 0], + [2, 0, 0, -2, 1, 4, 0, -2, 0], + [0, 1, 2, -2, 1, 4, 0, -2, 0], + [1, 1, 0, 0, 0, -3, 0, 0, 0], + [1, -1, 0, -1, 0, -3, 0, 0, 0], + [-1, -1, 2, 2, 2, -3, 0, 1, 0], + [0, -1, 2, 2, 2, -3, 0, 1, 0], + [1, -1, 2, 0, 2, -3, 0, 1, 0], + [3, 0, 2, 0, 2, -3, 0, 1, 0], + [-2, 0, 2, 0, 2, -3, 0, 1, 0], + [1, 0, 2, 0, 0, 3, 0, 0, 0], + [-1, 0, 2, 4, 2, -2, 0, 1, 0], + [1, 0, 0, 0, 2, -2, 0, 1, 0], + [-1, 0, 2, -2, 1, -2, 0, 1, 0], + [0, -2, 2, -2, 1, -2, 0, 1, 0], + [-2, 0, 0, 0, 1, -2, 0, 1, 0], + [2, 0, 0, 0, 1, 2, 0, -1, 0], + [3, 0, 0, 0, 0, 2, 0, 0, 0], + [1, 1, 2, 0, 2, 2, 0, -1, 0], + [0, 0, 2, 1, 2, 2, 0, -1, 0], + [1, 0, 0, 2, 1, -1, 0, 0, 0], + [1, 0, 2, 2, 1, -1, 0, 1, 0], + [1, 1, 0, -2, 1, -1, 0, 0, 0], + [0, 1, 0, 2, 0, -1, 0, 0, 0], + [0, 1, 2, -2, 0, -1, 0, 0, 0], + [0, 1, -2, 2, 0, -1, 0, 0, 0], + [1, 0, -2, 2, 0, -1, 0, 0, 0], + [1, 0, -2, -2, 0, -1, 0, 0, 0], + [1, 0, 2, -2, 0, -1, 0, 0, 0], + [1, 0, 0, -4, 0, -1, 0, 0, 0], + [2, 0, 0, -4, 0, -1, 0, 0, 0], + [0, 0, 2, 4, 2, -1, 0, 0, 0], + [0, 0, 2, -1, 2, -1, 0, 0, 0], + [-2, 0, 2, 4, 2, -1, 0, 1, 0], + [2, 0, 2, 2, 2, -1, 0, 0, 0], + [0, -1, 2, 0, 1, -1, 0, 0, 0], + [0, 0, -2, 0, 1, -1, 0, 0, 0], + [0, 0, 4, -2, 2, 1, 0, 0, 0], + [0, 1, 0, 0, 2, 1, 0, 0, 0], + [1, 1, 2, -2, 2, 1, 0, -1, 0], + [3, 0, 2, -2, 2, 1, 0, 0, 0], + [-2, 0, 2, 2, 2, 1, 0, -1, 0], + [-1, 0, 0, 0, 2, 1, 0, -1, 0], + [0, 0, -2, 2, 1, 1, 0, 0, 0], + [0, 1, 2, 0, 1, 1, 0, 0, 0], + [-1, 0, 4, 0, 2, 1, 0, 0, 0], + [2, 1, 0, -2, 0, 1, 0, 0, 0], + [2, 0, 0, 2, 0, 1, 0, 0, 0], + [2, 0, 2, -2, 1, 1, 0, -1, 0], + [2, 0, -2, 0, 1, 1, 0, 0, 0], + [1, -1, 0, -2, 0, 1, 0, 0, 0], + [-1, 0, 0, 1, 1, 1, 0, 0, 0], + [-1, -1, 0, 2, 1, 1, 0, 0, 0], + [0, 1, 0, 1, 0, 1, 0, 0, 0] +]; diff --git a/src/data/values/leap-seconds.ts b/src/data/values/leap-seconds.ts new file mode 100644 index 0000000..f729707 --- /dev/null +++ b/src/data/values/leap-seconds.ts @@ -0,0 +1,47 @@ +/** julian date, offset (seconds) */ +export type LeapSecondsData = [number, number]; + +/** List of leap seconds by Julian Date. */ +export let LEAP_SECONDS: LeapSecondsData[] = [ + [2437300.5, 1.422818], + [2437512.5, 1.372818], + [2437665.5, 1.845858], + [2438334.5, 1.845858], + [2438395.5, 3.24013], + [2438486.5, 3.34013], + [2438639.5, 3.44013], + [2438761.5, 3.54013], + [2438820.5, 3.64013], + [2438942.5, 3.74013], + [2439004.5, 3.84013], + [2439126.5, 4.31317], + [2439887.5, 4.21317], + [2441317.5, 10.0], + [2441499.5, 11.0], + [2441683.5, 12.0], + [2442048.5, 13.0], + [2442413.5, 14.0], + [2442778.5, 15.0], + [2443144.5, 16.0], + [2443509.5, 17.0], + [2443874.5, 18.0], + [2444239.5, 19.0], + [2444786.5, 20.0], + [2445151.5, 21.0], + [2445516.5, 22.0], + [2446247.5, 23.0], + [2447161.5, 24.0], + [2447892.5, 25.0], + [2448257.5, 26.0], + [2448804.5, 27.0], + [2449169.5, 28.0], + [2449534.5, 29.0], + [2450083.5, 30.0], + [2450630.5, 31.0], + [2451179.5, 32.0], + [2453736.5, 33.0], + [2454832.5, 34.0], + [2456109.5, 35.0], + [2457204.5, 36.0], + [2457754.5, 37.0] +]; diff --git a/src/epoch.ts b/src/epoch.ts deleted file mode 100644 index e75a3aa..0000000 --- a/src/epoch.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { DEG2RAD, LEAP_SECONDS, SEC2DAY } from "./constants"; -import { evalPoly } from "./operations"; - -/** Class representing a astrodynamic epoch. */ -export class Epoch { - /** Return a new Epoch object, containing current time. */ - public static now(): Epoch { - return new Epoch(new Date().getTime()); - } - - /** Seconds since 1 January 1970, 00:00 UTC. */ - public unix: number; - - /** - * Create a new Epoch object. - * - * @param millis milliseconds since 1 January 1970, 00:00 UTC - */ - constructor(millis: number) { - this.unix = millis / 1000; - } - - /** Convert to a new Date object. */ - public toDate(): Date { - return new Date(this.unix * 1000); - } - - /** Convert to milliseconds since 1 January 1970, 00:00 UTC. */ - get millis(): number { - return this.unix * 1000; - } - - /** Convert to a UTC string. */ - public toString(): string { - return this.toDate().toUTCString(); - } - - /** - * Return a new Epoch, incremented by some desired number of seconds. - * - * @param seconds seconds to increment (can be negative) - */ - public roll(seconds: number): Epoch { - return new Epoch((this.unix + seconds) * 1000); - } - - /** Return this as a Julian date. */ - get julianDate(): number { - return this.unix / 86400 + 2440587.5; - } - - /** Fetch the number of leap seconds used in offset. */ - get leapSecondsOffset(): number { - const julian = this.julianDate; - if (julian < LEAP_SECONDS[0][0]) { - return 0; - } - if (julian > LEAP_SECONDS[LEAP_SECONDS.length - 1][0]) { - return LEAP_SECONDS[LEAP_SECONDS.length - 1][1]; - } - for (let i = 0; i < LEAP_SECONDS.length - 2; i++) { - if (LEAP_SECONDS[i][0] <= julian && julian < LEAP_SECONDS[i + 1][0]) { - return LEAP_SECONDS[i][1]; - } - } - return 0; - } - - /** Return this in terrestrial centuries. */ - get terrestrialCenturies(): number { - const julian = this.julianDate; - const offset = this.leapSecondsOffset + 32.184; - const jdtt = julian + offset * SEC2DAY; - return (jdtt - 2451545.0) / 36525; - } - - /** Return this in Julian centuries. */ - get julianCenturies(): number { - const julian = this.julianDate; - return (julian - 2451545.0) / 36525; - } - - /** Return the Greenwich Mean Sidereal Time angle, in radians. */ - get gmstAngle(): number { - const t = this.julianCenturies; - const seconds = evalPoly(t, [ - 67310.54841, - 876600.0 * 3600 + 8640184.812866, - 0.093104, - -6.2e-6 - ]); - return ((seconds % 86400) / 240) * DEG2RAD; - } -} diff --git a/src/forces.ts b/src/forces.ts deleted file mode 100644 index 04b6c93..0000000 --- a/src/forces.ts +++ /dev/null @@ -1,302 +0,0 @@ -import { atmosphericDensity, moonPosition, sunPosition } from "./bodies"; -import * as c from "./constants"; -import { EarthCenteredFixed } from "./coordinates/earth-centered-fixed"; -import { J2000 } from "./coordinates/j2000"; -import { Epoch } from "./epoch"; -import { factorial, legendreFunction } from "./operations"; -import { INumericalModel } from "./propagators/propagator-interface"; -import { Vector } from "./vector"; - -type Egm96Properties = [number, number, number[][]]; - -const EGM_96_DENORMALIZED = (() => { - const output = []; - for (const coeffs of c.EGM_96_NORMALIZED) { - const [l, m, clm, slm] = coeffs; - const k = m === 0 ? 1 : 2; - const a = factorial(l + m); - const b = factorial(l - m) * k * (2 * l + 1); - const nFac = Math.sqrt(a / b); - output.push([l, m, clm / nFac, slm / nFac]); - } - return output; -})(); - -function egm96Properties( - degree: number, - order: number -): [number, number, number[][]] { - const mu = c.EARTH_MU; - const radius = c.EARTH_RAD_EQ; - const coeffs: number[][] = []; - EGM_96_DENORMALIZED.forEach(element => { - const [l, m, clm, slm] = element; - if (!(l > degree || m > order)) { - coeffs.push([l, m, clm, slm]); - } - }); - return [mu, radius, coeffs]; -} - -function gradRange( - r: number, - phi: number, - lam: number, - props: Egm96Properties -) { - const [mu, radius, coeffs] = props; - const reR = radius / r; - let gSum = 0; - coeffs.forEach(element => { - const [l, m, clm, slm] = element; - const plm = legendreFunction(l, m, phi); - gSum += - reR ** l * - (l + 1) * - plm * - (clm * Math.cos(m * lam) + slm * Math.sin(m * lam)); - }); - return -(mu / r ** 2) * gSum; -} - -function gradInclination( - r: number, - phi: number, - lam: number, - props: Egm96Properties -) { - const [mu, radius, coeffs] = props; - const reR = radius / r; - let gSum = 0; - coeffs.forEach(element => { - const [l, m, clm, slm] = element; - const plm = legendreFunction(l, m, phi); - const plm1 = legendreFunction(l, m + 1, phi); - gSum += - reR ** l * - (plm1 - m * Math.tan(phi) * plm) * - (clm * Math.cos(m * lam) + slm * Math.sin(m * lam)); - }); - return (mu / r) * gSum; -} - -function gradAzimuth( - r: number, - phi: number, - lam: number, - props: Egm96Properties -) { - const [mu, radius, coeffs] = props; - const reR = radius / r; - let gSum = 0; - coeffs.forEach(element => { - const [l, m, clm, slm] = element; - const plm = legendreFunction(l, m, phi); - gSum += - reR ** l * m * plm * (slm * Math.cos(m * lam) - clm * Math.sin(m * lam)); - }); - return (mu / r) * gSum; -} - -function gravityGradient( - r: number, - phi: number, - lam: number, - props: Egm96Properties -) { - return [ - gradRange(r, phi, lam, props), - gradInclination(r, phi, lam, props), - gradAzimuth(r, phi, lam, props) - ]; -} - -export function earthAspherical( - j2kState: J2000, - degree: number, - order: number -) { - const ecef = j2kState.toECI().toECEF(); - const [ri, rj, rk] = ecef.position.state; - const geoCoord = ecef.toGeodetic(); - const r = ecef.position.magnitude; - const phi = geoCoord.geocentric; - const lam = geoCoord.longitude; - const props = egm96Properties(degree, order); - const [duR, duPhi, duLam] = gravityGradient(r, phi, lam, props); - const rInv = (1 / r) * duR; - const ijOpA = rInv - (rk / (r ** 2 * Math.sqrt(ri ** 2 + rj ** 2))) * duPhi; - const ijOpB = (1 / (ri ** 2 + rj ** 2)) * duLam; - const ai = ijOpA * ri - ijOpB * rj; - const aj = ijOpA * rj + ijOpB * ri; - const ak = rInv * rk + (Math.sqrt(ri ** 2 + rj ** 2) / r ** 2) * duPhi; - return new EarthCenteredFixed(ai, aj, ak).toECI(j2kState.epoch.millis).toJ2K() - .position; -} - -/** - * Calculate acceleration in km/s^2 due Earth's gravity. - * - * @param position satellite J2000 position 3-vector, in kilometers - */ -export function earthSpherical(position: Vector): Vector { - const rMag = position.magnitude; - return position.scale(-c.EARTH_MU / rMag ** 3); -} - -export function gravityEarth( - epoch: Epoch, - position: Vector, - velocity: Vector, - degree = 4, - order = 4 -) { - const [ri, rj, rk] = position.state; - const [vi, vj, vk] = velocity.state; - const j2kState = new J2000(epoch.millis, ri, rj, rk, vi, vj, vk); - const [si, sj, sk] = earthSpherical(position).state; - const [ai, aj, ak] = earthAspherical(j2kState, degree, order).state; - const gx = si + ai; - const gy = sj + aj; - const gz = sk + ak; - return new Vector(gx, gy, gz); -} - -/** - * Calculate acceleration in km/s^2 due the Moon's gravity. - * - * @param epoch satellite state epoch - * @param position satellite J2000 position 3-vector, in kilometers - */ -export function gravityMoon(epoch: Epoch, position: Vector): Vector { - const rMoon = moonPosition(epoch); - const aNum = rMoon.add(position.scale(-1)); - const aDen = aNum.magnitude ** 3; - const bNum = rMoon; - const bDen = rMoon.magnitude ** 3; - const grav = aNum.scale(1 / aDen).add(bNum.scale(-1 / bDen)); - return grav.scale(c.MOON_MU); -} - -/** - * Calculate satellite acceleration in km/s^2 due the Sun's gravity. - * - * @param epoch satellite state epoch - * @param position satellite J2000 position 3-vector, in kilometers - */ -export function gravitySun(epoch: Epoch, position: Vector): Vector { - const rSun = sunPosition(epoch); - const aNum = rSun.add(position.scale(-1)); - const aDen = aNum.magnitude ** 3; - const bNum = rSun; - const bDen = rSun.magnitude ** 3; - const grav = aNum.scale(1 / aDen).add(bNum.scale(-1 / bDen)); - return grav.scale(c.SUN_MU); -} - -/** - * Return 1 if the the satellite has line of sight with the Sun, otherwise - * return 0. - * - * @param rSat satellite J2000 position 3-vector, in kilometers - * @param rSun Sun J2000 position 3-vector, in kilometers - */ -function shadowFactor(rSat: Vector, rSun: Vector): number { - const n = rSat.magnitude ** 2 - rSat.dot(rSun); - const d = rSat.magnitude ** 2 + rSun.magnitude ** 2 - 2 * rSat.dot(rSun); - const tMin = n / d; - const cVal = (1 - tMin) * rSat.magnitude ** 2 + rSat.dot(rSun) * tMin; - if (tMin < 0 || tMin > 1) { - return 1; - } - if (cVal >= c.EARTH_RAD_EQ ** 2) { - return 1; - } - return 0; -} - -/** - * Calculate acceleration in km/s^2 due to solar radiation pressure. - * - * @param epoch satellite state epoch - * @param position satellite J2000 position 3-vector, in kilometers - * @param mass satellite mass, in kilograms - * @param area satellite surface area, in meters squared - * @param reflect satellite reflectivity coefficient - */ -export function solarRadiation( - epoch: Epoch, - position: Vector, - mass: number, - area: number, - reflect: number -): Vector { - const rSat = position; - const rSun = sunPosition(epoch); - const sFactor = shadowFactor(rSat, rSun); - const rDist = rSat.add(rSun.scale(-1)); - const psr = c.SOLAR_FLUX / c.SPEED_OF_LIGHT; - const fScale = -(psr * reflect * (area / 1000)) / mass; - return rDist.normalized.scale(sFactor * fScale); -} - -/** - * Calculate acceleration in km/s^2 due to atmospheric drag. - * - * @param position satellite J2000 position 3-vector, in kilometers - * @param velocity satellite J2000 velocity 3-vector, in kilometers per second - * @param mass satellite mass, in kilograms - * @param area satellite surface area, in meters squared - * @param drag satellite drag coefficient - */ -export function atmosphericDrag( - position: Vector, - velocity: Vector, - mass: number, - area: number, - drag: number -): Vector { - const rotVel = c.EARTH_ROTATION.cross(position); - const vRel = velocity.add(rotVel.scale(-1)).scale(1000); - const vMag = vRel.magnitude; - const density = atmosphericDensity(position); - const fScale = -0.5 * ((drag * area) / mass) * density * vMag ** 2; - const velVec = vRel.normalized; - return velVec.scale(fScale / 1000); -} - -/** - * Calculate the velocity and acceleration, in km/s and km/s^2 of a satellite - * due to orbital perturbations. - * - * @param epoch satellite state epoch - * @param posVel satellite J2000 position and velocity 6-vector, in km and km/s - * @param flags options for calculating acceleration - */ -export function derivative( - epoch: Epoch, - posVel: Vector, - flags: INumericalModel -): Vector { - const position = posVel.slice(0, 3); - const velocity = posVel.slice(3, 6); - const { mass, area, drag, reflect, degree, order } = flags; - let acceleration = gravityEarth(epoch, position, velocity, degree, order); - if (flags.gravitySun) { - acceleration = acceleration.add(gravitySun(epoch, position)); - } - if (flags.gravityMoon) { - acceleration = acceleration.add(gravityMoon(epoch, position)); - } - if (flags.solarRadiation) { - acceleration = acceleration.add( - solarRadiation(epoch, position, mass, area, reflect) - ); - } - if (flags.atmosphericDrag) { - acceleration = acceleration.add( - atmosphericDrag(position, velocity, mass, area, drag) - ); - } - return velocity.concat(acceleration); -} diff --git a/src/forces/atmospheric-drag.ts b/src/forces/atmospheric-drag.ts new file mode 100644 index 0000000..119de13 --- /dev/null +++ b/src/forces/atmospheric-drag.ts @@ -0,0 +1,63 @@ +import { EarthBody } from "../bodies/earth-body"; +import { J2000 } from "../coordinates/j2000"; +import { DataHandler } from "../data/data-handler"; +import { AccelerationForce, AccelerationMap } from "./forces-interface"; + +/** Model of atmospheric drag, for use in a ForceModel object. */ +export class AtmosphericDrag implements AccelerationForce { + /** spacecraft mass, in kilograms */ + private mass: number; + /** spacecraft area, in square meters */ + private area: number; + /** drag coefficient (unitless) */ + private dragCoeff: number; + + /** + * Create a new atmospheric drag AccelerationForce object. + * + * @param mass spacecraft mass, in kilograms + * @param area spacecraft area, in square meters + * @param dragCoeff drag coefficient (unitless) + */ + constructor(mass: number, area: number, dragCoeff: number) { + this.mass = mass; + this.area = area; + this.dragCoeff = dragCoeff; + } + + /** + * Calculate acceleration due to atmospheric drag, using the Exponential + * Atmospheric Density model. + * + * @param j2kState J2000 state vector + */ + public expAtmosphereDrag(j2kState: J2000) { + const { position, velocity } = j2kState; + const { mass, area, dragCoeff } = this; + var density = DataHandler.getExpAtmosphericDensity(position); + var vRel = velocity + .add( + EarthBody.getRotation(j2kState.epoch) + .negate() + .cross(position) + ) + .scale(1000); + var fScale = + -0.5 * + density * + ((dragCoeff * area) / mass) * + Math.pow(vRel.magnitude(), 2); + return vRel.normalized().scale(fScale / 1000); + } + + /** + * Update the acceleration map argument with a calculated "atmospheric_drag" + * value, for the provided state vector. + * + * @param j2kState J2000 state vector + * @param accMap acceleration map (km/s^2) + */ + public acceleration(j2kState: J2000, accMap: AccelerationMap) { + accMap["atmospheric_drag"] = this.expAtmosphereDrag(j2kState); + } +} diff --git a/src/forces/earth-gravity.ts b/src/forces/earth-gravity.ts new file mode 100644 index 0000000..0e52cfe --- /dev/null +++ b/src/forces/earth-gravity.ts @@ -0,0 +1,155 @@ +import { EarthBody } from "../bodies/earth-body"; +import { ITRF } from "../coordinates/itrf"; +import { J2000 } from "../coordinates/j2000"; +import { DataHandler } from "../data/data-handler"; +import { SphericalHarmonics } from "../math/spherical-harmonics"; +import { Vector3D } from "../math/vector-3d"; +import { AccelerationForce, AccelerationMap } from "./forces-interface"; + +/** Model of Earth gravity, for use in a ForceModel object. */ +export class EarthGravity implements AccelerationForce { + /** model aspherical gravity, if true. */ + private earthAsphericalFlag: boolean; + /** geopotential degree (max=70) */ + private degree: number; + /** geopotential order (max=70) */ + private order: number; + /** spherical harmonics manager */ + private harmonics: SphericalHarmonics; + + /** + * Create a new EarthGravity object. + * + * @param degree geopotential degree (max=70) + * @param order geopotential order (max=70) + */ + constructor(degree: number, order: number) { + this.earthAsphericalFlag = degree >= 2; + this.degree = degree; + this.order = order; + this.harmonics = new SphericalHarmonics(degree); + } + + /** + * Calculate a cache of recurring values for the geopotential model: + * + * [ + * sin(m * lambda), + * cos(m * lambda), + * tan(phi) + * ] + * + * @param m m-index + * @param lambda longitude, in radians + * @param phi geocentric latitude, in radians + */ + private recurExp( + m: number, + lambda: number, + phi: number + ): [number, number, number] { + var smLam = Math.sin(m * lambda); + var cmLam = Math.cos(m * lambda); + var mtPhi = m * Math.tan(phi); + return [smLam, cmLam, mtPhi]; + } + + /** + * Calculate R, Phi, and Lambda acceleration derivatives. + * + * @param phi geocentric latitude, in radians + * @param lambda longitude, in radians + * @param r radius (km) + */ + private calcGradient( + phi: number, + lambda: number, + r: number + ): [number, number, number] { + const { degree, order, harmonics, recurExp } = this; + let sumR = 0; + let sumPhi = 0; + let sumLambda = 0; + for (let l = 2; l <= degree; l++) { + for (let m = 0; m <= Math.min(l, order); m++) { + const { clm, slm } = DataHandler.getEgm96Coeffs(l, m); + const [smLam, cmLam, mtPhi] = recurExp(m, lambda, phi); + // r derivative + const aR = + Math.pow(EarthBody.RADIUS_EQUATOR / r, l) * + (l + 1) * + harmonics.getP(l, m); + const bR = clm * cmLam + slm * smLam; + sumR += aR * bR; + // phi derivative + const aPhi = + Math.pow(EarthBody.RADIUS_EQUATOR / r, l) * + (harmonics.getP(l, m + 1) - mtPhi * harmonics.getP(l, m)); + const bPhi = clm * cmLam + slm * smLam; + sumPhi += aPhi * bPhi; + // lambda derivative + const aLambda = + Math.pow(EarthBody.RADIUS_EQUATOR / r, l) * m * harmonics.getP(l, m); + const bLambda = slm * cmLam - clm * smLam; + sumLambda += aLambda * bLambda; + } + } + const dR = -(EarthBody.MU / (r * r)) * sumR; + const dPhi = (EarthBody.MU / r) * sumPhi; + const dLambda = (EarthBody.MU / r) * sumLambda; + return [dR, dPhi, dLambda]; + } + + /** + * Calculate acceleration due to Earth's gravity, assuming a spherical Earth. + * + * @param j2kState J2000 state vector + */ + private earthSpherical(j2kState: J2000) { + const { position } = j2kState; + const rMag = position.magnitude(); + return position.scale(-EarthBody.MU / (rMag * rMag * rMag)); + } + + /** + * Calculate the aspherical components of acceleration due to Earth's gravity. + * + * @param j2kState J2000 state vector + */ + private earthAspherical(j2kState: J2000) { + const itrf = j2kState.toITRF(); + const { x: ri, y: rj, z: rk } = itrf.position; + const p = Math.sqrt(ri * ri + rj * rj); + const phi = Math.atan2(rk, p); + const lambda = Math.atan2(rj, ri); + const r = itrf.position.magnitude(); + this.harmonics.buildCache(phi); + const [dR, dPhi, dLambda] = this.calcGradient(phi, lambda, r); + const r2 = r * r; + const ri2 = ri * ri; + const rj2 = rj * rj; + const p1 = (1 / r) * dR - (rk / (r2 * Math.sqrt(ri2 + rj2))) * dPhi; + const p2 = (1 / (ri2 + rj2)) * dLambda; + const ai = p1 * ri - p2 * rj; + const aj = p1 * rj + p2 * ri; + const ak = (1 / r) * dR * rk + (Math.sqrt(ri2 + rj2) / r2) * dPhi; + const accVec = new ITRF(j2kState.epoch, new Vector3D(ai, aj, ak)); + return accVec.toJ2000().position; + } + + /** + * Update the acceleration map argument with a calculated "earth_gravity" + * value, for the provided state vector. + * + * @param j2kState J2000 state vector + * @param accMap acceleration map (km/s^2) + */ + public acceleration(j2kState: J2000, accMap: AccelerationMap) { + accMap["earth_gravity"] = this.earthSpherical(j2kState); + if (this.earthAsphericalFlag) { + accMap["earth_gravity"] = accMap["earth_gravity"].add( + this.earthAspherical(j2kState) + ); + } + } +} diff --git a/src/forces/force-model.ts b/src/forces/force-model.ts new file mode 100644 index 0000000..1115e6c --- /dev/null +++ b/src/forces/force-model.ts @@ -0,0 +1,126 @@ +import { J2000 } from "../coordinates/j2000"; +import { Vector3D } from "../math/vector-3d"; +import { Vector6D } from "../math/vector-6d"; +import { AtmosphericDrag } from "./atmospheric-drag"; +import { EarthGravity } from "./earth-gravity"; +import { AccelerationMap } from "./forces-interface"; +import { SolarRadiationPressure } from "./solar-radiation-pressure"; +import { ThirdBody } from "./third-body"; + +/** Object for efficiently managing acceleration forces on a spacecraft. */ +export class ForceModel { + /** Earth gravity model, if applicable */ + private earthGravity: EarthGravity | null; + /** third-body model, if applicable */ + private thirdBody: ThirdBody | null; + /** atmospheric drag model, if applicable */ + private atmosphericDrag: AtmosphericDrag | null; + /** solar radiation pressure model, if applicable */ + private solarRadiationPressure: SolarRadiationPressure | null; + + /** Create a new ForceModel object. */ + constructor() { + this.earthGravity = null; + this.thirdBody = null; + this.atmosphericDrag = null; + this.solarRadiationPressure = null; + } + + /** Clear all current AccelerationForce models for this object. */ + public clearModel() { + this.earthGravity = null; + this.thirdBody = null; + this.atmosphericDrag = null; + this.solarRadiationPressure = null; + } + + /** + * Create and add a new EarthGravity force to this object. + * + * @param degree geopotential degree (max=70) + * @param order geopotential order (max=70) + */ + public setEarthGravity(degree: number, order: number) { + this.earthGravity = new EarthGravity(degree, order); + } + + /** + * Create and add a new ThirdBody force to this object. + * + * @param moon moon gravity, if true + * @param sun sun gravity, if true + */ + public setThirdBody(moon: boolean, sun: boolean) { + this.thirdBody = new ThirdBody(moon, sun); + } + + /** + * Create and add a new AtmosphericDrag force to this object. + * + * @param mass spacecraft mass, in kilograms + * @param area spacecraft area, in square meters + * @param dragCoeff drag coefficient (default=2.2) + */ + public setAtmosphericDrag(mass: number, area: number, dragCoeff = 2.2) { + this.atmosphericDrag = new AtmosphericDrag(mass, area, dragCoeff); + } + + /** + * Create and add a new SolarRadiationPressure force to this object. + * + * @param mass spacecraft mass, in kilograms + * @param area spacecraft area, in square meters + * @param reflectCoeff reflectivity coefficient (default=1.2) + */ + public setSolarRadiationPressure( + mass: number, + area: number, + reflectCoeff = 1.2 + ) { + this.solarRadiationPressure = new SolarRadiationPressure( + mass, + area, + reflectCoeff + ); + } + + /** + * Create an acceleration map argument with calculated values for each + * acceleration source, for the provided state vector. + * + * @param j2kState J2000 state vector + */ + public accelerations(j2kState: J2000) { + const accMap: AccelerationMap = {}; + if (this.earthGravity !== null) { + this.earthGravity.acceleration(j2kState, accMap); + } + if (this.thirdBody !== null) { + this.thirdBody.acceleration(j2kState, accMap); + } + if (this.atmosphericDrag !== null) { + this.atmosphericDrag.acceleration(j2kState, accMap); + } + if (this.solarRadiationPressure !== null) { + this.solarRadiationPressure.acceleration(j2kState, accMap); + } + return accMap; + } + + /** + * Calculate and return the 6-dimensional derivative (velocity, acceleration) + * for the provided state vector. + * + * @param j2kState J2000 state vector + */ + public derivative(j2kState: J2000) { + const accMap = this.accelerations(j2kState); + let accel = Vector3D.origin(); + for (let k in accMap) { + accel = accel.add(accMap[k]); + } + const { x: vx, y: vy, z: vz } = j2kState.velocity; + const { x: ax, y: ay, z: az } = accel; + return new Vector6D(vx, vy, vz, ax, ay, az); + } +} diff --git a/src/forces/forces-interface.ts b/src/forces/forces-interface.ts new file mode 100644 index 0000000..9780833 --- /dev/null +++ b/src/forces/forces-interface.ts @@ -0,0 +1,12 @@ +import { J2000 } from "../coordinates/j2000"; +import { Vector3D } from "../math/vector-3d"; + +/** Store acceration name and vector. */ +export type AccelerationMap = { + [name: string]: Vector3D; +}; + +export interface AccelerationForce { + /** Update acceleration map with a named vector for this object. */ + acceleration: (j2kState: J2000, accMap: AccelerationMap) => void; +} diff --git a/src/forces/solar-radiation-pressure.ts b/src/forces/solar-radiation-pressure.ts new file mode 100644 index 0000000..d03b071 --- /dev/null +++ b/src/forces/solar-radiation-pressure.ts @@ -0,0 +1,50 @@ +import { SunBody } from "../bodies/sun-body"; +import { J2000 } from "../coordinates/j2000"; +import { AccelerationForce, AccelerationMap } from "../forces/forces-interface"; + +/** Model of solar radiation pressure, for use in a ForceModel object. */ +export class SolarRadiationPressure implements AccelerationForce { + /** spacecraft mass, in kilograms */ + private mass: number; + /** spacecraft area, in square meters */ + private area: number; + /** reflectivity coefficient (unitless) */ + private reflectCoeff: number; + + /** + * Create a new solar radiation pressure AccelerationForce object. + * + * @param mass spacecraft mass, in kilograms + * @param area spacecraft area, in square meters + * @param reflectCoeff reflectivity coefficient (unitless) + */ + constructor(mass: number, area: number, reflectCoeff: number) { + this.mass = mass; + this.area = area; + this.reflectCoeff = reflectCoeff; + } + + /** + * Calculate acceleration due to solar radiation pressure. + * + * @param j2kState J2000 state vector + */ + private radiationPressure(j2kState: J2000) { + const { mass, area, reflectCoeff } = this; + const rSun = SunBody.position(j2kState.epoch); + const r = rSun.changeOrigin(j2kState.position); + const pFac = -(SunBody.SOLAR_PRESSURE * reflectCoeff * area) / mass; + return r.normalized().scale(pFac / 1000); + } + + /** + * Update the acceleration map argument with a calculated + * "solar_radiation_pressure" value, for the provided state vector. + * + * @param j2kState J2000 state vector + * @param accMap acceleration map (km/s^2) + */ + public acceleration(j2kState: J2000, accMap: AccelerationMap) { + accMap["solar_radiation_pressure"] = this.radiationPressure(j2kState); + } +} diff --git a/src/forces/third-body.ts b/src/forces/third-body.ts new file mode 100644 index 0000000..9a13e4c --- /dev/null +++ b/src/forces/third-body.ts @@ -0,0 +1,69 @@ +import { MoonBody } from "../bodies/moon-body"; +import { SunBody } from "../bodies/sun-body"; +import { J2000 } from "../coordinates/j2000"; +import { AccelerationForce, AccelerationMap } from "./forces-interface"; + +/** Model of third-body gravity, for use in a ForceModel object. */ +export class ThirdBody implements AccelerationForce { + /** model Moon gravity, if true */ + private moonGravityFlag: boolean; + /** model Sun gravity, if true */ + private sunGravityFlag: boolean; + + /** + * Create a new ThirdBody object. + * + * @param moonGravityFlag model Moon gravity, if true + * @param sunGravityFlag model Sun gravity, if true + */ + constructor(moonGravityFlag: boolean, sunGravityFlag: boolean) { + this.moonGravityFlag = moonGravityFlag; + this.sunGravityFlag = sunGravityFlag; + } + + /** + * Calculate acceleration due to the Moon's gravity. + * + * @param j2kState J2000 state vector + */ + private moonGravity(j2kState: J2000) { + const rMoon = MoonBody.position(j2kState.epoch); + const aNum = rMoon.changeOrigin(j2kState.position); + const aDen = Math.pow(aNum.magnitude(), 3); + const bNum = rMoon; + const bDen = Math.pow(rMoon.magnitude(), 3); + const grav = aNum.scale(1.0 / aDen).add(bNum.scale(-1.0 / bDen)); + return grav.scale(MoonBody.MU); + } + + /** + * Calculate acceleration due to the Sun's gravity. + * + * @param j2kState J2000 state vector + */ + private sunGravity(j2kState: J2000) { + const rSun = SunBody.position(j2kState.epoch); + const aNum = rSun.changeOrigin(j2kState.position); + const aDen = Math.pow(aNum.magnitude(), 3); + const bNum = rSun; + const bDen = Math.pow(rSun.magnitude(), 3); + const grav = aNum.scale(1.0 / aDen).add(bNum.scale(-1.0 / bDen)); + return grav.scale(SunBody.MU); + } + + /** + * Update the acceleration map argument with calculated "moon_gravity" and + * "sun_gravity" values, for the provided state vector. + * + * @param j2kState J2000 state vector + * @param accMap acceleration map (km/s^2) + */ + public acceleration(j2kState: J2000, accMap: AccelerationMap) { + if (this.moonGravityFlag) { + accMap["moon_gravity"] = this.moonGravity(j2kState); + } + if (this.sunGravityFlag) { + accMap["sun_gravity"] = this.sunGravity(j2kState); + } + } +} diff --git a/src/index.ts b/src/index.ts index 0c119d0..dd15b95 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,41 +1,18 @@ -import * as bodies from "./bodies"; -export { bodies }; - -import * as constants from "./constants"; -export { constants }; - -export { EarthCenteredFixed } from "./coordinates/earth-centered-fixed"; - -export { EarthCenteredInertial } from "./coordinates/earth-centered-inertial"; - -export { Epoch } from "./epoch"; - -import * as forces from "./forces"; -export { forces }; - +// bodies +export { EarthBody } from "./bodies/earth-body"; +export { MoonBody } from "./bodies/moon-body"; +export { SunBody } from "./bodies/sun-body"; +// coordinates +export { ClassicalElements } from "./coordinates/classical-elements"; export { Geodetic } from "./coordinates/geodetic"; - -export { GroundStation } from "./constructs/ground-station"; - -export { Interpolator } from "./propagators/interpolator"; - +export { ITRF } from "./coordinates/itrf"; export { J2000 } from "./coordinates/j2000"; - -export { Kepler } from "./propagators/kepler"; - -export { KeplerianElements } from "./coordinates/keplerian-elements"; - -export { LookAngle } from "./coordinates/look-angle"; - -import * as operations from "./operations"; -export { operations }; - -export { RungeKutta4 } from "./propagators/runge-kutta-4"; - -export { Satellite } from "./constructs/satellite"; - -export { Spherical } from "./coordinates/spherical"; - -export { TopocentricHorizon } from "./coordinates/topocentric-horizon"; - -export { Vector } from "./vector"; +// data +export { DataHandler } from "./data/data-handler"; +// math +export { Vector3D } from "./math/vector-3d"; +// propagators +export { KeplerPropagator } from "./propagators/kepler-propagator"; +export { RungeKutta4Propagator } from "./propagators/runge-kutta-4-propagator"; +// time +export { EpochUTC } from "./time/epoch-utc"; diff --git a/src/math/constants.ts b/src/math/constants.ts new file mode 100644 index 0000000..a2dde5b --- /dev/null +++ b/src/math/constants.ts @@ -0,0 +1,26 @@ +/** Value of 2 times Pi. */ +export const TWO_PI = Math.PI * 2; + +/** Unit for converting degrees to radians. */ +export const DEG2RAD = Math.PI / 180; + +/** Unit for converting radians to degrees. */ +export const RAD2DEG = 180 / Math.PI; + +/** Unit for converting 0.0001 arcseconds to radians. */ +export const TTASEC2RAD = (1 / 60 / 60 / 10000) * DEG2RAD; + +/** Unit for converting arcseconds to radians. */ +export const ASEC2RAD = (1 / 60 / 60) * DEG2RAD; + +/** Astronomical Unit, in kilometers. */ +export const ASTRONOMICAL_UNIT = 149597870.0; + +/** Unit for converting seconds to days. */ +export const SEC2DAY = 1 / 60 / 60 / 24; + +/** Unit for converting seconds to degrees. */ +export const SEC2DEG = 1 / 60 / 60; + +/** Speed of light, in km/s. */ +export const SPEED_OF_LIGHT = 299792458; diff --git a/src/operations.ts b/src/math/operations.ts similarity index 53% rename from src/operations.ts rename to src/math/operations.ts index de8adda..cc23c0d 100644 --- a/src/operations.ts +++ b/src/math/operations.ts @@ -8,12 +8,10 @@ import { TWO_PI } from "./constants"; * @param n a positive integer */ export function factorial(n: number): number { - if (n < 0) { - throw new Error("Argument must be a positive integer."); - } + n = Math.abs(n); let output = 1; - for (let i = n; i > 1; i--) { - output *= i; + for (let i = 0; i < n; i++) { + output *= i + 1; } return output; } @@ -81,58 +79,14 @@ export function linearInterpolate( return (y0 * (x1 - x) + y1 * (x - x0)) / (x1 - x0); } -export function legendreFunction(l: number, m: number, phi: number): number { - if (m > l) { - return 0; - } - if (l === 0 && m === 0) { - return 1; - } - if (l === 1 && m === 0) { - return Math.sin(phi); - } - if (l === 1 && m === 1) { - return Math.cos(phi); - } - if (l === 2 && m === 0) { - return (1.0 / 2.0) * (3 * Math.sin(phi) ** 2 - 1); - } - if (l === 2 && m === 1) { - return 3 * Math.sin(phi) * Math.cos(phi); - } - if (l === 2 && m === 2) { - return 3 * Math.cos(phi) ** 2; - } - if (l === 3 && m === 0) { - return (1.0 / 2.0) * (5 * Math.sin(phi) ** 3 - 3 * Math.sin(phi)); - } - if (l === 3 && m === 1) { - return (1.0 / 2.0) * Math.cos(phi) * (15 * Math.sin(phi) ** 2 - 3); - } - if (l === 3 && m === 2) { - return 15 * Math.cos(phi) ** 2 * Math.sin(phi); - } - if (l === 3 && m === 3) { - return 15 * Math.cos(phi) ** 3; - } - if (l === 4 && m === 0) { - return ( - (1.0 / 8.0) * (35 * Math.sin(phi) ** 4 - 30 * Math.sin(phi) ** 2 + 3) - ); - } - if (l === 4 && m === 1) { - return ( - (5.0 / 2.0) * Math.cos(phi) * (7 * Math.sin(phi) ** 3 - 3 * Math.sin(phi)) - ); - } - if (l === 4 && m === 2) { - return (15.0 / 2.0) * Math.cos(phi) ** 2 * (7 * Math.sin(phi) ** 2 - 1); - } - if (l === 4 && m === 3) { - return 105 * Math.cos(phi) ** 3 * Math.sin(phi); - } - if (l === 4 && m === 4) { - return 105 * Math.cos(phi) ** 4; - } - return 0; +/** + * Copy the sign of one number, to the magnitude of another. + * + * @param magnitude + * @param sign + */ +export function copySign(magnitude: number, sign: number) { + const m = Math.abs(magnitude); + const s = sign >= 0 ? 1 : -1; + return s * m; } diff --git a/src/math/spherical-harmonics.ts b/src/math/spherical-harmonics.ts new file mode 100644 index 0000000..0622c85 --- /dev/null +++ b/src/math/spherical-harmonics.ts @@ -0,0 +1,70 @@ +/** Class for handling spherical harmonics operations. */ +export class SphericalHarmonics { + /** dimension */ + private d: number; + /** associated legendre polynomial table */ + private P: number[][]; + + /** + * Create a new SphericalHarmonics object. + * + * @param dimension degree + */ + constructor(dimension: number) { + this.d = dimension; + this.P = []; + } + + /** + * Fetch the associated legendre polynomial from the provided index. + * + * @param l l-index + * @param m m-index + */ + public getP(l: number, m: number) { + return this.P[l][m] || 0; + } + + /** Reset the polynomial table to zeroes. */ + private clearTable() { + this.P = []; + for (let l = 0; l <= this.d; l++) { + const temp = []; + for (let m = 0; m <= l + 1; m++) { + temp.push(0); + } + this.P.push(temp); + } + } + + /** + * Build a cache of associated Legendre polynomials. + * + * @param phi geocentric latitude + */ + public buildCache(phi: number) { + this.clearTable(); + const { d, P } = this; + const sPhi = Math.sin(phi); + const cPhi = Math.cos(phi); + P[0][0] = 1.0; + P[0][1] = 0.0; + P[1][0] = sPhi; + P[1][1] = cPhi; + for (let l = 2; l <= d; l++) { + for (let m = 0; m <= l; m++) { + if (l >= 2 && m == 0) { + P[l][0] = + ((2 * l - 1) * sPhi * this.getP(l - 1, 0) - + (l - 1) * this.getP(l - 2, 0)) / + l; + } else if (m != 0 && m < l) { + P[l][m] = + this.getP(l - 2, m) + (2 * l - 1) * cPhi * this.getP(l - 1, m - 1); + } else if (l == m && l != 0) { + P[l][l] = (2 * l - 1) * cPhi * this.getP(l - 1, l - 1); + } + } + } + } +} diff --git a/src/math/vector-3d.ts b/src/math/vector-3d.ts new file mode 100644 index 0000000..3f263dc --- /dev/null +++ b/src/math/vector-3d.ts @@ -0,0 +1,225 @@ +import { Vector6D } from "./vector-6d"; + +/** Class representing a vector of length 3. */ +export class Vector3D { + /** Vector x-axis component. */ + public readonly x: number; + /** Vector y-axis component. */ + public readonly y: number; + /** Vector z-axis component. */ + public readonly z: number; + + /** + * Create a new Vector3D object. + * + * @param x x-axis component + * @param y y-axis component + * @param z z-axis component + */ + constructor(x: number, y: number, z: number) { + this.x = x; + this.y = y; + this.z = z; + } + + /** + * Create a new Vector3D object, containing zero for each state element. + */ + public static origin(): Vector3D { + return new Vector3D(0, 0, 0); + } + + /** Return a string representation of this vector. */ + public toString(): string { + const { x, y, z } = this; + const xStr = x.toFixed(9); + const yStr = y.toFixed(9); + const zStr = z.toFixed(9); + return `[ ${xStr}, ${yStr}, ${zStr} ]`; + } + + /** Return the magnitude of this object. */ + public magnitude(): number { + const { x, y, z } = this; + return Math.sqrt(x * x + y * y + z * z); + } + + /** + * Calculate the Euclidean distance between this and another Vector3D. + * + * @param v the other vector + */ + public distance(v: Vector3D): number { + const { x, y, z } = this; + var dx = x - v.x; + var dy = y - v.y; + var dz = z - v.z; + return Math.sqrt(dx * dx + dy * dy + dz * dz); + } + + /** + * Perform element-wise addition of this and another Vector. + * + * Returns a new Vector object containing the sum. + * + * @param v the other vector + */ + public add(v: Vector3D): Vector3D { + const { x, y, z } = this; + return new Vector3D(x + v.x, y + v.y, z + v.z); + } + + /** + * Linearly scale the elements of this. + * + * Returns a new Vector object containing the scaled state. + * + * @param n scalar value + */ + public scale(n: number): Vector3D { + const { x, y, z } = this; + return new Vector3D(x * n, y * n, z * n); + } + + /** Return a new Vector3D object with all values negated. */ + public negate() { + return this.scale(-1); + } + + /** + * Return the normalized (unit vector) form of this as a new Vector3D object. + */ + public normalized(): Vector3D { + const { x, y, z } = this; + const m = this.magnitude(); + return new Vector3D(x / m, y / m, z / m); + } + + /** + * Calculate the cross product of this and another Vector. + * + * Returns the result as a new Vector object. + * + * @param v the other vector + */ + public cross(v: Vector3D): Vector3D { + const { x, y, z } = this; + return new Vector3D( + y * v.z - z * v.y, + z * v.x - x * v.z, + x * v.y - y * v.x + ); + } + + /** + * Calculate the dot product this and another Vector. + * + * @param v the other vector + */ + public dot(v: Vector3D): number { + const { x, y, z } = this; + return x * v.x + y * v.y + z * v.z; + } + + /** + * Rotate the elements of this along the x-axis. + * + * @param theta rotation angle, in radians + */ + public rot1(theta: number): Vector3D { + const cosT = Math.cos(theta); + const sinT = Math.sin(theta); + const { x, y, z } = this; + return new Vector3D( + 1 * x + 0 * y + 0 * z, + 0 * x + cosT * y + sinT * z, + 0 * x + -sinT * y + cosT * z + ); + } + + /** + * Rotate the elements of this along the y-axis. + * + * @param theta rotation angle, in radians + */ + public rot2(theta: number): Vector3D { + const cosT = Math.cos(theta); + const sinT = Math.sin(theta); + const { x, y, z } = this; + return new Vector3D( + cosT * x + 0 * y + -sinT * z, + 0 * x + 1 * y + 0 * z, + sinT * x + 0 * y + cosT * z + ); + } + + /** + * Rotate the elements of this along the z-axis. + * + * @param theta rotation angle, in radians + */ + public rot3(theta: number): Vector3D { + const cosT = Math.cos(theta); + const sinT = Math.sin(theta); + const { x, y, z } = this; + return new Vector3D( + cosT * x + sinT * y + 0 * z, + -sinT * x + cosT * y + 0 * z, + 0 * x + 0 * y + 1 * z + ); + } + + /** + * Calculate the angle, in radians, between this and another Vector3D. + * + * @param v the other vector + */ + public angle(v: Vector3D): number { + return Math.acos(this.dot(v) / (this.magnitude() * v.magnitude())); + } + + /** + * Change coordinates of this to the relative position from a new origin. + * + * @param origin new origin + */ + public changeOrigin(origin: Vector3D): Vector3D { + const delta = origin.negate(); + return this.add(delta); + } + + /** + * Join this and another Vector3D object into a single Vector6D object. + * + * @param v other vector + */ + public join(v: Vector3D) { + const { x: a, y: b, z: c } = this; + const { x, y, z } = v; + return new Vector6D(a, b, c, x, y, z); + } + + /** + * Determine line of sight between two vectors and the radius of a central + * object. Returns true if line-of-sight exists. + * + * @param v other vector + * @param radius central body radius + */ + public sight(v: Vector3D, radius: number) { + const r1Mag2 = Math.pow(this.magnitude(), 2); + const r2Mag2 = Math.pow(v.magnitude(), 2); + const rDot = this.dot(v); + let los = false; + const tMin = (r1Mag2 - rDot) / (r1Mag2 + r2Mag2 - 2 * rDot); + if (tMin < 0 || tMin > 1) { + los = true; + } else { + const c = (1 - tMin) * r1Mag2 + rDot * tMin; + if (c >= radius * radius) { + los = true; + } + } + return los; + } +} diff --git a/src/math/vector-6d.ts b/src/math/vector-6d.ts new file mode 100644 index 0000000..5adcc7d --- /dev/null +++ b/src/math/vector-6d.ts @@ -0,0 +1,80 @@ +import { Vector3D } from "./vector-3d"; + +/** Class representing a vector of length 6. */ +export class Vector6D { + /** Vector a-axis component. */ + public readonly a: number; + /** Vector b-axis component. */ + public readonly b: number; + /** Vector c-axis component. */ + public readonly c: number; + /** Vector x-axis component. */ + public readonly x: number; + /** Vector y-axis component. */ + public readonly y: number; + /** Vector z-axis component. */ + public readonly z: number; + + /** + * Create a new Vector6D object. + * + * @param a a-axis component + * @param b b-axis component + * @param c c-axis component + * @param x x-axis component + * @param y y-axis component + * @param z z-axis component + */ + constructor( + a: number, + b: number, + c: number, + x: number, + y: number, + z: number + ) { + this.a = a; + this.b = b; + this.c = c; + this.x = x; + this.y = y; + this.z = z; + } + + /** + * Create a new Vector6D object, containing zero for each state element. + */ + public static origin(): Vector6D { + return new Vector6D(0, 0, 0, 0, 0, 0); + } + + /** + * Perform element-wise addition of this and another Vector. + * + * Returns a new Vector object containing the sum. + * + * @param v the other vector + */ + public add(v: Vector6D): Vector6D { + const { a, b, c, x, y, z } = this; + return new Vector6D(a + v.a, b + v.b, c + v.c, x + v.x, y + v.y, z + v.z); + } + + /** + * Linearly scale the elements of this. + * + * Returns a new Vector object containing the scaled state. + * + * @param n scalar value + */ + public scale(n: number): Vector6D { + const { a, b, c, x, y, z } = this; + return new Vector6D(a * n, b * n, c * n, x * n, y * n, z * n); + } + + /** Split this into two Vector3D objects. */ + public split(): [Vector3D, Vector3D] { + const { a, b, c, x, y, z } = this; + return [new Vector3D(a, b, c), new Vector3D(x, y, z)]; + } +} diff --git a/src/matrix.ts b/src/matrix.ts deleted file mode 100644 index 5b72da0..0000000 --- a/src/matrix.ts +++ /dev/null @@ -1,28 +0,0 @@ -/** Class representing a matrix. */ -export class Matrix { - /** - * Create a new object using the values from an array. - * - * @param values matrix elements - */ - public static fromArray(values: number[][]) { - return new Matrix(...values); - } - - /** Matrix state elements. */ - public readonly state: number[][]; - - /** - * Create a new Matrix object. - * - * An error will be thrown if the element array is empty. - * - * @param elements vector elements - */ - constructor(...elements: number[][]) { - if (elements.length === 0 || elements[0].length === 0) { - throw new Error("Matrix state cannot be empty."); - } - this.state = elements; - } -} diff --git a/src/propagators/interpolator.ts b/src/propagators/interpolator.ts deleted file mode 100644 index a734641..0000000 --- a/src/propagators/interpolator.ts +++ /dev/null @@ -1,222 +0,0 @@ -import { J2000 } from "../coordinates/j2000"; -import { earthSpherical } from "../forces"; -import { linearInterpolate, sign } from "../operations"; -import { Vector } from "../vector"; -import { IPropagator, PropagatorType } from "./propagator-interface"; - -/** Closure used for interpolation. */ -export type InterpClosure = (millis: number) => J2000; - -/** - * Create a closure for interpolating new states, using the Verlet method, from - * constructor data. - * - * @param states a list of J2000 states - * @param stepSize step size, in seconds - */ -function closureVerlet(states: J2000[], stepSize: number): InterpClosure { - type Internal = [number, Vector, Vector]; - const cache: Internal[] = []; - states.forEach(element => - cache.push([element.epoch.millis, element.position, element.velocity]) - ); - return (millis: number): J2000 => { - let state = cache[0]; - cache.forEach(element => { - const [elEpoch, crEpoch] = [element[0], state[0]]; - if (Math.abs(millis - elEpoch) < Math.abs(millis - crEpoch)) { - state = element; - } - }); - while (state[0] !== millis) { - const [t0, x0, v0] = state; - const delta = (millis - t0) / 1000; - const sgn = sign(delta); - const dt = Math.min(Math.abs(delta), stepSize) * sgn; - const t1 = t0 + dt * 1000; - const a0 = earthSpherical(x0); - const x1 = x0.add(v0.scale(dt)).add(a0.scale(0.5 * dt * dt)); - const a1 = earthSpherical(x1); - const v1 = v0.add(a0.add(a1).scale(0.5 * dt)); - state = [t1, x1, v1]; - } - const [epoch, position, velocity] = state; - const [ri, rj, rk] = position.state; - const [vi, vj, vk] = velocity.state; - return new J2000(epoch, ri, rj, rk, vi, vj, vk); - }; -} - -/** - * Create a closure for interpolating new states, using the linear method, from - * constructor data. - * - * @param states a list of J2000 states - */ -function closureLinear(states: J2000[]): InterpClosure { - type Range = [number, number]; - type Internal = [Range, Range, Range, Range, Range, Range, Range]; - const cache: Internal[] = []; - for (let i = 0; i < states.length - 1; i++) { - const [stateA, stateB] = [states[i], states[i + 1]]; - const t: Range = [stateA.epoch.millis, stateB.epoch.millis]; - const ri: Range = [stateA.position.state[0], stateB.position.state[0]]; - const rj: Range = [stateA.position.state[1], stateB.position.state[1]]; - const rk: Range = [stateA.position.state[2], stateB.position.state[2]]; - const vi: Range = [stateA.velocity.state[0], stateB.velocity.state[0]]; - const vj: Range = [stateA.velocity.state[1], stateB.velocity.state[1]]; - const vk: Range = [stateA.velocity.state[2], stateB.velocity.state[2]]; - cache.push([t, ri, rj, rk, vi, vj, vk]); - } - return (millis: number): J2000 => { - let dex = 0; - for (let i = 0; i < cache.length; i++) { - const [start, end] = cache[i][0]; - if (millis >= start && millis <= end) { - dex = i; - break; - } - } - const [t, ri, rj, rk, vi, vj, vk] = cache[dex]; - const riVal = linearInterpolate(millis, t[0], ri[0], t[1], ri[1]); - const rjVal = linearInterpolate(millis, t[0], rj[0], t[1], rj[1]); - const rkVal = linearInterpolate(millis, t[0], rk[0], t[1], rk[1]); - const viVal = linearInterpolate(millis, t[0], vi[0], t[1], vi[1]); - const vjVal = linearInterpolate(millis, t[0], vj[0], t[1], vj[1]); - const vkVal = linearInterpolate(millis, t[0], vk[0], t[1], vk[1]); - return new J2000(millis, riVal, rjVal, rkVal, viVal, vjVal, vkVal); - }; -} - -/** Standard interface for interpolator options. */ -export interface InterpolatorModel { - /** Interpolator method string. */ - method: string; - /** Step size, in seconds. Only used for numerical interpolation methods. */ - stepSize: number; -} - -/** Nullable interpolator options. */ -export type InterpolatorOptions = Partial; - -/** Interpolate ephemeris from an array of J2000 states. */ -export class Interpolator implements IPropagator { - /** Verlet method identifier string. */ - public static readonly VERLET = "verlet"; - /** Linear method identifier string. */ - public static readonly LINEAR = "linear"; - /** Default interpolator model. */ - public static readonly DEFAULT_MODEL: InterpolatorModel = { - method: Interpolator.VERLET, - stepSize: 60 - }; - /** Propagator identifier string. */ - public readonly type: string; - /** Interpolator model options. */ - public readonly model: InterpolatorModel; - /** Cache for last computed state. */ - public state: J2000; - /** Time range available for interpolation, in UNIX milliseconds. */ - private readonly range: [number, number]; - /** Closure used for interpolation. */ - private readonly closure: InterpClosure; - /** Revert state on reset call. */ - private readonly resetState: J2000; - - /** - * Create a new Interpolator object. If values are not specified in the - * model argument, options are merged from: DEFAULT_MODEL - * - * @param states a list of propagated J2000 states - * @param model Interpolator model options - */ - public constructor(states: J2000[], model?: InterpolatorOptions) { - this.type = PropagatorType.INTERPOLATOR; - model = model || {}; - this.model = { ...Interpolator.DEFAULT_MODEL, ...model }; - this.range = [ - states[0].epoch.millis, - states[states.length - 1].epoch.millis - ]; - this.resetState = states[0]; - this.state = states[0]; - if (this.model.method === Interpolator.LINEAR) { - this.closure = closureLinear(states); - } else if (this.model.method === Interpolator.VERLET) { - this.closure = closureVerlet(states, this.model.stepSize); - } else { - const estr = `Invalid Interpolator method: [${this.model.method}]`; - throw new Error(estr); - } - } - - /** Return a string representation of the object. */ - public toString(): string { - const tStart = new Date(this.range[0]).toUTCString(); - const tEnd = new Date(this.range[1]).toUTCString(); - const sStr = this.isNumerical() ? `${this.model.stepSize} seconds` : "N/A"; - return [ - "[Interpolator]", - ` Method: ${this.model.method}`, - ` Range: [${tStart}] -> [${tEnd}]`, - ` Step Size: ${sStr}` - ].join("\n"); - } - - /** - * Restore cached state to initial propagator state. Doesn't really do much - * for the Interpolator, since it doesn't rely on transient states. - */ - public reset(): Interpolator { - this.state = this.resetState; - return this; - } - - /** - * Propagate satellite state to a new epoch. - * - * NOTE: The interpolator will throw a RangeError if the propagation time is - * outside the range of states provided for interpolation. - * - * @param millis milliseconds since 1 January 1970, 00:00 UTC - */ - public propagate(millis: number): J2000 { - if (millis < this.range[0] || millis > this.range[1]) { - const tryDate = new Date(millis).toUTCString(); - const startDate = new Date(this.range[0]).toUTCString(); - const endDate = new Date(this.range[1]).toUTCString(); - throw new RangeError( - `Epoch [${tryDate}] outside valid range: ` + - `[${startDate}] -> [${endDate}]` - ); - } - this.state = this.closure(millis); - return this.state; - } - - /** - * Propagate state by some number of seconds, repeatedly, starting at a - * specified epoch. - * - * @param millis propagation start time - * @param interval seconds between output states - * @param count number of steps to take - */ - public step(millis: number, interval: number, count: number): J2000[] { - const output: J2000[] = [this.propagate(millis)]; - let tempEpoch = millis; - for (let i = 0; i < count; i++) { - tempEpoch += interval * 1000; - output.push(this.propagate(tempEpoch)); - } - return output; - } - - /** Return true if using numerical methods, otherwise return false. */ - private isNumerical(): boolean { - if (this.model.method === Interpolator.VERLET) { - return true; - } - return false; - } -} diff --git a/src/propagators/kepler.ts b/src/propagators/kepler-propagator.ts similarity index 62% rename from src/propagators/kepler.ts rename to src/propagators/kepler-propagator.ts index c93569a..3a85c46 100644 --- a/src/propagators/kepler.ts +++ b/src/propagators/kepler-propagator.ts @@ -1,17 +1,16 @@ -import { TWO_PI } from "../constants"; +import { ClassicalElements } from "../coordinates/classical-elements"; import { J2000 } from "../coordinates/j2000"; -import { KeplerianElements } from "../coordinates/keplerian-elements"; -import { matchHalfPlane } from "../operations"; -import { IPropagator, PropagatorType } from "./propagator-interface"; +import { TWO_PI } from "../math/constants"; +import { matchHalfPlane } from "../math/operations"; +import { EpochUTC } from "../time/epoch-utc"; +import { IPropagator } from "./propagator-interface"; /** Satellite ephemeris propagator, using Kepler's method. */ -export class Kepler implements IPropagator { - /** Propagator identifier string. */ - public readonly type: string; +export class KeplerPropagator implements IPropagator { /** Cache for last computed statellite state. */ public state: J2000; /** Keplerian element set. */ - private readonly elements: KeplerianElements; + private readonly elements: ClassicalElements; /** * Create a new Kepler propagator object. This propagator only models @@ -19,10 +18,9 @@ export class Kepler implements IPropagator { * * @param elements Keplerian element set */ - constructor(elements: KeplerianElements) { - this.type = PropagatorType.KEPLER; + constructor(elements: ClassicalElements) { this.elements = elements; - this.state = elements.toJ2K(); + this.state = elements.toJ2000(); } /** Return a string representation of the object. */ @@ -34,19 +32,19 @@ export class Kepler implements IPropagator { * Restore cached state to initial propagator state. Doesn't really do much * for the Kepler propagator, since it doesn't rely on transient states. */ - public reset(): Kepler { - this.state = this.elements.toJ2K(); + public reset(): KeplerPropagator { + this.state = this.elements.toJ2000(); return this; } /** * Propagate satellite state to a new epoch. * - * @param millis milliseconds since 1 January 1970, 00:00 UTC + * @param epoch UTC epoch */ - public propagate(millis: number): J2000 { - const { epoch, a, e, i, o, w, v } = this.elements; - const delta = millis / 1000 - epoch.unix; + public propagate(epoch: EpochUTC): J2000 { + const { epoch: t, a, e, i, o, w, v } = this.elements; + const delta = epoch.difference(t); const n = this.elements.meanMotion(); let eaInit = Math.acos((e + Math.cos(v)) / (1 + e * Math.cos(v))); eaInit = matchHalfPlane(eaInit, v); @@ -65,7 +63,7 @@ export class Kepler implements IPropagator { (Math.cos(eaFinal) - e) / (1 - e * Math.cos(eaFinal)) ); vFinal = matchHalfPlane(vFinal, eaFinal); - this.state = new KeplerianElements(millis, a, e, i, o, w, vFinal).toJ2K(); + this.state = new ClassicalElements(epoch, a, e, i, o, w, vFinal).toJ2000(); return this.state; } @@ -73,15 +71,15 @@ export class Kepler implements IPropagator { * Propagate state by some number of seconds, repeatedly, starting at a * specified epoch. * - * @param millis propagation start time + * @param epoch UTC epoch * @param interval seconds between output states * @param count number of steps to take */ - public step(millis: number, interval: number, count: number): J2000[] { - const output: J2000[] = [this.propagate(millis)]; - let tempEpoch = millis; + public step(epoch: EpochUTC, interval: number, count: number): J2000[] { + const output: J2000[] = [this.propagate(epoch)]; + let tempEpoch = epoch; for (let i = 0; i < count; i++) { - tempEpoch += interval * 1000; + tempEpoch = tempEpoch.roll(interval); output.push(this.propagate(tempEpoch)); } return output; diff --git a/src/propagators/propagator-interface.ts b/src/propagators/propagator-interface.ts index 51ce4a7..4b3a90e 100644 --- a/src/propagators/propagator-interface.ts +++ b/src/propagators/propagator-interface.ts @@ -1,51 +1,14 @@ import { J2000 } from "../coordinates/j2000"; +import { EpochUTC } from "../time/epoch-utc"; /** Common interface for propagator objects. */ export interface IPropagator { - /** Propagator identifier string. */ - type: string; /** Cache for last computed statellite state. */ state: J2000; /** Propagate state to a new epoch. */ - propagate(millis: number): J2000; + propagate(epoch: EpochUTC): J2000; /** Propagate state by some number of seconds, repeatedly. */ - step(millis: number, interval: number, count: number): J2000[]; + step(epoch: EpochUTC, interval: number, count: number): J2000[]; /** Restore initial propagator state. */ - reset(): IPropagator; + reset(): void; } - -/** Propagator type identifiers. */ -export enum PropagatorType { - RUNGE_KUTTA_4 = "runge-kutta-4", - KEPLER = "kepler", - INTERPOLATOR = "interpolator" -} - -/** Options for numerical integration propagation models. */ -export interface INumericalModel { - /** Step size, in seconds. */ - stepSize: number; - /** Model Solar gravity, if true. */ - gravitySun: boolean; - /** Model Lunar gravity, if true. */ - gravityMoon: boolean; - /** Model Solar radiation pressure, if true. */ - solarRadiation: boolean; - /** Model atmospheric drag, if true. */ - atmosphericDrag: boolean; - /** Satellite mass, in kilograms */ - mass: number; - /** Satellite surface area, in meters squared */ - area: number; - /** Satellite drag coefficient. */ - drag: number; - /** Satellite reflectivity coefficient. */ - reflect: number; - /** Geopotential coefficient degree. (max=4) */ - degree: number; - /** Geopotential coefficient order. (max=4) */ - order: number; -} - -/** Options for numerical integration propagation constructors. */ -export type NumericalOptions = Partial; diff --git a/src/propagators/runge-kutta-4-propagator.ts b/src/propagators/runge-kutta-4-propagator.ts new file mode 100644 index 0000000..6caa99d --- /dev/null +++ b/src/propagators/runge-kutta-4-propagator.ts @@ -0,0 +1,121 @@ +import { J2000 } from "../coordinates/j2000"; +import { ForceModel } from "../forces/force-model"; +import { copySign } from "../math/operations"; +import { Vector6D } from "../math/vector-6d"; +import { EpochUTC } from "../time/epoch-utc"; +import { IPropagator } from "./propagator-interface"; + +/** 4th order Runge-Kutta numerical integrator for satellite propagation. */ +export class RungeKutta4Propagator implements IPropagator { + /** force model */ + public readonly forceModel: ForceModel; + /** initial state */ + private readonly initState: J2000; + /** cached state */ + private cacheState: J2000; + /** step size (seconds) */ + private stepSize: number; + + /** + * Create a new RungeKutta4 propagator object. + * + * @param elements J2000 state vector + */ + constructor(state: J2000) { + this.initState = state; + this.cacheState = this.initState; + this.stepSize = 15; + this.forceModel = new ForceModel(); + this.forceModel.setEarthGravity(0, 0); + } + + /** Fetch last propagated satellite state. */ + get state() { + return this.cacheState; + } + + /** + * Set the integration step size. + * + * Smaller is slower, but more accurate. + * + * @param seconds step size (seconds) + */ + public setStepSize(seconds: number) { + this.stepSize = Math.abs(seconds); + } + + /** Reset cached state to the initialized state. */ + public reset() { + this.cacheState = this.initState; + } + + /** + * Calculate partial derivatives for integrations. + * + * @param j2kState J2000 state vector + * @param hArg step size argument + * @param kArg derivative argument + */ + private kFn(j2kState: J2000, hArg: number, kArg: Vector6D) { + const epoch = j2kState.epoch.roll(hArg); + const posvel = j2kState.position.join(j2kState.velocity); + const [position, velocity] = posvel.add(kArg).split(); + const sample = new J2000(epoch, position, velocity); + return this.forceModel.derivative(sample); + } + + /** + * Calculate a future state by integrating velocity and acceleration. + * + * @param j2kState J2000 state vector + * @param step step size (seconds) + */ + private integrate(j2kState: J2000, step: number) { + const k1 = this.kFn(j2kState, 0, Vector6D.origin()).scale(step); + const k2 = this.kFn(j2kState, step / 2, k1.scale(1 / 2)).scale(step); + const k3 = this.kFn(j2kState, step / 2, k2.scale(1 / 2)).scale(step); + const k4 = this.kFn(j2kState, step, k3).scale(step); + const v1 = k1; + const v2 = v1.add(k2.scale(2)); + const v3 = v2.add(k3.scale(2)); + const v4 = v3.add(k4); + const tNext = j2kState.epoch.roll(step); + const posvel = j2kState.position.join(j2kState.velocity); + const [position, velocity] = posvel.add(v4.scale(1 / 6)).split(); + return new J2000(tNext, position, velocity); + } + + /** + * Integrate cached state to a new epoch. + * + * @param newEpoch propagation epoch + */ + public propagate(newEpoch: EpochUTC) { + while (!this.cacheState.epoch.equals(newEpoch)) { + const delta = newEpoch.difference(this.cacheState.epoch); + const mag = Math.min(this.stepSize, Math.abs(delta)); + const step = copySign(mag, delta); + this.cacheState = this.integrate(this.cacheState, step); + } + return this.cacheState; + } + + /** + * Propagate state by some number of seconds, repeatedly, starting at a + * specified epoch. + * + * @param epoch UTC epoch + * @param interval seconds between output states + * @param count number of steps to take + */ + public step(epoch: EpochUTC, interval: number, count: number): J2000[] { + const output: J2000[] = [this.propagate(epoch)]; + let tempEpoch = epoch; + for (let i = 0; i < count; i++) { + tempEpoch = tempEpoch.roll(interval); + output.push(this.propagate(tempEpoch)); + } + return output; + } +} diff --git a/src/propagators/runge-kutta-4.ts b/src/propagators/runge-kutta-4.ts deleted file mode 100644 index 555f82e..0000000 --- a/src/propagators/runge-kutta-4.ts +++ /dev/null @@ -1,172 +0,0 @@ -import { J2000 } from "../coordinates/j2000"; -import { Epoch } from "../epoch"; -import { derivative } from "../forces"; -import { sign } from "../operations"; -import { Vector } from "../vector"; -import { - INumericalModel, - IPropagator, - NumericalOptions, - PropagatorType -} from "./propagator-interface"; - -/** 4th order Runge-Kutta numerical integrator for satellite propagation. */ -export class RungeKutta4 implements IPropagator { - /** Default propagator model. */ - public static readonly DEFAULT_MODEL: INumericalModel = { - area: 1, - atmosphericDrag: true, - degree: 4, - drag: 2.2, - gravityMoon: true, - gravitySun: true, - mass: 1000, - order: 4, - reflect: 1.4, - solarRadiation: true, - stepSize: 60 - }; - /** Default propagator model for two-body acceleration. */ - public static readonly DEFAULT_MODEL_TWOBODY: INumericalModel = { - area: 0, - atmosphericDrag: false, - degree: 0, - drag: 0, - gravityMoon: false, - gravitySun: false, - mass: 0, - order: 0, - reflect: 0, - solarRadiation: false, - stepSize: 60 - }; - - /** - * Create a new RungeKutta4 propagator object. If values are not specified - * in the model argument, options are merged from: DEFAULT_MODEL_TWOBODY - * - * @param state satellite state - * @param model propagator options - */ - public static twoBody(state: J2000, model?: NumericalOptions): RungeKutta4 { - model = model || {}; - const mergeModel = { ...RungeKutta4.DEFAULT_MODEL_TWOBODY, ...model }; - return new RungeKutta4(state, mergeModel); - } - - /** Propagator identifier string. */ - public readonly type: string; - /** Propagator force model. */ - public readonly model: INumericalModel; - /** Cached state used in propagator calculations after initialization. */ - public state: J2000; - /** Propagator initial state. */ - private readonly initState: J2000; - - /** - * Create a new RungeKutta4 propagator object. If values are not specified - * in the model argument, options are merged from: DEFAULT_MODEL - * - * @param state satellite state - * @param model propagator options - */ - public constructor(state: J2000, model?: NumericalOptions) { - this.type = PropagatorType.RUNGE_KUTTA_4; - this.initState = state; - this.state = state; - model = model || {}; - this.model = { ...RungeKutta4.DEFAULT_MODEL, ...model }; - } - - /** Return a string representation of the object. */ - public toString(): string { - const status = (p: boolean) => (p ? "ENABLED" : "DISABLED"); - return [ - "[RungeKutta4]", - ` Step Size: ${this.model.stepSize} seconds`, - ` Satellite Mass: ${this.model.mass} kg`, - ` Satellite Surface Area: ${this.model.area} m^2`, - ` Drag Coefficient: ${this.model.drag}`, - ` Reflectivity Coefficient: ${this.model.reflect}`, - ` Geopotential Degree: ${this.model.degree}`, - ` Geopotential Order: ${this.model.order}`, - ` Sun Gravity: ${status(this.model.gravitySun)}`, - ` Moon Gravity: ${status(this.model.gravityMoon)}`, - ` Solar Radiation Pressure: ${status(this.model.solarRadiation)}`, - ` Atmospheric Drag: ${status(this.model.atmosphericDrag)}` - ].join("\n"); - } - - /** Restore initial propagator state. */ - public reset(): RungeKutta4 { - this.state = this.initState; - return this; - } - - /** - * Propagate satellite state to a new epoch. - * - * @param millis milliseconds since 1 January 1970, 00:00 UTC - */ - public propagate(millis: number): J2000 { - const unix = millis / 1000; - while (this.state.epoch.unix !== unix) { - const delta = unix - this.state.epoch.unix; - const sgn = sign(delta); - const stepNorm = Math.min(Math.abs(delta), this.model.stepSize) * sgn; - this.state = this.integrate(stepNorm); - } - return this.state; - } - - /** - * Propagate state by some number of seconds, repeatedly, starting at a - * specified epoch. - * - * @param millis propagation start time - * @param interval seconds between output states - * @param count number of steps to take - */ - public step(millis: number, interval: number, count: number): J2000[] { - const output: J2000[] = [this.propagate(millis)]; - let tempEpoch = millis; - for (let i = 0; i < count; i++) { - tempEpoch += interval * 1000; - output.push(this.propagate(tempEpoch)); - } - return output; - } - - /** - * Generate a derivative function given the propagator's current model - * options. - */ - private genDerivative(): (epoch: Epoch, posVel: Vector) => Vector { - return (epoch: Epoch, posVel: Vector) => { - return derivative(epoch, posVel, this.model); - }; - } - - /** - * Integrate orbital perturbations to a new state. - * - * @param step step size, in seconds - */ - private integrate(step: number): J2000 { - const { epoch, position, velocity } = this.state; - const posVel = position.concat(velocity); - const drv = this.genDerivative(); - const k1 = drv(epoch, posVel); - const k2 = drv(epoch.roll(step / 2), posVel.add(k1.scale(step / 2))); - const k3 = drv(epoch.roll(step / 2), posVel.add(k2.scale(step / 2))); - const k4 = drv(epoch.roll(step), posVel.add(k3.scale(step))); - const [ri, rj, rk, vi, vj, vk] = posVel.add( - k1 - .add(k2.scale(2)) - .add(k3.scale(2)) - .add(k4) - .scale(step / 6) - ).state; - return new J2000(epoch.roll(step).millis, ri, rj, rk, vi, vj, vk); - } -} diff --git a/src/test/bodies-test.ts b/src/test/bodies-test.ts new file mode 100644 index 0000000..50e4058 --- /dev/null +++ b/src/test/bodies-test.ts @@ -0,0 +1,81 @@ +import * as assert from "assert"; +import { + EarthBody, + EpochUTC, + J2000, + MoonBody, + RungeKutta4Propagator, + SunBody, + Vector3D +} from "../index"; + +const epoch = EpochUTC.fromDateString("2018-12-21T00:00:00.000Z"); + +const state = new J2000( + epoch, + new Vector3D(-1117.913276, 73.093299, -7000.018272), + new Vector3D(3.531365461, 6.583914964, -0.495649656) +); + +const rk4Prop = new RungeKutta4Propagator(state); + +describe("MoonBody", () => { + describe("position", () => { + const actual = MoonBody.position(epoch); + const expected = new Vector3D( + 154366.09642497, + 318375.615233499, + 109213.672184026 + ); + it("should be within 300km of real-world magnitude", () => { + const magnitude = Math.abs(expected.magnitude() - actual.magnitude()); + assert(magnitude <= 300); + }); + it("should be within 0.25 degrees of real-world angle", () => { + const angle = expected.angle(actual) * (180 / Math.PI); + assert(angle <= 0.25); + }); + }); +}); + +describe("SunBody", () => { + describe("position", () => { + const actual = SunBody.position(epoch); + const expected = new Vector3D( + -3092558.657913523, + -134994294.84136814, + -58520244.455122419 + ); + it("should be within 7000km of real-world magnitude", () => { + const magnitude = Math.abs(expected.magnitude() - actual.magnitude()); + assert(magnitude <= 7000); + }); + it("should be within 0.30 degrees of real-world angle", () => { + const angle = expected.angle(actual) * (180 / Math.PI); + assert(angle <= 0.3); + }); + }); + + describe("shadow", () => { + rk4Prop.reset(); + rk4Prop.setStepSize(30); + rk4Prop.forceModel.clearModel(); + rk4Prop.forceModel.setEarthGravity(0, 0); + let propEpoch = epoch; + let errorCount = 0; + it("should approximately match inverted vector sight algorithm", () => { + for (let i = 0; i < 1440; i++) { + const satState = rk4Prop.propagate(propEpoch); + const shadow = SunBody.shadow(satState); + const satPos = satState.position; + const sunPos = SunBody.position(propEpoch); + const sight = satPos.sight(sunPos, EarthBody.RADIUS_MEAN); + if (shadow === sight) { + errorCount++; + } + propEpoch = propEpoch.roll(60); + } + assert(errorCount <= 3); + }); + }); +}); diff --git a/src/test/coordinates-test.ts b/src/test/coordinates-test.ts new file mode 100644 index 0000000..3a2e68f --- /dev/null +++ b/src/test/coordinates-test.ts @@ -0,0 +1,45 @@ +import * as assert from "assert"; +import { DataHandler } from "../data/data-handler"; +import { EpochUTC, ITRF, J2000, Vector3D } from "../index"; + +DataHandler.setFinalsData([ + " 4 4 5 53100.00 I -0.141198 0.000079 0.331215 0.000051 I-0.4384012 0.0000027 1.5611 0.0020 I -52.007 .409 -4.039 .198 -0.141110 0.330940 -0.4383520 -52.100 -4.100", + " 4 4 6 53101.00 I -0.140722 0.000071 0.333536 0.000057 I-0.4399498 0.0000028 1.5244 0.0019 I -52.215 .380 -3.846 .166 -0.140720 0.333270 -0.4399620 -52.500 -4.000", + " 4 4 7 53102.00 I -0.140160 0.000067 0.336396 0.000060 I-0.4414071 0.0000026 1.3591 0.0024 I -52.703 .380 -3.878 .166 -0.140070 0.336140 -0.4414210 -52.700 -4.100" +]); + +const j2kState = new J2000( + EpochUTC.fromDateString("2004-04-06T07:51:28.386Z"), + new Vector3D(5102.5096, 6123.01152, 6378.1363), + new Vector3D(-4.7432196, 0.7905366, 5.53375619) +); + +const itrfState = new ITRF( + EpochUTC.fromDateString("2004-04-06T07:51:28.386Z"), + new Vector3D(-1033.479383, 7901.2952758, 6380.3565953), + new Vector3D(-3.22563652, -2.87245145, 5.531924446) +); + +describe("J2000", () => { + const testState = j2kState.toITRF(); + it("should convert to ITRF within 0.6m", () => { + const rDist = itrfState.position.distance(testState.position) * 1000; + assert(rDist <= 0.6); + }); + it("should convert to ITRF within 0.0004m/s", () => { + const vDist = itrfState.velocity.distance(testState.velocity) * 1000; + assert(vDist <= 0.0004); + }); +}); + +describe("ITRF", () => { + const testState = itrfState.toJ2000(); + it("should convert to J2000 within 0.6m", () => { + const rDist = j2kState.position.distance(testState.position) * 1000; + assert(rDist <= 0.6); + }); + it("should convert to J2000 within 0.0004m/s", () => { + const vDist = j2kState.velocity.distance(testState.velocity) * 1000; + assert(vDist <= 0.0004); + }); +}); diff --git a/src/test/propagator-test.ts b/src/test/propagator-test.ts new file mode 100644 index 0000000..e7c44ff --- /dev/null +++ b/src/test/propagator-test.ts @@ -0,0 +1,56 @@ +import * as assert from "assert"; +import { + EpochUTC, + J2000, + KeplerPropagator, + RungeKutta4Propagator, + Vector3D +} from "../index"; +import { DataHandler } from "../data/data-handler"; + +DataHandler.setFinalsData([ + "181220 58472.00 I 0.111682 0.000013 0.267043 0.000011 I-0.0268992 0.0000042 0.8116 0.0029 I -107.187 1.028 -6.992 0.043", + "181221 58473.00 I 0.109899 0.000013 0.266778 0.000012 I-0.0276299 0.0000041 0.6550 0.0031 I -107.216 1.028 -6.947 0.043", + "181222 58474.00 I 0.107885 0.000012 0.266558 0.000012 I-0.0282132 0.0000046 0.5105 0.0030 I -107.320 1.028 -7.168 0.043" +]); + +const state = new J2000( + EpochUTC.fromDateString("2018-12-21T00:00:00.000Z"), + new Vector3D(-1117.913276, 73.093299, -7000.018272), + new Vector3D(3.531365461, 6.583914964, -0.495649656) +); + +const epoch = EpochUTC.fromDateString("2018-12-22T00:00:00.000Z"); + +const rk4Prop = new RungeKutta4Propagator(state); +const kepProp = new KeplerPropagator(state.toClassicalElements()); + +describe("KeplerPropagator", () => { + describe("two-body", () => { + rk4Prop.reset(); + rk4Prop.setStepSize(10); + rk4Prop.forceModel.clearModel(); + rk4Prop.forceModel.setEarthGravity(0, 0); + kepProp.reset(); + const rk4Result = rk4Prop.propagate(epoch).position; + const kepResult = kepProp.propagate(epoch).position; + it("should be within 1m of numerical two-body after 24 hours", () => { + assert(kepResult.distance(rk4Result) < 0.001); + }); + }); +}); + +describe("RungeKutta4Propagator", () => { + describe("high-accuracy", () => { + rk4Prop.reset(); + rk4Prop.setStepSize(10); + rk4Prop.forceModel.clearModel(); + rk4Prop.forceModel.setEarthGravity(50, 50); + rk4Prop.forceModel.setThirdBody(true, true); + const actual = rk4Prop.propagate(epoch).position; + const expected = new Vector3D(-212.125533, -2464.351601, 6625.907454); + it("should be within 25m of real-world ephemeris after 24 hours", () => { + assert(expected.distance(actual) < 0.025); + }); + }); +}); diff --git a/src/test/test-bodies.ts b/src/test/test-bodies.ts deleted file mode 100644 index d81046a..0000000 --- a/src/test/test-bodies.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { assert } from "chai"; -import * as bodies from "../bodies"; -import { Epoch } from "../epoch"; -import { Vector } from "../vector"; - -describe("bodies", () => { - const testEpoch = new Epoch(Date.UTC(2017, 5, 27, 7, 6, 33, 584)); - const testPosition = new Vector( - 4.1285334206e4, - 7.434716817e3, - -3.676240106e3 - ); - - describe("#precession()", () => { - it("should calculate precession angles", () => { - const pVals = bodies.precession(testEpoch); - assert.deepEqual(pVals, [ - 0.0019551413267373313, - 0.0016990899951803613, - 0.0019552588475936637 - ]); - }); - }); - - describe("#nutation()", () => { - it("should calculate nutation angles", () => { - const nVals = bodies.nutation(testEpoch); - assert.deepEqual(nVals, [ - -0.000043867325425733865, - -0.000040239886445427816, - 0.4090531153388292 - ]); - }); - }); - - describe("#atmosphericDensity()", () => { - it("should return atmospheric density", () => { - const aDens = bodies.atmosphericDensity(testPosition); - assert.equal(aDens, 1.5721664203116942e-71); - }); - }); - - describe("#moonPosition()", () => { - it("should return the position of the Moon", () => { - const moonPos = bodies.moonPosition(testEpoch); - assert.deepEqual(moonPos.state, [ - -282809.2858974682, - 220295.82569754496, - 91509.42449112915 - ]); - }); - }); - - describe("#sunPosition()", () => { - it("should return the position of the Sun", () => { - const sunPos = bodies.sunPosition(testEpoch); - assert.deepEqual(sunPos.state, [ - -15469334.826931607, - 138805771.37745005, - 60173122.43849363 - ]); - }); - }); -}); diff --git a/src/test/test-constructs.ts b/src/test/test-constructs.ts deleted file mode 100644 index bb8e951..0000000 --- a/src/test/test-constructs.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { assert } from "chai"; -import { RAD2DEG } from "../constants"; -import { Satellite } from "../constructs/satellite"; -import { J2000 } from "../coordinates/j2000"; -import { RungeKutta4 } from "../propagators/runge-kutta-4"; - -describe("Satellite", () => { - describe("#footprint()", () => { - it("should calculate swath angle using cached state", () => { - const state = new J2000(0, 42164, 0, 0, 0, 0, 0); - const satellite = new Satellite(new RungeKutta4(state)); - const footprint = satellite.footprint() * RAD2DEG; - assert.equal(footprint, 81.30928342062306); - }); - }); - - describe("#earthRadius()", () => { - const state = new J2000(0, 42164, 0, 0, 0, 0, 0); - const satellite = new Satellite(new RungeKutta4(state)); - const radius = satellite.earthRadius() * RAD2DEG; - it("should return the Earth's angular radius", () => { - assert.equal(radius, 8.690716579376947); - }); - }); -}); diff --git a/src/test/test-coordinates.ts b/src/test/test-coordinates.ts deleted file mode 100644 index 991b9f7..0000000 --- a/src/test/test-coordinates.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { assert } from "chai"; -import { DEG2RAD, RAD2DEG } from "../constants"; -import { EarthCenteredFixed } from "../coordinates/earth-centered-fixed"; -import { Geodetic } from "../coordinates/geodetic"; -import { J2000 } from "../coordinates/j2000"; -import { KeplerianElements } from "../coordinates/keplerian-elements"; - -const TEST_J2K = new J2000(0, 8228, 389, 6888, -0.7, 6.6, -0.6); - -const TEST_KEPLER = new KeplerianElements( - 0, - 13360.642770119148, - 0.22049791840816513, - DEG2RAD * 39.93754927254844, - DEG2RAD * 269.85555147445865, - DEG2RAD * 125.72438198841463, - DEG2RAD * 326.46253415447933 -); - -describe("J2000", () => { - describe("#.toKeplerian()", () => { - it("should convert to Keplerian elements", () => { - const { epoch, a, e, i, o, w, v } = TEST_J2K.toKeplerian(); - assert.equal(epoch.unix, TEST_J2K.epoch.unix); - assert.equal(a, 13360.642770119148); - assert.equal(e, 0.22049791840816513); - assert.equal(i * RAD2DEG, 39.93754927254844); - assert.equal(o * RAD2DEG, 269.85555147445865); - assert.equal(w * RAD2DEG, 125.72438198841463); - assert.equal(v * RAD2DEG, 326.46253415447933); - }); - }); -}); - -describe("KeplerianElements", () => { - describe("#.toJ2K()", () => { - it("should convert to J2000 cartesian coordinates", () => { - const { epoch, position, velocity } = TEST_KEPLER.toJ2K(); - assert.equal(epoch.unix, TEST_KEPLER.epoch.unix); - assert.deepEqual(position.state, [ - 8228, - 389.0000000000039, - 6888.000000000001 - ]); - assert.deepEqual(velocity.state, [ - -0.7000000000000014, - 6.6000000000000005, - -0.6000000000000014 - ]); - }); - }); -}); - -describe("Topocentric", () => { - describe("#.toLookAngle()", () => { - it("should convert to look angles", () => { - const center = new EarthCenteredFixed(42164, 0, 0) - .toTopocentric(new Geodetic(0, 0, 0)) - .toLookAngle(); - assert.equal(center.azimuth * RAD2DEG, 180); - assert.equal(center.elevation * RAD2DEG, 90); - assert.equal(center.range, 35785.8637); - const north = new EarthCenteredFixed(42164, 0, 0) - .toTopocentric(new Geodetic(45 * DEG2RAD, 0, 0)) - .toLookAngle(); - assert.equal(north.azimuth * RAD2DEG, 180); - assert.equal(north.elevation * RAD2DEG, 38.20257303057648); - assert.equal(north.range, 37912.906092388876); - const south = new EarthCenteredFixed(42164, 0, 0) - .toTopocentric(new Geodetic(-45 * DEG2RAD, 0, 0)) - .toLookAngle(); - assert.equal(south.azimuth * RAD2DEG, 0); - assert.equal(south.elevation * RAD2DEG, 38.20257303057648); - assert.equal(south.range, 37912.906092388876); - const east = new EarthCenteredFixed(42164, 0, 0) - .toTopocentric(new Geodetic(0, 45 * DEG2RAD, 0)) - .toLookAngle(); - assert.equal(east.azimuth * RAD2DEG, 270); - assert.equal(east.elevation * RAD2DEG, 38.16990789263988); - assert.equal(east.range, 37923.10987953692); - const west = new EarthCenteredFixed(42164, 0, 0) - .toTopocentric(new Geodetic(0, -45 * DEG2RAD, 0)) - .toLookAngle(); - assert.equal(west.azimuth * RAD2DEG, 90); - assert.equal(west.elevation * RAD2DEG, 38.16990789263988); - assert.equal(west.range, 37923.10987953692); - }); - }); -}); diff --git a/src/test/test-epoch.ts b/src/test/test-epoch.ts deleted file mode 100644 index fc23c88..0000000 --- a/src/test/test-epoch.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { assert } from "chai"; -import { Epoch } from "../epoch"; - -describe("Epoch", () => { - const testEpoch = new Epoch(Date.UTC(2017, 5, 27, 7, 6, 33, 584)); - - describe("#roll()", () => { - it("should change the epoch time", () => { - const epRoll = testEpoch.roll(86400); - assert.equal(epRoll.unix, 1498633593.584); - }); - }); - - describe("#toJulianDate()", () => { - it("should calculate the Julian Date", () => { - assert.equal(testEpoch.julianDate, 2457931.796222037); - }); - }); - - describe("#getLeapSecondOffset()", () => { - it("should return the leap-second offset", () => { - assert.equal(testEpoch.leapSecondsOffset, 37); - }); - }); - - describe("#toTerrestrialCenturies()", () => { - it("should calculate Terrestrial Centuries", () => { - assert.equal(testEpoch.terrestrialCenturies, 0.17486097256065913); - }); - }); - - describe("#toJulianCenturies()", () => { - it("should calculate Julian Centuries", () => { - assert.equal(testEpoch.julianCenturies, 0.17486095063756796); - }); - }); - - describe("#getGMSTAngle()", () => { - it("should calculate the GMST angle", () => { - assert.equal(testEpoch.gmstAngle, 0.38797689926765666); - }); - }); -}); diff --git a/src/test/test-forces.ts b/src/test/test-forces.ts deleted file mode 100644 index f09b390..0000000 --- a/src/test/test-forces.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { assert } from "chai"; -import { Epoch } from "../epoch"; -import * as forces from "../forces"; -import { Vector } from "../vector"; - -const TEST_EPOCH = new Epoch(Date.UTC(2017, 5, 27, 7, 6, 33, 584)); - -const TEST_POSITION = new Vector(4.1285334206e4, 7.434716817e3, -3.676240106e3); - -const TEST_VELOCITY = new Vector(-5.3281e-1, 3.030355, 1.05016e-1); - -describe("forces", () => { - describe("#gravityEarth()", () => { - it("should compute acceleration due to Earth gravity", () => { - const earthAcc = forces.earthSpherical(TEST_POSITION); - assert.deepEqual(earthAcc.state, [ - -0.00022037980931088386, - -0.00003968628342053639, - 0.000019623653510925474 - ]); - }); - }); - - describe("#gravityMoon()", () => { - it("should compute acceleration due to Moon gravity", () => { - const moonAcc = forces.gravityMoon(TEST_EPOCH, TEST_POSITION); - assert.deepEqual(moonAcc.state, [ - 2.4118241499517503e-9, - -4.928790594365748e-9, - -1.526286361618321e-9 - ]); - }); - }); - - describe("#gravitySun()", () => { - it("should compute acceleration due to Sun gravity", () => { - const sunAcc = forces.gravitySun(TEST_EPOCH, TEST_POSITION); - assert.deepEqual(sunAcc.state, [ - -1.5708452032806065e-9, - -1.642083599602331e-10, - 1.8915359419403605e-10 - ]); - }); - }); - - describe("#solarRadiation()", () => { - it("should compute acceleration due to solar radiation", () => { - const srAcc = forces.solarRadiation( - TEST_EPOCH, - TEST_POSITION, - 1000, - 1, - 1.4 - ); - assert.deepEqual(srAcc.state, [ - -6.468125663392147e-13, - 5.788066976458911e-12, - 2.5094489571027267e-12 - ]); - }); - }); - - describe("#atmosphericDrag()", () => { - it("should compute acceleration due to atmospheric drag", () => { - const adAcc = forces.atmosphericDrag( - TEST_POSITION, - TEST_VELOCITY, - 1000, - 1, - 2.2 - ); - assert.deepEqual(adAcc.state, [ - -1.7323209434508467e-74, - -3.669569925336681e-74, - -1.9481607545554463e-73 - ]); - }); - }); -}); diff --git a/src/test/test-operations.ts b/src/test/test-operations.ts deleted file mode 100644 index 2540edf..0000000 --- a/src/test/test-operations.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { assert } from "chai"; -import * as operations from "../operations"; - -describe("operations", () => { - describe("#factorial()", () => { - it("should return the factorial of the input", () => { - assert.equal(operations.factorial(10), 3628800); - }); - }); - - describe("#evalPoly()", () => { - it("should evaluate a polynomial", () => { - assert.equal(operations.evalPoly(3, [1, 2, 3]), 34); - }); - }); - - describe("#sign()", () => { - it("should return the sign of the input", () => { - assert.equal(operations.sign(1), 1); - assert.equal(operations.sign(-1), -1); - assert.equal(operations.sign(0), 0); - }); - }); -}); diff --git a/src/test/test-propagators.ts b/src/test/test-propagators.ts deleted file mode 100644 index 0c83459..0000000 --- a/src/test/test-propagators.ts +++ /dev/null @@ -1,283 +0,0 @@ -import { assert } from "chai"; -import { J2000 } from "../coordinates/j2000"; -import { Interpolator } from "../propagators/interpolator"; -import { Kepler } from "../propagators/kepler"; -import { RungeKutta4 } from "../propagators/runge-kutta-4"; - -/** - * (a) Semimajor Axis: 42165.052 km - * (e) Eccentricity: 0.001723 - * (i) Inclination: 5.3802° - * (Ω) Right Ascension: 78.7240° - */ -const GEO_PERIOD = [ - new J2000( - Date.UTC(2017, 5, 27, 7, 6, 33, 584), - 4.1285334206e4, - 7.434716817e3, - -3.676240106e3, - -5.3281e-1, - 3.030355, - 1.05016e-1 - ), - new J2000( - Date.UTC(2017, 5, 27, 13, 6, 33, 584), - -7.54402452534e3, - 4.15051976949e4, - 1.46135663491e3, - -3.00934568722, - -5.52507917363e-1, - 2.67798152794e-1 - ), - new J2000( - Date.UTC(2017, 5, 27, 19, 6, 33, 584), - -4.13604755301e4, - -7.62935881401e3, - 3.68034831979e3, - 5.50737740226e-1, - -3.01903793887, - -1.06463779436e-1 - ), - new J2000( - Date.UTC(2017, 5, 28, 7, 6, 33, 584), - 4.11526359989e4, - 8.14874780238e3, - -3.65210292647e3, - -5.84795155962e-1, - 3.02059500637, - 1.09651877768e-1 - ) -]; - -/** - * (a) Semimajor Axis: 20726.300 km - * (e) Eccentricity: 0.031591 - * (i) Inclination: 83.9278° - * (Ω) Right Ascension: 337.8636° - */ -const TEST_STATE_1 = [ - new J2000( - Date.UTC(2019, 10, 10, 19, 18, 1, 259), - 1886.241127, - -3045.971781, - -19841.316189, - 4.163012315, - -1.6277958, - 0.572183403 - ), - new J2000( - Date.UTC(2019, 10, 12, 9, 36, 4, 449), - -15086.432881, - 7555.644808, - 12268.091553, - -2.427587367, - 0.578532906, - -3.571952678 - ) -]; - -/** - * (a) Semimajor Axis: 21467.888 km - * (e) Eccentricity: 0.064043 - * (i) Inclination: 82.0279° - * (Ω) Right Ascension: 58.0407° - */ -const TEST_STATE_2 = [ - new J2000( - Date.UTC(2018, 7, 2, 3, 19, 30, 764), - 10766.413859, - 17060.152654, - -744.501313, - -0.504478539, - 0.389800939, - 4.529557487 - ), - new J2000( - Date.UTC(2018, 7, 3, 18, 1, 28, 409), - -12257.2953, - -18305.120151, - 4979.283427, - -0.095936284, - -1.187562397, - -3.912693552 - ) -]; - -/** - * (a) Semimajor Axis: 28875.588 km - * (e) Eccentricity: 0.260648 - * (i) Inclination: 87.3031° - * (Ω) Right Ascension: 177.9062° - */ -const TEST_STATE_3 = [ - new J2000( - Date.UTC(2018, 10, 30, 16, 14, 2, 696), - -33154.628126, - 941.711796, - 5736.970031, - -0.112147894, - -0.143809195, - 3.137874036 - ), - new J2000( - Date.UTC(2018, 11, 2, 14, 25, 29, 102), - 8510.666216, - -1738.198088, - 30240.749743, - 2.940719342, - -0.027613773, - -1.697921358 - ) -]; - -/** - * (a) Semimajor Axis: 6783.063 km - * (e) Eccentricity: 0.000745 - * (i) Inclination: 51.5397° - * (Ω) Right Ascension: 282.2575° - */ -const TEST_STATE_4 = [ - new J2000( - Date.UTC(2018, 6, 6, 12, 0, 0, 0), - 4012.3318, - -3811.33296, - 3917.51571, - 1.941806414, - 6.215850084, - 4.05032976 - ), - new J2000( - Date.UTC(2018, 6, 7, 12, 0, 0, 0), - -4170.83299, - 2275.13615, - -4844.49545, - -1.056742703, - -7.178017864, - -2.460646905 - ) -]; - -describe("RungeKutta4", () => { - describe("#propagate()", () => { - const [GEO_0HR, GEO_6HR, GEO_12HR, GEO_24HR] = GEO_PERIOD; - const rk4 = new RungeKutta4(GEO_0HR, { stepSize: 60 }); - it("should have an error less than 50 meters after 6 hours", () => { - const { position } = rk4.propagate(GEO_6HR.epoch.millis); - const dist = position.distance(GEO_6HR.position) * 1000; - assert.isBelow(dist, 50); - }); - it("should have an error less than 100 meters after 12 hours", () => { - const { position } = rk4.propagate(GEO_12HR.epoch.millis); - const dist = position.distance(GEO_12HR.position) * 1000; - assert.isBelow(dist, 100); - }); - it("should have an error less than 200 meters after 24 hours", () => { - const { position } = rk4.propagate(GEO_24HR.epoch.millis); - const dist = position.distance(GEO_24HR.position) * 1000; - assert.isBelow(dist, 200); - }); - it("should propagate test state #1 within 700 meters", () => { - const [testStart, testEnd] = TEST_STATE_1; - const testProp = new RungeKutta4(testStart, { stepSize: 60 }); - const { position } = testProp.propagate(testEnd.epoch.millis); - const dist = position.distance(testEnd.position) * 1000; - assert.isBelow(dist, 700); - }); - it("should propagate test state #2 within 600 meters", () => { - const [testStart, testEnd] = TEST_STATE_2; - const testProp = new RungeKutta4(testStart, { stepSize: 60 }); - const { position } = testProp.propagate(testEnd.epoch.millis); - const dist = position.distance(testEnd.position) * 1000; - assert.isBelow(dist, 600); - }); - it("should propagate test state #3 within 300 meters", () => { - const [testStart, testEnd] = TEST_STATE_3; - const testProp = new RungeKutta4(testStart, { stepSize: 60 }); - const { position } = testProp.propagate(testEnd.epoch.millis); - const dist = position.distance(testEnd.position) * 1000; - assert.isBelow(dist, 300); - }); - it("should propagate test state #4 within 3250 meters", () => { - const [testStart, testEnd] = TEST_STATE_4; - const testProp = new RungeKutta4(testStart, { stepSize: 30 }); - const { position } = testProp.propagate(testEnd.epoch.millis); - const dist = position.distance(testEnd.position) * 1000; - assert.isBelow(dist, 3250); - }); - }); -}); - -describe("Kepler", () => { - describe("#step()", () => { - it("should match numerical two-body results", () => { - const state = new J2000( - Date.UTC(2017, 10, 16, 0, 11, 30, 195), - -3.8623494373e4, - 1.6869763376e4, - 1.004344449e3, - -1.231249, - -2.810612, - -2.01294e-1 - ); - const propRk = RungeKutta4.twoBody(state, { stepSize: 300 }); - const resultRk = propRk.step( - Date.UTC(2017, 10, 16, 0, 11, 30, 195), - 21600, - 6 - ); - const propKep = new Kepler(state.toKeplerian()); - const resultKep = propKep.step( - Date.UTC(2017, 10, 16, 0, 11, 30, 195), - 21600, - 6 - ); - for (let i = 0; i < resultRk.length; i++) { - const dist = - resultRk[i].position.distance(resultKep[i].position) * 1000; - assert.isBelow(dist, 5); - } - }); - }); -}); - -describe("Interpolator", () => { - describe("#propagate()", () => { - const state = new J2000( - Date.UTC(2017, 10, 16, 0, 11, 30, 195), - -3.8623494373e4, - 1.6869763376e4, - 1.004344449e3, - -1.231249, - -2.810612, - -2.01294e-1 - ); - const rk4 = new RungeKutta4(state); - const j2ks = rk4.step(Date.UTC(2017, 10, 17), 900, 96); - rk4.reset(); - const expected = rk4.step(Date.UTC(2017, 10, 17), 60, 1440); - const interpLinear = new Interpolator(j2ks, { method: "linear" }); - const interpVerlet = new Interpolator(j2ks, { method: "verlet" }); - it("should be within 25km of expected using the linear method", () => { - expected.forEach(element => { - const actual = interpLinear.propagate(element.epoch.millis); - const dist = actual.position.distance(element.position); - assert.isBelow(dist, 50); - }); - }); - it("should be within 5m of expected using the Verlet method", () => { - expected.forEach(element => { - const actual = interpVerlet.propagate(element.epoch.millis); - const dist = actual.position.distance(element.position) * 1000; - assert.isBelow(dist, 10); - }); - }); - it("should throw RangeError if outside data range", () => { - assert.throws(() => { - interpVerlet.propagate(Date.UTC(2017, 10, 16, 23, 59, 59, 999)); - }, RangeError); - assert.throws(() => { - interpVerlet.propagate(Date.UTC(2017, 10, 18, 0, 0, 0, 1)); - }, RangeError); - }); - }); -}); diff --git a/src/test/test-vector.ts b/src/test/test-vector.ts deleted file mode 100644 index c151c41..0000000 --- a/src/test/test-vector.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { assert } from "chai"; -import { Vector } from "../vector"; - -describe("Vector", () => { - const vecA = new Vector(1, 2, 3); - const vecB = new Vector(4, 5, 6); - const vecR = new Vector(1, 1, 1); - - it("should fail when creating an empty vector", () => { - assert.throws(() => Vector.origin(0)); - }); - - describe("#slice()", () => { - const vecASlice = vecA.slice(1, 3); - it("should shorten the vector state length", () => { - assert.deepEqual(vecASlice.state, [2, 3]); - }); - }); - - describe("#magnitude()", () => { - const vecAMag = vecA.magnitude; - it("should return the vector magnitude", () => { - assert.equal(vecAMag, 3.7416573867739413); - }); - }); - - describe("#origin()", () => { - const vecOrig = Vector.origin(3); - it("should create a vector with zero state fields", () => { - assert.deepEqual(vecOrig.state, [0, 0, 0]); - }); - }); - - describe("#distance()", () => { - const vecDist = vecA.distance(vecB); - it("should return the distance between two vectors", () => { - assert.equal(vecDist, 5.196152422706632); - }); - }); - - describe("#add()", () => { - const vecAdd = vecA.add(vecB); - it("should return the sum of two vectors", () => { - assert.deepEqual(vecAdd.state, [5, 7, 9]); - }); - }); - - describe("#concat()", () => { - const vecConcat = vecA.concat(vecB); - it("should return the concatenated state of two vectors", () => { - assert.deepEqual(vecConcat.state, [1, 2, 3, 4, 5, 6]); - }); - }); - - describe("#scale()", () => { - const vecScale = vecA.scale(2); - it("should linearly scale the vector", () => { - assert.deepEqual(vecScale.state, [2, 4, 6]); - }); - }); - - describe("#normalize()", () => { - const vecNorm = vecA.normalized; - it("should return a unit vector", () => { - assert.deepEqual(vecNorm.state, [ - 0.2672612419124244, - 0.5345224838248488, - 0.8017837257372732 - ]); - assert.equal(vecNorm.magnitude, 1); - }); - }); - - describe("#cross()", () => { - const vecCross = vecA.cross(vecB); - it("should return the cross product of two vectors", () => { - assert.deepEqual(vecCross.state, [-3, 6, -3]); - }); - }); - - describe("#dot()", () => { - const vecDot = vecA.dot(vecB); - it("should return the dot product of two vectors", () => { - assert.equal(vecDot, 32); - }); - }); - - describe("#rot1()", () => { - const vecRot1 = vecR.rot1(Math.PI); - it("should rotate the vector along the x-axis", () => { - assert.deepEqual(vecRot1.state.map(Math.round), [1, -1, -1]); - }); - }); - - describe("#rot2()", () => { - const vecRot2 = vecR.rot2(Math.PI); - it("should rotate the vector along the y-axis", () => { - assert.deepEqual(vecRot2.state.map(Math.round), [-1, 1, -1]); - }); - }); - - describe("#rot3()", () => { - const vecRot3 = vecR.rot3(Math.PI); - it("should rotate the vector along the z-axis", () => { - assert.deepEqual(vecRot3.state.map(Math.round), [-1, -1, 1]); - }); - }); - - describe("#angle()", () => { - const v1 = new Vector(2, -4, -1); - const v2 = new Vector(0, 5, 2); - it("should compute the angle between two vectors", () => { - assert.equal(v1.angle(v2), 2.671408755771823); - }); - }); - - describe("#changeOrigin()", () => { - const origin = new Vector(3, 3); - const p1 = new Vector(1, 1); - const p2 = new Vector(-1, 1); - it("should output the vector given a different origin", () => { - assert.deepEqual(p1.changeOrigin(origin).state, [-2, -2]); - assert.deepEqual(p2.changeOrigin(origin).state, [-4, -2]); - }); - }); -}); diff --git a/src/time/abstract-epoch.ts b/src/time/abstract-epoch.ts new file mode 100644 index 0000000..489d4e5 --- /dev/null +++ b/src/time/abstract-epoch.ts @@ -0,0 +1,52 @@ +/** Base class for representing epochs. */ +export abstract class AbstractEpoch { + /** Seconds since 1 January 1970, 00:00 UTC. */ + public readonly unix: number; + + /** + * Create a new Epoch object. + * + * @param millis milliseconds since 1 January 1970, 00:00 UTC + */ + constructor(millis: number) { + this.unix = millis / 1000; + } + + /** + * Calculate the difference between this and another epoch, in seconds. + * + * @param epoch comparison epoch + */ + public difference(epoch: AbstractEpoch) { + return this.unix - epoch.unix; + } + + /** + * Return true if this and another epoch are equal. + * + * @param epoch comparison epoch + */ + public equals(epoch: AbstractEpoch) { + return this.unix == epoch.unix; + } + + /** Convert this to a JavaScript Date object. */ + public toDate() { + return new Date(this.unix * 1000); + } + + /** String representation of this object. */ + public toString() { + return this.toDate().toISOString(); + } + + /** Convert this to a Julian Date. */ + public toJulianDate() { + return this.unix / 86400 + 2440587.5; + } + + /** Convert this to Julian Centuries. */ + public toJulianCenturies() { + return (this.toJulianDate() - 2451545) / 36525; + } +} diff --git a/src/time/epoch-utc.ts b/src/time/epoch-utc.ts new file mode 100644 index 0000000..ee153ac --- /dev/null +++ b/src/time/epoch-utc.ts @@ -0,0 +1,92 @@ +import { DataHandler } from "../data/data-handler"; +import { DEG2RAD, TWO_PI } from "../math/constants"; +import { evalPoly } from "../math/operations"; +import { AbstractEpoch } from "./abstract-epoch"; +import { EpochTAI, EpochTDB, EpochTT, EpochUT1 } from "./time-scales"; + +/** Class representing a UTC astrodynamic epoch. */ +export class EpochUTC extends AbstractEpoch { + /** + * Create a new Epoch object. + * + * @param millis milliseconds since 1 January 1970, 00:00 UTC + */ + constructor(millis: number) { + super(millis); + } + + /** + * Create a new EpochUTC object from a valid JavaScript Date string. + * + * @param dateStr + */ + public static fromDateString(dateStr: string) { + return new EpochUTC(new Date(dateStr).getTime()); + } + + /** Return a new Epoch object, containing current time. */ + public static now(): EpochUTC { + return new EpochUTC(new Date().getTime()); + } + + /** + * Return a new Epoch, incremented by some desired number of seconds. + * + * @param seconds seconds to increment (can be negative) + */ + public roll(seconds: number): EpochUTC { + return new EpochUTC((this.unix + seconds) * 1000); + } + + /** Convert to UNSO Modified Julian Date. */ + public toMjd() { + return this.toJulianDate() - 2400000.5; + } + + /** Convert to GSFC Modified Julian Date. */ + public toMjdGsfc() { + return this.toJulianDate() - 2400000.5 - 29999.5; + } + + /** Convert to a UT1 Epoch. */ + public toUT1() { + const { dut1 } = DataHandler.getFinalsData(this.toMjd()); + return new EpochUT1((this.unix + dut1) * 1000); + } + + /** Convert to an International Atomic Time (TAI) Epoch. */ + public toTAI() { + const ls = DataHandler.leapSecondsOffset(this.toJulianDate()); + return new EpochTAI((this.unix + ls) * 1000); + } + + /** Convert to a Terrestrial Time (TT) Epoch. */ + public toTT() { + return new EpochTT((this.toTAI().unix + 32.184) * 1000); + } + + /** Convert to a Barycentric Dynamical Time (TDB) Epoch. */ + public toTDB() { + const tt = this.toTT(); + const tTT = tt.toJulianCenturies(); + const mEarth = (357.5277233 + 35999.05034 * tTT) * DEG2RAD; + const seconds = + 0.001658 * Math.sin(mEarth) + 0.00001385 * Math.sin(2 * mEarth); + return new EpochTDB((tt.unix + seconds) * 1000); + } + + /** + * Calculate the Greenwich Mean Sideral Time (GMST) angle for this epoch, + * in radians. + */ + public gmstAngle() { + const t = this.toUT1().toJulianCenturies(); + const seconds = evalPoly(t, [ + 67310.54841, + 876600.0 * 3600.0 + 8640184.812866, + 0.093104, + 6.2e-6 + ]); + return ((seconds % 86400) / 86400) * TWO_PI; + } +} diff --git a/src/time/time-scales.ts b/src/time/time-scales.ts new file mode 100644 index 0000000..8728406 --- /dev/null +++ b/src/time/time-scales.ts @@ -0,0 +1,29 @@ +import { AbstractEpoch } from "./abstract-epoch"; + +/** UT1 Epoch */ +export class EpochUT1 extends AbstractEpoch { + constructor(millis: number) { + super(millis); + } +} + +/** International Atomic Time (TAI) Epoch */ +export class EpochTAI extends AbstractEpoch { + constructor(millis: number) { + super(millis); + } +} + +/** Terrestrial Time (TT) Epoch */ +export class EpochTT extends AbstractEpoch { + constructor(millis: number) { + super(millis); + } +} + +/** Barycentric Dynamical Time (TDB) Epoch */ +export class EpochTDB extends AbstractEpoch { + constructor(millis: number) { + super(millis); + } +} diff --git a/src/vector.ts b/src/vector.ts deleted file mode 100644 index 0f1e76b..0000000 --- a/src/vector.ts +++ /dev/null @@ -1,272 +0,0 @@ -/** Class representing an arbitrary length vector. */ -export class Vector { - /** - * Create a new Vector object, containing zero for each state element. - * - * @param n vector length, expressed as a positive integer - */ - public static origin(n: number): Vector { - const output = []; - for (let i = 0; i < Math.floor(Math.abs(n)); i++) { - output.push(0); - } - return Vector.fromArray(output); - } - - /** - * Create a new Vector object, using the elements of an Array. - * - * @param values vector elements - */ - public static fromArray(values: number[]): Vector { - return new Vector(...values); - } - - /** Vector state elements. */ - public readonly state: number[]; - - /** - * Create a new Vector object. - * - * Vectors can have an arbitrary number state elements, but cannot be empty. - * An error will be thrown if no elements are provided. - * - * @param elements vector elements - */ - constructor(...elements: number[]) { - if (elements.length === 0) { - throw new Error("Vector elements cannot be empty."); - } - this.state = elements; - } - - /** Return a string representation of this state. */ - public toString(): string { - const fixArray = this.state.map(x => parseFloat(x.toFixed(3))); - return `[ ${fixArray.join(", ")} ]`; - } - - /** - * Return a subset of the state elements as a new Vector object. - * - * Works in a similar way to JavaScript's Array.slice(). - * - * @param start integer specifying the selection start - * @param end integer specifying where to end the selection - */ - public slice(start: number, end: number): Vector { - return Vector.fromArray(this.state.slice(start, end)); - } - - /** Return the magnitude of this object. */ - get magnitude(): number { - const sq = this.state.map(x => x * x); - const sum = sq.reduce((a, b) => a + b); - return Math.sqrt(sum); - } - - /** - * Calculate the Euclidean distance between this and another Vector. - * - * Throws an error if argument and this dimensions do not match. - * - * @param v the other vector - */ - public distance(v: Vector): number { - this.isDimensionMatched(v); - let sqDiff = 0; - for (let i = 0; i < this.state.length; i++) { - const diff = this.state[i] - v.state[i]; - sqDiff += diff * diff; - } - return Math.sqrt(sqDiff); - } - - /** - * Perform element-wise addition of this and another Vector. - * - * Returns a new Vector object containing the sum. Throws an error if - * argument and this dimensions do not match. - * - * @param v the other vector - */ - public add(v: Vector): Vector { - this.isDimensionMatched(v); - const output = []; - for (let i = 0; i < this.state.length; i++) { - output.push(this.state[i] + v.state[i]); - } - return Vector.fromArray(output); - } - - /** - * Concatinate the elements of this and another Vector. - * - * Returns a new Vector object containing the combined state. - * - * @param v the other vector - */ - public concat(v: Vector): Vector { - let output: number[] = []; - output = output.concat(this.state); - output = output.concat(v.state); - return Vector.fromArray(output); - } - - /** - * Linearly scale the elements of this. - * - * Returns a new Vector object containing the scaled state. - * - * @param n a scalar value - */ - public scale(n: number): Vector { - return Vector.fromArray(this.state.map(x => x * n)); - } - - public pow(n: number): Vector { - const pState = this.state.map(x => Math.pow(x, n)); - return Vector.fromArray(pState); - } - - /** - * Return the normalized (unit vector) form of this as a new Vector object. - */ - get normalized(): Vector { - const m = this.magnitude; - return Vector.fromArray(this.state.map(x => x / m)); - } - - /** - * Calculate the cross product of this and another Vector. - * - * Returns the result as a new Vector object. Throws an error if both Vector - * dimensions are not equal to `3`. - * - * @param v the other vector - */ - public cross(v: Vector): Vector { - this.isDimensionMatched(v); - this.isDimensionEqual(3); - const [x, y, z] = this.state; - const [vx, vy, vz] = v.state; - return new Vector(y * vz - z * vy, z * vx - x * vz, x * vy - y * vx); - } - - /** - * Calculate the dot product this and another Vector. - * - * Throws an error if argument and this dimensions do not match. - * - * @param v the other vector - */ - public dot(v: Vector): number { - this.isDimensionMatched(v); - let output = 0; - for (let i = 0; i < this.state.length; i++) { - output += this.state[i] * v.state[i]; - } - return output; - } - - /** - * Rotate the elements of this along the x-axis. - * - * Throws an error if this dimension is not equal to `3`. - * - * @param theta rotation angle, in radians - */ - public rot1(theta: number): Vector { - this.isDimensionEqual(3); - const cosT = Math.cos(theta); - const sinT = Math.sin(theta); - const [x, y, z] = this.state; - return new Vector( - 1 * x + 0 * y + 0 * z, - 0 * x + cosT * y + sinT * z, - 0 * x + -sinT * y + cosT * z - ); - } - - /** - * Rotate the elements of this along the y-axis. - * - * Throws an error if this dimension is not equal to `3`. - * - * @param theta rotation angle, in radians - */ - public rot2(theta: number): Vector { - this.isDimensionEqual(3); - const cosT = Math.cos(theta); - const sinT = Math.sin(theta); - const [x, y, z] = this.state; - return new Vector( - cosT * x + 0 * y + -sinT * z, - 0 * x + 1 * y + 0 * z, - sinT * x + 0 * y + cosT * z - ); - } - - /** - * Rotate the elements of this along the z-axis. - * - * Throws an error if this dimension is not equal to `3`. - * - * @param theta rotation angle, in radians - */ - public rot3(theta: number): Vector { - this.isDimensionEqual(3); - const cosT = Math.cos(theta); - const sinT = Math.sin(theta); - const [x, y, z] = this.state; - return new Vector( - cosT * x + sinT * y + 0 * z, - -sinT * x + cosT * y + 0 * z, - 0 * x + 0 * y + 1 * z - ); - } - - /** - * Calculate the angle, in radians, between this and another Vector. - * - * Throws an error if argument and this dimensions do not match. - * - * @param v the other vector - */ - public angle(v: Vector): number { - this.isDimensionMatched(v); - return Math.acos(this.dot(v) / (this.magnitude * v.magnitude)); - } - - /** - * Change coordinates of this to the relative position from a new origin. - * - * Throws an error if argument and this dimensions do not match. - * - * @param origin new origin - */ - public changeOrigin(origin: Vector): Vector { - this.isDimensionMatched(origin); - const delta = origin.scale(-1); - return this.add(delta); - } - - /** Return the vector state dimension. */ - get dimension(): number { - return this.state.length; - } - - /** Throw an error if dimensions do not match argument. */ - private isDimensionMatched(v: Vector): void { - if (this.dimension !== v.dimension) { - throw new Error("Argument dimension doesn't match this."); - } - } - - /** Throw an error if dimensions do not equal argument. */ - private isDimensionEqual(n: number): void { - if (this.dimension !== n) { - throw new Error(`This dimension must equal: ${n}`); - } - } -} diff --git a/tsconfig.json b/tsconfig.json index fd6be84..f27cf0d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,9 +2,10 @@ "compilerOptions": { "target": "es5", "module": "commonjs", - "declaration": true, "outDir": "./dist", "rootDir": "./src", + "declaration": true, + "sourceMap": true, "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, diff --git a/tslint.json b/tslint.json deleted file mode 100644 index 376213a..0000000 --- a/tslint.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "defaultSeverity": "error", - "extends": ["tslint:recommended"], - "jsRules": {}, - "rules": { - "max-line-length": [true, 80], - "arrow-parens": false, - "trailing-comma": false - }, - "rulesDirectory": [] -} diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 701ad4b..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,24 +0,0 @@ -const path = require("path"); -const webpack = require("webpack"); -const UglifyJsPlugin = require("uglifyjs-webpack-plugin"); - -module.exports = { - mode: "production", - entry: { - "pious-squid": path.join(__dirname, "dist", "index.js"), - "pious-squid.min": path.join(__dirname, "dist", "index.js") - }, - output: { - path: path.join(__dirname, "bundle"), - filename: "[name].js", - library: "PiousSquid" - }, - optimization: { - minimize: true, - minimizer: [ - new UglifyJsPlugin({ - include: /\.min\.js$/ - }) - ] - } -};