////////////////////////////////////////////////////////////////////////////////
// base.js
////////////////////////////////////////////////////////////////////////////////

// Copyright 2013 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
//       copyright notice, this list of conditions and the following
//       disclaimer in the documentation and/or other materials provided
//       with the distribution.
//     * Neither the name of Google Inc. nor the names of its
//       contributors may be used to endorse or promote products derived
//       from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

if(typeof(WScript) === "undefined")
{
    var WScript = {
        Echo: print
    }
}

// Performance.now is used in latency benchmarks, the fallback is Date.now.
var performance = performance || {};
performance.now = (function() {
  return performance.now       ||
         performance.mozNow    ||
         performance.msNow     ||
         performance.oNow      ||
         performance.webkitNow ||
         Date.now;
})();

// Simple framework for running the benchmark suites and
// computing a score based on the timing measurements.


// A benchmark has a name (string) and a function that will be run to
// do the performance measurement. The optional setup and tearDown
// arguments are functions that will be invoked before and after
// running the benchmark, but the running time of these functions will
// not be accounted for in the benchmark score.
function Benchmark(name, doWarmup, doDeterministic, deterministicIterations, 
                   run, setup, tearDown, rmsResult, minIterations) {
  this.name = name;
  this.doWarmup = doWarmup;
  this.doDeterministic = doDeterministic;
  this.deterministicIterations = deterministicIterations;
  this.run = run;
  this.Setup = setup ? setup : function() { };
  this.TearDown = tearDown ? tearDown : function() { };
  this.rmsResult = rmsResult ? rmsResult : null; 
  this.minIterations = minIterations ? minIterations : 32;
}


// Benchmark results hold the benchmark and the measured time used to
// run the benchmark. The benchmark score is computed later once a
// full benchmark suite has run to completion. If latency is set to 0
// then there is no latency score for this benchmark.
function BenchmarkResult(benchmark, time, latency) {
  this.benchmark = benchmark;
  this.time = time;
  this.latency = latency;
}


// Automatically convert results to numbers. Used by the geometric
// mean computation.
BenchmarkResult.prototype.valueOf = function() {
  return this.time;
}


// Suites of benchmarks consist of a name and the set of benchmarks in
// addition to the reference timing that the final score will be based
// on. This way, all scores are relative to a reference run and higher
// scores implies better performance.
function BenchmarkSuite(name, reference, benchmarks) {
  this.name = name;
  this.reference = reference;
  this.benchmarks = benchmarks;
  BenchmarkSuite.suites.push(this);
}


// Keep track of all declared benchmark suites.
BenchmarkSuite.suites = [];

// Scores are not comparable across versions. Bump the version if
// you're making changes that will affect that scores, e.g. if you add
// a new benchmark or change an existing one.
BenchmarkSuite.version = '9';


// Defines global benchsuite running mode that overrides benchmark suite 
// behavior. Intended to be set by the benchmark driver. Undefined 
// values here allow a benchmark to define behaviour itself.
BenchmarkSuite.config = {
  doWarmup: undefined,
  doDeterministic: undefined
};


// Override the alert function to throw an exception instead.
alert = function(s) {
  throw "Alert called with argument: " + s;
};


// To make the benchmark results predictable, we replace Math.random
// with a 100% deterministic alternative.
BenchmarkSuite.ResetRNG = function() {
  Math.random = (function() {
    var seed = 49734321;
    return function() {
      // Robert Jenkins' 32 bit integer hash function.
      seed = ((seed + 0x7ed55d16) + (seed << 12))  & 0xffffffff;
      seed = ((seed ^ 0xc761c23c) ^ (seed >>> 19)) & 0xffffffff;
      seed = ((seed + 0x165667b1) + (seed << 5))   & 0xffffffff;
      seed = ((seed + 0xd3a2646c) ^ (seed << 9))   & 0xffffffff;
      seed = ((seed + 0xfd7046c5) + (seed << 3))   & 0xffffffff;
      seed = ((seed ^ 0xb55a4f09) ^ (seed >>> 16)) & 0xffffffff;
      return (seed & 0xfffffff) / 0x10000000;
    };
  })();
}


// Runs all registered benchmark suites and optionally yields between
// each individual benchmark to avoid running for too long in the
// context of browsers. Once done, the final score is reported to the
// runner.
BenchmarkSuite.RunSuites = function(runner, skipBenchmarks) {
  skipBenchmarks = typeof skipBenchmarks === 'undefined' ? [] : skipBenchmarks;
  var continuation = null;
  var suites = BenchmarkSuite.suites;
  var length = suites.length;
  BenchmarkSuite.scores = [];
  var index = 0;
  function RunStep() {
    while (continuation || index < length) {
      if (continuation) {
        continuation = continuation();
      } else {
        var suite = suites[index++];
        if (runner.NotifyStart) runner.NotifyStart(suite.name);
        if (skipBenchmarks.indexOf(suite.name) > -1) {
          suite.NotifySkipped(runner);
        } else {
          continuation = suite.RunStep(runner);
        }
      }
      if (continuation && typeof window != 'undefined' && window.setTimeout) {
        window.setTimeout(RunStep, 25);
        return;
      }
    }

    // show final result
    if (runner.NotifyScore) {
      var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores);
      var formatted = BenchmarkSuite.FormatScore(100 * score);
      runner.NotifyScore(formatted);
    }
  }
  RunStep();
}


// Counts the total number of registered benchmarks. Useful for
// showing progress as a percentage.
BenchmarkSuite.CountBenchmarks = function() {
  var result = 0;
  var suites = BenchmarkSuite.suites;
  for (var i = 0; i < suites.length; i++) {
    result += suites[i].benchmarks.length;
  }
  return result;
}


// Computes the geometric mean of a set of numbers.
BenchmarkSuite.GeometricMean = function(numbers) {
  var log = 0;
  for (var i = 0; i < numbers.length; i++) {
    log += Math.log(numbers[i]);
  }
  return Math.pow(Math.E, log / numbers.length);
}


// Computes the geometric mean of a set of throughput time measurements.
BenchmarkSuite.GeometricMeanTime = function(measurements) {
  var log = 0;
  for (var i = 0; i < measurements.length; i++) {
    log += Math.log(measurements[i].time);
  }
  return Math.pow(Math.E, log / measurements.length);
}


// Computes the geometric mean of a set of rms measurements.
BenchmarkSuite.GeometricMeanLatency = function(measurements) {
  var log = 0;
  var hasLatencyResult = false;
  for (var i = 0; i < measurements.length; i++) {
    if (measurements[i].latency != 0) {
      log += Math.log(measurements[i].latency);
      hasLatencyResult = true;
    }
  }
  if (hasLatencyResult) {
    return Math.pow(Math.E, log / measurements.length);
  } else {
    return 0;
  }
}


// Converts a score value to a string with at least three significant
// digits.
BenchmarkSuite.FormatScore = function(value) {
  if (value > 100) {
    return value.toFixed(0);
  } else {
    return value.toPrecision(3);
  }
}

// Notifies the runner that we're done running a single benchmark in
// the benchmark suite. This can be useful to report progress.
BenchmarkSuite.prototype.NotifyStep = function(result) {
  this.results.push(result);
  if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name);
}


// Notifies the runner that we're done with running a suite and that
// we have a result which can be reported to the user if needed.
BenchmarkSuite.prototype.NotifyResult = function() {
  var mean = BenchmarkSuite.GeometricMeanTime(this.results);
  var score = this.reference[0] / mean;
  BenchmarkSuite.scores.push(score);
  if (this.runner.NotifyResult) {
    var formatted = BenchmarkSuite.FormatScore(100 * score);
    this.runner.NotifyResult(this.name, formatted);
  }
  if (this.reference.length == 2) {
    var meanLatency = BenchmarkSuite.GeometricMeanLatency(this.results);
    if (meanLatency != 0) {
      var scoreLatency = this.reference[1] / meanLatency;
      BenchmarkSuite.scores.push(scoreLatency);
      if (this.runner.NotifyResult) {
        var formattedLatency = BenchmarkSuite.FormatScore(100 * scoreLatency)
        this.runner.NotifyResult(this.name + "Latency", formattedLatency);
      }
    }
  }
}


BenchmarkSuite.prototype.NotifySkipped = function(runner) {
  BenchmarkSuite.scores.push(1);  // push default reference score.
  if (runner.NotifyResult) {
    runner.NotifyResult(this.name, "Skipped");
  }
}


// Notifies the runner that running a benchmark resulted in an error.
BenchmarkSuite.prototype.NotifyError = function(error) {
  if (this.runner.NotifyError) {
    this.runner.NotifyError(this.name, error);
  }
  if (this.runner.NotifyStep) {
    this.runner.NotifyStep(this.name);
  }
}


// Runs a single benchmark for at least a second and computes the
// average time it takes to run a single iteration.
BenchmarkSuite.prototype.RunSingleBenchmark = function(benchmark, data) {
  var config = BenchmarkSuite.config;
  var doWarmup = config.doWarmup !== undefined 
                 ? config.doWarmup 
                 : benchmark.doWarmup;
  var doDeterministic = config.doDeterministic !== undefined 
                        ? config.doDeterministic 
                        : benchmark.doDeterministic;

  function Measure(data) {
    var elapsed = 0;
    var start = new Date();
  
  // Run either for 1 second or for the number of iterations specified
  // by minIterations, depending on the config flag doDeterministic.
    for (var i = 0; (doDeterministic ? 
      i<benchmark.deterministicIterations : elapsed < 1000); i++) {
      benchmark.run();
      elapsed = new Date() - start;
    }
    if (data != null) {
      data.runs += i;
      data.elapsed += elapsed;
    }
  }

  // Sets up data in order to skip or not the warmup phase.
  if (!doWarmup && data == null) {
    data = { runs: 0, elapsed: 0 };
  }

  if (data == null) {
    Measure(null);
    return { runs: 0, elapsed: 0 };
  } else {
    Measure(data);
    // If we've run too few iterations, we continue for another second.
    if (data.runs < benchmark.minIterations) return data;
    var usec = (data.elapsed * 1000) / data.runs;
    var rms = (benchmark.rmsResult != null) ? benchmark.rmsResult() : 0;
    this.NotifyStep(new BenchmarkResult(benchmark, usec, rms));
    return null;
  }
}


// This function starts running a suite, but stops between each
// individual benchmark in the suite and returns a continuation
// function which can be invoked to run the next benchmark. Once the
// last benchmark has been executed, null is returned.
BenchmarkSuite.prototype.RunStep = function(runner) {
  BenchmarkSuite.ResetRNG();
  this.results = [];
  this.runner = runner;
  var length = this.benchmarks.length;
  var index = 0;
  var suite = this;
  var data;

  // Run the setup, the actual benchmark, and the tear down in three
  // separate steps to allow the framework to yield between any of the
  // steps.

  function RunNextSetup() {
    if (index < length) {
      try {
        suite.benchmarks[index].Setup();
      } catch (e) {
        suite.NotifyError(e);
        return null;
      }
      return RunNextBenchmark;
    }
    suite.NotifyResult();
    return null;
  }

  function RunNextBenchmark() {
    try {
      data = suite.RunSingleBenchmark(suite.benchmarks[index], data);
    } catch (e) {
      suite.NotifyError(e);
      return null;
    }
    // If data is null, we're done with this benchmark.
    return (data == null) ? RunNextTearDown : RunNextBenchmark();
  }

  function RunNextTearDown() {
    try {
      suite.benchmarks[index++].TearDown();
    } catch (e) {
      suite.NotifyError(e);
      return null;
    }
    return RunNextSetup;
  }

  // Start out running the setup.
  return RunNextSetup();
}

/////////////////////////////////////////////////////////////
// box2d.js
/////////////////////////////////////////////////////////////

// Portions copyright 2013 Google, Inc

/*
* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com
*
* This software is provided 'as-is', without any express or implied
* warranty.  In no event will the authors be held liable for any damages
* arising from the use of this software.
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software
* in a product, an acknowledgment in the product documentation would be
* appreciated but is not required.
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
* 3. This notice may not be removed or altered from any source distribution.
*/

/*
* Following code is beautified using http://jsbeautifier.org/
*/

var Box2D = {};
(function (F, G) {
    function K() {}
    if (!(Object.defineProperty instanceof Function) && Object.prototype.__defineGetter__ instanceof Function && Object.prototype.__defineSetter__ instanceof Function) Object.defineProperty = function (y, w, A) {
        A.get instanceof Function && y.__defineGetter__(w, A.get);
        A.set instanceof Function && y.__defineSetter__(w, A.set)
    };
    F.inherit = function (y, w) {
        K.prototype = w.prototype;
        y.prototype = new K;
        y.prototype.constructor = y
    };
    F.generateCallback = function (y, w) {
        return function () {
            w.apply(y, arguments)
        }
    };
    F.NVector = function (y) {
        if (y === G) y = 0;
        for (var w = Array(y || 0), A = 0; A < y; ++A) w[A] = 0;
        return w
    };
    F.is = function (y, w) {
        if (y === null) return false;
        if (w instanceof Function && y instanceof w) return true;
        if (y.constructor.__implements != G && y.constructor.__implements[w]) return true;
        return false
    };
    F.parseUInt = function (y) {
        return Math.abs(parseInt(y))
    }
})(Box2D);
var Vector = Array,
    Vector_a2j_Number = Box2D.NVector;
if (typeof Box2D === "undefined") Box2D = {};
if (typeof Box2D.Collision === "undefined") Box2D.Collision = {};
if (typeof Box2D.Collision.Shapes === "undefined") Box2D.Collision.Shapes = {};
if (typeof Box2D.Common === "undefined") Box2D.Common = {};
if (typeof Box2D.Common.Math === "undefined") Box2D.Common.Math = {};
if (typeof Box2D.Dynamics === "undefined") Box2D.Dynamics = {};
if (typeof Box2D.Dynamics.Contacts === "undefined") Box2D.Dynamics.Contacts = {};
if (typeof Box2D.Dynamics.Controllers === "undefined") Box2D.Dynamics.Controllers = {};
if (typeof Box2D.Dynamics.Joints === "undefined") Box2D.Dynamics.Joints = {};
(function () {
    function F() {
        F.b2AABB.apply(this, arguments)
    }

    function G() {
        G.b2Bound.apply(this, arguments)
    }

    function K() {
        K.b2BoundValues.apply(this, arguments);
        this.constructor === K && this.b2BoundValues.apply(this, arguments)
    }

    function y() {
        y.b2Collision.apply(this, arguments)
    }

    function w() {
        w.b2ContactID.apply(this, arguments);
        this.constructor === w && this.b2ContactID.apply(this, arguments)
    }

    function A() {
        A.b2ContactPoint.apply(this, arguments)
    }

    function U() {
        U.b2Distance.apply(this, arguments)
    }

    function p() {
        p.b2DistanceInput.apply(this,
            arguments)
    }

    function B() {
        B.b2DistanceOutput.apply(this, arguments)
    }

    function Q() {
        Q.b2DistanceProxy.apply(this, arguments)
    }

    function V() {
        V.b2DynamicTree.apply(this, arguments);
        this.constructor === V && this.b2DynamicTree.apply(this, arguments)
    }

    function M() {
        M.b2DynamicTreeBroadPhase.apply(this, arguments)
    }

    function L() {
        L.b2DynamicTreeNode.apply(this, arguments)
    }

    function I() {
        I.b2DynamicTreePair.apply(this, arguments)
    }

    function W() {
        W.b2Manifold.apply(this, arguments);
        this.constructor === W && this.b2Manifold.apply(this, arguments)
    }

    function Y() {
        Y.b2ManifoldPoint.apply(this, arguments);
        this.constructor === Y && this.b2ManifoldPoint.apply(this, arguments)
    }

    function k() {
        k.b2Point.apply(this, arguments)
    }

    function z() {
        z.b2RayCastInput.apply(this, arguments);
        this.constructor === z && this.b2RayCastInput.apply(this, arguments)
    }

    function u() {
        u.b2RayCastOutput.apply(this, arguments)
    }

    function D() {
        D.b2Segment.apply(this, arguments)
    }

    function H() {
        H.b2SeparationFunction.apply(this, arguments)
    }

    function O() {
        O.b2Simplex.apply(this, arguments);
        this.constructor === O && this.b2Simplex.apply(this, arguments)
    }

    function E() {
        E.b2SimplexCache.apply(this, arguments)
    }

    function R() {
        R.b2SimplexVertex.apply(this, arguments)
    }

    function N() {
        N.b2TimeOfImpact.apply(this, arguments)
    }

    function S() {
        S.b2TOIInput.apply(this, arguments)
    }

    function aa() {
        aa.b2WorldManifold.apply(this, arguments);
        this.constructor === aa && this.b2WorldManifold.apply(this, arguments)
    }

    function Z() {
        Z.ClipVertex.apply(this, arguments)
    }

    function d() {
        d.Features.apply(this, arguments)
    }

    function h() {
        h.b2CircleShape.apply(this, arguments);
        this.constructor === h && this.b2CircleShape.apply(this, arguments)
    }

    function l() {
        l.b2EdgeChainDef.apply(this, arguments);
        this.constructor === l && this.b2EdgeChainDef.apply(this, arguments)
    }

    function j() {
        j.b2EdgeShape.apply(this, arguments);
        this.constructor === j && this.b2EdgeShape.apply(this, arguments)
    }

    function o() {
        o.b2MassData.apply(this, arguments)
    }

    function q() {
        q.b2PolygonShape.apply(this, arguments);
        this.constructor === q && this.b2PolygonShape.apply(this, arguments)
    }

    function n() {
        n.b2Shape.apply(this, arguments);
        this.constructor === n && this.b2Shape.apply(this, arguments)
    }

    function a() {
        a.b2Color.apply(this, arguments);
        this.constructor === a && this.b2Color.apply(this, arguments)
    }

    function c() {
        c.b2Settings.apply(this, arguments)
    }

    function g() {
        g.b2Mat22.apply(this, arguments);
        this.constructor === g && this.b2Mat22.apply(this, arguments)
    }

    function b() {
        b.b2Mat33.apply(this, arguments);
        this.constructor === b && this.b2Mat33.apply(this, arguments)
    }

    function e() {
        e.b2Math.apply(this, arguments)
    }

    function f() {
        f.b2Sweep.apply(this, arguments)
    }

    function m() {
        m.b2Transform.apply(this,
            arguments);
        this.constructor === m && this.b2Transform.apply(this, arguments)
    }

    function r() {
        r.b2Vec2.apply(this, arguments);
        this.constructor === r && this.b2Vec2.apply(this, arguments)
    }

    function s() {
        s.b2Vec3.apply(this, arguments);
        this.constructor === s && this.b2Vec3.apply(this, arguments)
    }

    function v() {
        v.b2Body.apply(this, arguments);
        this.constructor === v && this.b2Body.apply(this, arguments)
    }

    function t() {
        t.b2BodyDef.apply(this, arguments);
        this.constructor === t && this.b2BodyDef.apply(this, arguments)
    }

    function x() {
        x.b2ContactFilter.apply(this,
            arguments)
    }

    function C() {
        C.b2ContactImpulse.apply(this, arguments)
    }

    function J() {
        J.b2ContactListener.apply(this, arguments)
    }

    function T() {
        T.b2ContactManager.apply(this, arguments);
        this.constructor === T && this.b2ContactManager.apply(this, arguments)
    }

    function P() {
        P.b2DebugDraw.apply(this, arguments);
        this.constructor === P && this.b2DebugDraw.apply(this, arguments)
    }

    function X() {
        X.b2DestructionListener.apply(this, arguments)
    }

    function $() {
        $.b2FilterData.apply(this, arguments)
    }

    function ba() {
        ba.b2Fixture.apply(this, arguments);
        this.constructor === ba && this.b2Fixture.apply(this, arguments)
    }

    function ca() {
        ca.b2FixtureDef.apply(this, arguments);
        this.constructor === ca && this.b2FixtureDef.apply(this, arguments)
    }

    function da() {
        da.b2Island.apply(this, arguments);
        this.constructor === da && this.b2Island.apply(this, arguments)
    }

    function Fa() {
        Fa.b2TimeStep.apply(this, arguments)
    }

    function ea() {
        ea.b2World.apply(this, arguments);
        this.constructor === ea && this.b2World.apply(this, arguments)
    }

    function Ga() {
        Ga.b2CircleContact.apply(this, arguments)
    }

    function fa() {
        fa.b2Contact.apply(this,
            arguments);
        this.constructor === fa && this.b2Contact.apply(this, arguments)
    }

    function ga() {
        ga.b2ContactConstraint.apply(this, arguments);
        this.constructor === ga && this.b2ContactConstraint.apply(this, arguments)
    }

    function Ha() {
        Ha.b2ContactConstraintPoint.apply(this, arguments)
    }

    function Ia() {
        Ia.b2ContactEdge.apply(this, arguments)
    }

    function ha() {
        ha.b2ContactFactory.apply(this, arguments);
        this.constructor === ha && this.b2ContactFactory.apply(this, arguments)
    }

    function Ja() {
        Ja.b2ContactRegister.apply(this, arguments)
    }

    function Ka() {
        Ka.b2ContactResult.apply(this,
            arguments)
    }

    function ia() {
        ia.b2ContactSolver.apply(this, arguments);
        this.constructor === ia && this.b2ContactSolver.apply(this, arguments)
    }

    function La() {
        La.b2EdgeAndCircleContact.apply(this, arguments)
    }

    function ja() {
        ja.b2NullContact.apply(this, arguments);
        this.constructor === ja && this.b2NullContact.apply(this, arguments)
    }

    function Ma() {
        Ma.b2PolyAndCircleContact.apply(this, arguments)
    }

    function Na() {
        Na.b2PolyAndEdgeContact.apply(this, arguments)
    }

    function Oa() {
        Oa.b2PolygonContact.apply(this, arguments)
    }

    function ka() {
        ka.b2PositionSolverManifold.apply(this,
            arguments);
        this.constructor === ka && this.b2PositionSolverManifold.apply(this, arguments)
    }

    function Pa() {
        Pa.b2BuoyancyController.apply(this, arguments)
    }

    function Qa() {
        Qa.b2ConstantAccelController.apply(this, arguments)
    }

    function Ra() {
        Ra.b2ConstantForceController.apply(this, arguments)
    }

    function Sa() {
        Sa.b2Controller.apply(this, arguments)
    }

    function Ta() {
        Ta.b2ControllerEdge.apply(this, arguments)
    }

    function Ua() {
        Ua.b2GravityController.apply(this, arguments)
    }

    function Va() {
        Va.b2TensorDampingController.apply(this, arguments)
    }

    function la() {
        la.b2DistanceJoint.apply(this, arguments);
        this.constructor === la && this.b2DistanceJoint.apply(this, arguments)
    }

    function ma() {
        ma.b2DistanceJointDef.apply(this, arguments);
        this.constructor === ma && this.b2DistanceJointDef.apply(this, arguments)
    }

    function na() {
        na.b2FrictionJoint.apply(this, arguments);
        this.constructor === na && this.b2FrictionJoint.apply(this, arguments)
    }

    function oa() {
        oa.b2FrictionJointDef.apply(this, arguments);
        this.constructor === oa && this.b2FrictionJointDef.apply(this, arguments)
    }

    function pa() {
        pa.b2GearJoint.apply(this,
            arguments);
        this.constructor === pa && this.b2GearJoint.apply(this, arguments)
    }

    function qa() {
        qa.b2GearJointDef.apply(this, arguments);
        this.constructor === qa && this.b2GearJointDef.apply(this, arguments)
    }

    function Wa() {
        Wa.b2Jacobian.apply(this, arguments)
    }

    function ra() {
        ra.b2Joint.apply(this, arguments);
        this.constructor === ra && this.b2Joint.apply(this, arguments)
    }

    function sa() {
        sa.b2JointDef.apply(this, arguments);
        this.constructor === sa && this.b2JointDef.apply(this, arguments)
    }

    function Xa() {
        Xa.b2JointEdge.apply(this, arguments)
    }

    function ta() {
        ta.b2LineJoint.apply(this, arguments);
        this.constructor === ta && this.b2LineJoint.apply(this, arguments)
    }

    function ua() {
        ua.b2LineJointDef.apply(this, arguments);
        this.constructor === ua && this.b2LineJointDef.apply(this, arguments)
    }

    function va() {
        va.b2MouseJoint.apply(this, arguments);
        this.constructor === va && this.b2MouseJoint.apply(this, arguments)
    }

    function wa() {
        wa.b2MouseJointDef.apply(this, arguments);
        this.constructor === wa && this.b2MouseJointDef.apply(this, arguments)
    }

    function xa() {
        xa.b2PrismaticJoint.apply(this,
            arguments);
        this.constructor === xa && this.b2PrismaticJoint.apply(this, arguments)
    }

    function ya() {
        ya.b2PrismaticJointDef.apply(this, arguments);
        this.constructor === ya && this.b2PrismaticJointDef.apply(this, arguments)
    }

    function za() {
        za.b2PulleyJoint.apply(this, arguments);
        this.constructor === za && this.b2PulleyJoint.apply(this, arguments)
    }

    function Aa() {
        Aa.b2PulleyJointDef.apply(this, arguments);
        this.constructor === Aa && this.b2PulleyJointDef.apply(this, arguments)
    }

    function Ba() {
        Ba.b2RevoluteJoint.apply(this, arguments);
        this.constructor === Ba && this.b2RevoluteJoint.apply(this, arguments)
    }

    function Ca() {
        Ca.b2RevoluteJointDef.apply(this, arguments);
        this.constructor === Ca && this.b2RevoluteJointDef.apply(this, arguments)
    }

    function Da() {
        Da.b2WeldJoint.apply(this, arguments);
        this.constructor === Da && this.b2WeldJoint.apply(this, arguments)
    }

    function Ea() {
        Ea.b2WeldJointDef.apply(this, arguments);
        this.constructor === Ea && this.b2WeldJointDef.apply(this, arguments)
    }
    Box2D.Collision.IBroadPhase = "Box2D.Collision.IBroadPhase";
    Box2D.Collision.b2AABB = F;
    Box2D.Collision.b2Bound = G;
    Box2D.Collision.b2BoundValues = K;
    Box2D.Collision.b2Collision = y;
    Box2D.Collision.b2ContactID = w;
    Box2D.Collision.b2ContactPoint = A;
    Box2D.Collision.b2Distance = U;
    Box2D.Collision.b2DistanceInput = p;
    Box2D.Collision.b2DistanceOutput = B;
    Box2D.Collision.b2DistanceProxy = Q;
    Box2D.Collision.b2DynamicTree = V;
    Box2D.Collision.b2DynamicTreeBroadPhase = M;
    Box2D.Collision.b2DynamicTreeNode = L;
    Box2D.Collision.b2DynamicTreePair = I;
    Box2D.Collision.b2Manifold = W;
    Box2D.Collision.b2ManifoldPoint = Y;
    Box2D.Collision.b2Point = k;
    Box2D.Collision.b2RayCastInput = z;
    Box2D.Collision.b2RayCastOutput = u;
    Box2D.Collision.b2Segment = D;
    Box2D.Collision.b2SeparationFunction = H;
    Box2D.Collision.b2Simplex = O;
    Box2D.Collision.b2SimplexCache = E;
    Box2D.Collision.b2SimplexVertex = R;
    Box2D.Collision.b2TimeOfImpact = N;
    Box2D.Collision.b2TOIInput = S;
    Box2D.Collision.b2WorldManifold = aa;
    Box2D.Collision.ClipVertex = Z;
    Box2D.Collision.Features = d;
    Box2D.Collision.Shapes.b2CircleShape = h;
    Box2D.Collision.Shapes.b2EdgeChainDef = l;
    Box2D.Collision.Shapes.b2EdgeShape = j;
    Box2D.Collision.Shapes.b2MassData = o;
    Box2D.Collision.Shapes.b2PolygonShape = q;
    Box2D.Collision.Shapes.b2Shape = n;
    Box2D.Common.b2internal = "Box2D.Common.b2internal";
    Box2D.Common.b2Color = a;
    Box2D.Common.b2Settings = c;
    Box2D.Common.Math.b2Mat22 = g;
    Box2D.Common.Math.b2Mat33 = b;
    Box2D.Common.Math.b2Math = e;
    Box2D.Common.Math.b2Sweep = f;
    Box2D.Common.Math.b2Transform = m;
    Box2D.Common.Math.b2Vec2 = r;
    Box2D.Common.Math.b2Vec3 = s;
    Box2D.Dynamics.b2Body = v;
    Box2D.Dynamics.b2BodyDef = t;
    Box2D.Dynamics.b2ContactFilter = x;
    Box2D.Dynamics.b2ContactImpulse = C;
    Box2D.Dynamics.b2ContactListener = J;
    Box2D.Dynamics.b2ContactManager = T;
    Box2D.Dynamics.b2DebugDraw = P;
    Box2D.Dynamics.b2DestructionListener = X;
    Box2D.Dynamics.b2FilterData = $;
    Box2D.Dynamics.b2Fixture = ba;
    Box2D.Dynamics.b2FixtureDef = ca;
    Box2D.Dynamics.b2Island = da;
    Box2D.Dynamics.b2TimeStep = Fa;
    Box2D.Dynamics.b2World = ea;
    Box2D.Dynamics.Contacts.b2CircleContact = Ga;
    Box2D.Dynamics.Contacts.b2Contact = fa;
    Box2D.Dynamics.Contacts.b2ContactConstraint = ga;
    Box2D.Dynamics.Contacts.b2ContactConstraintPoint = Ha;
    Box2D.Dynamics.Contacts.b2ContactEdge = Ia;
    Box2D.Dynamics.Contacts.b2ContactFactory = ha;
    Box2D.Dynamics.Contacts.b2ContactRegister = Ja;
    Box2D.Dynamics.Contacts.b2ContactResult = Ka;
    Box2D.Dynamics.Contacts.b2ContactSolver = ia;
    Box2D.Dynamics.Contacts.b2EdgeAndCircleContact = La;
    Box2D.Dynamics.Contacts.b2NullContact = ja;
    Box2D.Dynamics.Contacts.b2PolyAndCircleContact = Ma;
    Box2D.Dynamics.Contacts.b2PolyAndEdgeContact = Na;
    Box2D.Dynamics.Contacts.b2PolygonContact = Oa;
    Box2D.Dynamics.Contacts.b2PositionSolverManifold = ka;
    Box2D.Dynamics.Controllers.b2BuoyancyController = Pa;
    Box2D.Dynamics.Controllers.b2ConstantAccelController = Qa;
    Box2D.Dynamics.Controllers.b2ConstantForceController = Ra;
    Box2D.Dynamics.Controllers.b2Controller = Sa;
    Box2D.Dynamics.Controllers.b2ControllerEdge = Ta;
    Box2D.Dynamics.Controllers.b2GravityController = Ua;
    Box2D.Dynamics.Controllers.b2TensorDampingController = Va;
    Box2D.Dynamics.Joints.b2DistanceJoint = la;
    Box2D.Dynamics.Joints.b2DistanceJointDef = ma;
    Box2D.Dynamics.Joints.b2FrictionJoint = na;
    Box2D.Dynamics.Joints.b2FrictionJointDef = oa;
    Box2D.Dynamics.Joints.b2GearJoint = pa;
    Box2D.Dynamics.Joints.b2GearJointDef = qa;
    Box2D.Dynamics.Joints.b2Jacobian = Wa;
    Box2D.Dynamics.Joints.b2Joint = ra;
    Box2D.Dynamics.Joints.b2JointDef = sa;
    Box2D.Dynamics.Joints.b2JointEdge = Xa;
    Box2D.Dynamics.Joints.b2LineJoint = ta;
    Box2D.Dynamics.Joints.b2LineJointDef = ua;
    Box2D.Dynamics.Joints.b2MouseJoint = va;
    Box2D.Dynamics.Joints.b2MouseJointDef = wa;
    Box2D.Dynamics.Joints.b2PrismaticJoint = xa;
    Box2D.Dynamics.Joints.b2PrismaticJointDef = ya;
    Box2D.Dynamics.Joints.b2PulleyJoint = za;
    Box2D.Dynamics.Joints.b2PulleyJointDef = Aa;
    Box2D.Dynamics.Joints.b2RevoluteJoint = Ba;
    Box2D.Dynamics.Joints.b2RevoluteJointDef = Ca;
    Box2D.Dynamics.Joints.b2WeldJoint = Da;
    Box2D.Dynamics.Joints.b2WeldJointDef = Ea
})();
Box2D.postDefs = [];
(function () {
    var F = Box2D.Collision.Shapes.b2CircleShape,
        G = Box2D.Collision.Shapes.b2PolygonShape,
        K = Box2D.Collision.Shapes.b2Shape,
        y = Box2D.Common.b2Settings,
        w = Box2D.Common.Math.b2Math,
        A = Box2D.Common.Math.b2Sweep,
        U = Box2D.Common.Math.b2Transform,
        p = Box2D.Common.Math.b2Vec2,
        B = Box2D.Collision.b2AABB,
        Q = Box2D.Collision.b2Bound,
        V = Box2D.Collision.b2BoundValues,
        M = Box2D.Collision.b2Collision,
        L = Box2D.Collision.b2ContactID,
        I = Box2D.Collision.b2ContactPoint,
        W = Box2D.Collision.b2Distance,
        Y = Box2D.Collision.b2DistanceInput,
        k = Box2D.Collision.b2DistanceOutput,
        z = Box2D.Collision.b2DistanceProxy,
        u = Box2D.Collision.b2DynamicTree,
        D = Box2D.Collision.b2DynamicTreeBroadPhase,
        H = Box2D.Collision.b2DynamicTreeNode,
        O = Box2D.Collision.b2DynamicTreePair,
        E = Box2D.Collision.b2Manifold,
        R = Box2D.Collision.b2ManifoldPoint,
        N = Box2D.Collision.b2Point,
        S = Box2D.Collision.b2RayCastInput,
        aa = Box2D.Collision.b2RayCastOutput,
        Z = Box2D.Collision.b2Segment,
        d = Box2D.Collision.b2SeparationFunction,
        h = Box2D.Collision.b2Simplex,
        l = Box2D.Collision.b2SimplexCache,
        j = Box2D.Collision.b2SimplexVertex,
        o = Box2D.Collision.b2TimeOfImpact,
        q = Box2D.Collision.b2TOIInput,
        n = Box2D.Collision.b2WorldManifold,
        a = Box2D.Collision.ClipVertex,
        c = Box2D.Collision.Features,
        g = Box2D.Collision.IBroadPhase;
    B.b2AABB = function () {
        this.lowerBound = new p;
        this.upperBound = new p
    };
    B.prototype.IsValid = function () {
        var b = this.upperBound.y - this.lowerBound.y;
        return b = (b = this.upperBound.x - this.lowerBound.x >= 0 && b >= 0) && this.lowerBound.IsValid() && this.upperBound.IsValid()
    };
    B.prototype.GetCenter = function () {
        return new p((this.lowerBound.x + this.upperBound.x) / 2, (this.lowerBound.y + this.upperBound.y) / 2)
    };
    B.prototype.GetExtents = function () {
        return new p((this.upperBound.x - this.lowerBound.x) / 2, (this.upperBound.y - this.lowerBound.y) / 2)
    };
    B.prototype.Contains = function (b) {
        var e = true;
        return e = (e = (e = (e = e && this.lowerBound.x <= b.lowerBound.x) && this.lowerBound.y <= b.lowerBound.y) && b.upperBound.x <= this.upperBound.x) && b.upperBound.y <= this.upperBound.y
    };
    B.prototype.RayCast = function (b, e) {
        var f = -Number.MAX_VALUE,
            m = Number.MAX_VALUE,
            r = e.p1.x,
            s = e.p1.y,
            v = e.p2.x - e.p1.x,
            t = e.p2.y - e.p1.y,
            x = Math.abs(t),
            C = b.normal,
            J = 0,
            T = 0,
            P = J = 0;
        P = 0;
        if (Math.abs(v) < Number.MIN_VALUE) {
            if (r < this.lowerBound.x || this.upperBound.x < r) return false
        } else {
            J = 1 / v;
            T = (this.lowerBound.x - r) * J;
            J = (this.upperBound.x - r) * J;
            P = -1;
            if (T > J) {
                P = T;
                T = J;
                J = P;
                P = 1
            }
            if (T > f) {
                C.x = P;
                C.y = 0;
                f = T
            }
            m = Math.min(m, J);
            if (f > m) return false
        } if (x < Number.MIN_VALUE) {
            if (s < this.lowerBound.y || this.upperBound.y < s) return false
        } else {
            J = 1 / t;
            T = (this.lowerBound.y - s) * J;
            J = (this.upperBound.y - s) * J;
            P = -1;
            if (T > J) {
                P = T;
                T = J;
                J = P;
                P = 1
            }
            if (T > f) {
                C.y = P;
                C.x = 0;
                f = T
            }
            m = Math.min(m, J);
            if (f > m) return false
        }
        b.fraction = f;
        return true
    };
    B.prototype.TestOverlap = function (b) {
        var e = b.lowerBound.y - this.upperBound.y,
            f = this.lowerBound.y - b.upperBound.y;
        if (b.lowerBound.x - this.upperBound.x > 0 || e > 0) return false;
        if (this.lowerBound.x - b.upperBound.x > 0 || f > 0) return false;
        return true
    };
    B.Combine = function (b, e) {
        var f = new B;
        f.Combine(b, e);
        return f
    };
    B.prototype.Combine = function (b, e) {
        this.lowerBound.x = Math.min(b.lowerBound.x, e.lowerBound.x);
        this.lowerBound.y = Math.min(b.lowerBound.y, e.lowerBound.y);
        this.upperBound.x = Math.max(b.upperBound.x, e.upperBound.x);
        this.upperBound.y = Math.max(b.upperBound.y, e.upperBound.y)
    };
    Q.b2Bound = function () {};
    Q.prototype.IsLower = function () {
        return (this.value & 1) == 0
    };
    Q.prototype.IsUpper = function () {
        return (this.value & 1) == 1
    };
    Q.prototype.Swap = function (b) {
        var e = this.value,
            f = this.proxy,
            m = this.stabbingCount;
        this.value = b.value;
        this.proxy = b.proxy;
        this.stabbingCount = b.stabbingCount;
        b.value = e;
        b.proxy = f;
        b.stabbingCount = m
    };
    V.b2BoundValues = function () {};
    V.prototype.b2BoundValues = function () {
        this.lowerValues = new Vector_a2j_Number;
        this.lowerValues[0] = 0;
        this.lowerValues[1] = 0;
        this.upperValues = new Vector_a2j_Number;
        this.upperValues[0] = 0;
        this.upperValues[1] = 0
    };
    M.b2Collision = function () {};
    M.ClipSegmentToLine = function (b, e, f, m) {
        if (m === undefined) m = 0;
        var r, s = 0;
        r = e[0];
        var v = r.v;
        r = e[1];
        var t = r.v,
            x = f.x * v.x + f.y * v.y - m;
        r = f.x * t.x + f.y * t.y - m;
        x <= 0 && b[s++].Set(e[0]);
        r <= 0 && b[s++].Set(e[1]);
        if (x * r < 0) {
            f = x / (x - r);
            r = b[s];
            r = r.v;
            r.x = v.x + f * (t.x - v.x);
            r.y = v.y + f * (t.y - v.y);
            r = b[s];
            r.id = (x > 0 ? e[0] : e[1]).id;
            ++s
        }
        return s
    };
    M.EdgeSeparation = function (b, e, f, m, r) {
            if (f === undefined) f = 0;
            parseInt(b.m_vertexCount);
            var s = b.m_vertices;
            b = b.m_normals;
            var v = parseInt(m.m_vertexCount),
                t = m.m_vertices,
                x, C;
            x = e.R;
            C = b[f];
            b = x.col1.x * C.x + x.col2.x * C.y;
            m = x.col1.y * C.x + x.col2.y * C.y;
            x = r.R;
            var J = x.col1.x * b + x.col1.y * m;
            x = x.col2.x * b + x.col2.y * m;
            for (var T = 0, P = Number.MAX_VALUE, X = 0; X < v; ++X) {
                C = t[X];
                C = C.x * J + C.y * x;
                if (C < P) {
                    P = C;
                    T = X
                }
            }
            C = s[f];
            x = e.R;
            f = e.position.x + (x.col1.x * C.x + x.col2.x * C.y);
            e = e.position.y + (x.col1.y * C.x + x.col2.y * C.y);
            C = t[T];
            x = r.R;
            s = r.position.x + (x.col1.x * C.x + x.col2.x * C.y);
            r = r.position.y + (x.col1.y * C.x + x.col2.y * C.y);
            s -= f;
            r -= e;
            return s * b + r * m
    };
    M.FindMaxSeparation = function (b, e, f, m, r) {
        var s = parseInt(e.m_vertexCount),
            v = e.m_normals,
            t, x;
        x = r.R;
        t = m.m_centroid;
        var C = r.position.x + (x.col1.x * t.x + x.col2.x * t.y),
            J = r.position.y + (x.col1.y * t.x + x.col2.y * t.y);
        x = f.R;
        t = e.m_centroid;
        C -= f.position.x + (x.col1.x * t.x + x.col2.x * t.y);
        J -= f.position.y + (x.col1.y * t.x + x.col2.y * t.y);
        x = C * f.R.col1.x + J * f.R.col1.y;
        J = C * f.R.col2.x + J * f.R.col2.y;
        C = 0;
        for (var T = -Number.MAX_VALUE, P = 0; P < s; ++P) {
            t = v[P];
            t = t.x * x + t.y * J;
            if (t > T) {
                T = t;
                C = P
            }
        }
        v = M.EdgeSeparation(e, f, C, m, r);
        t = parseInt(C - 1 >= 0 ? C - 1 : s - 1);
        x = M.EdgeSeparation(e, f, t, m, r);
        J = parseInt(C + 1 < s ? C + 1 : 0);
        T = M.EdgeSeparation(e, f, J, m, r);
        var X = P = 0,
            $ = 0;
        if (x > v && x > T) {
            $ = -1;
            P = t;
            X = x
        } else if (T > v) {
            $ = 1;
            P = J;
            X = T
        } else {
            b[0] = C;
            return v
        }
        for (;;) {
            C = $ == -1 ? P - 1 >= 0 ? P - 1 : s - 1 : P + 1 < s ? P + 1 : 0;
            v = M.EdgeSeparation(e, f, C, m, r);
            if (v > X) {
                P = C;
                X = v
            } else break
        }
        b[0] = P;
        return X
    };
    M.FindIncidentEdge = function (b, e, f, m, r, s) {
        if (m === undefined) m = 0;
        parseInt(e.m_vertexCount);
        var v = e.m_normals,
            t = parseInt(r.m_vertexCount);
        e = r.m_vertices;
        r = r.m_normals;
        var x;
        x = f.R;
        f = v[m];
        v = x.col1.x * f.x + x.col2.x * f.y;
        var C = x.col1.y * f.x + x.col2.y * f.y;
        x = s.R;
        f = x.col1.x * v + x.col1.y * C;
        C = x.col2.x * v + x.col2.y * C;
        v = f;
        x = 0;
        for (var J = Number.MAX_VALUE, T = 0; T < t; ++T) {
            f = r[T];
            f = v * f.x + C * f.y;
            if (f < J) {
                J = f;
                x = T
            }
        }
        r = parseInt(x);
        v = parseInt(r + 1 < t ? r + 1 : 0);
        t = b[0];
        f = e[r];
        x = s.R;
        t.v.x = s.position.x + (x.col1.x * f.x + x.col2.x * f.y);
        t.v.y = s.position.y + (x.col1.y * f.x + x.col2.y * f.y);
        t.id.features.referenceEdge = m;
        t.id.features.incidentEdge = r;
        t.id.features.incidentVertex = 0;
        t = b[1];
        f = e[v];
        x = s.R;
        t.v.x = s.position.x + (x.col1.x * f.x + x.col2.x * f.y);
        t.v.y = s.position.y + (x.col1.y * f.x + x.col2.y * f.y);
        t.id.features.referenceEdge = m;
        t.id.features.incidentEdge = v;
        t.id.features.incidentVertex = 1
    };
    M.MakeClipPointVector = function () {
        var b = new Vector(2);
        b[0] = new a;
        b[1] = new a;
        return b
    };
    M.CollidePolygons = function (b, e, f, m, r) {
        var s;
        b.m_pointCount = 0;
        var v = e.m_radius + m.m_radius;
        s = 0;
        M.s_edgeAO[0] = s;
        var t = M.FindMaxSeparation(M.s_edgeAO, e, f, m, r);
        s = M.s_edgeAO[0];
        if (!(t > v)) {
            var x = 0;
            M.s_edgeBO[0] = x;
            var C = M.FindMaxSeparation(M.s_edgeBO,
                m, r, e, f);
            x = M.s_edgeBO[0];
            if (!(C > v)) {
                var J = 0,
                    T = 0;
                if (C > 0.98 * t + 0.0010) {
                    t = m;
                    m = e;
                    e = r;
                    f = f;
                    J = x;
                    b.m_type = E.e_faceB;
                    T = 1
                } else {
                    t = e;
                    m = m;
                    e = f;
                    f = r;
                    J = s;
                    b.m_type = E.e_faceA;
                    T = 0
                }
                s = M.s_incidentEdge;
                M.FindIncidentEdge(s, t, e, J, m, f);
                x = parseInt(t.m_vertexCount);
                r = t.m_vertices;
                t = r[J];
                var P;
                P = J + 1 < x ? r[parseInt(J + 1)] : r[0];
                J = M.s_localTangent;
                J.Set(P.x - t.x, P.y - t.y);
                J.Normalize();
                r = M.s_localNormal;
                r.x = J.y;
                r.y = -J.x;
                m = M.s_planePoint;
                m.Set(0.5 * (t.x + P.x), 0.5 * (t.y + P.y));
                C = M.s_tangent;
                x = e.R;
                C.x = x.col1.x * J.x + x.col2.x * J.y;
                C.y = x.col1.y * J.x + x.col2.y * J.y;
                var X = M.s_tangent2;
                X.x = -C.x;
                X.y = -C.y;
                J = M.s_normal;
                J.x = C.y;
                J.y = -C.x;
                var $ = M.s_v11,
                    ba = M.s_v12;
                $.x = e.position.x + (x.col1.x * t.x + x.col2.x * t.y);
                $.y = e.position.y + (x.col1.y * t.x + x.col2.y * t.y);
                ba.x = e.position.x + (x.col1.x * P.x + x.col2.x * P.y);
                ba.y = e.position.y + (x.col1.y * P.x + x.col2.y * P.y);
                e = J.x * $.x + J.y * $.y;
                x = C.x * ba.x + C.y * ba.y + v;
                P = M.s_clipPoints1;
                t = M.s_clipPoints2;
                ba = 0;
                ba = M.ClipSegmentToLine(P, s, X, -C.x * $.x - C.y * $.y + v);
                if (!(ba < 2)) {
                    ba = M.ClipSegmentToLine(t, P, C, x);
                    if (!(ba < 2)) {
                        b.m_localPlaneNormal.SetV(r);
                        b.m_localPoint.SetV(m);
                        for (m = r = 0; m < y.b2_maxManifoldPoints; ++m) {
                            s = t[m];
                            if (J.x * s.v.x + J.y * s.v.y - e <= v) {
                                C = b.m_points[r];
                                x = f.R;
                                X = s.v.x - f.position.x;
                                $ = s.v.y - f.position.y;
                                C.m_localPoint.x = X * x.col1.x + $ * x.col1.y;
                                C.m_localPoint.y = X * x.col2.x + $ * x.col2.y;
                                C.m_id.Set(s.id);
                                C.m_id.features.flip = T;
                                ++r
                            }
                        }
                        b.m_pointCount = r
                    }
                }
            }
        }
    };
    M.CollideCircles = function (b, e, f, m, r) {
        b.m_pointCount = 0;
        var s, v;
        s = f.R;
        v = e.m_p;
        var t = f.position.x + (s.col1.x * v.x + s.col2.x * v.y);
        f = f.position.y + (s.col1.y * v.x + s.col2.y * v.y);
        s = r.R;
        v = m.m_p;
        t = r.position.x + (s.col1.x * v.x + s.col2.x * v.y) - t;
        r = r.position.y + (s.col1.y * v.x + s.col2.y * v.y) - f;
        s = e.m_radius + m.m_radius;
        if (!(t * t + r * r > s * s)) {
            b.m_type = E.e_circles;
            b.m_localPoint.SetV(e.m_p);
            b.m_localPlaneNormal.SetZero();
            b.m_pointCount = 1;
            b.m_points[0].m_localPoint.SetV(m.m_p);
            b.m_points[0].m_id.key = 0
        }
    };
    M.CollidePolygonAndCircle = function (b, e, f, m, r) {
        var s = b.m_pointCount = 0,
            v = 0,
            t, x;
        x = r.R;
        t = m.m_p;
        var C = r.position.y + (x.col1.y * t.x + x.col2.y * t.y);
        s = r.position.x + (x.col1.x * t.x + x.col2.x * t.y) - f.position.x;
        v = C - f.position.y;
        x = f.R;
        f = s * x.col1.x + v * x.col1.y;
        x = s * x.col2.x + v * x.col2.y;
        var J = 0;
        C = -Number.MAX_VALUE;
        r = e.m_radius + m.m_radius;
        var T = parseInt(e.m_vertexCount),
            P = e.m_vertices;
        e = e.m_normals;
        for (var X = 0; X < T; ++X) {
            t = P[X];
            s = f - t.x;
            v = x - t.y;
            t = e[X];
            s = t.x * s + t.y * v;
            if (s > r) return;
            if (s > C) {
                C = s;
                J = X
            }
        }
        s = parseInt(J);
        v = parseInt(s + 1 < T ? s + 1 : 0);
        t = P[s];
        P = P[v];
        if (C < Number.MIN_VALUE) {
            b.m_pointCount = 1;
            b.m_type = E.e_faceA;
            b.m_localPlaneNormal.SetV(e[J]);
            b.m_localPoint.x = 0.5 * (t.x + P.x);
            b.m_localPoint.y = 0.5 * (t.y + P.y)
        } else {
            C = (f - P.x) * (t.x - P.x) + (x - P.y) * (t.y - P.y);
            if ((f - t.x) * (P.x - t.x) + (x - t.y) * (P.y - t.y) <= 0) {
                if ((f - t.x) * (f - t.x) + (x - t.y) * (x - t.y) > r * r) return;
                b.m_pointCount = 1;
                b.m_type = E.e_faceA;
                b.m_localPlaneNormal.x = f - t.x;
                b.m_localPlaneNormal.y = x - t.y;
                b.m_localPlaneNormal.Normalize();
                b.m_localPoint.SetV(t)
            } else if (C <= 0) {
                if ((f - P.x) * (f - P.x) + (x - P.y) * (x - P.y) > r * r) return;
                b.m_pointCount = 1;
                b.m_type = E.e_faceA;
                b.m_localPlaneNormal.x = f - P.x;
                b.m_localPlaneNormal.y = x - P.y;
                b.m_localPlaneNormal.Normalize();
                b.m_localPoint.SetV(P)
            } else {
                J = 0.5 * (t.x + P.x);
                t = 0.5 * (t.y + P.y);
                C = (f - J) * e[s].x + (x - t) * e[s].y;
                if (C > r) return;
                b.m_pointCount = 1;
                b.m_type = E.e_faceA;
                b.m_localPlaneNormal.x = e[s].x;
                b.m_localPlaneNormal.y = e[s].y;
                b.m_localPlaneNormal.Normalize();
                b.m_localPoint.Set(J, t)
            }
        }
        b.m_points[0].m_localPoint.SetV(m.m_p);
        b.m_points[0].m_id.key = 0
    };
    M.TestOverlap = function (b, e) {
        var f = e.lowerBound,
            m = b.upperBound,
            r = f.x - m.x,
            s = f.y - m.y;
        f = b.lowerBound;
        m = e.upperBound;
        var v = f.y - m.y;
        if (r > 0 || s > 0) return false;
        if (f.x - m.x > 0 || v > 0) return false;
        return true
    };
    Box2D.postDefs.push(function () {
        Box2D.Collision.b2Collision.s_incidentEdge = M.MakeClipPointVector();
        Box2D.Collision.b2Collision.s_clipPoints1 = M.MakeClipPointVector();
        Box2D.Collision.b2Collision.s_clipPoints2 = M.MakeClipPointVector();
        Box2D.Collision.b2Collision.s_edgeAO = new Vector_a2j_Number(1);
        Box2D.Collision.b2Collision.s_edgeBO = new Vector_a2j_Number(1);
        Box2D.Collision.b2Collision.s_localTangent = new p;
        Box2D.Collision.b2Collision.s_localNormal = new p;
        Box2D.Collision.b2Collision.s_planePoint = new p;
        Box2D.Collision.b2Collision.s_normal = new p;
        Box2D.Collision.b2Collision.s_tangent = new p;
        Box2D.Collision.b2Collision.s_tangent2 = new p;
        Box2D.Collision.b2Collision.s_v11 = new p;
        Box2D.Collision.b2Collision.s_v12 = new p;
        Box2D.Collision.b2Collision.b2CollidePolyTempVec = new p;
        Box2D.Collision.b2Collision.b2_nullFeature = 255
    });
    L.b2ContactID = function () {
        this.features = new c
    };
    L.prototype.b2ContactID = function () {
        this.features._m_id = this
    };
    L.prototype.Set = function (b) {
        this.key = b._key
    };
    L.prototype.Copy = function () {
        var b = new L;
        b.key = this.key;
        return b
    };
    Object.defineProperty(L.prototype, "key", {
        enumerable: false,
        configurable: true,
        get: function () {
            return this._key
        }
    });
    Object.defineProperty(L.prototype, "key", {
        enumerable: false,
        configurable: true,
        set: function (b) {
            if (b === undefined) b = 0;
            this._key = b;
            this.features._referenceEdge = this._key & 255;
            this.features._incidentEdge = (this._key & 65280) >> 8 & 255;
            this.features._incidentVertex = (this._key & 16711680) >> 16 & 255;
            this.features._flip = (this._key & 4278190080) >> 24 & 255
        }
    });
    I.b2ContactPoint = function () {
        this.position = new p;
        this.velocity = new p;
        this.normal = new p;
        this.id = new L
    };
    W.b2Distance = function () {};
    W.Distance = function (b, e, f) {
        ++W.b2_gjkCalls;
        var m = f.proxyA,
            r = f.proxyB,
            s = f.transformA,
            v = f.transformB,
            t = W.s_simplex;
        t.ReadCache(e, m, s, r, v);
        var x = t.m_vertices,
            C = W.s_saveA,
            J = W.s_saveB,
            T = 0;
        t.GetClosestPoint().LengthSquared();
        for (var P = 0, X, $ = 0; $ < 20;) {
            T = t.m_count;
            for (P = 0; P < T; P++) {
                C[P] = x[P].indexA;
                J[P] = x[P].indexB
            }
            switch (t.m_count) {
            case 1:
                break;
            case 2:
                t.Solve2();
                break;
            case 3:
                t.Solve3();
                break;
            default:
                y.b2Assert(false)
            }
            if (t.m_count == 3) break;
            X = t.GetClosestPoint();
            X.LengthSquared();
            P = t.GetSearchDirection();
            if (P.LengthSquared() < Number.MIN_VALUE * Number.MIN_VALUE) break;
            X = x[t.m_count];
            X.indexA = m.GetSupport(w.MulTMV(s.R, P.GetNegative()));
            X.wA = w.MulX(s, m.GetVertex(X.indexA));
            X.indexB = r.GetSupport(w.MulTMV(v.R, P));
            X.wB = w.MulX(v, r.GetVertex(X.indexB));
            X.w = w.SubtractVV(X.wB, X.wA);
            ++$;
            ++W.b2_gjkIters;
            var ba = false;
            for (P = 0; P < T; P++)
                if (X.indexA == C[P] && X.indexB == J[P]) {
                    ba = true;
                    break
                }
            if (ba) break;
            ++t.m_count
        }
        W.b2_gjkMaxIters = w.Max(W.b2_gjkMaxIters, $);
        t.GetWitnessPoints(b.pointA, b.pointB);
        b.distance = w.SubtractVV(b.pointA,
            b.pointB).Length();
        b.iterations = $;
        t.WriteCache(e);
        if (f.useRadii) {
            e = m.m_radius;
            r = r.m_radius;
            if (b.distance > e + r && b.distance > Number.MIN_VALUE) {
                b.distance -= e + r;
                f = w.SubtractVV(b.pointB, b.pointA);
                f.Normalize();
                b.pointA.x += e * f.x;
                b.pointA.y += e * f.y;
                b.pointB.x -= r * f.x;
                b.pointB.y -= r * f.y
            } else {
                X = new p;
                X.x = 0.5 * (b.pointA.x + b.pointB.x);
                X.y = 0.5 * (b.pointA.y + b.pointB.y);
                b.pointA.x = b.pointB.x = X.x;
                b.pointA.y = b.pointB.y = X.y;
                b.distance = 0
            }
        }
    };
    Box2D.postDefs.push(function () {
        Box2D.Collision.b2Distance.s_simplex = new h;
        Box2D.Collision.b2Distance.s_saveA = new Vector_a2j_Number(3);
        Box2D.Collision.b2Distance.s_saveB = new Vector_a2j_Number(3)
    });
    Y.b2DistanceInput = function () {};
    k.b2DistanceOutput = function () {
        this.pointA = new p;
        this.pointB = new p
    };
    z.b2DistanceProxy = function () {};
    z.prototype.Set = function (b) {
        switch (b.GetType()) {
        case K.e_circleShape:
            b = b instanceof F ? b : null;
            this.m_vertices = new Vector(1, true);
            this.m_vertices[0] = b.m_p;
            this.m_count = 1;
            this.m_radius = b.m_radius;
            break;
        case K.e_polygonShape:
            b = b instanceof G ? b : null;
            this.m_vertices = b.m_vertices;
            this.m_count = b.m_vertexCount;
            this.m_radius = b.m_radius;
            break;
        default:
            y.b2Assert(false)
        }
    };
    z.prototype.GetSupport = function (b) {
        for (var e = 0, f = this.m_vertices[0].x * b.x + this.m_vertices[0].y * b.y, m = 1; m < this.m_count; ++m) {
            var r = this.m_vertices[m].x * b.x + this.m_vertices[m].y * b.y;
            if (r > f) {
                e = m;
                f = r
            }
        }
        return e
    };
    z.prototype.GetSupportVertex = function (b) {
        for (var e = 0, f = this.m_vertices[0].x * b.x + this.m_vertices[0].y * b.y, m = 1; m < this.m_count; ++m) {
            var r = this.m_vertices[m].x * b.x + this.m_vertices[m].y * b.y;
            if (r > f) {
                e = m;
                f = r
            }
        }
        return this.m_vertices[e]
    };
    z.prototype.GetVertexCount = function () {
        return this.m_count
    };
    z.prototype.GetVertex = function (b) {
        if (b === undefined) b = 0;
        y.b2Assert(0 <= b && b < this.m_count);
        return this.m_vertices[b]
    };
    u.b2DynamicTree = function () {};
    u.prototype.b2DynamicTree = function () {
        this.m_freeList = this.m_root = null;
        this.m_insertionCount = this.m_path = 0
    };
    u.prototype.CreateProxy = function (b, e) {
        var f = this.AllocateNode(),
            m = y.b2_aabbExtension,
            r = y.b2_aabbExtension;
        f.aabb.lowerBound.x = b.lowerBound.x - m;
        f.aabb.lowerBound.y = b.lowerBound.y - r;
        f.aabb.upperBound.x = b.upperBound.x + m;
        f.aabb.upperBound.y = b.upperBound.y + r;
        f.userData = e;
        this.InsertLeaf(f);
        return f
    };
    u.prototype.DestroyProxy = function (b) {
        this.RemoveLeaf(b);
        this.FreeNode(b)
    };
    u.prototype.MoveProxy = function (b, e, f) {
        y.b2Assert(b.IsLeaf());
        if (b.aabb.Contains(e)) return false;
        this.RemoveLeaf(b);
        var m = y.b2_aabbExtension + y.b2_aabbMultiplier * (f.x > 0 ? f.x : -f.x);
        f = y.b2_aabbExtension + y.b2_aabbMultiplier * (f.y > 0 ? f.y : -f.y);
        b.aabb.lowerBound.x = e.lowerBound.x - m;
        b.aabb.lowerBound.y = e.lowerBound.y - f;
        b.aabb.upperBound.x = e.upperBound.x + m;
        b.aabb.upperBound.y = e.upperBound.y + f;
        this.InsertLeaf(b);
        return true
    };
    u.prototype.Rebalance = function (b) {
        if (b === undefined) b = 0;
        if (this.m_root != null) for (var e = 0; e < b; e++) {
                for (var f = this.m_root, m = 0; f.IsLeaf() == false;) {
                    f = this.m_path >> m & 1 ? f.child2 : f.child1;
                    m = m + 1 & 31
                }++this.m_path;
                this.RemoveLeaf(f);
                this.InsertLeaf(f)
            }
    };
    u.prototype.GetFatAABB = function (b) {
        return b.aabb
    };
    u.prototype.GetUserData = function (b) {
        return b.userData
    };
    u.prototype.Query = function (b, e) {
        if (this.m_root != null) {
            var f = new Vector,
                m = 0;
            for (f[m++] = this.m_root; m > 0;) {
                var r = f[--m];
                if (r.aabb.TestOverlap(e))
                    if (r.IsLeaf()) {
                        if (!b(r)) break
                    } else {
                        f[m++] = r.child1;
                        f[m++] = r.child2
                    }
            }
        }
    };
    u.prototype.RayCast = function (b, e) {
        if (this.m_root != null) {
            var f = e.p1,
                m = e.p2,
                r = w.SubtractVV(f, m);
            r.Normalize();
            r = w.CrossFV(1, r);
            var s = w.AbsV(r),
                v = e.maxFraction,
                t = new B,
                x = 0,
                C = 0;
            x = f.x + v * (m.x - f.x);
            C = f.y + v * (m.y - f.y);
            t.lowerBound.x = Math.min(f.x, x);
            t.lowerBound.y = Math.min(f.y, C);
            t.upperBound.x = Math.max(f.x, x);
            t.upperBound.y = Math.max(f.y, C);
            var J = new Vector,
                T = 0;
            for (J[T++] = this.m_root; T > 0;) {
                v = J[--T];
                if (v.aabb.TestOverlap(t) != false) {
                    x = v.aabb.GetCenter();
                    C = v.aabb.GetExtents();
                    if (!(Math.abs(r.x * (f.x - x.x) + r.y * (f.y - x.y)) - s.x * C.x - s.y * C.y > 0))
                        if (v.IsLeaf()) {
                            x = new S;
                            x.p1 = e.p1;
                            x.p2 = e.p2;
                            x.maxFraction = e.maxFraction;
                            v = b(x, v);
                            if (v == 0) break;
                            if (v > 0) {
                                x = f.x + v * (m.x - f.x);
                                C = f.y + v * (m.y - f.y);
                                t.lowerBound.x = Math.min(f.x, x);
                                t.lowerBound.y = Math.min(f.y, C);
                                t.upperBound.x = Math.max(f.x, x);
                                t.upperBound.y = Math.max(f.y, C)
                            }
                        } else {
                            J[T++] = v.child1;
                            J[T++] = v.child2
                        }
                }
            }
        }
    };
    u.prototype.AllocateNode = function () {
        if (this.m_freeList) {
            var b = this.m_freeList;
            this.m_freeList = b.parent;
            b.parent = null;
            b.child1 = null;
            b.child2 = null;
            return b
        }
        return new H
    };
    u.prototype.FreeNode = function (b) {
        b.parent = this.m_freeList;
        this.m_freeList = b
    };
    u.prototype.InsertLeaf = function (b) {
        ++this.m_insertionCount;
        if (this.m_root == null) {
            this.m_root = b;
            this.m_root.parent = null
        } else {
            var e = b.aabb.GetCenter(),
                f = this.m_root;
            if (f.IsLeaf() == false) {
                do {
                    var m = f.child1;
                    f = f.child2;
                    f = Math.abs((m.aabb.lowerBound.x + m.aabb.upperBound.x) / 2 - e.x) + Math.abs((m.aabb.lowerBound.y + m.aabb.upperBound.y) / 2 - e.y) < Math.abs((f.aabb.lowerBound.x + f.aabb.upperBound.x) / 2 - e.x) + Math.abs((f.aabb.lowerBound.y + f.aabb.upperBound.y) / 2 - e.y) ? m : f
                } while (f.IsLeaf() == false)
            }
            e = f.parent;
            m = this.AllocateNode();
            m.parent = e;
            m.userData = null;
            m.aabb.Combine(b.aabb, f.aabb);
            if (e) {
                if (f.parent.child1 == f) e.child1 = m;
                else e.child2 = m;
                m.child1 = f;
                m.child2 = b;
                f.parent = m;
                b.parent = m;
                do {
                    if (e.aabb.Contains(m.aabb)) break;
                    e.aabb.Combine(e.child1.aabb, e.child2.aabb);
                    m = e;
                    e = e.parent
                } while (e)
            } else {
                m.child1 = f;
                m.child2 = b;
                f.parent = m;
                this.m_root = b.parent = m
            }
        }
    };
    u.prototype.RemoveLeaf = function (b) {
        if (b == this.m_root) this.m_root = null;
        else {
            var e = b.parent,
                f = e.parent;
            b = e.child1 == b ? e.child2 : e.child1;
            if (f) {
                if (f.child1 == e) f.child1 = b;
                else f.child2 = b;
                b.parent = f;
                for (this.FreeNode(e); f;) {
                    e = f.aabb;
                    f.aabb = B.Combine(f.child1.aabb, f.child2.aabb);
                    if (e.Contains(f.aabb)) break;
                    f = f.parent
                }
            } else {
                this.m_root = b;
                b.parent = null;
                this.FreeNode(e)
            }
        }
    };
    D.b2DynamicTreeBroadPhase = function () {
        this.m_tree = new u;
        this.m_moveBuffer = new Vector;
        this.m_pairBuffer = new Vector;
        this.m_pairCount = 0
    };
    D.prototype.CreateProxy = function (b, e) {
        var f = this.m_tree.CreateProxy(b, e);
        ++this.m_proxyCount;
        this.BufferMove(f);
        return f
    };
    D.prototype.DestroyProxy = function (b) {
        this.UnBufferMove(b);
        --this.m_proxyCount;
        this.m_tree.DestroyProxy(b)
    };
    D.prototype.MoveProxy = function (b, e, f) {
        this.m_tree.MoveProxy(b, e, f) && this.BufferMove(b)
    };
    D.prototype.TestOverlap = function (b, e) {
        var f = this.m_tree.GetFatAABB(b),
            m = this.m_tree.GetFatAABB(e);
        return f.TestOverlap(m)
    };
    D.prototype.GetUserData = function (b) {
        return this.m_tree.GetUserData(b)
    };
    D.prototype.GetFatAABB = function (b) {
        return this.m_tree.GetFatAABB(b)
    };
    D.prototype.GetProxyCount = function () {
        return this.m_proxyCount
    };
    D.prototype.UpdatePairs = function (b) {
        var e = this;
        var f = e.m_pairCount = 0,
            m;
        for (f = 0; f < e.m_moveBuffer.length; ++f) {
            m = e.m_moveBuffer[f];
            var r = e.m_tree.GetFatAABB(m);
            e.m_tree.Query(function (t) {
                    if (t == m) return true;
                    if (e.m_pairCount == e.m_pairBuffer.length) e.m_pairBuffer[e.m_pairCount] = new O;
                    var x = e.m_pairBuffer[e.m_pairCount];
                    x.proxyA = t < m ? t : m;
                    x.proxyB = t >= m ? t : m;
                    ++e.m_pairCount;
                    return true
                },
                r)
        }
        for (f = e.m_moveBuffer.length = 0; f < e.m_pairCount;) {
            r = e.m_pairBuffer[f];
            var s = e.m_tree.GetUserData(r.proxyA),
                v = e.m_tree.GetUserData(r.proxyB);
            b(s, v);
            for (++f; f < e.m_pairCount;) {
                s = e.m_pairBuffer[f];
                if (s.proxyA != r.proxyA || s.proxyB != r.proxyB) break;
                ++f
            }
        }
    };
    D.prototype.Query = function (b, e) {
        this.m_tree.Query(b, e)
    };
    D.prototype.RayCast = function (b, e) {
        this.m_tree.RayCast(b, e)
    };
    D.prototype.Validate = function () {};
    D.prototype.Rebalance = function (b) {
        if (b === undefined) b = 0;
        this.m_tree.Rebalance(b)
    };
    D.prototype.BufferMove = function (b) {
            this.m_moveBuffer[this.m_moveBuffer.length] = b
    };
    D.prototype.UnBufferMove = function (b) {
        this.m_moveBuffer.splice(parseInt(this.m_moveBuffer.indexOf(b)), 1)
    };
    D.prototype.ComparePairs = function () {
        return 0
    };
    D.__implements = {};
    D.__implements[g] = true;
    H.b2DynamicTreeNode = function () {
        this.aabb = new B
    };
    H.prototype.IsLeaf = function () {
        return this.child1 == null
    };
    O.b2DynamicTreePair = function () {};
    E.b2Manifold = function () {
        this.m_pointCount = 0
    };
    E.prototype.b2Manifold = function () {
        this.m_points = new Vector(y.b2_maxManifoldPoints);
        for (var b = 0; b < y.b2_maxManifoldPoints; b++) this.m_points[b] = new R;
        this.m_localPlaneNormal = new p;
        this.m_localPoint = new p
    };
    E.prototype.Reset = function () {
        for (var b = 0; b < y.b2_maxManifoldPoints; b++)(this.m_points[b] instanceof R ? this.m_points[b] : null).Reset();
        this.m_localPlaneNormal.SetZero();
        this.m_localPoint.SetZero();
        this.m_pointCount = this.m_type = 0
    };
    E.prototype.Set = function (b) {
        this.m_pointCount = b.m_pointCount;
        for (var e = 0; e < y.b2_maxManifoldPoints; e++)(this.m_points[e] instanceof R ? this.m_points[e] : null).Set(b.m_points[e]);
        this.m_localPlaneNormal.SetV(b.m_localPlaneNormal);
        this.m_localPoint.SetV(b.m_localPoint);
        this.m_type = b.m_type
    };
    E.prototype.Copy = function () {
        var b = new E;
        b.Set(this);
        return b
    };
    Box2D.postDefs.push(function () {
        Box2D.Collision.b2Manifold.e_circles = 1;
        Box2D.Collision.b2Manifold.e_faceA = 2;
        Box2D.Collision.b2Manifold.e_faceB = 4
    });
    R.b2ManifoldPoint = function () {
        this.m_localPoint = new p;
        this.m_id = new L
    };
    R.prototype.b2ManifoldPoint = function () {
        this.Reset()
    };
    R.prototype.Reset = function () {
        this.m_localPoint.SetZero();
        this.m_tangentImpulse = this.m_normalImpulse = 0;
        this.m_id.key = 0
    };
    R.prototype.Set = function (b) {
        this.m_localPoint.SetV(b.m_localPoint);
        this.m_normalImpulse = b.m_normalImpulse;
        this.m_tangentImpulse = b.m_tangentImpulse;
        this.m_id.Set(b.m_id)
    };
    N.b2Point = function () {
        this.p = new p
    };
    N.prototype.Support = function () {
        return this.p
    };
    N.prototype.GetFirstVertex = function () {
        return this.p
    };
    S.b2RayCastInput = function () {
        this.p1 = new p;
        this.p2 = new p
    };
    S.prototype.b2RayCastInput = function (b, e, f) {
        if (b === undefined) b = null;
        if (e === undefined) e = null;
        if (f === undefined) f = 1;
        b && this.p1.SetV(b);
        e && this.p2.SetV(e);
        this.maxFraction = f
    };
    aa.b2RayCastOutput = function () {
        this.normal = new p
    };
    Z.b2Segment = function () {
        this.p1 = new p;
        this.p2 = new p
    };
    Z.prototype.TestSegment = function (b, e, f, m) {
        if (m === undefined) m = 0;
        var r = f.p1,
            s = f.p2.x - r.x,
            v = f.p2.y - r.y;
        f = this.p2.y - this.p1.y;
        var t = -(this.p2.x - this.p1.x),
            x = 100 * Number.MIN_VALUE,
            C = -(s * f + v * t);
        if (C > x) {
            var J = r.x - this.p1.x,
                T = r.y - this.p1.y;
            r = J * f + T * t;
            if (0 <= r && r <= m * C) {
                m = -s * T + v * J;
                if (-x * C <= m && m <= C * (1 + x)) {
                    r /= C;
                    m = Math.sqrt(f * f + t * t);
                    f /= m;
                    t /= m;
                    b[0] = r;
                    e.Set(f,
                        t);
                    return true
                }
            }
        }
        return false
    };
    Z.prototype.Extend = function (b) {
        this.ExtendForward(b);
        this.ExtendBackward(b)
    };
    Z.prototype.ExtendForward = function (b) {
        var e = this.p2.x - this.p1.x,
            f = this.p2.y - this.p1.y;
        b = Math.min(e > 0 ? (b.upperBound.x - this.p1.x) / e : e < 0 ? (b.lowerBound.x - this.p1.x) / e : Number.POSITIVE_INFINITY, f > 0 ? (b.upperBound.y - this.p1.y) / f : f < 0 ? (b.lowerBound.y - this.p1.y) / f : Number.POSITIVE_INFINITY);
        this.p2.x = this.p1.x + e * b;
        this.p2.y = this.p1.y + f * b
    };
    Z.prototype.ExtendBackward = function (b) {
        var e = -this.p2.x + this.p1.x,
            f = -this.p2.y + this.p1.y;
        b = Math.min(e > 0 ? (b.upperBound.x - this.p2.x) / e : e < 0 ? (b.lowerBound.x - this.p2.x) / e : Number.POSITIVE_INFINITY, f > 0 ? (b.upperBound.y - this.p2.y) / f : f < 0 ? (b.lowerBound.y - this.p2.y) / f : Number.POSITIVE_INFINITY);
        this.p1.x = this.p2.x + e * b;
        this.p1.y = this.p2.y + f * b
    };
    d.b2SeparationFunction = function () {
        this.m_localPoint = new p;
        this.m_axis = new p
    };
    d.prototype.Initialize = function (b, e, f, m, r) {
        this.m_proxyA = e;
        this.m_proxyB = m;
        var s = parseInt(b.count);
        y.b2Assert(0 < s && s < 3);
        var v, t, x, C, J = C = x = m = e = 0,
            T = 0;
        J = 0;
        if (s == 1) {
            this.m_type = d.e_points;
            v = this.m_proxyA.GetVertex(b.indexA[0]);
            t = this.m_proxyB.GetVertex(b.indexB[0]);
            s = v;
            b = f.R;
            e = f.position.x + (b.col1.x * s.x + b.col2.x * s.y);
            m = f.position.y + (b.col1.y * s.x + b.col2.y * s.y);
            s = t;
            b = r.R;
            x = r.position.x + (b.col1.x * s.x + b.col2.x * s.y);
            C = r.position.y + (b.col1.y * s.x + b.col2.y * s.y);
            this.m_axis.x = x - e;
            this.m_axis.y = C - m;
            this.m_axis.Normalize()
        } else {
            if (b.indexB[0] == b.indexB[1]) {
                this.m_type = d.e_faceA;
                e = this.m_proxyA.GetVertex(b.indexA[0]);
                m = this.m_proxyA.GetVertex(b.indexA[1]);
                t = this.m_proxyB.GetVertex(b.indexB[0]);
                this.m_localPoint.x = 0.5 * (e.x + m.x);
                this.m_localPoint.y = 0.5 * (e.y + m.y);
                this.m_axis = w.CrossVF(w.SubtractVV(m, e), 1);
                this.m_axis.Normalize();
                s = this.m_axis;
                b = f.R;
                J = b.col1.x * s.x + b.col2.x * s.y;
                T = b.col1.y * s.x + b.col2.y * s.y;
                s = this.m_localPoint;
                b = f.R;
                e = f.position.x + (b.col1.x * s.x + b.col2.x * s.y);
                m = f.position.y + (b.col1.y * s.x + b.col2.y * s.y);
                s = t;
                b = r.R;
                x = r.position.x + (b.col1.x * s.x + b.col2.x * s.y);
                C = r.position.y + (b.col1.y * s.x + b.col2.y * s.y);
                J = (x - e) * J + (C - m) * T
            } else if (b.indexA[0] == b.indexA[0]) {
                this.m_type = d.e_faceB;
                x = this.m_proxyB.GetVertex(b.indexB[0]);
                C = this.m_proxyB.GetVertex(b.indexB[1]);
                v = this.m_proxyA.GetVertex(b.indexA[0]);
                this.m_localPoint.x = 0.5 * (x.x + C.x);
                this.m_localPoint.y = 0.5 * (x.y + C.y);
                this.m_axis = w.CrossVF(w.SubtractVV(C, x), 1);
                this.m_axis.Normalize();
                s = this.m_axis;
                b = r.R;
                J = b.col1.x * s.x + b.col2.x * s.y;
                T = b.col1.y * s.x + b.col2.y * s.y;
                s = this.m_localPoint;
                b = r.R;
                x = r.position.x + (b.col1.x * s.x + b.col2.x * s.y);
                C = r.position.y + (b.col1.y * s.x + b.col2.y * s.y);
                s = v;
                b = f.R;
                e = f.position.x + (b.col1.x * s.x + b.col2.x * s.y);
                m = f.position.y + (b.col1.y * s.x + b.col2.y * s.y);
                J = (e - x) * J + (m - C) * T
            } else {
                e = this.m_proxyA.GetVertex(b.indexA[0]);
                m = this.m_proxyA.GetVertex(b.indexA[1]);
                x = this.m_proxyB.GetVertex(b.indexB[0]);
                C = this.m_proxyB.GetVertex(b.indexB[1]);
                w.MulX(f, v);
                v = w.MulMV(f.R, w.SubtractVV(m, e));
                w.MulX(r, t);
                J = w.MulMV(r.R, w.SubtractVV(C, x));
                r = v.x * v.x + v.y * v.y;
                t = J.x * J.x + J.y * J.y;
                b = w.SubtractVV(J, v);
                f = v.x * b.x + v.y * b.y;
                b = J.x * b.x + J.y * b.y;
                v = v.x * J.x + v.y * J.y;
                T = r * t - v * v;
                J = 0;
                if (T != 0) J = w.Clamp((v * b - f * t) / T, 0, 1);
                if ((v * J + b) / t < 0) J = w.Clamp((v - f) / r, 0, 1);
                v = new p;
                v.x = e.x + J * (m.x - e.x);
                v.y = e.y + J * (m.y - e.y);
                t = new p;
                t.x = x.x + J * (C.x - x.x);
                t.y = x.y + J * (C.y - x.y);
                if (J == 0 || J == 1) {
                    this.m_type = d.e_faceB;
                    this.m_axis = w.CrossVF(w.SubtractVV(C, x), 1);
                    this.m_axis.Normalize();
                    this.m_localPoint = t
                } else {
                    this.m_type = d.e_faceA;
                    this.m_axis = w.CrossVF(w.SubtractVV(m, e), 1);
                    this.m_localPoint = v
                }
            }
            J < 0 && this.m_axis.NegativeSelf()
        }
    };
    d.prototype.Evaluate = function (b, e) {
        var f, m, r = 0;
        switch (this.m_type) {
        case d.e_points:
            f = w.MulTMV(b.R, this.m_axis);
            m = w.MulTMV(e.R, this.m_axis.GetNegative());
            f = this.m_proxyA.GetSupportVertex(f);
            m = this.m_proxyB.GetSupportVertex(m);
            f = w.MulX(b, f);
            m = w.MulX(e, m);
            return r = (m.x - f.x) * this.m_axis.x + (m.y - f.y) * this.m_axis.y;
        case d.e_faceA:
            r = w.MulMV(b.R, this.m_axis);
            f = w.MulX(b, this.m_localPoint);
            m = w.MulTMV(e.R, r.GetNegative());
            m = this.m_proxyB.GetSupportVertex(m);
            m = w.MulX(e, m);
            return r = (m.x - f.x) * r.x + (m.y - f.y) * r.y;
        case d.e_faceB:
            r = w.MulMV(e.R, this.m_axis);
            m = w.MulX(e, this.m_localPoint);
            f = w.MulTMV(b.R, r.GetNegative());
            f = this.m_proxyA.GetSupportVertex(f);
            f = w.MulX(b, f);
            return r = (f.x - m.x) * r.x + (f.y - m.y) * r.y;
        default:
            y.b2Assert(false);
            return 0
        }
    };
    Box2D.postDefs.push(function () {
        Box2D.Collision.b2SeparationFunction.e_points = 1;
        Box2D.Collision.b2SeparationFunction.e_faceA = 2;
        Box2D.Collision.b2SeparationFunction.e_faceB = 4
    });
    h.b2Simplex = function () {
        this.m_v1 = new j;
        this.m_v2 = new j;
        this.m_v3 = new j;
        this.m_vertices = new Vector(3)
    };
    h.prototype.b2Simplex = function () {
        this.m_vertices[0] = this.m_v1;
        this.m_vertices[1] = this.m_v2;
        this.m_vertices[2] = this.m_v3
    };
    h.prototype.ReadCache = function (b, e, f, m, r) {
        y.b2Assert(0 <= b.count && b.count <= 3);
        var s, v;
        this.m_count = b.count;
        for (var t = this.m_vertices, x = 0; x < this.m_count; x++) {
            var C = t[x];
            C.indexA = b.indexA[x];
            C.indexB = b.indexB[x];
            s = e.GetVertex(C.indexA);
            v = m.GetVertex(C.indexB);
            C.wA = w.MulX(f, s);
            C.wB = w.MulX(r, v);
            C.w = w.SubtractVV(C.wB, C.wA);
            C.a = 0
        }
        if (this.m_count > 1) {
            b = b.metric;
            s = this.GetMetric();
            if (s < 0.5 * b || 2 * b < s || s < Number.MIN_VALUE) this.m_count = 0
        }
        if (this.m_count == 0) {
            C = t[0];
            C.indexA = 0;
            C.indexB = 0;
            s = e.GetVertex(0);
            v = m.GetVertex(0);
            C.wA = w.MulX(f, s);
            C.wB = w.MulX(r, v);
            C.w = w.SubtractVV(C.wB, C.wA);
            this.m_count = 1
        }
    };
    h.prototype.WriteCache = function (b) {
            b.metric = this.GetMetric();
            b.count = Box2D.parseUInt(this.m_count);
            for (var e = this.m_vertices, f = 0; f < this.m_count; f++) {
                b.indexA[f] = Box2D.parseUInt(e[f].indexA);
                b.indexB[f] = Box2D.parseUInt(e[f].indexB)
            }
    };
    h.prototype.GetSearchDirection = function () {
        switch (this.m_count) {
        case 1:
            return this.m_v1.w.GetNegative();
        case 2:
            var b = w.SubtractVV(this.m_v2.w, this.m_v1.w);
            return w.CrossVV(b, this.m_v1.w.GetNegative()) > 0 ? w.CrossFV(1, b) : w.CrossVF(b, 1);
        default:
            y.b2Assert(false);
            return new p
        }
    };
    h.prototype.GetClosestPoint = function () {
            switch (this.m_count) {
            case 0:
                y.b2Assert(false);
                return new p;
            case 1:
                return this.m_v1.w;
            case 2:
                return new p(this.m_v1.a * this.m_v1.w.x + this.m_v2.a * this.m_v2.w.x, this.m_v1.a * this.m_v1.w.y + this.m_v2.a * this.m_v2.w.y);
            default:
                y.b2Assert(false);
                return new p
            }
    };
    h.prototype.GetWitnessPoints = function (b, e) {
        switch (this.m_count) {
        case 0:
            y.b2Assert(false);
            break;
        case 1:
            b.SetV(this.m_v1.wA);
            e.SetV(this.m_v1.wB);
            break;
        case 2:
            b.x = this.m_v1.a * this.m_v1.wA.x + this.m_v2.a * this.m_v2.wA.x;
            b.y = this.m_v1.a * this.m_v1.wA.y + this.m_v2.a * this.m_v2.wA.y;
            e.x = this.m_v1.a * this.m_v1.wB.x + this.m_v2.a * this.m_v2.wB.x;
            e.y = this.m_v1.a * this.m_v1.wB.y + this.m_v2.a * this.m_v2.wB.y;
            break;
        case 3:
            e.x = b.x = this.m_v1.a * this.m_v1.wA.x + this.m_v2.a * this.m_v2.wA.x + this.m_v3.a * this.m_v3.wA.x;
            e.y = b.y = this.m_v1.a * this.m_v1.wA.y + this.m_v2.a * this.m_v2.wA.y + this.m_v3.a * this.m_v3.wA.y;
            break;
        default:
            y.b2Assert(false)
        }
    };
    h.prototype.GetMetric = function () {
        switch (this.m_count) {
        case 0:
            y.b2Assert(false);
            return 0;
        case 1:
            return 0;
        case 2:
            return w.SubtractVV(this.m_v1.w,
                this.m_v2.w).Length();
        case 3:
            return w.CrossVV(w.SubtractVV(this.m_v2.w, this.m_v1.w), w.SubtractVV(this.m_v3.w, this.m_v1.w));
        default:
            y.b2Assert(false);
            return 0
        }
    };
    h.prototype.Solve2 = function () {
        var b = this.m_v1.w,
            e = this.m_v2.w,
            f = w.SubtractVV(e, b);
        b = -(b.x * f.x + b.y * f.y);
        if (b <= 0) this.m_count = this.m_v1.a = 1;
        else {
            e = e.x * f.x + e.y * f.y;
            if (e <= 0) {
                this.m_count = this.m_v2.a = 1;
                this.m_v1.Set(this.m_v2)
            } else {
                f = 1 / (e + b);
                this.m_v1.a = e * f;
                this.m_v2.a = b * f;
                this.m_count = 2
            }
        }
    };
    h.prototype.Solve3 = function () {
        var b = this.m_v1.w,
            e = this.m_v2.w,
            f = this.m_v3.w,
            m = w.SubtractVV(e, b),
            r = w.Dot(b, m),
            s = w.Dot(e, m);
        r = -r;
        var v = w.SubtractVV(f, b),
            t = w.Dot(b, v),
            x = w.Dot(f, v);
        t = -t;
        var C = w.SubtractVV(f, e),
            J = w.Dot(e, C);
        C = w.Dot(f, C);
        J = -J;
        v = w.CrossVV(m, v);
        m = v * w.CrossVV(e, f);
        f = v * w.CrossVV(f, b);
        b = v * w.CrossVV(b, e);
        if (r <= 0 && t <= 0) this.m_count = this.m_v1.a = 1;
        else if (s > 0 && r > 0 && b <= 0) {
            x = 1 / (s + r);
            this.m_v1.a = s * x;
            this.m_v2.a = r * x;
            this.m_count = 2
        } else if (x > 0 && t > 0 && f <= 0) {
            s = 1 / (x + t);
            this.m_v1.a = x * s;
            this.m_v3.a = t * s;
            this.m_count = 2;
            this.m_v2.Set(this.m_v3)
        } else if (s <= 0 && J <= 0) {
            this.m_count = this.m_v2.a = 1;
            this.m_v1.Set(this.m_v2)
        } else if (x <= 0 && C <= 0) {
            this.m_count = this.m_v3.a = 1;
            this.m_v1.Set(this.m_v3)
        } else if (C > 0 && J > 0 && m <= 0) {
            s = 1 / (C + J);
            this.m_v2.a = C * s;
            this.m_v3.a = J * s;
            this.m_count = 2;
            this.m_v1.Set(this.m_v3)
        } else {
            s = 1 / (m + f + b);
            this.m_v1.a = m * s;
            this.m_v2.a = f * s;
            this.m_v3.a = b * s;
            this.m_count = 3
        }
    };
    l.b2SimplexCache = function () {
        this.indexA = new Vector_a2j_Number(3);
        this.indexB = new Vector_a2j_Number(3)
    };
    j.b2SimplexVertex = function () {};
    j.prototype.Set = function (b) {
        this.wA.SetV(b.wA);
        this.wB.SetV(b.wB);
        this.w.SetV(b.w);
        this.a = b.a;
        this.indexA = b.indexA;
        this.indexB = b.indexB
    };
    o.b2TimeOfImpact = function () {};
    o.TimeOfImpact = function (b) {
        ++o.b2_toiCalls;
        var e = b.proxyA,
            f = b.proxyB,
            m = b.sweepA,
            r = b.sweepB;
        y.b2Assert(m.t0 == r.t0);
        y.b2Assert(1 - m.t0 > Number.MIN_VALUE);
        var s = e.m_radius + f.m_radius;
        b = b.tolerance;
        var v = 0,
            t = 0,
            x = 0;
        o.s_cache.count = 0;
        for (o.s_distanceInput.useRadii = false;;) {
            m.GetTransform(o.s_xfA, v);
            r.GetTransform(o.s_xfB, v);
            o.s_distanceInput.proxyA = e;
            o.s_distanceInput.proxyB = f;
            o.s_distanceInput.transformA = o.s_xfA;
            o.s_distanceInput.transformB = o.s_xfB;
            W.Distance(o.s_distanceOutput, o.s_cache, o.s_distanceInput);
            if (o.s_distanceOutput.distance <= 0) {
                v = 1;
                break
            }
            o.s_fcn.Initialize(o.s_cache, e, o.s_xfA, f, o.s_xfB);
            var C = o.s_fcn.Evaluate(o.s_xfA, o.s_xfB);
            if (C <= 0) {
                v = 1;
                break
            }
            if (t == 0) x = C > s ? w.Max(s - b, 0.75 * s) : w.Max(C - b, 0.02 * s);
            if (C - x < 0.5 * b) {
                if (t == 0) {
                    v = 1;
                    break
                }
                break
            }
            var J = v,
                T = v,
                P = 1;
            C = C;
            m.GetTransform(o.s_xfA, P);
            r.GetTransform(o.s_xfB, P);
            var X = o.s_fcn.Evaluate(o.s_xfA, o.s_xfB);
            if (X >= x) {
                v = 1;
                break
            }
            for (var $ = 0;;) {
                var ba = 0;
                ba = $ & 1 ? T + (x - C) * (P - T) / (X - C) : 0.5 * (T + P);
                m.GetTransform(o.s_xfA, ba);
                r.GetTransform(o.s_xfB, ba);
                var ca = o.s_fcn.Evaluate(o.s_xfA, o.s_xfB);
                if (w.Abs(ca - x) < 0.025 * b) {
                    J = ba;
                    break
                }
                if (ca > x) {
                    T = ba;
                    C = ca
                } else {
                    P = ba;
                    X = ca
                }++$;
                ++o.b2_toiRootIters;
                if ($ == 50) break
            }
            o.b2_toiMaxRootIters = w.Max(o.b2_toiMaxRootIters, $);
            if (J < (1 + 100 * Number.MIN_VALUE) * v) break;
            v = J;
            t++;
            ++o.b2_toiIters;
            if (t == 1E3) break
        }
        o.b2_toiMaxIters = w.Max(o.b2_toiMaxIters, t);
        return v
    };
    Box2D.postDefs.push(function () {
        Box2D.Collision.b2TimeOfImpact.b2_toiCalls = 0;
        Box2D.Collision.b2TimeOfImpact.b2_toiIters = 0;
        Box2D.Collision.b2TimeOfImpact.b2_toiMaxIters = 0;
        Box2D.Collision.b2TimeOfImpact.b2_toiRootIters = 0;
        Box2D.Collision.b2TimeOfImpact.b2_toiMaxRootIters = 0;
        Box2D.Collision.b2TimeOfImpact.s_cache = new l;
        Box2D.Collision.b2TimeOfImpact.s_distanceInput = new Y;
        Box2D.Collision.b2TimeOfImpact.s_xfA = new U;
        Box2D.Collision.b2TimeOfImpact.s_xfB = new U;
        Box2D.Collision.b2TimeOfImpact.s_fcn = new d;
        Box2D.Collision.b2TimeOfImpact.s_distanceOutput = new k
    });
    q.b2TOIInput = function () {
        this.proxyA = new z;
        this.proxyB = new z;
        this.sweepA = new A;
        this.sweepB = new A
    };
    n.b2WorldManifold = function () {
        this.m_normal = new p
    };
    n.prototype.b2WorldManifold = function () {
        this.m_points = new Vector(y.b2_maxManifoldPoints);
        for (var b = 0; b < y.b2_maxManifoldPoints; b++) this.m_points[b] = new p
    };
    n.prototype.Initialize = function (b, e, f, m, r) {
        if (f === undefined) f = 0;
        if (r === undefined) r = 0;
        if (b.m_pointCount != 0) {
            var s = 0,
                v, t, x = 0,
                C = 0,
                J = 0,
                T = 0,
                P = 0;
            v = 0;
            switch (b.m_type) {
            case E.e_circles:
                t = e.R;
                v = b.m_localPoint;
                s = e.position.x + t.col1.x * v.x + t.col2.x * v.y;
                e = e.position.y + t.col1.y * v.x + t.col2.y * v.y;
                t = m.R;
                v = b.m_points[0].m_localPoint;
                b = m.position.x + t.col1.x * v.x + t.col2.x * v.y;
                m = m.position.y + t.col1.y * v.x + t.col2.y * v.y;
                v = b - s;
                t = m - e;
                x = v * v + t * t;
                if (x > Number.MIN_VALUE * Number.MIN_VALUE) {
                    x = Math.sqrt(x);
                    this.m_normal.x = v / x;
                    this.m_normal.y = t / x
                } else {
                    this.m_normal.x = 1;
                    this.m_normal.y = 0
                }
                v = e + f * this.m_normal.y;
                m = m - r * this.m_normal.y;
                this.m_points[0].x = 0.5 * (s + f * this.m_normal.x + (b - r * this.m_normal.x));
                this.m_points[0].y = 0.5 * (v + m);
                break;
            case E.e_faceA:
                t = e.R;
                v = b.m_localPlaneNormal;
                x = t.col1.x * v.x + t.col2.x * v.y;
                C = t.col1.y * v.x + t.col2.y * v.y;
                t = e.R;
                v = b.m_localPoint;
                J = e.position.x + t.col1.x * v.x + t.col2.x * v.y;
                T = e.position.y + t.col1.y * v.x + t.col2.y * v.y;
                this.m_normal.x = x;
                this.m_normal.y = C;
                for (s = 0; s < b.m_pointCount; s++) {
                    t = m.R;
                    v = b.m_points[s].m_localPoint;
                    P = m.position.x + t.col1.x * v.x + t.col2.x * v.y;
                    v = m.position.y + t.col1.y * v.x + t.col2.y * v.y;
                    this.m_points[s].x = P + 0.5 * (f - (P - J) * x - (v - T) * C - r) * x;
                    this.m_points[s].y = v + 0.5 * (f - (P - J) * x - (v - T) * C - r) * C
                }
                break;
            case E.e_faceB:
                t = m.R;
                v = b.m_localPlaneNormal;
                x = t.col1.x * v.x + t.col2.x * v.y;
                C = t.col1.y * v.x + t.col2.y * v.y;
                t = m.R;
                v = b.m_localPoint;
                J = m.position.x + t.col1.x * v.x + t.col2.x * v.y;
                T = m.position.y + t.col1.y * v.x + t.col2.y * v.y;
                this.m_normal.x = -x;
                this.m_normal.y = -C;
                for (s = 0; s < b.m_pointCount; s++) {
                    t = e.R;
                    v = b.m_points[s].m_localPoint;
                    P = e.position.x + t.col1.x * v.x + t.col2.x * v.y;
                    v = e.position.y + t.col1.y * v.x + t.col2.y * v.y;
                    this.m_points[s].x = P + 0.5 * (r - (P - J) * x - (v - T) * C - f) * x;
                    this.m_points[s].y = v + 0.5 * (r - (P - J) * x - (v - T) * C - f) * C
                }
            }
        }
    };
    a.ClipVertex = function () {
        this.v = new p;
        this.id = new L
    };
    a.prototype.Set = function (b) {
        this.v.SetV(b.v);
        this.id.Set(b.id)
    };
    c.Features = function () {};
    Object.defineProperty(c.prototype, "referenceEdge", {
        enumerable: false,
        configurable: true,
        get: function () {
            return this._referenceEdge
        }
    });
    Object.defineProperty(c.prototype, "referenceEdge", {
        enumerable: false,
        configurable: true,
        set: function (b) {
            if (b === undefined) b = 0;
            this._referenceEdge = b;
            this._m_id._key = this._m_id._key & 4294967040 | this._referenceEdge & 255
        }
    });
    Object.defineProperty(c.prototype, "incidentEdge", {
        enumerable: false,
        configurable: true,
        get: function () {
            return this._incidentEdge
        }
    });
    Object.defineProperty(c.prototype,
        "incidentEdge", {
            enumerable: false,
            configurable: true,
            set: function (b) {
                if (b === undefined) b = 0;
                this._incidentEdge = b;
                this._m_id._key = this._m_id._key & 4294902015 | this._incidentEdge << 8 & 65280
            }
        });
    Object.defineProperty(c.prototype, "incidentVertex", {
        enumerable: false,
        configurable: true,
        get: function () {
            return this._incidentVertex
        }
    });
    Object.defineProperty(c.prototype, "incidentVertex", {
        enumerable: false,
        configurable: true,
        set: function (b) {
            if (b === undefined) b = 0;
            this._incidentVertex = b;
            this._m_id._key = this._m_id._key & 4278255615 |
                this._incidentVertex << 16 & 16711680
        }
    });
    Object.defineProperty(c.prototype, "flip", {
        enumerable: false,
        configurable: true,
        get: function () {
            return this._flip
        }
    });
    Object.defineProperty(c.prototype, "flip", {
        enumerable: false,
        configurable: true,
        set: function (b) {
            if (b === undefined) b = 0;
            this._flip = b;
            this._m_id._key = this._m_id._key & 16777215 | this._flip << 24 & 4278190080
        }
    })
})();
(function () {
    var F = Box2D.Common.b2Settings,
        G = Box2D.Collision.Shapes.b2CircleShape,
        K = Box2D.Collision.Shapes.b2EdgeChainDef,
        y = Box2D.Collision.Shapes.b2EdgeShape,
        w = Box2D.Collision.Shapes.b2MassData,
        A = Box2D.Collision.Shapes.b2PolygonShape,
        U = Box2D.Collision.Shapes.b2Shape,
        p = Box2D.Common.Math.b2Mat22,
        B = Box2D.Common.Math.b2Math,
        Q = Box2D.Common.Math.b2Transform,
        V = Box2D.Common.Math.b2Vec2,
        M = Box2D.Collision.b2Distance,
        L = Box2D.Collision.b2DistanceInput,
        I = Box2D.Collision.b2DistanceOutput,
        W = Box2D.Collision.b2DistanceProxy,
        Y = Box2D.Collision.b2SimplexCache;
    Box2D.inherit(G, Box2D.Collision.Shapes.b2Shape);
    G.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype;
    G.b2CircleShape = function () {
        Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments);
        this.m_p = new V
    };
    G.prototype.Copy = function () {
        var k = new G;
        k.Set(this);
        return k
    };
    G.prototype.Set = function (k) {
        this.__super.Set.call(this, k);
        if (Box2D.is(k, G)) this.m_p.SetV((k instanceof G ? k : null).m_p)
    };
    G.prototype.TestPoint = function (k, z) {
        var u = k.R,
            D = k.position.x + (u.col1.x * this.m_p.x + u.col2.x * this.m_p.y);
        u = k.position.y + (u.col1.y * this.m_p.x + u.col2.y * this.m_p.y);
        D = z.x - D;
        u = z.y - u;
        return D * D + u * u <= this.m_radius * this.m_radius
    };
    G.prototype.RayCast = function (k, z, u) {
        var D = u.R,
            H = z.p1.x - (u.position.x + (D.col1.x * this.m_p.x + D.col2.x * this.m_p.y));
        u = z.p1.y - (u.position.y + (D.col1.y * this.m_p.x + D.col2.y * this.m_p.y));
        D = z.p2.x - z.p1.x;
        var O = z.p2.y - z.p1.y,
            E = H * D + u * O,
            R = D * D + O * O,
            N = E * E - R * (H * H + u * u - this.m_radius * this.m_radius);
        if (N < 0 || R < Number.MIN_VALUE) return false;
        E = -(E + Math.sqrt(N));
        if (0 <= E && E <= z.maxFraction * R) {
            E /= R;
            k.fraction = E;
            k.normal.x = H + E * D;
            k.normal.y = u + E * O;
            k.normal.Normalize();
            return true
        }
        return false
    };
    G.prototype.ComputeAABB = function (k, z) {
        var u = z.R,
            D = z.position.x + (u.col1.x * this.m_p.x + u.col2.x * this.m_p.y);
        u = z.position.y + (u.col1.y * this.m_p.x + u.col2.y * this.m_p.y);
        k.lowerBound.Set(D - this.m_radius, u - this.m_radius);
        k.upperBound.Set(D + this.m_radius, u + this.m_radius)
    };
    G.prototype.ComputeMass = function (k, z) {
        if (z === undefined) z = 0;
        k.mass = z * F.b2_pi * this.m_radius * this.m_radius;
        k.center.SetV(this.m_p);
        k.I = k.mass * (0.5 * this.m_radius * this.m_radius + (this.m_p.x * this.m_p.x + this.m_p.y * this.m_p.y))
    };
    G.prototype.ComputeSubmergedArea = function (k, z, u, D) {
        if (z === undefined) z = 0;
        u = B.MulX(u, this.m_p);
        var H = -(B.Dot(k, u) - z);
        if (H < -this.m_radius + Number.MIN_VALUE) return 0;
        if (H > this.m_radius) {
            D.SetV(u);
            return Math.PI * this.m_radius * this.m_radius
        }
        z = this.m_radius * this.m_radius;
        var O = H * H;
        H = z * (Math.asin(H / this.m_radius) + Math.PI / 2) + H * Math.sqrt(z - O);
        z = -2 / 3 * Math.pow(z - O, 1.5) / H;
        D.x = u.x + k.x * z;
        D.y = u.y + k.y * z;
        return H
    };
    G.prototype.GetLocalPosition = function () {
            return this.m_p
    };
    G.prototype.SetLocalPosition = function (k) {
        this.m_p.SetV(k)
    };
    G.prototype.GetRadius = function () {
        return this.m_radius
    };
    G.prototype.SetRadius = function (k) {
        if (k === undefined) k = 0;
        this.m_radius = k
    };
    G.prototype.b2CircleShape = function (k) {
        if (k === undefined) k = 0;
        this.__super.b2Shape.call(this);
        this.m_type = U.e_circleShape;
        this.m_radius = k
    };
    K.b2EdgeChainDef = function () {};
    K.prototype.b2EdgeChainDef = function () {
        this.vertexCount = 0;
        this.isALoop = true;
        this.vertices = []
    };
    Box2D.inherit(y, Box2D.Collision.Shapes.b2Shape);
    y.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype;
    y.b2EdgeShape = function () {
        Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments);
        this.s_supportVec = new V;
        this.m_v1 = new V;
        this.m_v2 = new V;
        this.m_coreV1 = new V;
        this.m_coreV2 = new V;
        this.m_normal = new V;
        this.m_direction = new V;
        this.m_cornerDir1 = new V;
        this.m_cornerDir2 = new V
    };
    y.prototype.TestPoint = function () {
        return false
    };
    y.prototype.RayCast = function (k, z, u) {
        var D, H = z.p2.x - z.p1.x,
            O = z.p2.y - z.p1.y;
        D = u.R;
        var E = u.position.x + (D.col1.x * this.m_v1.x + D.col2.x * this.m_v1.y),
            R = u.position.y + (D.col1.y * this.m_v1.x + D.col2.y * this.m_v1.y),
            N = u.position.y + (D.col1.y * this.m_v2.x + D.col2.y * this.m_v2.y) - R;
        u = -(u.position.x + (D.col1.x * this.m_v2.x + D.col2.x * this.m_v2.y) - E);
        D = 100 * Number.MIN_VALUE;
        var S = -(H * N + O * u);
        if (S > D) {
            E = z.p1.x - E;
            var aa = z.p1.y - R;
            R = E * N + aa * u;
            if (0 <= R && R <= z.maxFraction * S) {
                z = -H * aa + O * E;
                if (-D * S <= z && z <= S * (1 + D)) {
                    R /= S;
                    k.fraction = R;
                    z = Math.sqrt(N * N + u * u);
                    k.normal.x = N / z;
                    k.normal.y = u / z;
                    return true
                }
            }
        }
        return false
    };
    y.prototype.ComputeAABB = function (k, z) {
        var u = z.R,
            D = z.position.x + (u.col1.x * this.m_v1.x + u.col2.x * this.m_v1.y),
            H = z.position.y + (u.col1.y * this.m_v1.x + u.col2.y * this.m_v1.y),
            O = z.position.x + (u.col1.x * this.m_v2.x + u.col2.x * this.m_v2.y);
        u = z.position.y + (u.col1.y * this.m_v2.x + u.col2.y * this.m_v2.y);
        if (D < O) {
            k.lowerBound.x = D;
            k.upperBound.x = O
        } else {
            k.lowerBound.x = O;
            k.upperBound.x = D
        } if (H < u) {
            k.lowerBound.y = H;
            k.upperBound.y = u
        } else {
            k.lowerBound.y = u;
            k.upperBound.y = H
        }
    };
    y.prototype.ComputeMass = function (k) {
        k.mass = 0;
        k.center.SetV(this.m_v1);
        k.I = 0
    };
    y.prototype.ComputeSubmergedArea = function (k, z, u, D) {
            if (z === undefined) z = 0;
            var H = new V(k.x * z, k.y * z),
                O = B.MulX(u, this.m_v1);
            u = B.MulX(u, this.m_v2);
            var E = B.Dot(k, O) - z;
            k = B.Dot(k, u) - z;
            if (E > 0)
                if (k > 0) return 0;
                else {
                    O.x = -k / (E - k) * O.x + E / (E - k) * u.x;
                    O.y = -k / (E - k) * O.y + E / (E - k) * u.y
                } else if (k > 0) {
                u.x = -k / (E - k) * O.x + E / (E - k) * u.x;
                u.y = -k / (E - k) * O.y + E / (E - k) * u.y
            }
            D.x = (H.x + O.x + u.x) / 3;
            D.y = (H.y + O.y + u.y) / 3;
            return 0.5 * ((O.x - H.x) * (u.y - H.y) - (O.y - H.y) * (u.x - H.x))
    };
    y.prototype.GetLength = function () {
        return this.m_length
    };
    y.prototype.GetVertex1 = function () {
        return this.m_v1
    };
    y.prototype.GetVertex2 = function () {
            return this.m_v2
    };
    y.prototype.GetCoreVertex1 = function () {
        return this.m_coreV1
    };
    y.prototype.GetCoreVertex2 = function () {
        return this.m_coreV2
    };
    y.prototype.GetNormalVector = function () {
        return this.m_normal
    };
    y.prototype.GetDirectionVector = function () {
        return this.m_direction
    };
    y.prototype.GetCorner1Vector = function () {
        return this.m_cornerDir1
    };
    y.prototype.GetCorner2Vector = function () {
        return this.m_cornerDir2
    };
    y.prototype.Corner1IsConvex = function () {
        return this.m_cornerConvex1
    };
    y.prototype.Corner2IsConvex = function () {
            return this.m_cornerConvex2
    };
    y.prototype.GetFirstVertex = function (k) {
        var z = k.R;
        return new V(k.position.x + (z.col1.x * this.m_coreV1.x + z.col2.x * this.m_coreV1.y), k.position.y + (z.col1.y * this.m_coreV1.x + z.col2.y * this.m_coreV1.y))
    };
    y.prototype.GetNextEdge = function () {
        return this.m_nextEdge
    };
    y.prototype.GetPrevEdge = function () {
        return this.m_prevEdge
    };
    y.prototype.Support = function (k, z, u) {
        if (z === undefined) z = 0;
        if (u === undefined) u = 0;
        var D = k.R,
            H = k.position.x + (D.col1.x * this.m_coreV1.x + D.col2.x * this.m_coreV1.y),
            O = k.position.y + (D.col1.y * this.m_coreV1.x + D.col2.y * this.m_coreV1.y),
            E = k.position.x + (D.col1.x * this.m_coreV2.x + D.col2.x * this.m_coreV2.y);
        k = k.position.y + (D.col1.y * this.m_coreV2.x + D.col2.y * this.m_coreV2.y);
        if (H * z + O * u > E * z + k * u) {
            this.s_supportVec.x = H;
            this.s_supportVec.y = O
        } else {
            this.s_supportVec.x = E;
            this.s_supportVec.y = k
        }
        return this.s_supportVec
    };
    y.prototype.b2EdgeShape = function (k, z) {
        this.__super.b2Shape.call(this);
        this.m_type = U.e_edgeShape;
        this.m_nextEdge = this.m_prevEdge = null;
        this.m_v1 = k;
        this.m_v2 = z;
        this.m_direction.Set(this.m_v2.x - this.m_v1.x, this.m_v2.y - this.m_v1.y);
        this.m_length = this.m_direction.Normalize();
        this.m_normal.Set(this.m_direction.y, -this.m_direction.x);
        this.m_coreV1.Set(-F.b2_toiSlop * (this.m_normal.x - this.m_direction.x) + this.m_v1.x, -F.b2_toiSlop * (this.m_normal.y - this.m_direction.y) + this.m_v1.y);
        this.m_coreV2.Set(-F.b2_toiSlop * (this.m_normal.x + this.m_direction.x) + this.m_v2.x, -F.b2_toiSlop * (this.m_normal.y + this.m_direction.y) + this.m_v2.y);
        this.m_cornerDir1 = this.m_normal;
        this.m_cornerDir2.Set(-this.m_normal.x, -this.m_normal.y)
    };
    y.prototype.SetPrevEdge = function (k, z, u, D) {
        this.m_prevEdge = k;
        this.m_coreV1 = z;
        this.m_cornerDir1 = u;
        this.m_cornerConvex1 = D
    };
    y.prototype.SetNextEdge = function (k, z, u, D) {
        this.m_nextEdge = k;
        this.m_coreV2 = z;
        this.m_cornerDir2 = u;
        this.m_cornerConvex2 = D
    };
    w.b2MassData = function () {
        this.mass = 0;
        this.center = new V(0, 0);
        this.I = 0
    };
    Box2D.inherit(A, Box2D.Collision.Shapes.b2Shape);
    A.prototype.__super = Box2D.Collision.Shapes.b2Shape.prototype;
    A.b2PolygonShape = function () {
        Box2D.Collision.Shapes.b2Shape.b2Shape.apply(this, arguments)
    };
    A.prototype.Copy = function () {
        var k = new A;
        k.Set(this);
        return k
    };
    A.prototype.Set = function (k) {
        this.__super.Set.call(this, k);
        if (Box2D.is(k, A)) {
            k = k instanceof A ? k : null;
            this.m_centroid.SetV(k.m_centroid);
            this.m_vertexCount = k.m_vertexCount;
            this.Reserve(this.m_vertexCount);
            for (var z = 0; z < this.m_vertexCount; z++) {
                this.m_vertices[z].SetV(k.m_vertices[z]);
                this.m_normals[z].SetV(k.m_normals[z])
            }
        }
    };
    A.prototype.SetAsArray = function (k, z) {
        if (z === undefined) z = 0;
        var u = new Vector,
            D = 0,
            H;
        for (D = 0; D < k.length; ++D) {
            H = k[D];
            u.push(H)
        }
        this.SetAsVector(u,
            z)
    };
    A.AsArray = function (k, z) {
        if (z === undefined) z = 0;
        var u = new A;
        u.SetAsArray(k, z);
        return u
    };
    A.prototype.SetAsVector = function (k, z) {
        if (z === undefined) z = 0;
        if (z == 0) z = k.length;
        F.b2Assert(2 <= z);
        this.m_vertexCount = z;
        this.Reserve(z);
        var u = 0;
        for (u = 0; u < this.m_vertexCount; u++) this.m_vertices[u].SetV(k[u]);
        for (u = 0; u < this.m_vertexCount; ++u) {
            var D = parseInt(u),
                H = parseInt(u + 1 < this.m_vertexCount ? u + 1 : 0);
            D = B.SubtractVV(this.m_vertices[H], this.m_vertices[D]);
            F.b2Assert(D.LengthSquared() > Number.MIN_VALUE);
            this.m_normals[u].SetV(B.CrossVF(D,
                1));
            this.m_normals[u].Normalize()
        }
        this.m_centroid = A.ComputeCentroid(this.m_vertices, this.m_vertexCount)
    };
    A.AsVector = function (k, z) {
        if (z === undefined) z = 0;
        var u = new A;
        u.SetAsVector(k, z);
        return u
    };
    A.prototype.SetAsBox = function (k, z) {
        if (k === undefined) k = 0;
        if (z === undefined) z = 0;
        this.m_vertexCount = 4;
        this.Reserve(4);
        this.m_vertices[0].Set(-k, -z);
        this.m_vertices[1].Set(k, -z);
        this.m_vertices[2].Set(k, z);
        this.m_vertices[3].Set(-k, z);
        this.m_normals[0].Set(0, -1);
        this.m_normals[1].Set(1, 0);
        this.m_normals[2].Set(0,
            1);
        this.m_normals[3].Set(-1, 0);
        this.m_centroid.SetZero()
    };
    A.AsBox = function (k, z) {
        if (k === undefined) k = 0;
        if (z === undefined) z = 0;
        var u = new A;
        u.SetAsBox(k, z);
        return u
    };
    A.prototype.SetAsOrientedBox = function (k, z, u, D) {
        if (k === undefined) k = 0;
        if (z === undefined) z = 0;
        if (u === undefined) u = null;
        if (D === undefined) D = 0;
        this.m_vertexCount = 4;
        this.Reserve(4);
        this.m_vertices[0].Set(-k, -z);
        this.m_vertices[1].Set(k, -z);
        this.m_vertices[2].Set(k, z);
        this.m_vertices[3].Set(-k, z);
        this.m_normals[0].Set(0, -1);
        this.m_normals[1].Set(1, 0);
        this.m_normals[2].Set(0, 1);
        this.m_normals[3].Set(-1, 0);
        this.m_centroid = u;
        k = new Q;
        k.position = u;
        k.R.Set(D);
        for (u = 0; u < this.m_vertexCount; ++u) {
            this.m_vertices[u] = B.MulX(k, this.m_vertices[u]);
            this.m_normals[u] = B.MulMV(k.R, this.m_normals[u])
        }
    };
    A.AsOrientedBox = function (k, z, u, D) {
        if (k === undefined) k = 0;
        if (z === undefined) z = 0;
        if (u === undefined) u = null;
        if (D === undefined) D = 0;
        var H = new A;
        H.SetAsOrientedBox(k, z, u, D);
        return H
    };
    A.prototype.SetAsEdge = function (k, z) {
        this.m_vertexCount = 2;
        this.Reserve(2);
        this.m_vertices[0].SetV(k);
        this.m_vertices[1].SetV(z);
        this.m_centroid.x = 0.5 * (k.x + z.x);
        this.m_centroid.y = 0.5 * (k.y + z.y);
        this.m_normals[0] = B.CrossVF(B.SubtractVV(z, k), 1);
        this.m_normals[0].Normalize();
        this.m_normals[1].x = -this.m_normals[0].x;
        this.m_normals[1].y = -this.m_normals[0].y
    };
    A.AsEdge = function (k, z) {
        var u = new A;
        u.SetAsEdge(k, z);
        return u
    };
    A.prototype.TestPoint = function (k, z) {
        var u;
        u = k.R;
        for (var D = z.x - k.position.x, H = z.y - k.position.y, O = D * u.col1.x + H * u.col1.y, E = D * u.col2.x + H * u.col2.y, R = 0; R < this.m_vertexCount; ++R) {
            u = this.m_vertices[R];
            D = O - u.x;
            H = E - u.y;
            u = this.m_normals[R];
            if (u.x * D + u.y * H > 0) return false
        }
        return true
    };
    A.prototype.RayCast = function (k, z, u) {
        var D = 0,
            H = z.maxFraction,
            O = 0,
            E = 0,
            R, N;
        O = z.p1.x - u.position.x;
        E = z.p1.y - u.position.y;
        R = u.R;
        var S = O * R.col1.x + E * R.col1.y,
            aa = O * R.col2.x + E * R.col2.y;
        O = z.p2.x - u.position.x;
        E = z.p2.y - u.position.y;
        R = u.R;
        z = O * R.col1.x + E * R.col1.y - S;
        R = O * R.col2.x + E * R.col2.y - aa;
        for (var Z = parseInt(-1), d = 0; d < this.m_vertexCount; ++d) {
            N = this.m_vertices[d];
            O = N.x - S;
            E = N.y - aa;
            N = this.m_normals[d];
            O = N.x * O + N.y * E;
            E = N.x * z + N.y * R;
            if (E == 0) {
                if (O < 0) return false
            } else if (E < 0 && O < D * E) {
                D = O / E;
                Z = d
            } else if (E > 0 && O < H * E) H = O / E;
            if (H < D - Number.MIN_VALUE) return false
        }
        if (Z >= 0) {
            k.fraction = D;
            R = u.R;
            N = this.m_normals[Z];
            k.normal.x = R.col1.x * N.x + R.col2.x * N.y;
            k.normal.y = R.col1.y * N.x + R.col2.y * N.y;
            return true
        }
        return false
    };
    A.prototype.ComputeAABB = function (k, z) {
        for (var u = z.R, D = this.m_vertices[0], H = z.position.x + (u.col1.x * D.x + u.col2.x * D.y), O = z.position.y + (u.col1.y * D.x + u.col2.y * D.y), E = H, R = O, N = 1; N < this.m_vertexCount; ++N) {
            D = this.m_vertices[N];
            var S = z.position.x + (u.col1.x * D.x + u.col2.x * D.y);
            D = z.position.y + (u.col1.y * D.x + u.col2.y * D.y);
            H = H < S ? H : S;
            O = O < D ? O : D;
            E = E > S ? E : S;
            R = R > D ? R : D
        }
        k.lowerBound.x = H - this.m_radius;
        k.lowerBound.y = O - this.m_radius;
        k.upperBound.x = E + this.m_radius;
        k.upperBound.y = R + this.m_radius
    };
    A.prototype.ComputeMass = function (k, z) {
        if (z === undefined) z = 0;
        if (this.m_vertexCount == 2) {
            k.center.x = 0.5 * (this.m_vertices[0].x + this.m_vertices[1].x);
            k.center.y = 0.5 * (this.m_vertices[0].y + this.m_vertices[1].y);
            k.mass = 0;
            k.I = 0
        } else {
            for (var u = 0, D = 0, H = 0, O = 0, E = 1 / 3, R = 0; R < this.m_vertexCount; ++R) {
                var N = this.m_vertices[R],
                    S = R + 1 < this.m_vertexCount ? this.m_vertices[parseInt(R + 1)] : this.m_vertices[0],
                    aa = N.x - 0,
                    Z = N.y - 0,
                    d = S.x - 0,
                    h = S.y - 0,
                    l = aa * h - Z * d,
                    j = 0.5 * l;
                H += j;
                u += j * E * (0 + N.x + S.x);
                D += j * E * (0 + N.y + S.y);
                N = aa;
                Z = Z;
                d = d;
                h = h;
                O += l * (E * (0.25 * (N * N + d * N + d * d) + (0 * N + 0 * d)) + 0 + (E * (0.25 * (Z * Z + h * Z + h * h) + (0 * Z + 0 * h)) + 0))
            }
            k.mass = z * H;
            u *= 1 / H;
            D *= 1 / H;
            k.center.Set(u, D);
            k.I = z * O
        }
    };
    A.prototype.ComputeSubmergedArea = function (k, z, u, D) {
        if (z === undefined) z = 0;
        var H = B.MulTMV(u.R, k),
            O = z - B.Dot(k, u.position),
            E = new Vector_a2j_Number,
            R = 0,
            N = parseInt(-1);
        z = parseInt(-1);
        var S = false;
        for (k = k = 0; k < this.m_vertexCount; ++k) {
            E[k] = B.Dot(H, this.m_vertices[k]) - O;
            var aa = E[k] < -Number.MIN_VALUE;
            if (k > 0)
                if (aa) {
                    if (!S) {
                        N = k - 1;
                        R++
                    }
                } else if (S) {
                z = k - 1;
                R++
            }
            S = aa
        }
        switch (R) {
        case 0:
            if (S) {
                k = new w;
                this.ComputeMass(k, 1);
                D.SetV(B.MulX(u, k.center));
                return k.mass
            } else return 0;
        case 1:
            if (N == -1) N = this.m_vertexCount - 1;
            else z = this.m_vertexCount - 1
        }
        k = parseInt((N + 1) % this.m_vertexCount);
        H = parseInt((z + 1) % this.m_vertexCount);
        O = (0 - E[N]) / (E[k] - E[N]);
        E = (0 - E[z]) / (E[H] - E[z]);
        N = new V(this.m_vertices[N].x * (1 - O) + this.m_vertices[k].x * O, this.m_vertices[N].y * (1 - O) + this.m_vertices[k].y * O);
        z = new V(this.m_vertices[z].x * (1 - E) + this.m_vertices[H].x * E, this.m_vertices[z].y * (1 - E) + this.m_vertices[H].y * E);
        E = 0;
        O = new V;
        R = this.m_vertices[k];
        for (k = k; k != H;) {
            k = (k + 1) % this.m_vertexCount;
            S = k == H ? z : this.m_vertices[k];
            aa = 0.5 * ((R.x - N.x) * (S.y - N.y) - (R.y - N.y) * (S.x - N.x));
            E += aa;
            O.x += aa * (N.x + R.x + S.x) / 3;
            O.y += aa * (N.y + R.y + S.y) / 3;
            R = S
        }
        O.Multiply(1 / E);
        D.SetV(B.MulX(u, O));
        return E
    };
    A.prototype.GetVertexCount = function () {
        return this.m_vertexCount
    };
    A.prototype.GetVertices = function () {
        return this.m_vertices
    };
    A.prototype.GetNormals = function () {
        return this.m_normals
    };
    A.prototype.GetSupport = function (k) {
        for (var z = 0, u = this.m_vertices[0].x * k.x + this.m_vertices[0].y * k.y, D = 1; D < this.m_vertexCount; ++D) {
            var H = this.m_vertices[D].x * k.x + this.m_vertices[D].y * k.y;
            if (H > u) {
                z = D;
                u = H
            }
        }
        return z
    };
    A.prototype.GetSupportVertex = function (k) {
        for (var z = 0, u = this.m_vertices[0].x * k.x + this.m_vertices[0].y * k.y, D = 1; D < this.m_vertexCount; ++D) {
            var H = this.m_vertices[D].x * k.x + this.m_vertices[D].y * k.y;
            if (H > u) {
                z = D;
                u = H
            }
        }
        return this.m_vertices[z]
    };
    A.prototype.Validate = function () {
        return false
    };
    A.prototype.b2PolygonShape = function () {
        this.__super.b2Shape.call(this);
        this.m_type = U.e_polygonShape;
        this.m_centroid = new V;
        this.m_vertices = new Vector;
        this.m_normals = new Vector
    };
    A.prototype.Reserve = function (k) {
        if (k === undefined) k = 0;
        for (var z = parseInt(this.m_vertices.length); z < k; z++) {
            this.m_vertices[z] = new V;
            this.m_normals[z] = new V
        }
    };
    A.ComputeCentroid = function (k, z) {
        if (z === undefined) z = 0;
        for (var u = new V, D = 0, H = 1 / 3, O = 0; O < z; ++O) {
            var E = k[O],
                R = O + 1 < z ? k[parseInt(O + 1)] : k[0],
                N = 0.5 * ((E.x - 0) * (R.y - 0) - (E.y - 0) * (R.x - 0));
            D += N;
            u.x += N * H * (0 + E.x + R.x);
            u.y += N * H * (0 + E.y + R.y)
        }
        u.x *= 1 / D;
        u.y *= 1 / D;
        return u
    };
    A.ComputeOBB = function (k, z, u) {
        if (u === undefined) u = 0;
        var D = 0,
            H = new Vector(u + 1);
        for (D = 0; D < u; ++D) H[D] = z[D];
        H[u] = H[0];
        z = Number.MAX_VALUE;
        for (D = 1; D <= u; ++D) {
            var O = H[parseInt(D - 1)],
                E = H[D].x - O.x,
                R = H[D].y - O.y,
                N = Math.sqrt(E * E + R * R);
            E /= N;
            R /= N;
            for (var S = -R, aa = E, Z = N = Number.MAX_VALUE, d = -Number.MAX_VALUE, h = -Number.MAX_VALUE, l = 0; l < u; ++l) {
                var j = H[l].x - O.x,
                    o = H[l].y - O.y,
                    q = E * j + R * o;
                j = S * j + aa * o;
                if (q < N) N = q;
                if (j < Z) Z = j;
                if (q > d) d = q;
                if (j > h) h = j
            }
            l = (d - N) * (h - Z);
            if (l < 0.95 * z) {
                z = l;
                k.R.col1.x = E;
                k.R.col1.y = R;
                k.R.col2.x = S;
                k.R.col2.y = aa;
                E = 0.5 * (N + d);
                R = 0.5 * (Z + h);
                S = k.R;
                k.center.x = O.x + (S.col1.x * E + S.col2.x * R);
                k.center.y = O.y + (S.col1.y * E + S.col2.y * R);
                k.extents.x = 0.5 * (d - N);
                k.extents.y = 0.5 * (h - Z)
            }
        }
    };
    Box2D.postDefs.push(function () {
        Box2D.Collision.Shapes.b2PolygonShape.s_mat = new p
    });
    U.b2Shape = function () {};
    U.prototype.Copy = function () {
        return null
    };
    U.prototype.Set = function (k) {
        this.m_radius = k.m_radius
    };
    U.prototype.GetType = function () {
        return this.m_type
    };
    U.prototype.TestPoint = function () {
        return false
    };
    U.prototype.RayCast = function () {
        return false
    };
    U.prototype.ComputeAABB = function () {};
    U.prototype.ComputeMass = function () {};
    U.prototype.ComputeSubmergedArea = function () {
        return 0
    };
    U.TestOverlap = function (k, z, u, D) {
        var H = new L;
        H.proxyA = new W;
        H.proxyA.Set(k);
        H.proxyB = new W;
        H.proxyB.Set(u);
        H.transformA = z;
        H.transformB = D;
        H.useRadii = true;
        k = new Y;
        k.count = 0;
        z = new I;
        M.Distance(z, k, H);
        return z.distance < 10 * Number.MIN_VALUE
    };
    U.prototype.b2Shape = function () {
        this.m_type = U.e_unknownShape;
        this.m_radius = F.b2_linearSlop
    };
    Box2D.postDefs.push(function () {
        Box2D.Collision.Shapes.b2Shape.e_unknownShape = parseInt(-1);
        Box2D.Collision.Shapes.b2Shape.e_circleShape = 0;
        Box2D.Collision.Shapes.b2Shape.e_polygonShape = 1;
        Box2D.Collision.Shapes.b2Shape.e_edgeShape = 2;
        Box2D.Collision.Shapes.b2Shape.e_shapeTypeCount = 3;
        Box2D.Collision.Shapes.b2Shape.e_hitCollide = 1;
        Box2D.Collision.Shapes.b2Shape.e_missCollide = 0;
        Box2D.Collision.Shapes.b2Shape.e_startsInsideCollide = parseInt(-1)
    })
})();
(function () {
    var F = Box2D.Common.b2Color,
        G = Box2D.Common.b2Settings,
        K = Box2D.Common.Math.b2Math;
    F.b2Color = function () {
        this._b = this._g = this._r = 0
    };
    F.prototype.b2Color = function (y, w, A) {
        if (y === undefined) y = 0;
        if (w === undefined) w = 0;
        if (A === undefined) A = 0;
        this._r = Box2D.parseUInt(255 * K.Clamp(y, 0, 1));
        this._g = Box2D.parseUInt(255 * K.Clamp(w, 0, 1));
        this._b = Box2D.parseUInt(255 * K.Clamp(A, 0, 1))
    };
    F.prototype.Set = function (y, w, A) {
        if (y === undefined) y = 0;
        if (w === undefined) w = 0;
        if (A === undefined) A = 0;
        this._r = Box2D.parseUInt(255 * K.Clamp(y,
            0, 1));
        this._g = Box2D.parseUInt(255 * K.Clamp(w, 0, 1));
        this._b = Box2D.parseUInt(255 * K.Clamp(A, 0, 1))
    };
    Object.defineProperty(F.prototype, "r", {
        enumerable: false,
        configurable: true,
        set: function (y) {
            if (y === undefined) y = 0;
            this._r = Box2D.parseUInt(255 * K.Clamp(y, 0, 1))
        }
    });
    Object.defineProperty(F.prototype, "g", {
        enumerable: false,
        configurable: true,
        set: function (y) {
            if (y === undefined) y = 0;
            this._g = Box2D.parseUInt(255 * K.Clamp(y, 0, 1))
        }
    });
    Object.defineProperty(F.prototype, "b", {
        enumerable: false,
        configurable: true,
        set: function (y) {
            if (y === undefined) y = 0;
            this._b = Box2D.parseUInt(255 * K.Clamp(y, 0, 1))
        }
    });
    Object.defineProperty(F.prototype, "color", {
        enumerable: false,
        configurable: true,
        get: function () {
            return this._r << 16 | this._g << 8 | this._b
        }
    });
    G.b2Settings = function () {};
    G.b2MixFriction = function (y, w) {
        if (y === undefined) y = 0;
        if (w === undefined) w = 0;
        return Math.sqrt(y * w)
    };
    G.b2MixRestitution = function (y, w) {
        if (y === undefined) y = 0;
        if (w === undefined) w = 0;
        return y > w ? y : w
    };
    G.b2Assert = function (y) {
        if (!y) throw "Assertion Failed";
    };
    Box2D.postDefs.push(function () {
        Box2D.Common.b2Settings.VERSION = "2.1alpha";
        Box2D.Common.b2Settings.USHRT_MAX = 65535;
        Box2D.Common.b2Settings.b2_pi = Math.PI;
        Box2D.Common.b2Settings.b2_maxManifoldPoints = 2;
        Box2D.Common.b2Settings.b2_aabbExtension = 0.1;
        Box2D.Common.b2Settings.b2_aabbMultiplier = 2;
        Box2D.Common.b2Settings.b2_polygonRadius = 2 * G.b2_linearSlop;
        Box2D.Common.b2Settings.b2_linearSlop = 0.0050;
        Box2D.Common.b2Settings.b2_angularSlop = 2 / 180 * G.b2_pi;
        Box2D.Common.b2Settings.b2_toiSlop = 8 * G.b2_linearSlop;
        Box2D.Common.b2Settings.b2_maxTOIContactsPerIsland = 32;
        Box2D.Common.b2Settings.b2_maxTOIJointsPerIsland = 32;
        Box2D.Common.b2Settings.b2_velocityThreshold = 1;
        Box2D.Common.b2Settings.b2_maxLinearCorrection = 0.2;
        Box2D.Common.b2Settings.b2_maxAngularCorrection = 8 / 180 * G.b2_pi;
        Box2D.Common.b2Settings.b2_maxTranslation = 2;
        Box2D.Common.b2Settings.b2_maxTranslationSquared = G.b2_maxTranslation * G.b2_maxTranslation;
        Box2D.Common.b2Settings.b2_maxRotation = 0.5 * G.b2_pi;
        Box2D.Common.b2Settings.b2_maxRotationSquared = G.b2_maxRotation * G.b2_maxRotation;
        Box2D.Common.b2Settings.b2_contactBaumgarte = 0.2;
        Box2D.Common.b2Settings.b2_timeToSleep = 0.5;
        Box2D.Common.b2Settings.b2_linearSleepTolerance = 0.01;
        Box2D.Common.b2Settings.b2_angularSleepTolerance = 2 / 180 * G.b2_pi
    })
})();
(function () {
    var F = Box2D.Common.Math.b2Mat22,
        G = Box2D.Common.Math.b2Mat33,
        K = Box2D.Common.Math.b2Math,
        y = Box2D.Common.Math.b2Sweep,
        w = Box2D.Common.Math.b2Transform,
        A = Box2D.Common.Math.b2Vec2,
        U = Box2D.Common.Math.b2Vec3;
    F.b2Mat22 = function () {
        this.col1 = new A;
        this.col2 = new A
    };
    F.prototype.b2Mat22 = function () {
        this.SetIdentity()
    };
    F.FromAngle = function (p) {
        if (p === undefined) p = 0;
        var B = new F;
        B.Set(p);
        return B
    };
    F.FromVV = function (p, B) {
        var Q = new F;
        Q.SetVV(p, B);
        return Q
    };
    F.prototype.Set = function (p) {
        if (p === undefined) p = 0;
        var B = Math.cos(p);
        p = Math.sin(p);
        this.col1.x = B;
        this.col2.x = -p;
        this.col1.y = p;
        this.col2.y = B
    };
    F.prototype.SetVV = function (p, B) {
        this.col1.SetV(p);
        this.col2.SetV(B)
    };
    F.prototype.Copy = function () {
        var p = new F;
        p.SetM(this);
        return p
    };
    F.prototype.SetM = function (p) {
        this.col1.SetV(p.col1);
        this.col2.SetV(p.col2)
    };
    F.prototype.AddM = function (p) {
        this.col1.x += p.col1.x;
        this.col1.y += p.col1.y;
        this.col2.x += p.col2.x;
        this.col2.y += p.col2.y
    };
    F.prototype.SetIdentity = function () {
        this.col1.x = 1;
        this.col2.x = 0;
        this.col1.y = 0;
        this.col2.y = 1
    };
    F.prototype.SetZero = function () {
        this.col1.x = 0;
        this.col2.x = 0;
        this.col1.y = 0;
        this.col2.y = 0
    };
    F.prototype.GetAngle = function () {
        return Math.atan2(this.col1.y, this.col1.x)
    };
    F.prototype.GetInverse = function (p) {
        var B = this.col1.x,
            Q = this.col2.x,
            V = this.col1.y,
            M = this.col2.y,
            L = B * M - Q * V;
        if (L != 0) L = 1 / L;
        p.col1.x = L * M;
        p.col2.x = -L * Q;
        p.col1.y = -L * V;
        p.col2.y = L * B;
        return p
    };
    F.prototype.Solve = function (p, B, Q) {
        if (B === undefined) B = 0;
        if (Q === undefined) Q = 0;
        var V = this.col1.x,
            M = this.col2.x,
            L = this.col1.y,
            I = this.col2.y,
            W = V * I - M * L;
        if (W != 0) W = 1 / W;
        p.x = W * (I * B - M * Q);
        p.y = W * (V * Q - L * B);
        return p
    };
    F.prototype.Abs = function () {
        this.col1.Abs();
        this.col2.Abs()
    };
    G.b2Mat33 = function () {
        this.col1 = new U;
        this.col2 = new U;
        this.col3 = new U
    };
    G.prototype.b2Mat33 = function (p, B, Q) {
        if (p === undefined) p = null;
        if (B === undefined) B = null;
        if (Q === undefined) Q = null;
        if (!p && !B && !Q) {
            this.col1.SetZero();
            this.col2.SetZero();
            this.col3.SetZero()
        } else {
            this.col1.SetV(p);
            this.col2.SetV(B);
            this.col3.SetV(Q)
        }
    };
    G.prototype.SetVVV = function (p, B, Q) {
        this.col1.SetV(p);
        this.col2.SetV(B);
        this.col3.SetV(Q)
    };
    G.prototype.Copy = function () {
        return new G(this.col1, this.col2, this.col3)
    };
    G.prototype.SetM = function (p) {
        this.col1.SetV(p.col1);
        this.col2.SetV(p.col2);
        this.col3.SetV(p.col3)
    };
    G.prototype.AddM = function (p) {
        this.col1.x += p.col1.x;
        this.col1.y += p.col1.y;
        this.col1.z += p.col1.z;
        this.col2.x += p.col2.x;
        this.col2.y += p.col2.y;
        this.col2.z += p.col2.z;
        this.col3.x += p.col3.x;
        this.col3.y += p.col3.y;
        this.col3.z += p.col3.z
    };
    G.prototype.SetIdentity = function () {
        this.col1.x = 1;
        this.col2.x = 0;
        this.col3.x = 0;
        this.col1.y = 0;
        this.col2.y = 1;
        this.col3.y = 0;
        this.col1.z = 0;
        this.col2.z = 0;
        this.col3.z = 1
    };
    G.prototype.SetZero = function () {
        this.col1.x = 0;
        this.col2.x = 0;
        this.col3.x = 0;
        this.col1.y = 0;
        this.col2.y = 0;
        this.col3.y = 0;
        this.col1.z = 0;
        this.col2.z = 0;
        this.col3.z = 0
    };
    G.prototype.Solve22 = function (p, B, Q) {
        if (B === undefined) B = 0;
        if (Q === undefined) Q = 0;
        var V = this.col1.x,
            M = this.col2.x,
            L = this.col1.y,
            I = this.col2.y,
            W = V * I - M * L;
        if (W != 0) W = 1 / W;
        p.x = W * (I * B - M * Q);
        p.y = W * (V * Q - L * B);
        return p
    };
    G.prototype.Solve33 = function (p, B, Q, V) {
        if (B === undefined) B = 0;
        if (Q === undefined) Q = 0;
        if (V === undefined) V = 0;
        var M = this.col1.x,
            L = this.col1.y,
            I = this.col1.z,
            W = this.col2.x,
            Y = this.col2.y,
            k = this.col2.z,
            z = this.col3.x,
            u = this.col3.y,
            D = this.col3.z,
            H = M * (Y * D - k * u) + L * (k * z - W * D) + I * (W * u - Y * z);
        if (H != 0) H = 1 / H;
        p.x = H * (B * (Y * D - k * u) + Q * (k * z - W * D) + V * (W * u - Y * z));
        p.y = H * (M * (Q * D - V * u) + L * (V * z - B * D) + I * (B * u - Q * z));
        p.z = H * (M * (Y * V - k * Q) + L * (k * B - W * V) + I * (W * Q - Y * B));
        return p
    };
    K.b2Math = function () {};
    K.IsValid = function (p) {
        if (p === undefined) p = 0;
        return isFinite(p)
    };
    K.Dot = function (p, B) {
        return p.x * B.x + p.y * B.y
    };
    K.CrossVV = function (p, B) {
        return p.x * B.y - p.y * B.x
    };
    K.CrossVF = function (p, B) {
        if (B === undefined) B = 0;
        return new A(B * p.y, -B * p.x)
    };
    K.CrossFV = function (p, B) {
        if (p === undefined) p = 0;
        return new A(-p * B.y, p * B.x)
    };
    K.MulMV = function (p, B) {
        return new A(p.col1.x * B.x + p.col2.x * B.y, p.col1.y * B.x + p.col2.y * B.y)
    };
    K.MulTMV = function (p, B) {
        return new A(K.Dot(B, p.col1), K.Dot(B, p.col2))
    };
    K.MulX = function (p, B) {
        var Q = K.MulMV(p.R, B);
        Q.x += p.position.x;
        Q.y += p.position.y;
        return Q
    };
    K.MulXT = function (p, B) {
        var Q = K.SubtractVV(B, p.position),
            V = Q.x * p.R.col1.x + Q.y * p.R.col1.y;
        Q.y = Q.x * p.R.col2.x + Q.y * p.R.col2.y;
        Q.x = V;
        return Q
    };
    K.AddVV = function (p, B) {
        return new A(p.x + B.x, p.y + B.y)
    };
    K.SubtractVV = function (p, B) {
        return new A(p.x - B.x, p.y - B.y)
    };
    K.Distance = function (p, B) {
        var Q = p.x - B.x,
            V = p.y - B.y;
        return Math.sqrt(Q * Q + V * V)
    };
    K.DistanceSquared = function (p, B) {
        var Q = p.x - B.x,
            V = p.y - B.y;
        return Q * Q + V * V
    };
    K.MulFV = function (p, B) {
        if (p === undefined) p = 0;
        return new A(p * B.x, p * B.y)
    };
    K.AddMM = function (p, B) {
        return F.FromVV(K.AddVV(p.col1, B.col1), K.AddVV(p.col2, B.col2))
    };
    K.MulMM = function (p, B) {
        return F.FromVV(K.MulMV(p,
            B.col1), K.MulMV(p, B.col2))
    };
    K.MulTMM = function (p, B) {
        var Q = new A(K.Dot(p.col1, B.col1), K.Dot(p.col2, B.col1)),
            V = new A(K.Dot(p.col1, B.col2), K.Dot(p.col2, B.col2));
        return F.FromVV(Q, V)
    };
    K.Abs = function (p) {
        if (p === undefined) p = 0;
        return p > 0 ? p : -p
    };
    K.AbsV = function (p) {
        return new A(K.Abs(p.x), K.Abs(p.y))
    };
    K.AbsM = function (p) {
        return F.FromVV(K.AbsV(p.col1), K.AbsV(p.col2))
    };
    K.Min = function (p, B) {
        if (p === undefined) p = 0;
        if (B === undefined) B = 0;
        return p < B ? p : B
    };
    K.MinV = function (p, B) {
        return new A(K.Min(p.x, B.x), K.Min(p.y, B.y))
    };
    K.Max = function (p, B) {
        if (p === undefined) p = 0;
        if (B === undefined) B = 0;
        return p > B ? p : B
    };
    K.MaxV = function (p, B) {
        return new A(K.Max(p.x, B.x), K.Max(p.y, B.y))
    };
    K.Clamp = function (p, B, Q) {
        if (p === undefined) p = 0;
        if (B === undefined) B = 0;
        if (Q === undefined) Q = 0;
        return p < B ? B : p > Q ? Q : p
    };
    K.ClampV = function (p, B, Q) {
        return K.MaxV(B, K.MinV(p, Q))
    };
    K.Swap = function (p, B) {
        var Q = p[0];
        p[0] = B[0];
        B[0] = Q
    };
    K.Random = function () {
        return Math.random() * 2 - 1
    };
    K.RandomRange = function (p, B) {
        if (p === undefined) p = 0;
        if (B === undefined) B = 0;
        var Q = Math.random();
        return Q = (B - p) * Q + p
    };
    K.NextPowerOfTwo = function (p) {
        if (p === undefined) p = 0;
        p |= p >> 1 & 2147483647;
        p |= p >> 2 & 1073741823;
        p |= p >> 4 & 268435455;
        p |= p >> 8 & 16777215;
        p |= p >> 16 & 65535;
        return p + 1
    };
    K.IsPowerOfTwo = function (p) {
        if (p === undefined) p = 0;
        return p > 0 && (p & p - 1) == 0
    };
    Box2D.postDefs.push(function () {
        Box2D.Common.Math.b2Math.b2Vec2_zero = new A(0, 0);
        Box2D.Common.Math.b2Math.b2Mat22_identity = F.FromVV(new A(1, 0), new A(0, 1));
        Box2D.Common.Math.b2Math.b2Transform_identity = new w(K.b2Vec2_zero, K.b2Mat22_identity)
    });
    y.b2Sweep = function () {
        this.localCenter = new A;
        this.c0 = new A;
        this.c = new A
    };
    y.prototype.Set = function (p) {
        this.localCenter.SetV(p.localCenter);
        this.c0.SetV(p.c0);
        this.c.SetV(p.c);
        this.a0 = p.a0;
        this.a = p.a;
        this.t0 = p.t0
    };
    y.prototype.Copy = function () {
        var p = new y;
        p.localCenter.SetV(this.localCenter);
        p.c0.SetV(this.c0);
        p.c.SetV(this.c);
        p.a0 = this.a0;
        p.a = this.a;
        p.t0 = this.t0;
        return p
    };
    y.prototype.GetTransform = function (p, B) {
        if (B === undefined) B = 0;
        p.position.x = (1 - B) * this.c0.x + B * this.c.x;
        p.position.y = (1 - B) * this.c0.y + B * this.c.y;
        p.R.Set((1 - B) * this.a0 + B * this.a);
        var Q = p.R;
        p.position.x -= Q.col1.x * this.localCenter.x + Q.col2.x * this.localCenter.y;
        p.position.y -= Q.col1.y * this.localCenter.x + Q.col2.y * this.localCenter.y
    };
    y.prototype.Advance = function (p) {
        if (p === undefined) p = 0;
        if (this.t0 < p && 1 - this.t0 > Number.MIN_VALUE) {
            var B = (p - this.t0) / (1 - this.t0);
            this.c0.x = (1 - B) * this.c0.x + B * this.c.x;
            this.c0.y = (1 - B) * this.c0.y + B * this.c.y;
            this.a0 = (1 - B) * this.a0 + B * this.a;
            this.t0 = p
        }
    };
    w.b2Transform = function () {
        this.position = new A;
        this.R = new F
    };
    w.prototype.b2Transform = function (p, B) {
        if (p === undefined) p = null;
        if (B === undefined) B = null;
        if (p) {
            this.position.SetV(p);
            this.R.SetM(B)
        }
    };
    w.prototype.Initialize = function (p, B) {
        this.position.SetV(p);
        this.R.SetM(B)
    };
    w.prototype.SetIdentity = function () {
        this.position.SetZero();
        this.R.SetIdentity()
    };
    w.prototype.Set = function (p) {
        this.position.SetV(p.position);
        this.R.SetM(p.R)
    };
    w.prototype.GetAngle = function () {
        return Math.atan2(this.R.col1.y, this.R.col1.x)
    };
    A.b2Vec2 = function () {};
    A.prototype.b2Vec2 = function (p, B) {
        if (p === undefined) p = 0;
        if (B === undefined) B = 0;
        this.x = p;
        this.y = B
    };
    A.prototype.SetZero = function () {
        this.y = this.x = 0
    };
    A.prototype.Set = function (p, B) {
        if (p === undefined) p = 0;
        if (B === undefined) B = 0;
        this.x = p;
        this.y = B
    };
    A.prototype.SetV = function (p) {
        this.x = p.x;
        this.y = p.y
    };
    A.prototype.GetNegative = function () {
        return new A(-this.x, -this.y)
    };
    A.prototype.NegativeSelf = function () {
        this.x = -this.x;
        this.y = -this.y
    };
    A.Make = function (p, B) {
        if (p === undefined) p = 0;
        if (B === undefined) B = 0;
        return new A(p, B)
    };
    A.prototype.Copy = function () {
        return new A(this.x, this.y)
    };
    A.prototype.Add = function (p) {
        this.x += p.x;
        this.y += p.y
    };
    A.prototype.Subtract = function (p) {
        this.x -= p.x;
        this.y -= p.y
    };
    A.prototype.Multiply = function (p) {
        if (p === undefined) p = 0;
        this.x *= p;
        this.y *= p
    };
    A.prototype.MulM = function (p) {
        var B = this.x;
        this.x = p.col1.x * B + p.col2.x * this.y;
        this.y = p.col1.y * B + p.col2.y * this.y
    };
    A.prototype.MulTM = function (p) {
        var B = K.Dot(this, p.col1);
        this.y = K.Dot(this, p.col2);
        this.x = B
    };
    A.prototype.CrossVF = function (p) {
        if (p === undefined) p = 0;
        var B = this.x;
        this.x = p * this.y;
        this.y = -p * B
    };
    A.prototype.CrossFV = function (p) {
        if (p === undefined) p = 0;
        var B = this.x;
        this.x = -p * this.y;
        this.y = p * B
    };
    A.prototype.MinV = function (p) {
        this.x = this.x < p.x ? this.x : p.x;
        this.y = this.y < p.y ? this.y : p.y
    };
    A.prototype.MaxV = function (p) {
        this.x = this.x > p.x ? this.x : p.x;
        this.y = this.y > p.y ? this.y : p.y
    };
    A.prototype.Abs = function () {
        if (this.x < 0) this.x = -this.x;
        if (this.y < 0) this.y = -this.y
    };
    A.prototype.Length = function () {
        return Math.sqrt(this.x * this.x + this.y * this.y)
    };
    A.prototype.LengthSquared = function () {
        return this.x * this.x + this.y * this.y
    };
    A.prototype.Normalize = function () {
        var p = Math.sqrt(this.x * this.x + this.y * this.y);
        if (p < Number.MIN_VALUE) return 0;
        var B = 1 / p;
        this.x *= B;
        this.y *= B;
        return p
    };
    A.prototype.IsValid = function () {
        return K.IsValid(this.x) && K.IsValid(this.y)
    };
    U.b2Vec3 = function () {};
    U.prototype.b2Vec3 = function (p, B, Q) {
        if (p === undefined) p = 0;
        if (B === undefined) B = 0;
        if (Q === undefined) Q = 0;
        this.x = p;
        this.y = B;
        this.z = Q
    };
    U.prototype.SetZero = function () {
        this.x = this.y = this.z = 0
    };
    U.prototype.Set = function (p, B, Q) {
        if (p === undefined) p = 0;
        if (B === undefined) B = 0;
        if (Q === undefined) Q = 0;
        this.x = p;
        this.y = B;
        this.z = Q
    };
    U.prototype.SetV = function (p) {
            this.x = p.x;
            this.y = p.y;
            this.z = p.z
    };
    U.prototype.GetNegative = function () {
        return new U(-this.x, -this.y, -this.z)
    };
    U.prototype.NegativeSelf = function () {
        this.x = -this.x;
        this.y = -this.y;
        this.z = -this.z
    };
    U.prototype.Copy = function () {
        return new U(this.x, this.y, this.z)
    };
    U.prototype.Add = function (p) {
        this.x += p.x;
        this.y += p.y;
        this.z += p.z
    };
    U.prototype.Subtract = function (p) {
        this.x -= p.x;
        this.y -= p.y;
        this.z -= p.z
    };
    U.prototype.Multiply = function (p) {
        if (p === undefined) p = 0;
        this.x *= p;
        this.y *= p;
        this.z *= p
    }
})();
(function () {
    var F = Box2D.Common.Math.b2Math,
        G = Box2D.Common.Math.b2Sweep,
        K = Box2D.Common.Math.b2Transform,
        y = Box2D.Common.Math.b2Vec2,
        w = Box2D.Common.b2Color,
        A = Box2D.Common.b2Settings,
        U = Box2D.Collision.b2AABB,
        p = Box2D.Collision.b2ContactPoint,
        B = Box2D.Collision.b2DynamicTreeBroadPhase,
        Q = Box2D.Collision.b2RayCastInput,
        V = Box2D.Collision.b2RayCastOutput,
        M = Box2D.Collision.Shapes.b2CircleShape,
        L = Box2D.Collision.Shapes.b2EdgeShape,
        I = Box2D.Collision.Shapes.b2MassData,
        W = Box2D.Collision.Shapes.b2PolygonShape,
        Y = Box2D.Collision.Shapes.b2Shape,
        k = Box2D.Dynamics.b2Body,
        z = Box2D.Dynamics.b2BodyDef,
        u = Box2D.Dynamics.b2ContactFilter,
        D = Box2D.Dynamics.b2ContactImpulse,
        H = Box2D.Dynamics.b2ContactListener,
        O = Box2D.Dynamics.b2ContactManager,
        E = Box2D.Dynamics.b2DebugDraw,
        R = Box2D.Dynamics.b2DestructionListener,
        N = Box2D.Dynamics.b2FilterData,
        S = Box2D.Dynamics.b2Fixture,
        aa = Box2D.Dynamics.b2FixtureDef,
        Z = Box2D.Dynamics.b2Island,
        d = Box2D.Dynamics.b2TimeStep,
        h = Box2D.Dynamics.b2World,
        l = Box2D.Dynamics.Contacts.b2Contact,
        j = Box2D.Dynamics.Contacts.b2ContactFactory,
        o = Box2D.Dynamics.Contacts.b2ContactSolver,
        q = Box2D.Dynamics.Joints.b2Joint,
        n = Box2D.Dynamics.Joints.b2PulleyJoint;
    k.b2Body = function () {
        this.m_xf = new K;
        this.m_sweep = new G;
        this.m_linearVelocity = new y;
        this.m_force = new y
    };
    k.prototype.connectEdges = function (a, c, g) {
        if (g === undefined) g = 0;
        var b = Math.atan2(c.GetDirectionVector().y, c.GetDirectionVector().x);
        g = F.MulFV(Math.tan((b - g) * 0.5), c.GetDirectionVector());
        g = F.SubtractVV(g, c.GetNormalVector());
        g = F.MulFV(A.b2_toiSlop, g);
        g = F.AddVV(g, c.GetVertex1());
        var e = F.AddVV(a.GetDirectionVector(),
            c.GetDirectionVector());
        e.Normalize();
        var f = F.Dot(a.GetDirectionVector(), c.GetNormalVector()) > 0;
        a.SetNextEdge(c, g, e, f);
        c.SetPrevEdge(a, g, e, f);
        return b
    };
    k.prototype.CreateFixture = function (a) {
        if (this.m_world.IsLocked() == true) return null;
        var c = new S;
        c.Create(this, this.m_xf, a);
        this.m_flags & k.e_activeFlag && c.CreateProxy(this.m_world.m_contactManager.m_broadPhase, this.m_xf);
        c.m_next = this.m_fixtureList;
        this.m_fixtureList = c;
        ++this.m_fixtureCount;
        c.m_body = this;
        c.m_density > 0 && this.ResetMassData();
        this.m_world.m_flags |= h.e_newFixture;
        return c
    };
    k.prototype.CreateFixture2 = function (a, c) {
        if (c === undefined) c = 0;
        var g = new aa;
        g.shape = a;
        g.density = c;
        return this.CreateFixture(g)
    };
    k.prototype.DestroyFixture = function (a) {
        if (this.m_world.IsLocked() != true) {
            for (var c = this.m_fixtureList, g = null; c != null;) {
                if (c == a) {
                    if (g) g.m_next = a.m_next;
                    else this.m_fixtureList = a.m_next;
                    break
                }
                g = c;
                c = c.m_next
            }
            for (c = this.m_contactList; c;) {
                g = c.contact;
                c = c.next;
                var b = g.GetFixtureA(),
                    e = g.GetFixtureB();
                if (a == b || a == e) this.m_world.m_contactManager.Destroy(g)
            }
            this.m_flags &
                k.e_activeFlag && a.DestroyProxy(this.m_world.m_contactManager.m_broadPhase);
            a.Destroy();
            a.m_body = null;
            a.m_next = null;
            --this.m_fixtureCount;
            this.ResetMassData()
        }
    };
    k.prototype.SetPositionAndAngle = function (a, c) {
        if (c === undefined) c = 0;
        var g;
        if (this.m_world.IsLocked() != true) {
            this.m_xf.R.Set(c);
            this.m_xf.position.SetV(a);
            g = this.m_xf.R;
            var b = this.m_sweep.localCenter;
            this.m_sweep.c.x = g.col1.x * b.x + g.col2.x * b.y;
            this.m_sweep.c.y = g.col1.y * b.x + g.col2.y * b.y;
            this.m_sweep.c.x += this.m_xf.position.x;
            this.m_sweep.c.y += this.m_xf.position.y;
            this.m_sweep.c0.SetV(this.m_sweep.c);
            this.m_sweep.a0 = this.m_sweep.a = c;
            b = this.m_world.m_contactManager.m_broadPhase;
            for (g = this.m_fixtureList; g; g = g.m_next) g.Synchronize(b, this.m_xf, this.m_xf);
            this.m_world.m_contactManager.FindNewContacts()
        }
    };
    k.prototype.SetTransform = function (a) {
        this.SetPositionAndAngle(a.position, a.GetAngle())
    };
    k.prototype.GetTransform = function () {
        return this.m_xf
    };
    k.prototype.GetPosition = function () {
        return this.m_xf.position
    };
    k.prototype.SetPosition = function (a) {
        this.SetPositionAndAngle(a,
            this.GetAngle())
    };
    k.prototype.GetAngle = function () {
        return this.m_sweep.a
    };
    k.prototype.SetAngle = function (a) {
        if (a === undefined) a = 0;
        this.SetPositionAndAngle(this.GetPosition(), a)
    };
    k.prototype.GetWorldCenter = function () {
        return this.m_sweep.c
    };
    k.prototype.GetLocalCenter = function () {
        return this.m_sweep.localCenter
    };
    k.prototype.SetLinearVelocity = function (a) {
        this.m_type != k.b2_staticBody && this.m_linearVelocity.SetV(a)
    };
    k.prototype.GetLinearVelocity = function () {
        return this.m_linearVelocity
    };
    k.prototype.SetAngularVelocity = function (a) {
            if (a === undefined) a = 0;
            if (this.m_type != k.b2_staticBody) this.m_angularVelocity = a
    };
    k.prototype.GetAngularVelocity = function () {
        return this.m_angularVelocity
    };
    k.prototype.GetDefinition = function () {
        var a = new z;
        a.type = this.GetType();
        a.allowSleep = (this.m_flags & k.e_allowSleepFlag) == k.e_allowSleepFlag;
        a.angle = this.GetAngle();
        a.angularDamping = this.m_angularDamping;
        a.angularVelocity = this.m_angularVelocity;
        a.fixedRotation = (this.m_flags & k.e_fixedRotationFlag) == k.e_fixedRotationFlag;
        a.bullet = (this.m_flags &
            k.e_bulletFlag) == k.e_bulletFlag;
        a.awake = (this.m_flags & k.e_awakeFlag) == k.e_awakeFlag;
        a.linearDamping = this.m_linearDamping;
        a.linearVelocity.SetV(this.GetLinearVelocity());
        a.position = this.GetPosition();
        a.userData = this.GetUserData();
        return a
    };
    k.prototype.ApplyForce = function (a, c) {
        if (this.m_type == k.b2_dynamicBody) {
            this.IsAwake() == false && this.SetAwake(true);
            this.m_force.x += a.x;
            this.m_force.y += a.y;
            this.m_torque += (c.x - this.m_sweep.c.x) * a.y - (c.y - this.m_sweep.c.y) * a.x
        }
    };
    k.prototype.ApplyTorque = function (a) {
        if (a === undefined) a = 0;
        if (this.m_type == k.b2_dynamicBody) {
            this.IsAwake() == false && this.SetAwake(true);
            this.m_torque += a
        }
    };
    k.prototype.ApplyImpulse = function (a, c) {
        if (this.m_type == k.b2_dynamicBody) {
            this.IsAwake() == false && this.SetAwake(true);
            this.m_linearVelocity.x += this.m_invMass * a.x;
            this.m_linearVelocity.y += this.m_invMass * a.y;
            this.m_angularVelocity += this.m_invI * ((c.x - this.m_sweep.c.x) * a.y - (c.y - this.m_sweep.c.y) * a.x)
        }
    };
    k.prototype.Split = function (a) {
        for (var c = this.GetLinearVelocity().Copy(), g = this.GetAngularVelocity(),
                b = this.GetWorldCenter(), e = this.m_world.CreateBody(this.GetDefinition()), f, m = this.m_fixtureList; m;)
            if (a(m)) {
                var r = m.m_next;
                if (f) f.m_next = r;
                else this.m_fixtureList = r;
                this.m_fixtureCount--;
                m.m_next = e.m_fixtureList;
                e.m_fixtureList = m;
                e.m_fixtureCount++;
                m.m_body = e;
                m = r
            } else {
                f = m;
                m = m.m_next
            }
        this.ResetMassData();
        e.ResetMassData();
        f = this.GetWorldCenter();
        a = e.GetWorldCenter();
        f = F.AddVV(c, F.CrossFV(g, F.SubtractVV(f, b)));
        c = F.AddVV(c, F.CrossFV(g, F.SubtractVV(a, b)));
        this.SetLinearVelocity(f);
        e.SetLinearVelocity(c);
        this.SetAngularVelocity(g);
        e.SetAngularVelocity(g);
        this.SynchronizeFixtures();
        e.SynchronizeFixtures();
        return e
    };
    k.prototype.Merge = function (a) {
        var c;
        for (c = a.m_fixtureList; c;) {
            var g = c.m_next;
            a.m_fixtureCount--;
            c.m_next = this.m_fixtureList;
            this.m_fixtureList = c;
            this.m_fixtureCount++;
            c.m_body = e;
            c = g
        }
        b.m_fixtureCount = 0;
        var b = this,
            e = a;
        b.GetWorldCenter();
        e.GetWorldCenter();
        b.GetLinearVelocity().Copy();
        e.GetLinearVelocity().Copy();
        b.GetAngularVelocity();
        e.GetAngularVelocity();
        b.ResetMassData();
        this.SynchronizeFixtures()
    };
    k.prototype.GetMass = function () {
        return this.m_mass
    };
    k.prototype.GetInertia = function () {
        return this.m_I
    };
    k.prototype.GetMassData = function (a) {
        a.mass = this.m_mass;
        a.I = this.m_I;
        a.center.SetV(this.m_sweep.localCenter)
    };
    k.prototype.SetMassData = function (a) {
        A.b2Assert(this.m_world.IsLocked() == false);
        if (this.m_world.IsLocked() != true)
            if (this.m_type == k.b2_dynamicBody) {
                this.m_invI = this.m_I = this.m_invMass = 0;
                this.m_mass = a.mass;
                if (this.m_mass <= 0) this.m_mass = 1;
                this.m_invMass = 1 / this.m_mass;
                if (a.I > 0 && (this.m_flags & k.e_fixedRotationFlag) == 0) {
                    this.m_I = a.I - this.m_mass * (a.center.x * a.center.x + a.center.y * a.center.y);
                    this.m_invI = 1 / this.m_I
                }
                var c = this.m_sweep.c.Copy();
                this.m_sweep.localCenter.SetV(a.center);
                this.m_sweep.c0.SetV(F.MulX(this.m_xf, this.m_sweep.localCenter));
                this.m_sweep.c.SetV(this.m_sweep.c0);
                this.m_linearVelocity.x += this.m_angularVelocity * -(this.m_sweep.c.y - c.y);
                this.m_linearVelocity.y += this.m_angularVelocity * +(this.m_sweep.c.x - c.x)
            }
    };
    k.prototype.ResetMassData = function () {
        this.m_invI = this.m_I = this.m_invMass = this.m_mass = 0;
        this.m_sweep.localCenter.SetZero();
        if (!(this.m_type == k.b2_staticBody || this.m_type == k.b2_kinematicBody)) {
            for (var a = y.Make(0, 0), c = this.m_fixtureList; c; c = c.m_next)
                if (c.m_density != 0) {
                    var g = c.GetMassData();
                    this.m_mass += g.mass;
                    a.x += g.center.x * g.mass;
                    a.y += g.center.y * g.mass;
                    this.m_I += g.I
                }
            if (this.m_mass > 0) {
                this.m_invMass = 1 / this.m_mass;
                a.x *= this.m_invMass;
                a.y *= this.m_invMass
            } else this.m_invMass = this.m_mass = 1; if (this.m_I > 0 && (this.m_flags & k.e_fixedRotationFlag) == 0) {
                this.m_I -= this.m_mass * (a.x * a.x + a.y * a.y);
                this.m_I *= this.m_inertiaScale;
                A.b2Assert(this.m_I > 0);
                this.m_invI = 1 / this.m_I
            } else this.m_invI = this.m_I = 0;
            c = this.m_sweep.c.Copy();
            this.m_sweep.localCenter.SetV(a);
            this.m_sweep.c0.SetV(F.MulX(this.m_xf, this.m_sweep.localCenter));
            this.m_sweep.c.SetV(this.m_sweep.c0);
            this.m_linearVelocity.x += this.m_angularVelocity * -(this.m_sweep.c.y - c.y);
            this.m_linearVelocity.y += this.m_angularVelocity * +(this.m_sweep.c.x - c.x)
        }
    };
    k.prototype.GetWorldPoint = function (a) {
        var c = this.m_xf.R;
        a = new y(c.col1.x * a.x + c.col2.x * a.y, c.col1.y * a.x + c.col2.y * a.y);
        a.x += this.m_xf.position.x;
        a.y += this.m_xf.position.y;
        return a
    };
    k.prototype.GetWorldVector = function (a) {
        return F.MulMV(this.m_xf.R, a)
    };
    k.prototype.GetLocalPoint = function (a) {
        return F.MulXT(this.m_xf, a)
    };
    k.prototype.GetLocalVector = function (a) {
        return F.MulTMV(this.m_xf.R, a)
    };
    k.prototype.GetLinearVelocityFromWorldPoint = function (a) {
        return new y(this.m_linearVelocity.x - this.m_angularVelocity * (a.y - this.m_sweep.c.y), this.m_linearVelocity.y + this.m_angularVelocity * (a.x - this.m_sweep.c.x))
    };
    k.prototype.GetLinearVelocityFromLocalPoint = function (a) {
        var c = this.m_xf.R;
        a = new y(c.col1.x * a.x + c.col2.x * a.y, c.col1.y * a.x + c.col2.y * a.y);
        a.x += this.m_xf.position.x;
        a.y += this.m_xf.position.y;
        return new y(this.m_linearVelocity.x - this.m_angularVelocity * (a.y - this.m_sweep.c.y), this.m_linearVelocity.y + this.m_angularVelocity * (a.x - this.m_sweep.c.x))
    };
    k.prototype.GetLinearDamping = function () {
        return this.m_linearDamping
    };
    k.prototype.SetLinearDamping = function (a) {
        if (a === undefined) a = 0;
        this.m_linearDamping = a
    };
    k.prototype.GetAngularDamping = function () {
        return this.m_angularDamping
    };
    k.prototype.SetAngularDamping = function (a) {
        if (a === undefined) a = 0;
        this.m_angularDamping = a
    };
    k.prototype.SetType = function (a) {
        if (a === undefined) a = 0;
        if (this.m_type != a) {
            this.m_type = a;
            this.ResetMassData();
            if (this.m_type == k.b2_staticBody) {
                this.m_linearVelocity.SetZero();
                this.m_angularVelocity = 0
            }
            this.SetAwake(true);
            this.m_force.SetZero();
            this.m_torque = 0;
            for (a = this.m_contactList; a; a = a.next) a.contact.FlagForFiltering()
        }
    };
    k.prototype.GetType = function () {
        return this.m_type
    };
    k.prototype.SetBullet = function (a) {
        if (a) this.m_flags |= k.e_bulletFlag;
        else this.m_flags &= ~k.e_bulletFlag
    };
    k.prototype.IsBullet = function () {
        return (this.m_flags & k.e_bulletFlag) == k.e_bulletFlag
    };
    k.prototype.SetSleepingAllowed = function (a) {
        if (a) this.m_flags |= k.e_allowSleepFlag;
        else {
            this.m_flags &= ~k.e_allowSleepFlag;
            this.SetAwake(true)
        }
    };
    k.prototype.SetAwake = function (a) {
        if (a) {
            this.m_flags |= k.e_awakeFlag;
            this.m_sleepTime = 0
        } else {
            this.m_flags &= ~k.e_awakeFlag;
            this.m_sleepTime = 0;
            this.m_linearVelocity.SetZero();
            this.m_angularVelocity = 0;
            this.m_force.SetZero();
            this.m_torque = 0
        }
    };
    k.prototype.IsAwake = function () {
        return (this.m_flags & k.e_awakeFlag) == k.e_awakeFlag
    };
    k.prototype.SetFixedRotation = function (a) {
        if (a) this.m_flags |= k.e_fixedRotationFlag;
        else this.m_flags &= ~k.e_fixedRotationFlag;
        this.ResetMassData()
    };
    k.prototype.IsFixedRotation = function () {
        return (this.m_flags & k.e_fixedRotationFlag) == k.e_fixedRotationFlag
    };
    k.prototype.SetActive = function (a) {
        if (a != this.IsActive()) {
            var c;
            if (a) {
                this.m_flags |= k.e_activeFlag;
                a = this.m_world.m_contactManager.m_broadPhase;
                for (c = this.m_fixtureList; c; c = c.m_next) c.CreateProxy(a, this.m_xf)
            } else {
                this.m_flags &= ~k.e_activeFlag;
                a = this.m_world.m_contactManager.m_broadPhase;
                for (c = this.m_fixtureList; c; c = c.m_next) c.DestroyProxy(a);
                for (a = this.m_contactList; a;) {
                    c = a;
                    a = a.next;
                    this.m_world.m_contactManager.Destroy(c.contact)
                }
                this.m_contactList = null
            }
        }
    };
    k.prototype.IsActive = function () {
        return (this.m_flags & k.e_activeFlag) == k.e_activeFlag
    };
    k.prototype.IsSleepingAllowed = function () {
        return (this.m_flags & k.e_allowSleepFlag) == k.e_allowSleepFlag
    };
    k.prototype.GetFixtureList = function () {
            return this.m_fixtureList
    };
    k.prototype.GetJointList = function () {
        return this.m_jointList
    };
    k.prototype.GetControllerList = function () {
        return this.m_controllerList
    };
    k.prototype.GetContactList = function () {
        return this.m_contactList
    };
    k.prototype.GetNext = function () {
        return this.m_next
    };
    k.prototype.GetUserData = function () {
        return this.m_userData
    };
    k.prototype.SetUserData = function (a) {
        this.m_userData = a
    };
    k.prototype.GetWorld = function () {
        return this.m_world
    };
    k.prototype.b2Body = function (a, c) {
        this.m_flags = 0;
        if (a.bullet) this.m_flags |= k.e_bulletFlag;
        if (a.fixedRotation) this.m_flags |= k.e_fixedRotationFlag;
        if (a.allowSleep) this.m_flags |= k.e_allowSleepFlag;
        if (a.awake) this.m_flags |= k.e_awakeFlag;
        if (a.active) this.m_flags |= k.e_activeFlag;
        this.m_world = c;
        this.m_xf.position.SetV(a.position);
        this.m_xf.R.Set(a.angle);
        this.m_sweep.localCenter.SetZero();
        this.m_sweep.t0 = 1;
        this.m_sweep.a0 = this.m_sweep.a = a.angle;
        var g = this.m_xf.R,
            b = this.m_sweep.localCenter;
        this.m_sweep.c.x = g.col1.x * b.x + g.col2.x * b.y;
        this.m_sweep.c.y = g.col1.y * b.x + g.col2.y * b.y;
        this.m_sweep.c.x += this.m_xf.position.x;
        this.m_sweep.c.y += this.m_xf.position.y;
        this.m_sweep.c0.SetV(this.m_sweep.c);
        this.m_contactList = this.m_controllerList = this.m_jointList = null;
        this.m_controllerCount = 0;
        this.m_next = this.m_prev = null;
        this.m_linearVelocity.SetV(a.linearVelocity);
        this.m_angularVelocity = a.angularVelocity;
        this.m_linearDamping = a.linearDamping;
        this.m_angularDamping = a.angularDamping;
        this.m_force.Set(0, 0);
        this.m_sleepTime = this.m_torque = 0;
        this.m_type = a.type;
        if (this.m_type == k.b2_dynamicBody) this.m_invMass = this.m_mass = 1;
        else this.m_invMass = this.m_mass = 0;
        this.m_invI = this.m_I = 0;
        this.m_inertiaScale = a.inertiaScale;
        this.m_userData = a.userData;
        this.m_fixtureList = null;
        this.m_fixtureCount = 0
    };
    k.prototype.SynchronizeFixtures = function () {
        var a = k.s_xf1;
        a.R.Set(this.m_sweep.a0);
        var c = a.R,
            g = this.m_sweep.localCenter;
        a.position.x = this.m_sweep.c0.x - (c.col1.x * g.x + c.col2.x * g.y);
        a.position.y = this.m_sweep.c0.y - (c.col1.y * g.x + c.col2.y * g.y);
        g = this.m_world.m_contactManager.m_broadPhase;
        for (c = this.m_fixtureList; c; c = c.m_next) c.Synchronize(g, a, this.m_xf)
    };
    k.prototype.SynchronizeTransform = function () {
        this.m_xf.R.Set(this.m_sweep.a);
        var a = this.m_xf.R,
            c = this.m_sweep.localCenter;
        this.m_xf.position.x = this.m_sweep.c.x - (a.col1.x * c.x + a.col2.x * c.y);
        this.m_xf.position.y = this.m_sweep.c.y - (a.col1.y * c.x + a.col2.y * c.y)
    };
    k.prototype.ShouldCollide = function (a) {
        if (this.m_type != k.b2_dynamicBody && a.m_type != k.b2_dynamicBody) return false;
        for (var c = this.m_jointList; c; c = c.next)
            if (c.other == a)
                if (c.joint.m_collideConnected == false) return false;
        return true
    };
    k.prototype.Advance = function (a) {
        if (a === undefined) a = 0;
        this.m_sweep.Advance(a);
        this.m_sweep.c.SetV(this.m_sweep.c0);
        this.m_sweep.a = this.m_sweep.a0;
        this.SynchronizeTransform()
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.b2Body.s_xf1 = new K;
        Box2D.Dynamics.b2Body.e_islandFlag = 1;
        Box2D.Dynamics.b2Body.e_awakeFlag = 2;
        Box2D.Dynamics.b2Body.e_allowSleepFlag = 4;
        Box2D.Dynamics.b2Body.e_bulletFlag = 8;
        Box2D.Dynamics.b2Body.e_fixedRotationFlag = 16;
        Box2D.Dynamics.b2Body.e_activeFlag = 32;
        Box2D.Dynamics.b2Body.b2_staticBody = 0;
        Box2D.Dynamics.b2Body.b2_kinematicBody = 1;
        Box2D.Dynamics.b2Body.b2_dynamicBody = 2
    });
    z.b2BodyDef = function () {
        this.position = new y;
        this.linearVelocity = new y
    };
    z.prototype.b2BodyDef = function () {
        this.userData = null;
        this.position.Set(0, 0);
        this.angle = 0;
        this.linearVelocity.Set(0, 0);
        this.angularDamping = this.linearDamping = this.angularVelocity = 0;
        this.awake = this.allowSleep = true;
        this.bullet = this.fixedRotation = false;
        this.type = k.b2_staticBody;
        this.active = true;
        this.inertiaScale = 1
    };
    u.b2ContactFilter = function () {};
    u.prototype.ShouldCollide = function (a, c) {
            var g = a.GetFilterData(),
                b = c.GetFilterData();
            if (g.groupIndex == b.groupIndex && g.groupIndex != 0) return g.groupIndex > 0;
            return (g.maskBits & b.categoryBits) != 0 && (g.categoryBits & b.maskBits) != 0
    };
    u.prototype.RayCollide = function (a, c) {
        if (!a) return true;
        return this.ShouldCollide(a instanceof S ? a : null, c)
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.b2ContactFilter.b2_defaultFilter = new u
    });
    D.b2ContactImpulse = function () {
        this.normalImpulses = new Vector_a2j_Number(A.b2_maxManifoldPoints);
        this.tangentImpulses = new Vector_a2j_Number(A.b2_maxManifoldPoints)
    };
    H.b2ContactListener = function () {};
    H.prototype.BeginContact = function () {};
    H.prototype.EndContact = function () {};
    H.prototype.PreSolve = function () {};
    H.prototype.PostSolve = function () {};
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.b2ContactListener.b2_defaultListener = new H
    });
    O.b2ContactManager = function () {};
    O.prototype.b2ContactManager = function () {
        this.m_world = null;
        this.m_contactCount = 0;
        this.m_contactFilter = u.b2_defaultFilter;
        this.m_contactListener = H.b2_defaultListener;
        this.m_contactFactory = new j(this.m_allocator);
        this.m_broadPhase = new B
    };
    O.prototype.AddPair = function (a, c) {
        var g = a instanceof S ? a : null,
            b = c instanceof S ? c : null,
            e = g.GetBody(),
            f = b.GetBody();
        if (e != f) {
            for (var m = f.GetContactList(); m;) {
                if (m.other == e) {
                    var r = m.contact.GetFixtureA(),
                        s = m.contact.GetFixtureB();
                    if (r == g && s == b) return;
                    if (r == b && s == g) return
                }
                m = m.next
            }
            if (f.ShouldCollide(e) != false)
                if (this.m_contactFilter.ShouldCollide(g, b) != false) {
                    m = this.m_contactFactory.Create(g, b);
                    g = m.GetFixtureA();
                    b = m.GetFixtureB();
                    e = g.m_body;
                    f = b.m_body;
                    m.m_prev = null;
                    m.m_next = this.m_world.m_contactList;
                    if (this.m_world.m_contactList != null) this.m_world.m_contactList.m_prev = m;
                    this.m_world.m_contactList = m;
                    m.m_nodeA.contact = m;
                    m.m_nodeA.other = f;
                    m.m_nodeA.prev = null;
                    m.m_nodeA.next = e.m_contactList;
                    if (e.m_contactList != null) e.m_contactList.prev = m.m_nodeA;
                    e.m_contactList = m.m_nodeA;
                    m.m_nodeB.contact = m;
                    m.m_nodeB.other = e;
                    m.m_nodeB.prev = null;
                    m.m_nodeB.next = f.m_contactList;
                    if (f.m_contactList != null) f.m_contactList.prev = m.m_nodeB;
                    f.m_contactList = m.m_nodeB;
                    ++this.m_world.m_contactCount
                }
        }
    };
    O.prototype.FindNewContacts = function () {
        this.m_broadPhase.UpdatePairs(Box2D.generateCallback(this, this.AddPair))
    };
    O.prototype.Destroy = function (a) {
        var c = a.GetFixtureA(),
            g = a.GetFixtureB();
        c = c.GetBody();
        g = g.GetBody();
        a.IsTouching() && this.m_contactListener.EndContact(a);
        if (a.m_prev) a.m_prev.m_next = a.m_next;
        if (a.m_next) a.m_next.m_prev = a.m_prev;
        if (a == this.m_world.m_contactList) this.m_world.m_contactList = a.m_next;
        if (a.m_nodeA.prev) a.m_nodeA.prev.next = a.m_nodeA.next;
        if (a.m_nodeA.next) a.m_nodeA.next.prev = a.m_nodeA.prev;
        if (a.m_nodeA == c.m_contactList) c.m_contactList = a.m_nodeA.next;
        if (a.m_nodeB.prev) a.m_nodeB.prev.next = a.m_nodeB.next;
        if (a.m_nodeB.next) a.m_nodeB.next.prev = a.m_nodeB.prev;
        if (a.m_nodeB == g.m_contactList) g.m_contactList = a.m_nodeB.next;
        this.m_contactFactory.Destroy(a);
        --this.m_contactCount
    };
    O.prototype.Collide = function () {
        for (var a = this.m_world.m_contactList; a;) {
            var c = a.GetFixtureA(),
                g = a.GetFixtureB(),
                b = c.GetBody(),
                e = g.GetBody();
            if (b.IsAwake() == false && e.IsAwake() == false) a = a.GetNext();
            else {
                if (a.m_flags & l.e_filterFlag) {
                    if (e.ShouldCollide(b) == false) {
                        c = a;
                        a = c.GetNext();
                        this.Destroy(c);
                        continue
                    }
                    if (this.m_contactFilter.ShouldCollide(c, g) == false) {
                        c = a;
                        a = c.GetNext();
                        this.Destroy(c);
                        continue
                    }
                    a.m_flags &= ~l.e_filterFlag
                }
                if (this.m_broadPhase.TestOverlap(c.m_proxy, g.m_proxy) == false) {
                    c = a;
                    a = c.GetNext();
                    this.Destroy(c)
                } else {
                    a.Update(this.m_contactListener);
                    a = a.GetNext()
                }
            }
        }
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.b2ContactManager.s_evalCP = new p
    });
    E.b2DebugDraw = function () {};
    E.prototype.b2DebugDraw = function () {};
    E.prototype.SetFlags = function () {};
    E.prototype.GetFlags = function () {};
    E.prototype.AppendFlags = function () {};
    E.prototype.ClearFlags = function () {};
    E.prototype.SetSprite = function () {};
    E.prototype.GetSprite = function () {};
    E.prototype.SetDrawScale = function () {};
    E.prototype.GetDrawScale = function () {};
    E.prototype.SetLineThickness = function () {};
    E.prototype.GetLineThickness = function () {};
    E.prototype.SetAlpha = function () {};
    E.prototype.GetAlpha = function () {};
    E.prototype.SetFillAlpha = function () {};
    E.prototype.GetFillAlpha = function () {};
    E.prototype.SetXFormScale = function () {};
    E.prototype.GetXFormScale = function () {};
    E.prototype.DrawPolygon = function () {};
    E.prototype.DrawSolidPolygon = function () {};
    E.prototype.DrawCircle = function () {};
    E.prototype.DrawSolidCircle = function () {};
    E.prototype.DrawSegment = function () {};
    E.prototype.DrawTransform = function () {};
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.b2DebugDraw.e_shapeBit = 1;
        Box2D.Dynamics.b2DebugDraw.e_jointBit = 2;
        Box2D.Dynamics.b2DebugDraw.e_aabbBit = 4;
        Box2D.Dynamics.b2DebugDraw.e_pairBit = 8;
        Box2D.Dynamics.b2DebugDraw.e_centerOfMassBit = 16;
        Box2D.Dynamics.b2DebugDraw.e_controllerBit = 32
    });
    R.b2DestructionListener = function () {};
    R.prototype.SayGoodbyeJoint = function () {};
    R.prototype.SayGoodbyeFixture = function () {};
    N.b2FilterData = function () {
        this.categoryBits = 1;
        this.maskBits = 65535;
        this.groupIndex = 0
    };
    N.prototype.Copy = function () {
        var a = new N;
        a.categoryBits = this.categoryBits;
        a.maskBits = this.maskBits;
        a.groupIndex = this.groupIndex;
        return a
    };
    S.b2Fixture = function () {
        this.m_filter = new N
    };
    S.prototype.GetType = function () {
        return this.m_shape.GetType()
    };
    S.prototype.GetShape = function () {
        return this.m_shape
    };
    S.prototype.SetSensor = function (a) {
        if (this.m_isSensor != a) {
            this.m_isSensor = a;
            if (this.m_body != null) for (a = this.m_body.GetContactList(); a;) {
                    var c = a.contact,
                        g = c.GetFixtureA(),
                        b = c.GetFixtureB();
                    if (g == this || b == this) c.SetSensor(g.IsSensor() || b.IsSensor());
                    a = a.next
                }
        }
    };
    S.prototype.IsSensor = function () {
        return this.m_isSensor
    };
    S.prototype.SetFilterData = function (a) {
        this.m_filter = a.Copy();
        if (!this.m_body) for (a = this.m_body.GetContactList(); a;) {
                var c = a.contact,
                    g = c.GetFixtureA(),
                    b = c.GetFixtureB();
                if (g == this || b == this) c.FlagForFiltering();
                a = a.next
            }
    };
    S.prototype.GetFilterData = function () {
        return this.m_filter.Copy()
    };
    S.prototype.GetBody = function () {
        return this.m_body
    };
    S.prototype.GetNext = function () {
        return this.m_next
    };
    S.prototype.GetUserData = function () {
        return this.m_userData
    };
    S.prototype.SetUserData = function (a) {
        this.m_userData = a
    };
    S.prototype.TestPoint = function (a) {
        return this.m_shape.TestPoint(this.m_body.GetTransform(),
            a)
    };
    S.prototype.RayCast = function (a, c) {
        return this.m_shape.RayCast(a, c, this.m_body.GetTransform())
    };
    S.prototype.GetMassData = function (a) {
        if (a === undefined) a = null;
        if (a == null) a = new I;
        this.m_shape.ComputeMass(a, this.m_density);
        return a
    };
    S.prototype.SetDensity = function (a) {
        if (a === undefined) a = 0;
        this.m_density = a
    };
    S.prototype.GetDensity = function () {
        return this.m_density
    };
    S.prototype.GetFriction = function () {
        return this.m_friction
    };
    S.prototype.SetFriction = function (a) {
        if (a === undefined) a = 0;
        this.m_friction = a
    };
    S.prototype.GetRestitution = function () {
            return this.m_restitution
    };
    S.prototype.SetRestitution = function (a) {
        if (a === undefined) a = 0;
        this.m_restitution = a
    };
    S.prototype.GetAABB = function () {
        return this.m_aabb
    };
    S.prototype.b2Fixture = function () {
        this.m_aabb = new U;
        this.m_shape = this.m_next = this.m_body = this.m_userData = null;
        this.m_restitution = this.m_friction = this.m_density = 0
    };
    S.prototype.Create = function (a, c, g) {
        this.m_userData = g.userData;
        this.m_friction = g.friction;
        this.m_restitution = g.restitution;
        this.m_body = a;
        this.m_next = null;
        this.m_filter = g.filter.Copy();
        this.m_isSensor = g.isSensor;
        this.m_shape = g.shape.Copy();
        this.m_density = g.density
    };
    S.prototype.Destroy = function () {
        this.m_shape = null
    };
    S.prototype.CreateProxy = function (a, c) {
        this.m_shape.ComputeAABB(this.m_aabb, c);
        this.m_proxy = a.CreateProxy(this.m_aabb, this)
    };
    S.prototype.DestroyProxy = function (a) {
        if (this.m_proxy != null) {
            a.DestroyProxy(this.m_proxy);
            this.m_proxy = null
        }
    };
    S.prototype.Synchronize = function (a, c, g) {
        if (this.m_proxy) {
            var b = new U,
                e = new U;
            this.m_shape.ComputeAABB(b, c);
            this.m_shape.ComputeAABB(e, g);
            this.m_aabb.Combine(b, e);
            c = F.SubtractVV(g.position, c.position);
            a.MoveProxy(this.m_proxy, this.m_aabb, c)
        }
    };
    aa.b2FixtureDef = function () {
        this.filter = new N
    };
    aa.prototype.b2FixtureDef = function () {
        this.userData = this.shape = null;
        this.friction = 0.2;
        this.density = this.restitution = 0;
        this.filter.categoryBits = 1;
        this.filter.maskBits = 65535;
        this.filter.groupIndex = 0;
        this.isSensor = false
    };
    Z.b2Island = function () {};
    Z.prototype.b2Island = function () {
        this.m_bodies = new Vector;
        this.m_contacts = new Vector;
        this.m_joints = new Vector
    };
    Z.prototype.Initialize = function (a, c, g, b, e, f) {
        if (a === undefined) a = 0;
        if (c === undefined) c = 0;
        if (g === undefined) g = 0;
        var m = 0;
        this.m_bodyCapacity = a;
        this.m_contactCapacity = c;
        this.m_jointCapacity = g;
        this.m_jointCount = this.m_contactCount = this.m_bodyCount = 0;
        this.m_allocator = b;
        this.m_listener = e;
        this.m_contactSolver = f;
        for (m = this.m_bodies.length; m < a; m++) this.m_bodies[m] = null;
        for (m = this.m_contacts.length; m < c; m++) this.m_contacts[m] = null;
        for (m = this.m_joints.length; m < g; m++) this.m_joints[m] = null
    };
    Z.prototype.Clear = function () {
        this.m_jointCount = this.m_contactCount = this.m_bodyCount = 0
    };
    Z.prototype.Solve = function (a, c, g) {
        var b = 0,
            e = 0,
            f;
        for (b = 0; b < this.m_bodyCount; ++b) {
            e = this.m_bodies[b];
            if (e.GetType() == k.b2_dynamicBody) {
                e.m_linearVelocity.x += a.dt * (c.x + e.m_invMass * e.m_force.x);
                e.m_linearVelocity.y += a.dt * (c.y + e.m_invMass * e.m_force.y);
                e.m_angularVelocity += a.dt * e.m_invI * e.m_torque;
                e.m_linearVelocity.Multiply(F.Clamp(1 - a.dt * e.m_linearDamping, 0, 1));
                e.m_angularVelocity *= F.Clamp(1 - a.dt * e.m_angularDamping, 0, 1)
            }
        }
        this.m_contactSolver.Initialize(a, this.m_contacts,
            this.m_contactCount, this.m_allocator);
        c = this.m_contactSolver;
        c.InitVelocityConstraints(a);
        for (b = 0; b < this.m_jointCount; ++b) {
            f = this.m_joints[b];
            f.InitVelocityConstraints(a)
        }
        for (b = 0; b < a.velocityIterations; ++b) {
            for (e = 0; e < this.m_jointCount; ++e) {
                f = this.m_joints[e];
                f.SolveVelocityConstraints(a)
            }
            c.SolveVelocityConstraints()
        }
        for (b = 0; b < this.m_jointCount; ++b) {
            f = this.m_joints[b];
            f.FinalizeVelocityConstraints()
        }
        c.FinalizeVelocityConstraints();
        for (b = 0; b < this.m_bodyCount; ++b) {
            e = this.m_bodies[b];
            if (e.GetType() != k.b2_staticBody) {
                var m = a.dt * e.m_linearVelocity.x,
                    r = a.dt * e.m_linearVelocity.y;
                if (m * m + r * r > A.b2_maxTranslationSquared) {
                    e.m_linearVelocity.Normalize();
                    e.m_linearVelocity.x *= A.b2_maxTranslation * a.inv_dt;
                    e.m_linearVelocity.y *= A.b2_maxTranslation * a.inv_dt
                }
                m = a.dt * e.m_angularVelocity;
                if (m * m > A.b2_maxRotationSquared) e.m_angularVelocity = e.m_angularVelocity < 0 ? -A.b2_maxRotation * a.inv_dt : A.b2_maxRotation * a.inv_dt;
                e.m_sweep.c0.SetV(e.m_sweep.c);
                e.m_sweep.a0 = e.m_sweep.a;
                e.m_sweep.c.x += a.dt * e.m_linearVelocity.x;
                e.m_sweep.c.y += a.dt * e.m_linearVelocity.y;
                e.m_sweep.a += a.dt * e.m_angularVelocity;
                e.SynchronizeTransform()
            }
        }
        for (b = 0; b < a.positionIterations; ++b) {
            m = c.SolvePositionConstraints(A.b2_contactBaumgarte);
            r = true;
            for (e = 0; e < this.m_jointCount; ++e) {
                f = this.m_joints[e];
                f = f.SolvePositionConstraints(A.b2_contactBaumgarte);
                r = r && f
            }
            if (m && r) break
        }
        this.Report(c.m_constraints);
        if (g) {
            g = Number.MAX_VALUE;
            c = A.b2_linearSleepTolerance * A.b2_linearSleepTolerance;
            m = A.b2_angularSleepTolerance * A.b2_angularSleepTolerance;
            for (b = 0; b < this.m_bodyCount; ++b) {
                e = this.m_bodies[b];
                if (e.GetType() != k.b2_staticBody) {
                    if ((e.m_flags & k.e_allowSleepFlag) == 0) g = e.m_sleepTime = 0;
                    if ((e.m_flags & k.e_allowSleepFlag) == 0 || e.m_angularVelocity * e.m_angularVelocity > m || F.Dot(e.m_linearVelocity, e.m_linearVelocity) > c) g = e.m_sleepTime = 0;
                    else {
                        e.m_sleepTime += a.dt;
                        g = F.Min(g, e.m_sleepTime)
                    }
                }
            }
            if (g >= A.b2_timeToSleep)
                for (b = 0; b < this.m_bodyCount; ++b) {
                    e = this.m_bodies[b];
                    e.SetAwake(false)
                }
        }
    };
    Z.prototype.SolveTOI = function (a) {
        var c = 0,
            g = 0;
        this.m_contactSolver.Initialize(a, this.m_contacts, this.m_contactCount,
            this.m_allocator);
        var b = this.m_contactSolver;
        for (c = 0; c < this.m_jointCount; ++c) this.m_joints[c].InitVelocityConstraints(a);
        for (c = 0; c < a.velocityIterations; ++c) {
            b.SolveVelocityConstraints();
            for (g = 0; g < this.m_jointCount; ++g) this.m_joints[g].SolveVelocityConstraints(a)
        }
        for (c = 0; c < this.m_bodyCount; ++c) {
            g = this.m_bodies[c];
            if (g.GetType() != k.b2_staticBody) {
                var e = a.dt * g.m_linearVelocity.x,
                    f = a.dt * g.m_linearVelocity.y;
                if (e * e + f * f > A.b2_maxTranslationSquared) {
                    g.m_linearVelocity.Normalize();
                    g.m_linearVelocity.x *= A.b2_maxTranslation * a.inv_dt;
                    g.m_linearVelocity.y *= A.b2_maxTranslation * a.inv_dt
                }
                e = a.dt * g.m_angularVelocity;
                if (e * e > A.b2_maxRotationSquared) g.m_angularVelocity = g.m_angularVelocity < 0 ? -A.b2_maxRotation * a.inv_dt : A.b2_maxRotation * a.inv_dt;
                g.m_sweep.c0.SetV(g.m_sweep.c);
                g.m_sweep.a0 = g.m_sweep.a;
                g.m_sweep.c.x += a.dt * g.m_linearVelocity.x;
                g.m_sweep.c.y += a.dt * g.m_linearVelocity.y;
                g.m_sweep.a += a.dt * g.m_angularVelocity;
                g.SynchronizeTransform()
            }
        }
        for (c = 0; c < a.positionIterations; ++c) {
            e = b.SolvePositionConstraints(0.75);
            f = true;
            for (g = 0; g <
                this.m_jointCount; ++g) {
                var m = this.m_joints[g].SolvePositionConstraints(A.b2_contactBaumgarte);
                f = f && m
            }
            if (e && f) break
        }
        this.Report(b.m_constraints)
    };
    Z.prototype.Report = function (a) {
        if (this.m_listener != null)
            for (var c = 0; c < this.m_contactCount; ++c) {
                for (var g = this.m_contacts[c], b = a[c], e = 0; e < b.pointCount; ++e) {
                    Z.s_impulse.normalImpulses[e] = b.points[e].normalImpulse;
                    Z.s_impulse.tangentImpulses[e] = b.points[e].tangentImpulse
                }
                this.m_listener.PostSolve(g, Z.s_impulse)
            }
    };
    Z.prototype.AddBody = function (a) {
        a.m_islandIndex = this.m_bodyCount;
        this.m_bodies[this.m_bodyCount++] = a
    };
    Z.prototype.AddContact = function (a) {
        this.m_contacts[this.m_contactCount++] = a
    };
    Z.prototype.AddJoint = function (a) {
        this.m_joints[this.m_jointCount++] = a
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.b2Island.s_impulse = new D
    });
    d.b2TimeStep = function () {};
    d.prototype.Set = function (a) {
        this.dt = a.dt;
        this.inv_dt = a.inv_dt;
        this.positionIterations = a.positionIterations;
        this.velocityIterations = a.velocityIterations;
        this.warmStarting = a.warmStarting
    };
    h.b2World = function () {
        this.s_stack = new Vector;
        this.m_contactManager = new O;
        this.m_contactSolver = new o;
        this.m_island = new Z
    };
    h.prototype.b2World = function (a, c) {
        this.m_controllerList = this.m_jointList = this.m_contactList = this.m_bodyList = this.m_debugDraw = this.m_destructionListener = null;
        this.m_controllerCount = this.m_jointCount = this.m_contactCount = this.m_bodyCount = 0;
        h.m_warmStarting = true;
        h.m_continuousPhysics = true;
        this.m_allowSleep = c;
        this.m_gravity = a;
        this.m_inv_dt0 = 0;
        this.m_contactManager.m_world = this;
        this.m_groundBody = this.CreateBody(new z)
    };
    h.prototype.SetDestructionListener = function (a) {
        this.m_destructionListener = a
    };
    h.prototype.SetContactFilter = function (a) {
        this.m_contactManager.m_contactFilter = a
    };
    h.prototype.SetContactListener = function (a) {
        this.m_contactManager.m_contactListener = a
    };
    h.prototype.SetDebugDraw = function (a) {
        this.m_debugDraw = a
    };
    h.prototype.SetBroadPhase = function (a) {
        var c = this.m_contactManager.m_broadPhase;
        this.m_contactManager.m_broadPhase = a;
        for (var g = this.m_bodyList; g; g = g.m_next)
            for (var b = g.m_fixtureList; b; b = b.m_next) b.m_proxy = a.CreateProxy(c.GetFatAABB(b.m_proxy), b)
    };
    h.prototype.Validate = function () {
        this.m_contactManager.m_broadPhase.Validate()
    };
    h.prototype.GetProxyCount = function () {
        return this.m_contactManager.m_broadPhase.GetProxyCount()
    };
    h.prototype.CreateBody = function (a) {
        if (this.IsLocked() == true) return null;
        a = new k(a, this);
        a.m_prev = null;
        if (a.m_next = this.m_bodyList) this.m_bodyList.m_prev = a;
        this.m_bodyList = a;
        ++this.m_bodyCount;
        return a
    };
    h.prototype.DestroyBody = function (a) {
        if (this.IsLocked() != true) {
            for (var c = a.m_jointList; c;) {
                var g = c;
                c = c.next;
                this.m_destructionListener && this.m_destructionListener.SayGoodbyeJoint(g.joint);
                this.DestroyJoint(g.joint)
            }
            for (c = a.m_controllerList; c;) {
                g = c;
                c = c.nextController;
                g.controller.RemoveBody(a)
            }
            for (c = a.m_contactList; c;) {
                g = c;
                c = c.next;
                this.m_contactManager.Destroy(g.contact)
            }
            a.m_contactList = null;
            for (c = a.m_fixtureList; c;) {
                g = c;
                c = c.m_next;
                this.m_destructionListener && this.m_destructionListener.SayGoodbyeFixture(g);
                g.DestroyProxy(this.m_contactManager.m_broadPhase);
                g.Destroy()
            }
            a.m_fixtureList = null;
            a.m_fixtureCount = 0;
            if (a.m_prev) a.m_prev.m_next = a.m_next;
            if (a.m_next) a.m_next.m_prev = a.m_prev;
            if (a == this.m_bodyList) this.m_bodyList = a.m_next;
            --this.m_bodyCount
        }
    };
    h.prototype.CreateJoint = function (a) {
        var c = q.Create(a, null);
        c.m_prev = null;
        if (c.m_next = this.m_jointList) this.m_jointList.m_prev = c;
        this.m_jointList = c;
        ++this.m_jointCount;
        c.m_edgeA.joint = c;
        c.m_edgeA.other = c.m_bodyB;
        c.m_edgeA.prev = null;
        if (c.m_edgeA.next = c.m_bodyA.m_jointList) c.m_bodyA.m_jointList.prev = c.m_edgeA;
        c.m_bodyA.m_jointList = c.m_edgeA;
        c.m_edgeB.joint = c;
        c.m_edgeB.other = c.m_bodyA;
        c.m_edgeB.prev = null;
        if (c.m_edgeB.next = c.m_bodyB.m_jointList) c.m_bodyB.m_jointList.prev = c.m_edgeB;
        c.m_bodyB.m_jointList = c.m_edgeB;
        var g = a.bodyA,
            b = a.bodyB;
        if (a.collideConnected == false)
            for (a = b.GetContactList(); a;) {
                a.other == g && a.contact.FlagForFiltering();
                a = a.next
            }
        return c
    };
    h.prototype.DestroyJoint = function (a) {
        var c = a.m_collideConnected;
        if (a.m_prev) a.m_prev.m_next = a.m_next;
        if (a.m_next) a.m_next.m_prev = a.m_prev;
        if (a == this.m_jointList) this.m_jointList = a.m_next;
        var g = a.m_bodyA,
            b = a.m_bodyB;
        g.SetAwake(true);
        b.SetAwake(true);
        if (a.m_edgeA.prev) a.m_edgeA.prev.next = a.m_edgeA.next;
        if (a.m_edgeA.next) a.m_edgeA.next.prev = a.m_edgeA.prev;
        if (a.m_edgeA == g.m_jointList) g.m_jointList = a.m_edgeA.next;
        a.m_edgeA.prev = null;
        a.m_edgeA.next = null;
        if (a.m_edgeB.prev) a.m_edgeB.prev.next = a.m_edgeB.next;
        if (a.m_edgeB.next) a.m_edgeB.next.prev = a.m_edgeB.prev;
        if (a.m_edgeB == b.m_jointList) b.m_jointList = a.m_edgeB.next;
        a.m_edgeB.prev = null;
        a.m_edgeB.next = null;
        q.Destroy(a, null);
        --this.m_jointCount;
        if (c == false)
            for (a = b.GetContactList(); a;) {
                a.other == g && a.contact.FlagForFiltering();
                a = a.next
            }
    };
    h.prototype.AddController = function (a) {
        a.m_next = this.m_controllerList;
        a.m_prev = null;
        this.m_controllerList = a;
        a.m_world = this;
        this.m_controllerCount++;
        return a
    };
    h.prototype.RemoveController = function (a) {
        if (a.m_prev) a.m_prev.m_next = a.m_next;
        if (a.m_next) a.m_next.m_prev = a.m_prev;
        if (this.m_controllerList == a) this.m_controllerList = a.m_next;
        this.m_controllerCount--
    };
    h.prototype.CreateController = function (a) {
        if (a.m_world != this) throw Error("Controller can only be a member of one world");
        a.m_next = this.m_controllerList;
        a.m_prev = null;
        if (this.m_controllerList) this.m_controllerList.m_prev = a;
        this.m_controllerList = a;
        ++this.m_controllerCount;
        a.m_world = this;
        return a
    };
    h.prototype.DestroyController = function (a) {
        a.Clear();
        if (a.m_next) a.m_next.m_prev = a.m_prev;
        if (a.m_prev) a.m_prev.m_next = a.m_next;
        if (a == this.m_controllerList) this.m_controllerList = a.m_next;
        --this.m_controllerCount
    };
    h.prototype.SetWarmStarting = function (a) {
        h.m_warmStarting = a
    };
    h.prototype.SetContinuousPhysics = function (a) {
        h.m_continuousPhysics = a
    };
    h.prototype.GetBodyCount = function () {
        return this.m_bodyCount
    };
    h.prototype.GetJointCount = function () {
        return this.m_jointCount
    };
    h.prototype.GetContactCount = function () {
        return this.m_contactCount
    };
    h.prototype.SetGravity = function (a) {
        this.m_gravity = a
    };
    h.prototype.GetGravity = function () {
        return this.m_gravity
    };
    h.prototype.GetGroundBody = function () {
        return this.m_groundBody
    };
    h.prototype.Step = function (a, c, g) {
        if (a === undefined) a = 0;
        if (c === undefined) c = 0;
        if (g === undefined) g = 0;
        if (this.m_flags & h.e_newFixture) {
            this.m_contactManager.FindNewContacts();
            this.m_flags &= ~h.e_newFixture
        }
        this.m_flags |= h.e_locked;
        var b = h.s_timestep2;
        b.dt = a;
        b.velocityIterations = c;
        b.positionIterations = g;
        b.inv_dt = a > 0 ? 1 / a : 0;
        b.dtRatio = this.m_inv_dt0 * a;
        b.warmStarting = h.m_warmStarting;
        this.m_contactManager.Collide();
        b.dt > 0 && this.Solve(b);
        h.m_continuousPhysics && b.dt > 0 && this.SolveTOI(b);
        if (b.dt > 0) this.m_inv_dt0 = b.inv_dt;
        this.m_flags &= ~h.e_locked
    };
    h.prototype.ClearForces = function () {
        for (var a = this.m_bodyList; a; a = a.m_next) {
            a.m_force.SetZero();
            a.m_torque = 0
        }
    };
    h.prototype.DrawDebugData = function () {
            if (this.m_debugDraw != null) {
                this.m_debugDraw.m_sprite.graphics.clear();
                var a = this.m_debugDraw.GetFlags(),
                    c, g, b;
                new y;
                new y;
                new y;
                var e;
                new U;
                new U;
                e = [new y, new y, new y, new y];
                var f = new w(0, 0, 0);
                if (a & E.e_shapeBit)
                    for (c = this.m_bodyList; c; c = c.m_next) {
                        e = c.m_xf;
                        for (g = c.GetFixtureList(); g; g = g.m_next) {
                            b = g.GetShape();
                            if (c.IsActive() == false) f.Set(0.5, 0.5, 0.3);
                            else if (c.GetType() == k.b2_staticBody) f.Set(0.5, 0.9, 0.5);
                            else if (c.GetType() == k.b2_kinematicBody) f.Set(0.5, 0.5, 0.9);
                            else c.IsAwake() == false ?
                                f.Set(0.6, 0.6, 0.6) : f.Set(0.9, 0.7, 0.7);
                            this.DrawShape(b, e, f)
                        }
                    }
                if (a & E.e_jointBit)
                    for (c = this.m_jointList; c; c = c.m_next) this.DrawJoint(c);
                if (a & E.e_controllerBit)
                    for (c = this.m_controllerList; c; c = c.m_next) c.Draw(this.m_debugDraw);
                if (a & E.e_pairBit) {
                    f.Set(0.3, 0.9, 0.9);
                    for (c = this.m_contactManager.m_contactList; c; c = c.GetNext()) {
                        b = c.GetFixtureA();
                        g = c.GetFixtureB();
                        b = b.GetAABB().GetCenter();
                        g = g.GetAABB().GetCenter();
                        this.m_debugDraw.DrawSegment(b, g, f)
                    }
                }
                if (a & E.e_aabbBit) {
                    b = this.m_contactManager.m_broadPhase;
                    e = [new y,
                        new y, new y, new y
                    ];
                    for (c = this.m_bodyList; c; c = c.GetNext())
                        if (c.IsActive() != false)
                            for (g = c.GetFixtureList(); g; g = g.GetNext()) {
                                var m = b.GetFatAABB(g.m_proxy);
                                e[0].Set(m.lowerBound.x, m.lowerBound.y);
                                e[1].Set(m.upperBound.x, m.lowerBound.y);
                                e[2].Set(m.upperBound.x, m.upperBound.y);
                                e[3].Set(m.lowerBound.x, m.upperBound.y);
                                this.m_debugDraw.DrawPolygon(e, 4, f)
                            }
                }
                if (a & E.e_centerOfMassBit)
                    for (c = this.m_bodyList; c; c = c.m_next) {
                        e = h.s_xf;
                        e.R = c.m_xf.R;
                        e.position = c.GetWorldCenter();
                        this.m_debugDraw.DrawTransform(e)
                    }
            }
    };
    h.prototype.QueryAABB = function (a, c) {
            var g = this.m_contactManager.m_broadPhase;
            g.Query(function (b) {
                return a(g.GetUserData(b))
            }, c)
    };
    h.prototype.QueryShape = function (a, c, g) {
        if (g === undefined) g = null;
        if (g == null) {
            g = new K;
            g.SetIdentity()
        }
        var b = this.m_contactManager.m_broadPhase,
            e = new U;
        c.ComputeAABB(e, g);
        b.Query(function (f) {
            f = b.GetUserData(f) instanceof S ? b.GetUserData(f) : null;
            if (Y.TestOverlap(c, g, f.GetShape(), f.GetBody().GetTransform())) return a(f);
            return true
        }, e)
    };
    h.prototype.QueryPoint = function (a, c) {
        var g = this.m_contactManager.m_broadPhase,
            b = new U;
        b.lowerBound.Set(c.x - A.b2_linearSlop, c.y - A.b2_linearSlop);
        b.upperBound.Set(c.x + A.b2_linearSlop, c.y + A.b2_linearSlop);
        g.Query(function (e) {
            e = g.GetUserData(e) instanceof S ? g.GetUserData(e) : null;
            if (e.TestPoint(c)) return a(e);
            return true
        }, b)
    };
    h.prototype.RayCast = function (a, c, g) {
        var b = this.m_contactManager.m_broadPhase,
            e = new V,
            f = new Q(c, g);
        b.RayCast(function (m, r) {
            var s = b.GetUserData(r);
            s = s instanceof S ? s : null;
            if (s.RayCast(e, m)) {
                var v = e.fraction,
                    t = new y((1 - v) * c.x + v * g.x, (1 - v) * c.y + v * g.y);
                return a(s,
                    t, e.normal, v)
            }
            return m.maxFraction
        }, f)
    };
    h.prototype.RayCastOne = function (a, c) {
        var g;
        this.RayCast(function (b, e, f, m) {
            if (m === undefined) m = 0;
            g = b;
            return m
        }, a, c);
        return g
    };
    h.prototype.RayCastAll = function (a, c) {
        var g = new Vector;
        this.RayCast(function (b) {
            g[g.length] = b;
            return 1
        }, a, c);
        return g
    };
    h.prototype.GetBodyList = function () {
        return this.m_bodyList
    };
    h.prototype.GetJointList = function () {
        return this.m_jointList
    };
    h.prototype.GetContactList = function () {
        return this.m_contactList
    };
    h.prototype.IsLocked = function () {
        return (this.m_flags &
            h.e_locked) > 0
    };
    h.prototype.Solve = function (a) {
        for (var c, g = this.m_controllerList; g; g = g.m_next) g.Step(a);
        g = this.m_island;
        g.Initialize(this.m_bodyCount, this.m_contactCount, this.m_jointCount, null, this.m_contactManager.m_contactListener, this.m_contactSolver);
        for (c = this.m_bodyList; c; c = c.m_next) c.m_flags &= ~k.e_islandFlag;
        for (var b = this.m_contactList; b; b = b.m_next) b.m_flags &= ~l.e_islandFlag;
        for (b = this.m_jointList; b; b = b.m_next) b.m_islandFlag = false;
        parseInt(this.m_bodyCount);
        b = this.s_stack;
        for (var e = this.m_bodyList; e; e = e.m_next)
            if (!(e.m_flags & k.e_islandFlag))
                if (!(e.IsAwake() == false || e.IsActive() == false))
                    if (e.GetType() != k.b2_staticBody) {
                        g.Clear();
                        var f = 0;
                        b[f++] = e;
                        for (e.m_flags |= k.e_islandFlag; f > 0;) {
                            c = b[--f];
                            g.AddBody(c);
                            c.IsAwake() == false && c.SetAwake(true);
                            if (c.GetType() != k.b2_staticBody) {
                                for (var m, r = c.m_contactList; r; r = r.next)
                                    if (!(r.contact.m_flags & l.e_islandFlag))
                                        if (!(r.contact.IsSensor() == true || r.contact.IsEnabled() == false || r.contact.IsTouching() == false)) {
                                            g.AddContact(r.contact);
                                            r.contact.m_flags |= l.e_islandFlag;
                                            m = r.other;
                                            if (!(m.m_flags & k.e_islandFlag)) {
                                                b[f++] = m;
                                                m.m_flags |= k.e_islandFlag
                                            }
                                        }
                                for (c = c.m_jointList; c; c = c.next)
                                    if (c.joint.m_islandFlag != true) {
                                        m = c.other;
                                        if (m.IsActive() != false) {
                                            g.AddJoint(c.joint);
                                            c.joint.m_islandFlag = true;
                                            if (!(m.m_flags & k.e_islandFlag)) {
                                                b[f++] = m;
                                                m.m_flags |= k.e_islandFlag
                                            }
                                        }
                                    }
                            }
                        }
                        g.Solve(a, this.m_gravity, this.m_allowSleep);
                        for (f = 0; f < g.m_bodyCount; ++f) {
                            c = g.m_bodies[f];
                            if (c.GetType() == k.b2_staticBody) c.m_flags &= ~k.e_islandFlag
                        }
                    }
        for (f = 0; f < b.length; ++f) {
            if (!b[f]) break;
            b[f] = null
        }
        for (c = this.m_bodyList; c; c = c.m_next) c.IsAwake() == false || c.IsActive() == false || c.GetType() != k.b2_staticBody && c.SynchronizeFixtures();
        this.m_contactManager.FindNewContacts()
    };
    h.prototype.SolveTOI = function (a) {
        var c, g, b, e = this.m_island;
        e.Initialize(this.m_bodyCount, A.b2_maxTOIContactsPerIsland, A.b2_maxTOIJointsPerIsland, null, this.m_contactManager.m_contactListener, this.m_contactSolver);
        var f = h.s_queue;
        for (c = this.m_bodyList; c; c = c.m_next) {
            c.m_flags &= ~k.e_islandFlag;
            c.m_sweep.t0 = 0
        }
        for (b = this.m_contactList; b; b = b.m_next) b.m_flags &= ~(l.e_toiFlag |
            l.e_islandFlag);
        for (b = this.m_jointList; b; b = b.m_next) b.m_islandFlag = false;
        for (;;) {
            var m = null,
                r = 1;
            for (b = this.m_contactList; b; b = b.m_next)
                if (!(b.IsSensor() == true || b.IsEnabled() == false || b.IsContinuous() == false)) {
                    c = 1;
                    if (b.m_flags & l.e_toiFlag) c = b.m_toi;
                    else {
                        c = b.m_fixtureA;
                        g = b.m_fixtureB;
                        c = c.m_body;
                        g = g.m_body;
                        if ((c.GetType() != k.b2_dynamicBody || c.IsAwake() == false) && (g.GetType() != k.b2_dynamicBody || g.IsAwake() == false)) continue;
                        var s = c.m_sweep.t0;
                        if (c.m_sweep.t0 < g.m_sweep.t0) {
                            s = g.m_sweep.t0;
                            c.m_sweep.Advance(s)
                        } else if (g.m_sweep.t0 <
                            c.m_sweep.t0) {
                            s = c.m_sweep.t0;
                            g.m_sweep.Advance(s)
                        }
                        c = b.ComputeTOI(c.m_sweep, g.m_sweep);
                        A.b2Assert(0 <= c && c <= 1);
                        if (c > 0 && c < 1) {
                            c = (1 - c) * s + c;
                            if (c > 1) c = 1
                        }
                        b.m_toi = c;
                        b.m_flags |= l.e_toiFlag
                    } if (Number.MIN_VALUE < c && c < r) {
                        m = b;
                        r = c
                    }
                }
            if (m == null || 1 - 100 * Number.MIN_VALUE < r) break;
            c = m.m_fixtureA;
            g = m.m_fixtureB;
            c = c.m_body;
            g = g.m_body;
            h.s_backupA.Set(c.m_sweep);
            h.s_backupB.Set(g.m_sweep);
            c.Advance(r);
            g.Advance(r);
            m.Update(this.m_contactManager.m_contactListener);
            m.m_flags &= ~l.e_toiFlag;
            if (m.IsSensor() == true || m.IsEnabled() == false) {
                c.m_sweep.Set(h.s_backupA);
                g.m_sweep.Set(h.s_backupB);
                c.SynchronizeTransform();
                g.SynchronizeTransform()
            } else if (m.IsTouching() != false) {
                c = c;
                if (c.GetType() != k.b2_dynamicBody) c = g;
                e.Clear();
                m = b = 0;
                f[b + m++] = c;
                for (c.m_flags |= k.e_islandFlag; m > 0;) {
                    c = f[b++];
                    --m;
                    e.AddBody(c);
                    c.IsAwake() == false && c.SetAwake(true);
                    if (c.GetType() == k.b2_dynamicBody) {
                        for (g = c.m_contactList; g; g = g.next) {
                            if (e.m_contactCount == e.m_contactCapacity) break;
                            if (!(g.contact.m_flags & l.e_islandFlag))
                                if (!(g.contact.IsSensor() == true || g.contact.IsEnabled() == false || g.contact.IsTouching() == false)) {
                                    e.AddContact(g.contact);
                                    g.contact.m_flags |= l.e_islandFlag;
                                    s = g.other;
                                    if (!(s.m_flags & k.e_islandFlag)) {
                                        if (s.GetType() != k.b2_staticBody) {
                                            s.Advance(r);
                                            s.SetAwake(true)
                                        }
                                        f[b + m] = s;
                                        ++m;
                                        s.m_flags |= k.e_islandFlag
                                    }
                                }
                        }
                        for (c = c.m_jointList; c; c = c.next)
                            if (e.m_jointCount != e.m_jointCapacity)
                                if (c.joint.m_islandFlag != true) {
                                    s = c.other;
                                    if (s.IsActive() != false) {
                                        e.AddJoint(c.joint);
                                        c.joint.m_islandFlag = true;
                                        if (!(s.m_flags & k.e_islandFlag)) {
                                            if (s.GetType() != k.b2_staticBody) {
                                                s.Advance(r);
                                                s.SetAwake(true)
                                            }
                                            f[b + m] = s;
                                            ++m;
                                            s.m_flags |= k.e_islandFlag
                                        }
                                    }
                                }
                    }
                }
                b = h.s_timestep;
                b.warmStarting = false;
                b.dt = (1 - r) * a.dt;
                b.inv_dt = 1 / b.dt;
                b.dtRatio = 0;
                b.velocityIterations = a.velocityIterations;
                b.positionIterations = a.positionIterations;
                e.SolveTOI(b);
                for (r = r = 0; r < e.m_bodyCount; ++r) {
                    c = e.m_bodies[r];
                    c.m_flags &= ~k.e_islandFlag;
                    if (c.IsAwake() != false)
                        if (c.GetType() == k.b2_dynamicBody) {
                            c.SynchronizeFixtures();
                            for (g = c.m_contactList; g; g = g.next) g.contact.m_flags &= ~l.e_toiFlag
                        }
                }
                for (r = 0; r < e.m_contactCount; ++r) {
                    b = e.m_contacts[r];
                    b.m_flags &= ~(l.e_toiFlag |
                        l.e_islandFlag)
                }
                for (r = 0; r < e.m_jointCount; ++r) {
                    b = e.m_joints[r];
                    b.m_islandFlag = false
                }
                this.m_contactManager.FindNewContacts()
            }
        }
    };
    h.prototype.DrawJoint = function (a) {
        var c = a.GetBodyA(),
            g = a.GetBodyB(),
            b = c.m_xf.position,
            e = g.m_xf.position,
            f = a.GetAnchorA(),
            m = a.GetAnchorB(),
            r = h.s_jointColor;
        switch (a.m_type) {
        case q.e_distanceJoint:
            this.m_debugDraw.DrawSegment(f, m, r);
            break;
        case q.e_pulleyJoint:
            c = a instanceof n ? a : null;
            a = c.GetGroundAnchorA();
            c = c.GetGroundAnchorB();
            this.m_debugDraw.DrawSegment(a, f, r);
            this.m_debugDraw.DrawSegment(c,
                m, r);
            this.m_debugDraw.DrawSegment(a, c, r);
            break;
        case q.e_mouseJoint:
            this.m_debugDraw.DrawSegment(f, m, r);
            break;
        default:
            c != this.m_groundBody && this.m_debugDraw.DrawSegment(b, f, r);
            this.m_debugDraw.DrawSegment(f, m, r);
            g != this.m_groundBody && this.m_debugDraw.DrawSegment(e, m, r)
        }
    };
    h.prototype.DrawShape = function (a, c, g) {
        switch (a.m_type) {
        case Y.e_circleShape:
            var b = a instanceof M ? a : null;
            this.m_debugDraw.DrawSolidCircle(F.MulX(c, b.m_p), b.m_radius, c.R.col1, g);
            break;
        case Y.e_polygonShape:
            b = 0;
            b = a instanceof W ? a : null;
            a = parseInt(b.GetVertexCount());
            var e = b.GetVertices(),
                f = new Vector(a);
            for (b = 0; b < a; ++b) f[b] = F.MulX(c, e[b]);
            this.m_debugDraw.DrawSolidPolygon(f, a, g);
            break;
        case Y.e_edgeShape:
            b = a instanceof L ? a : null;
            this.m_debugDraw.DrawSegment(F.MulX(c, b.GetVertex1()), F.MulX(c, b.GetVertex2()), g)
        }
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.b2World.s_timestep2 = new d;
        Box2D.Dynamics.b2World.s_xf = new K;
        Box2D.Dynamics.b2World.s_backupA = new G;
        Box2D.Dynamics.b2World.s_backupB = new G;
        Box2D.Dynamics.b2World.s_timestep = new d;
        Box2D.Dynamics.b2World.s_queue = new Vector;
        Box2D.Dynamics.b2World.s_jointColor = new w(0.5, 0.8, 0.8);
        Box2D.Dynamics.b2World.e_newFixture = 1;
        Box2D.Dynamics.b2World.e_locked = 2
    })
})();
(function () {
    var F = Box2D.Collision.Shapes.b2CircleShape,
        G = Box2D.Collision.Shapes.b2EdgeShape,
        K = Box2D.Collision.Shapes.b2PolygonShape,
        y = Box2D.Collision.Shapes.b2Shape,
        w = Box2D.Dynamics.Contacts.b2CircleContact,
        A = Box2D.Dynamics.Contacts.b2Contact,
        U = Box2D.Dynamics.Contacts.b2ContactConstraint,
        p = Box2D.Dynamics.Contacts.b2ContactConstraintPoint,
        B = Box2D.Dynamics.Contacts.b2ContactEdge,
        Q = Box2D.Dynamics.Contacts.b2ContactFactory,
        V = Box2D.Dynamics.Contacts.b2ContactRegister,
        M = Box2D.Dynamics.Contacts.b2ContactResult,
        L = Box2D.Dynamics.Contacts.b2ContactSolver,
        I = Box2D.Dynamics.Contacts.b2EdgeAndCircleContact,
        W = Box2D.Dynamics.Contacts.b2NullContact,
        Y = Box2D.Dynamics.Contacts.b2PolyAndCircleContact,
        k = Box2D.Dynamics.Contacts.b2PolyAndEdgeContact,
        z = Box2D.Dynamics.Contacts.b2PolygonContact,
        u = Box2D.Dynamics.Contacts.b2PositionSolverManifold,
        D = Box2D.Dynamics.b2Body,
        H = Box2D.Dynamics.b2TimeStep,
        O = Box2D.Common.b2Settings,
        E = Box2D.Common.Math.b2Mat22,
        R = Box2D.Common.Math.b2Math,
        N = Box2D.Common.Math.b2Vec2,
        S = Box2D.Collision.b2Collision,
        aa = Box2D.Collision.b2ContactID,
        Z = Box2D.Collision.b2Manifold,
        d = Box2D.Collision.b2TimeOfImpact,
        h = Box2D.Collision.b2TOIInput,
        l = Box2D.Collision.b2WorldManifold;
    Box2D.inherit(w, Box2D.Dynamics.Contacts.b2Contact);
    w.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
    w.b2CircleContact = function () {
        Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments)
    };
    w.Create = function () {
        return new w
    };
    w.Destroy = function () {};
    w.prototype.Reset = function (j, o) {
        this.__super.Reset.call(this, j, o)
    };
    w.prototype.Evaluate = function () {
            var j = this.m_fixtureA.GetBody(),
                o = this.m_fixtureB.GetBody();
            S.CollideCircles(this.m_manifold, this.m_fixtureA.GetShape() instanceof F ? this.m_fixtureA.GetShape() : null, j.m_xf, this.m_fixtureB.GetShape() instanceof F ? this.m_fixtureB.GetShape() : null, o.m_xf)
    };
    A.b2Contact = function () {
        this.m_nodeA = new B;
        this.m_nodeB = new B;
        this.m_manifold = new Z;
        this.m_oldManifold = new Z
    };
    A.prototype.GetManifold = function () {
        return this.m_manifold
    };
    A.prototype.GetWorldManifold = function (j) {
        var o = this.m_fixtureA.GetBody(),
            q = this.m_fixtureB.GetBody(),
            n = this.m_fixtureA.GetShape(),
            a = this.m_fixtureB.GetShape();
        j.Initialize(this.m_manifold, o.GetTransform(), n.m_radius, q.GetTransform(), a.m_radius)
    };
    A.prototype.IsTouching = function () {
        return (this.m_flags & A.e_touchingFlag) == A.e_touchingFlag
    };
    A.prototype.IsContinuous = function () {
        return (this.m_flags & A.e_continuousFlag) == A.e_continuousFlag
    };
    A.prototype.SetSensor = function (j) {
        if (j) this.m_flags |= A.e_sensorFlag;
        else this.m_flags &= ~A.e_sensorFlag
    };
    A.prototype.IsSensor = function () {
        return (this.m_flags &
            A.e_sensorFlag) == A.e_sensorFlag
    };
    A.prototype.SetEnabled = function (j) {
        if (j) this.m_flags |= A.e_enabledFlag;
        else this.m_flags &= ~A.e_enabledFlag
    };
    A.prototype.IsEnabled = function () {
        return (this.m_flags & A.e_enabledFlag) == A.e_enabledFlag
    };
    A.prototype.GetNext = function () {
        return this.m_next
    };
    A.prototype.GetFixtureA = function () {
        return this.m_fixtureA
    };
    A.prototype.GetFixtureB = function () {
        return this.m_fixtureB
    };
    A.prototype.FlagForFiltering = function () {
        this.m_flags |= A.e_filterFlag
    };
    A.prototype.b2Contact = function () {};
    A.prototype.Reset = function (j, o) {
        if (j === undefined) j = null;
        if (o === undefined) o = null;
        this.m_flags = A.e_enabledFlag;
        if (!j || !o) this.m_fixtureB = this.m_fixtureA = null;
        else {
            if (j.IsSensor() || o.IsSensor()) this.m_flags |= A.e_sensorFlag;
            var q = j.GetBody(),
                n = o.GetBody();
            if (q.GetType() != D.b2_dynamicBody || q.IsBullet() || n.GetType() != D.b2_dynamicBody || n.IsBullet()) this.m_flags |= A.e_continuousFlag;
            this.m_fixtureA = j;
            this.m_fixtureB = o;
            this.m_manifold.m_pointCount = 0;
            this.m_next = this.m_prev = null;
            this.m_nodeA.contact = null;
            this.m_nodeA.prev = null;
            this.m_nodeA.next = null;
            this.m_nodeA.other = null;
            this.m_nodeB.contact = null;
            this.m_nodeB.prev = null;
            this.m_nodeB.next = null;
            this.m_nodeB.other = null
        }
    };
    A.prototype.Update = function (j) {
        var o = this.m_oldManifold;
        this.m_oldManifold = this.m_manifold;
        this.m_manifold = o;
        this.m_flags |= A.e_enabledFlag;
        var q = false;
        o = (this.m_flags & A.e_touchingFlag) == A.e_touchingFlag;
        var n = this.m_fixtureA.m_body,
            a = this.m_fixtureB.m_body,
            c = this.m_fixtureA.m_aabb.TestOverlap(this.m_fixtureB.m_aabb);
        if (this.m_flags & A.e_sensorFlag) {
            if (c) {
                q = this.m_fixtureA.GetShape();
                c = this.m_fixtureB.GetShape();
                n = n.GetTransform();
                a = a.GetTransform();
                q = y.TestOverlap(q, n, c, a)
            }
            this.m_manifold.m_pointCount = 0
        } else {
            if (n.GetType() != D.b2_dynamicBody || n.IsBullet() || a.GetType() != D.b2_dynamicBody || a.IsBullet()) this.m_flags |= A.e_continuousFlag;
            else this.m_flags &= ~A.e_continuousFlag; if (c) {
                this.Evaluate();
                q = this.m_manifold.m_pointCount > 0;
                for (c = 0; c < this.m_manifold.m_pointCount; ++c) {
                    var g = this.m_manifold.m_points[c];
                    g.m_normalImpulse = 0;
                    g.m_tangentImpulse = 0;
                    for (var b = g.m_id, e = 0; e < this.m_oldManifold.m_pointCount; ++e) {
                        var f = this.m_oldManifold.m_points[e];
                        if (f.m_id.key == b.key) {
                            g.m_normalImpulse = f.m_normalImpulse;
                            g.m_tangentImpulse = f.m_tangentImpulse;
                            break
                        }
                    }
                }
            } else this.m_manifold.m_pointCount = 0; if (q != o) {
                n.SetAwake(true);
                a.SetAwake(true)
            }
        } if (q) this.m_flags |= A.e_touchingFlag;
        else this.m_flags &= ~A.e_touchingFlag;
        o == false && q == true && j.BeginContact(this);
        o == true && q == false && j.EndContact(this);
        (this.m_flags & A.e_sensorFlag) == 0 && j.PreSolve(this, this.m_oldManifold)
    };
    A.prototype.Evaluate = function () {};
    A.prototype.ComputeTOI = function (j, o) {
        A.s_input.proxyA.Set(this.m_fixtureA.GetShape());
        A.s_input.proxyB.Set(this.m_fixtureB.GetShape());
        A.s_input.sweepA = j;
        A.s_input.sweepB = o;
        A.s_input.tolerance = O.b2_linearSlop;
        return d.TimeOfImpact(A.s_input)
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.Contacts.b2Contact.e_sensorFlag = 1;
        Box2D.Dynamics.Contacts.b2Contact.e_continuousFlag = 2;
        Box2D.Dynamics.Contacts.b2Contact.e_islandFlag = 4;
        Box2D.Dynamics.Contacts.b2Contact.e_toiFlag = 8;
        Box2D.Dynamics.Contacts.b2Contact.e_touchingFlag = 16;
        Box2D.Dynamics.Contacts.b2Contact.e_enabledFlag = 32;
        Box2D.Dynamics.Contacts.b2Contact.e_filterFlag = 64;
        Box2D.Dynamics.Contacts.b2Contact.s_input = new h
    });
    U.b2ContactConstraint = function () {
        this.localPlaneNormal = new N;
        this.localPoint = new N;
        this.normal = new N;
        this.normalMass = new E;
        this.K = new E
    };
    U.prototype.b2ContactConstraint = function () {
        this.points = new Vector(O.b2_maxManifoldPoints);
        for (var j = 0; j < O.b2_maxManifoldPoints; j++) this.points[j] = new p
    };
    p.b2ContactConstraintPoint = function () {
        this.localPoint = new N;
        this.rA = new N;
        this.rB = new N
    };
    B.b2ContactEdge = function () {};
    Q.b2ContactFactory = function () {};
    Q.prototype.b2ContactFactory = function (j) {
        this.m_allocator = j;
        this.InitializeRegisters()
    };
    Q.prototype.AddType = function (j, o, q, n) {
        if (q === undefined) q = 0;
        if (n === undefined) n = 0;
        this.m_registers[q][n].createFcn = j;
        this.m_registers[q][n].destroyFcn = o;
        this.m_registers[q][n].primary = true;
        if (q != n) {
            this.m_registers[n][q].createFcn = j;
            this.m_registers[n][q].destroyFcn = o;
            this.m_registers[n][q].primary = false
        }
    };
    Q.prototype.InitializeRegisters = function () {
            this.m_registers = new Vector(y.e_shapeTypeCount);
            for (var j = 0; j < y.e_shapeTypeCount; j++) {
                this.m_registers[j] = new Vector(y.e_shapeTypeCount);
                for (var o = 0; o < y.e_shapeTypeCount; o++) this.m_registers[j][o] = new V
            }
            this.AddType(w.Create, w.Destroy, y.e_circleShape, y.e_circleShape);
            this.AddType(Y.Create, Y.Destroy, y.e_polygonShape, y.e_circleShape);
            this.AddType(z.Create, z.Destroy, y.e_polygonShape, y.e_polygonShape);
            this.AddType(I.Create, I.Destroy, y.e_edgeShape, y.e_circleShape);
            this.AddType(k.Create, k.Destroy,
                y.e_polygonShape, y.e_edgeShape)
    };
    Q.prototype.Create = function (j, o) {
        var q = parseInt(j.GetType()),
            n = parseInt(o.GetType());
        q = this.m_registers[q][n];
        if (q.pool) {
            n = q.pool;
            q.pool = n.m_next;
            q.poolCount--;
            n.Reset(j, o);
            return n
        }
        n = q.createFcn;
        if (n != null) {
            if (q.primary) {
                n = n(this.m_allocator);
                n.Reset(j, o)
            } else {
                n = n(this.m_allocator);
                n.Reset(o, j)
            }
            return n
        } else return null
    };
    Q.prototype.Destroy = function (j) {
        if (j.m_manifold.m_pointCount > 0) {
            j.m_fixtureA.m_body.SetAwake(true);
            j.m_fixtureB.m_body.SetAwake(true)
        }
        var o = parseInt(j.m_fixtureA.GetType()),
            q = parseInt(j.m_fixtureB.GetType());
        o = this.m_registers[o][q];
        o.poolCount++;
        j.m_next = o.pool;
        o.pool = j;
        o = o.destroyFcn;
        o(j, this.m_allocator)
    };
    V.b2ContactRegister = function () {};
    M.b2ContactResult = function () {
        this.position = new N;
        this.normal = new N;
        this.id = new aa
    };
    L.b2ContactSolver = function () {
        this.m_step = new H;
        this.m_constraints = new Vector
    };
    L.prototype.b2ContactSolver = function () {};
    L.prototype.Initialize = function (j, o, q, n) {
        if (q === undefined) q = 0;
        var a;
        this.m_step.Set(j);
        this.m_allocator = n;
        j = 0;
        for (this.m_constraintCount = q; this.m_constraints.length < this.m_constraintCount;) this.m_constraints[this.m_constraints.length] = new U;
        for (j = 0; j < q; ++j) {
            a = o[j];
            n = a.m_fixtureA;
            var c = a.m_fixtureB,
                g = n.m_shape.m_radius,
                b = c.m_shape.m_radius,
                e = n.m_body,
                f = c.m_body,
                m = a.GetManifold(),
                r = O.b2MixFriction(n.GetFriction(), c.GetFriction()),
                s = O.b2MixRestitution(n.GetRestitution(), c.GetRestitution()),
                v = e.m_linearVelocity.x,
                t = e.m_linearVelocity.y,
                x = f.m_linearVelocity.x,
                C = f.m_linearVelocity.y,
                J = e.m_angularVelocity,
                T = f.m_angularVelocity;
            O.b2Assert(m.m_pointCount > 0);
            L.s_worldManifold.Initialize(m, e.m_xf, g, f.m_xf, b);
            c = L.s_worldManifold.m_normal.x;
            a = L.s_worldManifold.m_normal.y;
            n = this.m_constraints[j];
            n.bodyA = e;
            n.bodyB = f;
            n.manifold = m;
            n.normal.x = c;
            n.normal.y = a;
            n.pointCount = m.m_pointCount;
            n.friction = r;
            n.restitution = s;
            n.localPlaneNormal.x = m.m_localPlaneNormal.x;
            n.localPlaneNormal.y = m.m_localPlaneNormal.y;
            n.localPoint.x = m.m_localPoint.x;
            n.localPoint.y = m.m_localPoint.y;
            n.radius = g + b;
            n.type = m.m_type;
            for (g = 0; g < n.pointCount; ++g) {
                r = m.m_points[g];
                b = n.points[g];
                b.normalImpulse = r.m_normalImpulse;
                b.tangentImpulse = r.m_tangentImpulse;
                b.localPoint.SetV(r.m_localPoint);
                r = b.rA.x = L.s_worldManifold.m_points[g].x - e.m_sweep.c.x;
                s = b.rA.y = L.s_worldManifold.m_points[g].y - e.m_sweep.c.y;
                var P = b.rB.x = L.s_worldManifold.m_points[g].x - f.m_sweep.c.x,
                    X = b.rB.y = L.s_worldManifold.m_points[g].y - f.m_sweep.c.y,
                    $ = r * a - s * c,
                    ba = P * a - X * c;
                $ *= $;
                ba *= ba;
                b.normalMass = 1 / (e.m_invMass + f.m_invMass + e.m_invI * $ + f.m_invI * ba);
                var ca = e.m_mass * e.m_invMass + f.m_mass * f.m_invMass;
                ca += e.m_mass * e.m_invI * $ + f.m_mass * f.m_invI * ba;
                b.equalizedMass = 1 / ca;
                ba = a;
                ca = -c;
                $ = r * ca - s * ba;
                ba = P * ca - X * ba;
                $ *= $;
                ba *= ba;
                b.tangentMass = 1 / (e.m_invMass + f.m_invMass + e.m_invI * $ + f.m_invI * ba);
                b.velocityBias = 0;
                r = n.normal.x * (x + -T * X - v - -J * s) + n.normal.y * (C + T * P - t - J * r);
                if (r < -O.b2_velocityThreshold) b.velocityBias += -n.restitution * r
            }
            if (n.pointCount == 2) {
                C = n.points[0];
                x = n.points[1];
                m = e.m_invMass;
                e = e.m_invI;
                v = f.m_invMass;
                f = f.m_invI;
                t = C.rA.x * a - C.rA.y * c;
                C = C.rB.x * a - C.rB.y * c;
                J = x.rA.x * a - x.rA.y * c;
                x = x.rB.x * a - x.rB.y * c;
                c = m + v + e * t * t + f * C * C;
                a = m + v + e * J * J + f * x * x;
                f = m + v + e * t * J + f * C * x;
                if (c * c < 100 * (c * a - f * f)) {
                    n.K.col1.Set(c, f);
                    n.K.col2.Set(f, a);
                    n.K.GetInverse(n.normalMass)
                } else n.pointCount = 1
            }
        }
    };
    L.prototype.InitVelocityConstraints = function (j) {
        for (var o = 0; o < this.m_constraintCount; ++o) {
            var q = this.m_constraints[o],
                n = q.bodyA,
                a = q.bodyB,
                c = n.m_invMass,
                g = n.m_invI,
                b = a.m_invMass,
                e = a.m_invI,
                f = q.normal.x,
                m = q.normal.y,
                r = m,
                s = -f,
                v = 0,
                t = 0;
            if (j.warmStarting) {
                t = q.pointCount;
                for (v = 0; v < t; ++v) {
                    var x = q.points[v];
                    x.normalImpulse *= j.dtRatio;
                    x.tangentImpulse *= j.dtRatio;
                    var C = x.normalImpulse * f + x.tangentImpulse * r,
                        J = x.normalImpulse * m + x.tangentImpulse * s;
                    n.m_angularVelocity -= g * (x.rA.x * J - x.rA.y * C);
                    n.m_linearVelocity.x -= c * C;
                    n.m_linearVelocity.y -= c * J;
                    a.m_angularVelocity += e * (x.rB.x * J - x.rB.y * C);
                    a.m_linearVelocity.x += b * C;
                    a.m_linearVelocity.y += b * J
                }
            } else {
                t = q.pointCount;
                for (v = 0; v < t; ++v) {
                    n = q.points[v];
                    n.normalImpulse = 0;
                    n.tangentImpulse = 0
                }
            }
        }
    };
    L.prototype.SolveVelocityConstraints = function () {
        for (var j = 0, o, q = 0, n = 0, a = 0, c = n = n = q = q = 0, g = q = q = 0, b = q = a = 0, e = 0, f, m = 0; m < this.m_constraintCount; ++m) {
            a = this.m_constraints[m];
            var r = a.bodyA,
                s = a.bodyB,
                v = r.m_angularVelocity,
                t = s.m_angularVelocity,
                x = r.m_linearVelocity,
                C = s.m_linearVelocity,
                J = r.m_invMass,
                T = r.m_invI,
                P = s.m_invMass,
                X = s.m_invI;
            b = a.normal.x;
            var $ = e = a.normal.y;
            f = -b;
            g = a.friction;
            for (j = 0; j < a.pointCount; j++) {
                o = a.points[j];
                q = C.x - t * o.rB.y - x.x + v * o.rA.y;
                n = C.y + t * o.rB.x - x.y - v * o.rA.x;
                q = q * $ + n * f;
                q = o.tangentMass * -q;
                n = g * o.normalImpulse;
                n = R.Clamp(o.tangentImpulse + q, -n, n);
                q = n - o.tangentImpulse;
                c = q * $;
                q = q * f;
                x.x -= J * c;
                x.y -= J * q;
                v -= T * (o.rA.x * q - o.rA.y * c);
                C.x += P * c;
                C.y += P * q;
                t += X * (o.rB.x * q - o.rB.y * c);
                o.tangentImpulse = n
            }
            parseInt(a.pointCount);
            if (a.pointCount == 1) {
                o = a.points[0];
                q = C.x + -t * o.rB.y - x.x - -v * o.rA.y;
                n = C.y + t * o.rB.x - x.y - v * o.rA.x;
                a = q * b + n * e;
                q = -o.normalMass * (a - o.velocityBias);
                n = o.normalImpulse + q;
                n = n > 0 ? n : 0;
                q = n - o.normalImpulse;
                c = q * b;
                q = q * e;
                x.x -= J * c;
                x.y -= J * q;
                v -= T * (o.rA.x * q - o.rA.y * c);
                C.x += P * c;
                C.y += P * q;
                t += X * (o.rB.x * q - o.rB.y * c);
                o.normalImpulse = n
            } else {
                o = a.points[0];
                j = a.points[1];
                q = o.normalImpulse;
                g = j.normalImpulse;
                var ba = (C.x - t * o.rB.y - x.x + v * o.rA.y) * b + (C.y + t * o.rB.x - x.y - v * o.rA.x) * e,
                    ca = (C.x - t * j.rB.y - x.x + v * j.rA.y) * b + (C.y + t * j.rB.x - x.y - v * j.rA.x) * e;
                n = ba - o.velocityBias;
                c = ca - j.velocityBias;
                f = a.K;
                n -= f.col1.x * q + f.col2.x * g;
                for (c -= f.col1.y * q + f.col2.y * g;;) {
                    f = a.normalMass;
                    $ = -(f.col1.x * n + f.col2.x * c);
                    f = -(f.col1.y * n + f.col2.y * c);
                    if ($ >= 0 && f >= 0) {
                        q = $ - q;
                        g = f - g;
                        a = q * b;
                        q = q * e;
                        b = g * b;
                        e = g * e;
                        x.x -= J * (a + b);
                        x.y -= J * (q + e);
                        v -= T * (o.rA.x * q - o.rA.y * a + j.rA.x * e - j.rA.y * b);
                        C.x += P * (a + b);
                        C.y += P * (q + e);
                        t += X * (o.rB.x * q - o.rB.y * a + j.rB.x * e - j.rB.y * b);
                        o.normalImpulse = $;
                        j.normalImpulse = f;
                        break
                    }
                    $ = -o.normalMass * n;
                    f = 0;
                    ca = a.K.col1.y * $ + c;
                    if ($ >= 0 && ca >= 0) {
                        q = $ - q;
                        g = f - g;
                        a = q * b;
                        q = q * e;
                        b = g * b;
                        e = g * e;
                        x.x -= J * (a + b);
                        x.y -= J * (q + e);
                        v -= T * (o.rA.x * q - o.rA.y * a + j.rA.x * e - j.rA.y * b);
                        C.x += P * (a + b);
                        C.y += P * (q + e);
                        t += X * (o.rB.x * q - o.rB.y * a + j.rB.x * e - j.rB.y * b);
                        o.normalImpulse = $;
                        j.normalImpulse = f;
                        break
                    }
                    $ = 0;
                    f = -j.normalMass * c;
                    ba = a.K.col2.x * f + n;
                    if (f >= 0 && ba >= 0) {
                        q = $ - q;
                        g = f - g;
                        a = q * b;
                        q = q * e;
                        b = g * b;
                        e = g * e;
                        x.x -= J * (a + b);
                        x.y -= J * (q + e);
                        v -= T * (o.rA.x * q - o.rA.y * a + j.rA.x * e - j.rA.y * b);
                        C.x += P * (a + b);
                        C.y += P * (q + e);
                        t += X * (o.rB.x * q - o.rB.y * a + j.rB.x * e - j.rB.y * b);
                        o.normalImpulse = $;
                        j.normalImpulse = f;
                        break
                    }
                    f = $ = 0;
                    ba = n;
                    ca = c;
                    if (ba >= 0 && ca >= 0) {
                        q = $ - q;
                        g = f - g;
                        a = q * b;
                        q = q * e;
                        b = g * b;
                        e = g * e;
                        x.x -= J * (a + b);
                        x.y -= J * (q + e);
                        v -= T * (o.rA.x * q - o.rA.y * a + j.rA.x * e - j.rA.y * b);
                        C.x += P * (a + b);
                        C.y += P * (q + e);
                        t += X * (o.rB.x * q - o.rB.y * a + j.rB.x * e - j.rB.y * b);
                        o.normalImpulse = $;
                        j.normalImpulse = f;
                        break
                    }
                    break
                }
            }
            r.m_angularVelocity = v;
            s.m_angularVelocity = t
        }
    };
    L.prototype.FinalizeVelocityConstraints = function () {
        for (var j = 0; j < this.m_constraintCount; ++j) for (var o = this.m_constraints[j], q = o.manifold, n = 0; n < o.pointCount; ++n) {
                var a = q.m_points[n],
                    c = o.points[n];
                a.m_normalImpulse = c.normalImpulse;
                a.m_tangentImpulse = c.tangentImpulse
            }
    };
    L.prototype.SolvePositionConstraints = function (j) {
        if (j === undefined) j = 0;
        for (var o = 0, q = 0; q < this.m_constraintCount; q++) {
            var n = this.m_constraints[q],
                a = n.bodyA,
                c = n.bodyB,
                g = a.m_mass * a.m_invMass,
                b = a.m_mass * a.m_invI,
                e = c.m_mass * c.m_invMass,
                f = c.m_mass * c.m_invI;
            L.s_psm.Initialize(n);
            for (var m = L.s_psm.m_normal, r = 0; r < n.pointCount; r++) {
                var s = n.points[r],
                    v = L.s_psm.m_points[r],
                    t = L.s_psm.m_separations[r],
                    x = v.x - a.m_sweep.c.x,
                    C = v.y - a.m_sweep.c.y,
                    J = v.x - c.m_sweep.c.x;
                v = v.y - c.m_sweep.c.y;
                o = o < t ? o : t;
                t = R.Clamp(j * (t + O.b2_linearSlop), -O.b2_maxLinearCorrection, 0);
                t = -s.equalizedMass * t;
                s = t * m.x;
                t = t * m.y;
                a.m_sweep.c.x -= g * s;
                a.m_sweep.c.y -= g * t;
                a.m_sweep.a -= b * (x * t - C * s);
                a.SynchronizeTransform();
                c.m_sweep.c.x += e * s;
                c.m_sweep.c.y += e * t;
                c.m_sweep.a += f * (J * t - v * s);
                c.SynchronizeTransform()
            }
        }
        return o > -1.5 * O.b2_linearSlop
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.Contacts.b2ContactSolver.s_worldManifold = new l;
        Box2D.Dynamics.Contacts.b2ContactSolver.s_psm = new u
    });
    Box2D.inherit(I, Box2D.Dynamics.Contacts.b2Contact);
    I.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
    I.b2EdgeAndCircleContact = function () {
        Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments)
    };
    I.Create = function () {
        return new I
    };
    I.Destroy = function () {};
    I.prototype.Reset = function (j, o) {
        this.__super.Reset.call(this, j, o)
    };
    I.prototype.Evaluate = function () {
        var j = this.m_fixtureA.GetBody(),
            o = this.m_fixtureB.GetBody();
        this.b2CollideEdgeAndCircle(this.m_manifold, this.m_fixtureA.GetShape() instanceof G ? this.m_fixtureA.GetShape() : null, j.m_xf,
            this.m_fixtureB.GetShape() instanceof F ? this.m_fixtureB.GetShape() : null, o.m_xf)
    };
    I.prototype.b2CollideEdgeAndCircle = function () {};
    Box2D.inherit(W, Box2D.Dynamics.Contacts.b2Contact);
    W.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
    W.b2NullContact = function () {
        Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments)
    };
    W.prototype.b2NullContact = function () {
        this.__super.b2Contact.call(this)
    };
    W.prototype.Evaluate = function () {};
    Box2D.inherit(Y, Box2D.Dynamics.Contacts.b2Contact);
    Y.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
    Y.b2PolyAndCircleContact = function () {
        Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments)
    };
    Y.Create = function () {
        return new Y
    };
    Y.Destroy = function () {};
    Y.prototype.Reset = function (j, o) {
        this.__super.Reset.call(this, j, o);
        O.b2Assert(j.GetType() == y.e_polygonShape);
        O.b2Assert(o.GetType() == y.e_circleShape)
    };
    Y.prototype.Evaluate = function () {
        var j = this.m_fixtureA.m_body,
            o = this.m_fixtureB.m_body;
        S.CollidePolygonAndCircle(this.m_manifold, this.m_fixtureA.GetShape() instanceof K ? this.m_fixtureA.GetShape() : null, j.m_xf, this.m_fixtureB.GetShape() instanceof F ? this.m_fixtureB.GetShape() : null, o.m_xf)
    };
    Box2D.inherit(k, Box2D.Dynamics.Contacts.b2Contact);
    k.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
    k.b2PolyAndEdgeContact = function () {
        Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments)
    };
    k.Create = function () {
        return new k
    };
    k.Destroy = function () {};
    k.prototype.Reset = function (j, o) {
        this.__super.Reset.call(this, j, o);
        O.b2Assert(j.GetType() == y.e_polygonShape);
        O.b2Assert(o.GetType() == y.e_edgeShape)
    };
    k.prototype.Evaluate = function () {
        var j = this.m_fixtureA.GetBody(),
            o = this.m_fixtureB.GetBody();
        this.b2CollidePolyAndEdge(this.m_manifold, this.m_fixtureA.GetShape() instanceof K ? this.m_fixtureA.GetShape() : null, j.m_xf, this.m_fixtureB.GetShape() instanceof G ? this.m_fixtureB.GetShape() : null, o.m_xf)
    };
    k.prototype.b2CollidePolyAndEdge = function () {};
    Box2D.inherit(z, Box2D.Dynamics.Contacts.b2Contact);
    z.prototype.__super = Box2D.Dynamics.Contacts.b2Contact.prototype;
    z.b2PolygonContact = function () {
            Box2D.Dynamics.Contacts.b2Contact.b2Contact.apply(this, arguments)
    };
    z.Create = function () {
        return new z
    };
    z.Destroy = function () {};
    z.prototype.Reset = function (j, o) {
        this.__super.Reset.call(this, j, o)
    };
    z.prototype.Evaluate = function () {
        var j = this.m_fixtureA.GetBody(),
            o = this.m_fixtureB.GetBody();
        S.CollidePolygons(this.m_manifold, this.m_fixtureA.GetShape() instanceof K ? this.m_fixtureA.GetShape() : null, j.m_xf, this.m_fixtureB.GetShape() instanceof K ? this.m_fixtureB.GetShape() : null, o.m_xf)
    };
    u.b2PositionSolverManifold = function () {};
    u.prototype.b2PositionSolverManifold = function () {
        this.m_normal = new N;
        this.m_separations = new Vector_a2j_Number(O.b2_maxManifoldPoints);
        this.m_points = new Vector(O.b2_maxManifoldPoints);
        for (var j = 0; j < O.b2_maxManifoldPoints; j++) this.m_points[j] = new N
    };
    u.prototype.Initialize = function (j) {
        O.b2Assert(j.pointCount > 0);
        var o = 0,
            q = 0,
            n = 0,
            a, c = 0,
            g = 0;
        switch (j.type) {
        case Z.e_circles:
            a = j.bodyA.m_xf.R;
            n = j.localPoint;
            o = j.bodyA.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y);
            q = j.bodyA.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y);
            a = j.bodyB.m_xf.R;
            n = j.points[0].localPoint;
            c = j.bodyB.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y);
            a = j.bodyB.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y);
            n = c - o;
            g = a - q;
            var b = n * n + g * g;
            if (b > Number.MIN_VALUE * Number.MIN_VALUE) {
                b = Math.sqrt(b);
                this.m_normal.x = n / b;
                this.m_normal.y = g / b
            } else {
                this.m_normal.x = 1;
                this.m_normal.y = 0
            }
            this.m_points[0].x = 0.5 * (o + c);
            this.m_points[0].y = 0.5 * (q + a);
            this.m_separations[0] = n * this.m_normal.x + g * this.m_normal.y - j.radius;
            break;
        case Z.e_faceA:
            a = j.bodyA.m_xf.R;
            n = j.localPlaneNormal;
            this.m_normal.x = a.col1.x * n.x + a.col2.x * n.y;
            this.m_normal.y = a.col1.y * n.x + a.col2.y * n.y;
            a = j.bodyA.m_xf.R;
            n = j.localPoint;
            c = j.bodyA.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y);
            g = j.bodyA.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y);
            a = j.bodyB.m_xf.R;
            for (o = 0; o < j.pointCount; ++o) {
                n = j.points[o].localPoint;
                q = j.bodyB.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y);
                n = j.bodyB.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y);
                this.m_separations[o] = (q - c) * this.m_normal.x + (n - g) * this.m_normal.y - j.radius;
                this.m_points[o].x = q;
                this.m_points[o].y = n
            }
            break;
        case Z.e_faceB:
            a = j.bodyB.m_xf.R;
            n = j.localPlaneNormal;
            this.m_normal.x = a.col1.x * n.x + a.col2.x * n.y;
            this.m_normal.y = a.col1.y * n.x + a.col2.y * n.y;
            a = j.bodyB.m_xf.R;
            n = j.localPoint;
            c = j.bodyB.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y);
            g = j.bodyB.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y);
            a = j.bodyA.m_xf.R;
            for (o = 0; o < j.pointCount; ++o) {
                n = j.points[o].localPoint;
                q = j.bodyA.m_xf.position.x + (a.col1.x * n.x + a.col2.x * n.y);
                n = j.bodyA.m_xf.position.y + (a.col1.y * n.x + a.col2.y * n.y);
                this.m_separations[o] = (q - c) * this.m_normal.x + (n - g) * this.m_normal.y - j.radius;
                this.m_points[o].Set(q, n)
            }
            this.m_normal.x *= -1;
            this.m_normal.y *= -1
        }
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointA = new N;
        Box2D.Dynamics.Contacts.b2PositionSolverManifold.circlePointB = new N
    })
})();
(function () {
    var F = Box2D.Common.Math.b2Mat22,
        G = Box2D.Common.Math.b2Math,
        K = Box2D.Common.Math.b2Vec2,
        y = Box2D.Common.b2Color,
        w = Box2D.Dynamics.Controllers.b2BuoyancyController,
        A = Box2D.Dynamics.Controllers.b2ConstantAccelController,
        U = Box2D.Dynamics.Controllers.b2ConstantForceController,
        p = Box2D.Dynamics.Controllers.b2Controller,
        B = Box2D.Dynamics.Controllers.b2ControllerEdge,
        Q = Box2D.Dynamics.Controllers.b2GravityController,
        V = Box2D.Dynamics.Controllers.b2TensorDampingController;
    Box2D.inherit(w, Box2D.Dynamics.Controllers.b2Controller);
    w.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
    w.b2BuoyancyController = function () {
        Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
        this.normal = new K(0, -1);
        this.density = this.offset = 0;
        this.velocity = new K(0, 0);
        this.linearDrag = 2;
        this.angularDrag = 1;
        this.useDensity = false;
        this.useWorldGravity = true;
        this.gravity = null
    };
    w.prototype.Step = function () {
        if (this.m_bodyList) {
            if (this.useWorldGravity) this.gravity = this.GetWorld().GetGravity().Copy();
            for (var M = this.m_bodyList; M; M = M.nextBody) {
                var L = M.body;
                if (L.IsAwake() != false) {
                    for (var I = new K, W = new K, Y = 0, k = 0, z = L.GetFixtureList(); z; z = z.GetNext()) {
                        var u = new K,
                            D = z.GetShape().ComputeSubmergedArea(this.normal, this.offset, L.GetTransform(), u);
                        Y += D;
                        I.x += D * u.x;
                        I.y += D * u.y;
                        var H = 0;
                        H = 1;
                        k += D * H;
                        W.x += D * u.x * H;
                        W.y += D * u.y * H
                    }
                    I.x /= Y;
                    I.y /= Y;
                    W.x /= k;
                    W.y /= k;
                    if (!(Y < Number.MIN_VALUE)) {
                        k = this.gravity.GetNegative();
                        k.Multiply(this.density * Y);
                        L.ApplyForce(k, W);
                        W = L.GetLinearVelocityFromWorldPoint(I);
                        W.Subtract(this.velocity);
                        W.Multiply(-this.linearDrag * Y);
                        L.ApplyForce(W, I);
                        L.ApplyTorque(-L.GetInertia() / L.GetMass() * Y * L.GetAngularVelocity() * this.angularDrag)
                    }
                }
            }
        }
    };
    w.prototype.Draw = function (M) {
        var L = new K,
            I = new K;
        L.x = this.normal.x * this.offset + this.normal.y * 1E3;
        L.y = this.normal.y * this.offset - this.normal.x * 1E3;
        I.x = this.normal.x * this.offset - this.normal.y * 1E3;
        I.y = this.normal.y * this.offset + this.normal.x * 1E3;
        var W = new y(0, 0, 1);
        M.DrawSegment(L, I, W)
    };
    Box2D.inherit(A, Box2D.Dynamics.Controllers.b2Controller);
    A.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
    A.b2ConstantAccelController = function () {
        Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
        this.A = new K(0, 0)
    };
    A.prototype.Step = function (M) {
        M = new K(this.A.x * M.dt, this.A.y * M.dt);
        for (var L = this.m_bodyList; L; L = L.nextBody) {
            var I = L.body;
            I.IsAwake() && I.SetLinearVelocity(new K(I.GetLinearVelocity().x + M.x, I.GetLinearVelocity().y + M.y))
        }
    };
    Box2D.inherit(U, Box2D.Dynamics.Controllers.b2Controller);
    U.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
    U.b2ConstantForceController = function () {
            Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
            this.F = new K(0, 0)
    };
    U.prototype.Step = function () {
        for (var M = this.m_bodyList; M; M = M.nextBody) {
            var L = M.body;
            L.IsAwake() && L.ApplyForce(this.F, L.GetWorldCenter())
        }
    };
    p.b2Controller = function () {};
    p.prototype.Step = function () {};
    p.prototype.Draw = function () {};
    p.prototype.AddBody = function (M) {
        var L = new B;
        L.controller = this;
        L.body = M;
        L.nextBody = this.m_bodyList;
        L.prevBody = null;
        this.m_bodyList = L;
        if (L.nextBody) L.nextBody.prevBody = L;
        this.m_bodyCount++;
        L.nextController = M.m_controllerList;
        L.prevController = null;
        M.m_controllerList = L;
        if (L.nextController) L.nextController.prevController = L;
        M.m_controllerCount++
    };
    p.prototype.RemoveBody = function (M) {
        for (var L = M.m_controllerList; L && L.controller != this;) L = L.nextController;
        if (L.prevBody) L.prevBody.nextBody = L.nextBody;
        if (L.nextBody) L.nextBody.prevBody = L.prevBody;
        if (L.nextController) L.nextController.prevController = L.prevController;
        if (L.prevController) L.prevController.nextController = L.nextController;
        if (this.m_bodyList == L) this.m_bodyList = L.nextBody;
        if (M.m_controllerList == L) M.m_controllerList = L.nextController;
        M.m_controllerCount--;
        this.m_bodyCount--
    };
    p.prototype.Clear = function () {
        for (; this.m_bodyList;) this.RemoveBody(this.m_bodyList.body)
    };
    p.prototype.GetNext = function () {
        return this.m_next
    };
    p.prototype.GetWorld = function () {
        return this.m_world
    };
    p.prototype.GetBodyList = function () {
        return this.m_bodyList
    };
    B.b2ControllerEdge = function () {};
    Box2D.inherit(Q, Box2D.Dynamics.Controllers.b2Controller);
    Q.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
    Q.b2GravityController = function () {
        Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
        this.G = 1;
        this.invSqr = true
    };
    Q.prototype.Step = function () {
        var M = null,
            L = null,
            I = null,
            W = 0,
            Y = null,
            k = null,
            z = null,
            u = 0,
            D = 0,
            H = 0;
        u = null;
        if (this.invSqr) for (M = this.m_bodyList; M; M = M.nextBody) {
                L = M.body;
                I = L.GetWorldCenter();
                W = L.GetMass();
                for (Y = this.m_bodyList; Y != M; Y = Y.nextBody) {
                    k = Y.body;
                    z = k.GetWorldCenter();
                    u = z.x - I.x;
                    D = z.y - I.y;
                    H = u * u + D * D;
                    if (!(H < Number.MIN_VALUE)) {
                        u = new K(u, D);
                        u.Multiply(this.G / H / Math.sqrt(H) * W * k.GetMass());
                        L.IsAwake() && L.ApplyForce(u, I);
                        u.Multiply(-1);
                        k.IsAwake() && k.ApplyForce(u, z)
                    }
                }
            } else
                for (M = this.m_bodyList; M; M = M.nextBody) {
                    L = M.body;
                    I = L.GetWorldCenter();
                    W = L.GetMass();
                    for (Y = this.m_bodyList; Y != M; Y = Y.nextBody) {
                        k = Y.body;
                        z = k.GetWorldCenter();
                        u = z.x - I.x;
                        D = z.y - I.y;
                        H = u * u + D * D;
                        if (!(H < Number.MIN_VALUE)) {
                            u = new K(u, D);
                            u.Multiply(this.G / H * W * k.GetMass());
                            L.IsAwake() && L.ApplyForce(u, I);
                            u.Multiply(-1);
                            k.IsAwake() && k.ApplyForce(u, z)
                        }
                    }
                }
    };
    Box2D.inherit(V, Box2D.Dynamics.Controllers.b2Controller);
    V.prototype.__super = Box2D.Dynamics.Controllers.b2Controller.prototype;
    V.b2TensorDampingController = function () {
        Box2D.Dynamics.Controllers.b2Controller.b2Controller.apply(this, arguments);
        this.T = new F;
        this.maxTimestep = 0
    };
    V.prototype.SetAxisAligned = function (M, L) {
        if (M === undefined) M = 0;
        if (L === undefined) L = 0;
        this.T.col1.x = -M;
        this.T.col1.y = 0;
        this.T.col2.x = 0;
        this.T.col2.y = -L;
        this.maxTimestep = M > 0 || L > 0 ? 1 / Math.max(M, L) : 0
    };
    V.prototype.Step = function (M) {
        M = M.dt;
        if (!(M <= Number.MIN_VALUE)) {
            if (M > this.maxTimestep && this.maxTimestep > 0) M = this.maxTimestep;
            for (var L = this.m_bodyList; L; L = L.nextBody) {
                var I = L.body;
                if (I.IsAwake()) {
                    var W = I.GetWorldVector(G.MulMV(this.T, I.GetLocalVector(I.GetLinearVelocity())));
                    I.SetLinearVelocity(new K(I.GetLinearVelocity().x + W.x * M, I.GetLinearVelocity().y + W.y * M))
                }
            }
        }
    }
})();
(function () {
    var F = Box2D.Common.b2Settings,
        G = Box2D.Common.Math.b2Mat22,
        K = Box2D.Common.Math.b2Mat33,
        y = Box2D.Common.Math.b2Math,
        w = Box2D.Common.Math.b2Vec2,
        A = Box2D.Common.Math.b2Vec3,
        U = Box2D.Dynamics.Joints.b2DistanceJoint,
        p = Box2D.Dynamics.Joints.b2DistanceJointDef,
        B = Box2D.Dynamics.Joints.b2FrictionJoint,
        Q = Box2D.Dynamics.Joints.b2FrictionJointDef,
        V = Box2D.Dynamics.Joints.b2GearJoint,
        M = Box2D.Dynamics.Joints.b2GearJointDef,
        L = Box2D.Dynamics.Joints.b2Jacobian,
        I = Box2D.Dynamics.Joints.b2Joint,
        W = Box2D.Dynamics.Joints.b2JointDef,
        Y = Box2D.Dynamics.Joints.b2JointEdge,
        k = Box2D.Dynamics.Joints.b2LineJoint,
        z = Box2D.Dynamics.Joints.b2LineJointDef,
        u = Box2D.Dynamics.Joints.b2MouseJoint,
        D = Box2D.Dynamics.Joints.b2MouseJointDef,
        H = Box2D.Dynamics.Joints.b2PrismaticJoint,
        O = Box2D.Dynamics.Joints.b2PrismaticJointDef,
        E = Box2D.Dynamics.Joints.b2PulleyJoint,
        R = Box2D.Dynamics.Joints.b2PulleyJointDef,
        N = Box2D.Dynamics.Joints.b2RevoluteJoint,
        S = Box2D.Dynamics.Joints.b2RevoluteJointDef,
        aa = Box2D.Dynamics.Joints.b2WeldJoint,
        Z = Box2D.Dynamics.Joints.b2WeldJointDef;
    Box2D.inherit(U, Box2D.Dynamics.Joints.b2Joint);
    U.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
    U.b2DistanceJoint = function () {
        Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
        this.m_localAnchor1 = new w;
        this.m_localAnchor2 = new w;
        this.m_u = new w
    };
    U.prototype.GetAnchorA = function () {
        return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)
    };
    U.prototype.GetAnchorB = function () {
        return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)
    };
    U.prototype.GetReactionForce = function (d) {
        if (d === undefined) d = 0;
        return new w(d * this.m_impulse * this.m_u.x, d * this.m_impulse * this.m_u.y)
    };
    U.prototype.GetReactionTorque = function () {
        return 0
    };
    U.prototype.GetLength = function () {
        return this.m_length
    };
    U.prototype.SetLength = function (d) {
        if (d === undefined) d = 0;
        this.m_length = d
    };
    U.prototype.GetFrequency = function () {
        return this.m_frequencyHz
    };
    U.prototype.SetFrequency = function (d) {
        if (d === undefined) d = 0;
        this.m_frequencyHz = d
    };
    U.prototype.GetDampingRatio = function () {
        return this.m_dampingRatio
    };
    U.prototype.SetDampingRatio = function (d) {
        if (d === undefined) d = 0;
        this.m_dampingRatio = d
    };
    U.prototype.b2DistanceJoint = function (d) {
        this.__super.b2Joint.call(this, d);
        this.m_localAnchor1.SetV(d.localAnchorA);
        this.m_localAnchor2.SetV(d.localAnchorB);
        this.m_length = d.length;
        this.m_frequencyHz = d.frequencyHz;
        this.m_dampingRatio = d.dampingRatio;
        this.m_bias = this.m_gamma = this.m_impulse = 0
    };
    U.prototype.InitVelocityConstraints = function (d) {
        var h, l = 0,
            j = this.m_bodyA,
            o = this.m_bodyB;
        h = j.m_xf.R;
        var q = this.m_localAnchor1.x - j.m_sweep.localCenter.x,
            n = this.m_localAnchor1.y - j.m_sweep.localCenter.y;
        l = h.col1.x * q + h.col2.x * n;
        n = h.col1.y * q + h.col2.y * n;
        q = l;
        h = o.m_xf.R;
        var a = this.m_localAnchor2.x - o.m_sweep.localCenter.x,
            c = this.m_localAnchor2.y - o.m_sweep.localCenter.y;
        l = h.col1.x * a + h.col2.x * c;
        c = h.col1.y * a + h.col2.y * c;
        a = l;
        this.m_u.x = o.m_sweep.c.x + a - j.m_sweep.c.x - q;
        this.m_u.y = o.m_sweep.c.y + c - j.m_sweep.c.y - n;
        l = Math.sqrt(this.m_u.x * this.m_u.x + this.m_u.y * this.m_u.y);
        l > F.b2_linearSlop ? this.m_u.Multiply(1 / l) : this.m_u.SetZero();
        h = q * this.m_u.y - n * this.m_u.x;
        var g = a * this.m_u.y - c * this.m_u.x;
        h = j.m_invMass + j.m_invI * h * h + o.m_invMass + o.m_invI * g * g;
        this.m_mass = h != 0 ? 1 / h : 0;
        if (this.m_frequencyHz > 0) {
            l = l - this.m_length;
            g = 2 * Math.PI * this.m_frequencyHz;
            var b = this.m_mass * g * g;
            this.m_gamma = d.dt * (2 * this.m_mass * this.m_dampingRatio * g + d.dt * b);
            this.m_gamma = this.m_gamma != 0 ? 1 / this.m_gamma : 0;
            this.m_bias = l * d.dt * b * this.m_gamma;
            this.m_mass = h + this.m_gamma;
            this.m_mass = this.m_mass != 0 ? 1 / this.m_mass : 0
        }
        if (d.warmStarting) {
            this.m_impulse *= d.dtRatio;
            d = this.m_impulse * this.m_u.x;
            h = this.m_impulse * this.m_u.y;
            j.m_linearVelocity.x -= j.m_invMass * d;
            j.m_linearVelocity.y -= j.m_invMass * h;
            j.m_angularVelocity -= j.m_invI * (q * h - n * d);
            o.m_linearVelocity.x += o.m_invMass * d;
            o.m_linearVelocity.y += o.m_invMass * h;
            o.m_angularVelocity += o.m_invI * (a * h - c * d)
        } else this.m_impulse = 0
    };
    U.prototype.SolveVelocityConstraints = function () {
        var d, h = this.m_bodyA,
            l = this.m_bodyB;
        d = h.m_xf.R;
        var j = this.m_localAnchor1.x - h.m_sweep.localCenter.x,
            o = this.m_localAnchor1.y - h.m_sweep.localCenter.y,
            q = d.col1.x * j + d.col2.x * o;
        o = d.col1.y * j + d.col2.y * o;
        j = q;
        d = l.m_xf.R;
        var n = this.m_localAnchor2.x - l.m_sweep.localCenter.x,
            a = this.m_localAnchor2.y - l.m_sweep.localCenter.y;
        q = d.col1.x * n + d.col2.x * a;
        a = d.col1.y * n + d.col2.y * a;
        n = q;
        q = -this.m_mass * (this.m_u.x * (l.m_linearVelocity.x + -l.m_angularVelocity * a - (h.m_linearVelocity.x + -h.m_angularVelocity * o)) + this.m_u.y * (l.m_linearVelocity.y + l.m_angularVelocity * n - (h.m_linearVelocity.y + h.m_angularVelocity * j)) + this.m_bias + this.m_gamma * this.m_impulse);
        this.m_impulse += q;
        d = q * this.m_u.x;
        q = q * this.m_u.y;
        h.m_linearVelocity.x -= h.m_invMass * d;
        h.m_linearVelocity.y -= h.m_invMass * q;
        h.m_angularVelocity -= h.m_invI * (j * q - o * d);
        l.m_linearVelocity.x += l.m_invMass * d;
        l.m_linearVelocity.y += l.m_invMass * q;
        l.m_angularVelocity += l.m_invI * (n * q - a * d)
    };
    U.prototype.SolvePositionConstraints = function () {
        var d;
        if (this.m_frequencyHz > 0) return true;
        var h = this.m_bodyA,
            l = this.m_bodyB;
        d = h.m_xf.R;
        var j = this.m_localAnchor1.x - h.m_sweep.localCenter.x,
            o = this.m_localAnchor1.y - h.m_sweep.localCenter.y,
            q = d.col1.x * j + d.col2.x * o;
        o = d.col1.y * j + d.col2.y * o;
        j = q;
        d = l.m_xf.R;
        var n = this.m_localAnchor2.x - l.m_sweep.localCenter.x,
            a = this.m_localAnchor2.y - l.m_sweep.localCenter.y;
        q = d.col1.x * n + d.col2.x * a;
        a = d.col1.y * n + d.col2.y * a;
        n = q;
        q = l.m_sweep.c.x + n - h.m_sweep.c.x - j;
        var c = l.m_sweep.c.y + a - h.m_sweep.c.y - o;
        d = Math.sqrt(q * q + c * c);
        q /= d;
        c /= d;
        d = d - this.m_length;
        d = y.Clamp(d, -F.b2_maxLinearCorrection, F.b2_maxLinearCorrection);
        var g = -this.m_mass * d;
        this.m_u.Set(q, c);
        q = g * this.m_u.x;
        c = g * this.m_u.y;
        h.m_sweep.c.x -= h.m_invMass * q;
        h.m_sweep.c.y -= h.m_invMass * c;
        h.m_sweep.a -= h.m_invI * (j * c - o * q);
        l.m_sweep.c.x += l.m_invMass * q;
        l.m_sweep.c.y += l.m_invMass * c;
        l.m_sweep.a += l.m_invI * (n * c - a * q);
        h.SynchronizeTransform();
        l.SynchronizeTransform();
        return y.Abs(d) < F.b2_linearSlop
    };
    Box2D.inherit(p, Box2D.Dynamics.Joints.b2JointDef);
    p.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
    p.b2DistanceJointDef = function () {
        Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
        this.localAnchorA = new w;
        this.localAnchorB = new w
    };
    p.prototype.b2DistanceJointDef = function () {
        this.__super.b2JointDef.call(this);
        this.type = I.e_distanceJoint;
        this.length = 1;
        this.dampingRatio = this.frequencyHz = 0
    };
    p.prototype.Initialize = function (d, h, l, j) {
        this.bodyA = d;
        this.bodyB = h;
        this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l));
        this.localAnchorB.SetV(this.bodyB.GetLocalPoint(j));
        d = j.x - l.x;
        l = j.y - l.y;
        this.length = Math.sqrt(d * d + l * l);
        this.dampingRatio = this.frequencyHz = 0
    };
    Box2D.inherit(B, Box2D.Dynamics.Joints.b2Joint);
    B.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
    B.b2FrictionJoint = function () {
        Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
        this.m_localAnchorA = new w;
        this.m_localAnchorB = new w;
        this.m_linearMass = new G;
        this.m_linearImpulse = new w
    };
    B.prototype.GetAnchorA = function () {
        return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)
    };
    B.prototype.GetAnchorB = function () {
        return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)
    };
    B.prototype.GetReactionForce = function (d) {
        if (d === undefined) d = 0;
        return new w(d * this.m_linearImpulse.x, d * this.m_linearImpulse.y)
    };
    B.prototype.GetReactionTorque = function (d) {
        if (d === undefined) d = 0;
        return d * this.m_angularImpulse
    };
    B.prototype.SetMaxForce = function (d) {
            if (d === undefined) d = 0;
            this.m_maxForce = d
    };
    B.prototype.GetMaxForce = function () {
        return this.m_maxForce
    };
    B.prototype.SetMaxTorque = function (d) {
        if (d === undefined) d = 0;
        this.m_maxTorque = d
    };
    B.prototype.GetMaxTorque = function () {
        return this.m_maxTorque
    };
    B.prototype.b2FrictionJoint = function (d) {
        this.__super.b2Joint.call(this, d);
        this.m_localAnchorA.SetV(d.localAnchorA);
        this.m_localAnchorB.SetV(d.localAnchorB);
        this.m_linearMass.SetZero();
        this.m_angularMass = 0;
        this.m_linearImpulse.SetZero();
        this.m_angularImpulse = 0;
        this.m_maxForce = d.maxForce;
        this.m_maxTorque = d.maxTorque
    };
    B.prototype.InitVelocityConstraints = function (d) {
        var h, l = 0,
            j = this.m_bodyA,
            o = this.m_bodyB;
        h = j.m_xf.R;
        var q = this.m_localAnchorA.x - j.m_sweep.localCenter.x,
            n = this.m_localAnchorA.y - j.m_sweep.localCenter.y;
        l = h.col1.x * q + h.col2.x * n;
        n = h.col1.y * q + h.col2.y * n;
        q = l;
        h = o.m_xf.R;
        var a = this.m_localAnchorB.x - o.m_sweep.localCenter.x,
            c = this.m_localAnchorB.y - o.m_sweep.localCenter.y;
        l = h.col1.x * a + h.col2.x * c;
        c = h.col1.y * a + h.col2.y * c;
        a = l;
        h = j.m_invMass;
        l = o.m_invMass;
        var g = j.m_invI,
            b = o.m_invI,
            e = new G;
        e.col1.x = h + l;
        e.col2.x = 0;
        e.col1.y = 0;
        e.col2.y = h + l;
        e.col1.x += g * n * n;
        e.col2.x += -g * q * n;
        e.col1.y += -g * q * n;
        e.col2.y += g * q * q;
        e.col1.x += b * c * c;
        e.col2.x += -b * a * c;
        e.col1.y += -b * a * c;
        e.col2.y += b * a * a;
        e.GetInverse(this.m_linearMass);
        this.m_angularMass = g + b;
        if (this.m_angularMass > 0) this.m_angularMass = 1 / this.m_angularMass;
        if (d.warmStarting) {
            this.m_linearImpulse.x *= d.dtRatio;
            this.m_linearImpulse.y *= d.dtRatio;
            this.m_angularImpulse *= d.dtRatio;
            d = this.m_linearImpulse;
            j.m_linearVelocity.x -= h * d.x;
            j.m_linearVelocity.y -= h * d.y;
            j.m_angularVelocity -= g * (q * d.y - n * d.x + this.m_angularImpulse);
            o.m_linearVelocity.x += l * d.x;
            o.m_linearVelocity.y += l * d.y;
            o.m_angularVelocity += b * (a * d.y - c * d.x + this.m_angularImpulse)
        } else {
            this.m_linearImpulse.SetZero();
            this.m_angularImpulse = 0
        }
    };
    B.prototype.SolveVelocityConstraints = function (d) {
        var h, l = 0,
            j = this.m_bodyA,
            o = this.m_bodyB,
            q = j.m_linearVelocity,
            n = j.m_angularVelocity,
            a = o.m_linearVelocity,
            c = o.m_angularVelocity,
            g = j.m_invMass,
            b = o.m_invMass,
            e = j.m_invI,
            f = o.m_invI;
        h = j.m_xf.R;
        var m = this.m_localAnchorA.x - j.m_sweep.localCenter.x,
            r = this.m_localAnchorA.y - j.m_sweep.localCenter.y;
        l = h.col1.x * m + h.col2.x * r;
        r = h.col1.y * m + h.col2.y * r;
        m = l;
        h = o.m_xf.R;
        var s = this.m_localAnchorB.x - o.m_sweep.localCenter.x,
            v = this.m_localAnchorB.y - o.m_sweep.localCenter.y;
        l = h.col1.x * s + h.col2.x * v;
        v = h.col1.y * s + h.col2.y * v;
        s = l;
        h = 0;
        l = -this.m_angularMass * (c - n);
        var t = this.m_angularImpulse;
        h = d.dt * this.m_maxTorque;
        this.m_angularImpulse = y.Clamp(this.m_angularImpulse + l, -h, h);
        l = this.m_angularImpulse - t;
        n -= e * l;
        c += f * l;
        h = y.MulMV(this.m_linearMass,
            new w(-(a.x - c * v - q.x + n * r), -(a.y + c * s - q.y - n * m)));
        l = this.m_linearImpulse.Copy();
        this.m_linearImpulse.Add(h);
        h = d.dt * this.m_maxForce;
        if (this.m_linearImpulse.LengthSquared() > h * h) {
            this.m_linearImpulse.Normalize();
            this.m_linearImpulse.Multiply(h)
        }
        h = y.SubtractVV(this.m_linearImpulse, l);
        q.x -= g * h.x;
        q.y -= g * h.y;
        n -= e * (m * h.y - r * h.x);
        a.x += b * h.x;
        a.y += b * h.y;
        c += f * (s * h.y - v * h.x);
        j.m_angularVelocity = n;
        o.m_angularVelocity = c
    };
    B.prototype.SolvePositionConstraints = function () {
        return true
    };
    Box2D.inherit(Q, Box2D.Dynamics.Joints.b2JointDef);
    Q.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
    Q.b2FrictionJointDef = function () {
        Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
        this.localAnchorA = new w;
        this.localAnchorB = new w
    };
    Q.prototype.b2FrictionJointDef = function () {
        this.__super.b2JointDef.call(this);
        this.type = I.e_frictionJoint;
        this.maxTorque = this.maxForce = 0
    };
    Q.prototype.Initialize = function (d, h, l) {
        this.bodyA = d;
        this.bodyB = h;
        this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l));
        this.localAnchorB.SetV(this.bodyB.GetLocalPoint(l))
    };
    Box2D.inherit(V, Box2D.Dynamics.Joints.b2Joint);
    V.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
    V.b2GearJoint = function () {
        Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
        this.m_groundAnchor1 = new w;
        this.m_groundAnchor2 = new w;
        this.m_localAnchor1 = new w;
        this.m_localAnchor2 = new w;
        this.m_J = new L
    };
    V.prototype.GetAnchorA = function () {
        return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)
    };
    V.prototype.GetAnchorB = function () {
        return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)
    };
    V.prototype.GetReactionForce = function (d) {
            if (d === undefined) d = 0;
            return new w(d * this.m_impulse * this.m_J.linearB.x, d * this.m_impulse * this.m_J.linearB.y)
    };
    V.prototype.GetReactionTorque = function (d) {
        if (d === undefined) d = 0;
        var h = this.m_bodyB.m_xf.R,
            l = this.m_localAnchor1.x - this.m_bodyB.m_sweep.localCenter.x,
            j = this.m_localAnchor1.y - this.m_bodyB.m_sweep.localCenter.y,
            o = h.col1.x * l + h.col2.x * j;
        j = h.col1.y * l + h.col2.y * j;
        l = o;
        return d * (this.m_impulse * this.m_J.angularB - l * this.m_impulse * this.m_J.linearB.y + j * this.m_impulse * this.m_J.linearB.x)
    };
    V.prototype.GetRatio = function () {
            return this.m_ratio
    };
    V.prototype.SetRatio = function (d) {
        if (d === undefined) d = 0;
        this.m_ratio = d
    };
    V.prototype.b2GearJoint = function (d) {
        this.__super.b2Joint.call(this, d);
        var h = parseInt(d.joint1.m_type),
            l = parseInt(d.joint2.m_type);
        this.m_prismatic2 = this.m_revolute2 = this.m_prismatic1 = this.m_revolute1 = null;
        var j = 0,
            o = 0;
        this.m_ground1 = d.joint1.GetBodyA();
        this.m_bodyA = d.joint1.GetBodyB();
        if (h == I.e_revoluteJoint) {
            this.m_revolute1 = d.joint1 instanceof N ? d.joint1 : null;
            this.m_groundAnchor1.SetV(this.m_revolute1.m_localAnchor1);
            this.m_localAnchor1.SetV(this.m_revolute1.m_localAnchor2);
            j = this.m_revolute1.GetJointAngle()
        } else {
            this.m_prismatic1 = d.joint1 instanceof H ? d.joint1 : null;
            this.m_groundAnchor1.SetV(this.m_prismatic1.m_localAnchor1);
            this.m_localAnchor1.SetV(this.m_prismatic1.m_localAnchor2);
            j = this.m_prismatic1.GetJointTranslation()
        }
        this.m_ground2 = d.joint2.GetBodyA();
        this.m_bodyB = d.joint2.GetBodyB();
        if (l == I.e_revoluteJoint) {
            this.m_revolute2 = d.joint2 instanceof N ? d.joint2 : null;
            this.m_groundAnchor2.SetV(this.m_revolute2.m_localAnchor1);
            this.m_localAnchor2.SetV(this.m_revolute2.m_localAnchor2);
            o = this.m_revolute2.GetJointAngle()
        } else {
            this.m_prismatic2 = d.joint2 instanceof H ? d.joint2 : null;
            this.m_groundAnchor2.SetV(this.m_prismatic2.m_localAnchor1);
            this.m_localAnchor2.SetV(this.m_prismatic2.m_localAnchor2);
            o = this.m_prismatic2.GetJointTranslation()
        }
        this.m_ratio = d.ratio;
        this.m_constant = j + this.m_ratio * o;
        this.m_impulse = 0
    };
    V.prototype.InitVelocityConstraints = function (d) {
        var h = this.m_ground1,
            l = this.m_ground2,
            j = this.m_bodyA,
            o = this.m_bodyB,
            q = 0,
            n = 0,
            a = 0,
            c = 0,
            g = a = 0,
            b = 0;
        this.m_J.SetZero();
        if (this.m_revolute1) {
            this.m_J.angularA = -1;
            b += j.m_invI
        } else {
            h = h.m_xf.R;
            n = this.m_prismatic1.m_localXAxis1;
            q = h.col1.x * n.x + h.col2.x * n.y;
            n = h.col1.y * n.x + h.col2.y * n.y;
            h = j.m_xf.R;
            a = this.m_localAnchor1.x - j.m_sweep.localCenter.x;
            c = this.m_localAnchor1.y - j.m_sweep.localCenter.y;
            g = h.col1.x * a + h.col2.x * c;
            c = h.col1.y * a + h.col2.y * c;
            a = g;
            a = a * n - c * q;
            this.m_J.linearA.Set(-q, -n);
            this.m_J.angularA = -a;
            b += j.m_invMass + j.m_invI * a * a
        } if (this.m_revolute2) {
            this.m_J.angularB = -this.m_ratio;
            b += this.m_ratio * this.m_ratio * o.m_invI
        } else {
            h = l.m_xf.R;
            n = this.m_prismatic2.m_localXAxis1;
            q = h.col1.x * n.x + h.col2.x * n.y;
            n = h.col1.y * n.x + h.col2.y * n.y;
            h = o.m_xf.R;
            a = this.m_localAnchor2.x - o.m_sweep.localCenter.x;
            c = this.m_localAnchor2.y - o.m_sweep.localCenter.y;
            g = h.col1.x * a + h.col2.x * c;
            c = h.col1.y * a + h.col2.y * c;
            a = g;
            a = a * n - c * q;
            this.m_J.linearB.Set(-this.m_ratio * q, -this.m_ratio * n);
            this.m_J.angularB = -this.m_ratio * a;
            b += this.m_ratio * this.m_ratio * (o.m_invMass + o.m_invI * a * a)
        }
        this.m_mass = b > 0 ? 1 / b : 0;
        if (d.warmStarting) {
            j.m_linearVelocity.x += j.m_invMass * this.m_impulse * this.m_J.linearA.x;
            j.m_linearVelocity.y += j.m_invMass * this.m_impulse * this.m_J.linearA.y;
            j.m_angularVelocity += j.m_invI * this.m_impulse * this.m_J.angularA;
            o.m_linearVelocity.x += o.m_invMass * this.m_impulse * this.m_J.linearB.x;
            o.m_linearVelocity.y += o.m_invMass * this.m_impulse * this.m_J.linearB.y;
            o.m_angularVelocity += o.m_invI * this.m_impulse * this.m_J.angularB
        } else this.m_impulse = 0
    };
    V.prototype.SolveVelocityConstraints = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l = -this.m_mass * this.m_J.Compute(d.m_linearVelocity,
                d.m_angularVelocity, h.m_linearVelocity, h.m_angularVelocity);
        this.m_impulse += l;
        d.m_linearVelocity.x += d.m_invMass * l * this.m_J.linearA.x;
        d.m_linearVelocity.y += d.m_invMass * l * this.m_J.linearA.y;
        d.m_angularVelocity += d.m_invI * l * this.m_J.angularA;
        h.m_linearVelocity.x += h.m_invMass * l * this.m_J.linearB.x;
        h.m_linearVelocity.y += h.m_invMass * l * this.m_J.linearB.y;
        h.m_angularVelocity += h.m_invI * l * this.m_J.angularB
    };
    V.prototype.SolvePositionConstraints = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l = 0,
            j = 0;
        l = this.m_revolute1 ?
            this.m_revolute1.GetJointAngle() : this.m_prismatic1.GetJointTranslation();
        j = this.m_revolute2 ? this.m_revolute2.GetJointAngle() : this.m_prismatic2.GetJointTranslation();
        l = -this.m_mass * (this.m_constant - (l + this.m_ratio * j));
        d.m_sweep.c.x += d.m_invMass * l * this.m_J.linearA.x;
        d.m_sweep.c.y += d.m_invMass * l * this.m_J.linearA.y;
        d.m_sweep.a += d.m_invI * l * this.m_J.angularA;
        h.m_sweep.c.x += h.m_invMass * l * this.m_J.linearB.x;
        h.m_sweep.c.y += h.m_invMass * l * this.m_J.linearB.y;
        h.m_sweep.a += h.m_invI * l * this.m_J.angularB;
        d.SynchronizeTransform();
        h.SynchronizeTransform();
        return 0 < F.b2_linearSlop
    };
    Box2D.inherit(M, Box2D.Dynamics.Joints.b2JointDef);
    M.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
    M.b2GearJointDef = function () {
        Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments)
    };
    M.prototype.b2GearJointDef = function () {
        this.__super.b2JointDef.call(this);
        this.type = I.e_gearJoint;
        this.joint2 = this.joint1 = null;
        this.ratio = 1
    };
    L.b2Jacobian = function () {
        this.linearA = new w;
        this.linearB = new w
    };
    L.prototype.SetZero = function () {
        this.linearA.SetZero();
        this.angularA = 0;
        this.linearB.SetZero();
        this.angularB = 0
    };
    L.prototype.Set = function (d, h, l, j) {
        if (h === undefined) h = 0;
        if (j === undefined) j = 0;
        this.linearA.SetV(d);
        this.angularA = h;
        this.linearB.SetV(l);
        this.angularB = j
    };
    L.prototype.Compute = function (d, h, l, j) {
        if (h === undefined) h = 0;
        if (j === undefined) j = 0;
        return this.linearA.x * d.x + this.linearA.y * d.y + this.angularA * h + (this.linearB.x * l.x + this.linearB.y * l.y) + this.angularB * j
    };
    I.b2Joint = function () {
        this.m_edgeA = new Y;
        this.m_edgeB = new Y;
        this.m_localCenterA = new w;
        this.m_localCenterB = new w
    };
    I.prototype.GetType = function () {
        return this.m_type
    };
    I.prototype.GetAnchorA = function () {
        return null
    };
    I.prototype.GetAnchorB = function () {
        return null
    };
    I.prototype.GetReactionForce = function () {
        return null
    };
    I.prototype.GetReactionTorque = function () {
        return 0
    };
    I.prototype.GetBodyA = function () {
        return this.m_bodyA
    };
    I.prototype.GetBodyB = function () {
        return this.m_bodyB
    };
    I.prototype.GetNext = function () {
        return this.m_next
    };
    I.prototype.GetUserData = function () {
        return this.m_userData
    };
    I.prototype.SetUserData = function (d) {
        this.m_userData = d
    };
    I.prototype.IsActive = function () {
        return this.m_bodyA.IsActive() && this.m_bodyB.IsActive()
    };
    I.Create = function (d) {
        var h = null;
        switch (d.type) {
        case I.e_distanceJoint:
            h = new U(d instanceof p ? d : null);
            break;
        case I.e_mouseJoint:
            h = new u(d instanceof D ? d : null);
            break;
        case I.e_prismaticJoint:
            h = new H(d instanceof O ? d : null);
            break;
        case I.e_revoluteJoint:
            h = new N(d instanceof S ? d : null);
            break;
        case I.e_pulleyJoint:
            h = new E(d instanceof R ? d : null);
            break;
        case I.e_gearJoint:
            h = new V(d instanceof M ? d : null);
            break;
        case I.e_lineJoint:
            h = new k(d instanceof z ? d : null);
            break;
        case I.e_weldJoint:
            h = new aa(d instanceof Z ? d : null);
            break;
        case I.e_frictionJoint:
            h = new B(d instanceof Q ? d : null)
        }
        return h
    };
    I.Destroy = function () {};
    I.prototype.b2Joint = function (d) {
        F.b2Assert(d.bodyA != d.bodyB);
        this.m_type = d.type;
        this.m_next = this.m_prev = null;
        this.m_bodyA = d.bodyA;
        this.m_bodyB = d.bodyB;
        this.m_collideConnected = d.collideConnected;
        this.m_islandFlag = false;
        this.m_userData = d.userData
    };
    I.prototype.InitVelocityConstraints = function () {};
    I.prototype.SolveVelocityConstraints = function () {};
    I.prototype.FinalizeVelocityConstraints = function () {};
    I.prototype.SolvePositionConstraints = function () {
        return false
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.Joints.b2Joint.e_unknownJoint = 0;
        Box2D.Dynamics.Joints.b2Joint.e_revoluteJoint = 1;
        Box2D.Dynamics.Joints.b2Joint.e_prismaticJoint = 2;
        Box2D.Dynamics.Joints.b2Joint.e_distanceJoint = 3;
        Box2D.Dynamics.Joints.b2Joint.e_pulleyJoint = 4;
        Box2D.Dynamics.Joints.b2Joint.e_mouseJoint = 5;
        Box2D.Dynamics.Joints.b2Joint.e_gearJoint = 6;
        Box2D.Dynamics.Joints.b2Joint.e_lineJoint = 7;
        Box2D.Dynamics.Joints.b2Joint.e_weldJoint = 8;
        Box2D.Dynamics.Joints.b2Joint.e_frictionJoint = 9;
        Box2D.Dynamics.Joints.b2Joint.e_inactiveLimit = 0;
        Box2D.Dynamics.Joints.b2Joint.e_atLowerLimit = 1;
        Box2D.Dynamics.Joints.b2Joint.e_atUpperLimit = 2;
        Box2D.Dynamics.Joints.b2Joint.e_equalLimits = 3
    });
    W.b2JointDef = function () {};
    W.prototype.b2JointDef = function () {
        this.type = I.e_unknownJoint;
        this.bodyB = this.bodyA = this.userData = null;
        this.collideConnected = false
    };
    Y.b2JointEdge = function () {};
    Box2D.inherit(k, Box2D.Dynamics.Joints.b2Joint);
    k.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
    k.b2LineJoint = function () {
        Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
        this.m_localAnchor1 = new w;
        this.m_localAnchor2 = new w;
        this.m_localXAxis1 = new w;
        this.m_localYAxis1 = new w;
        this.m_axis = new w;
        this.m_perp = new w;
        this.m_K = new G;
        this.m_impulse = new w
    };
    k.prototype.GetAnchorA = function () {
        return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)
    };
    k.prototype.GetAnchorB = function () {
        return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)
    };
    k.prototype.GetReactionForce = function (d) {
            if (d === undefined) d = 0;
            return new w(d * (this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.x), d * (this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.y))
    };
    k.prototype.GetReactionTorque = function (d) {
        if (d === undefined) d = 0;
        return d * this.m_impulse.y
    };
    k.prototype.GetJointTranslation = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l = d.GetWorldPoint(this.m_localAnchor1),
            j = h.GetWorldPoint(this.m_localAnchor2);
        h = j.x - l.x;
        l = j.y - l.y;
        d = d.GetWorldVector(this.m_localXAxis1);
        return d.x * h + d.y * l
    };
    k.prototype.GetJointSpeed = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l;
        l = d.m_xf.R;
        var j = this.m_localAnchor1.x - d.m_sweep.localCenter.x,
            o = this.m_localAnchor1.y - d.m_sweep.localCenter.y,
            q = l.col1.x * j + l.col2.x * o;
        o = l.col1.y * j + l.col2.y * o;
        j = q;
        l = h.m_xf.R;
        var n = this.m_localAnchor2.x - h.m_sweep.localCenter.x,
            a = this.m_localAnchor2.y - h.m_sweep.localCenter.y;
        q = l.col1.x * n + l.col2.x * a;
        a = l.col1.y * n + l.col2.y * a;
        n = q;
        l = h.m_sweep.c.x + n - (d.m_sweep.c.x + j);
        q = h.m_sweep.c.y + a - (d.m_sweep.c.y + o);
        var c = d.GetWorldVector(this.m_localXAxis1),
            g = d.m_linearVelocity,
            b = h.m_linearVelocity;
        d = d.m_angularVelocity;
        h = h.m_angularVelocity;
        return l * -d * c.y + q * d * c.x + (c.x * (b.x + -h * a - g.x - -d * o) + c.y * (b.y + h * n - g.y - d * j))
    };
    k.prototype.IsLimitEnabled = function () {
        return this.m_enableLimit
    };
    k.prototype.EnableLimit = function (d) {
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_enableLimit = d
    };
    k.prototype.GetLowerLimit = function () {
        return this.m_lowerTranslation
    };
    k.prototype.GetUpperLimit = function () {
        return this.m_upperTranslation
    };
    k.prototype.SetLimits = function (d,
        h) {
        if (d === undefined) d = 0;
        if (h === undefined) h = 0;
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_lowerTranslation = d;
        this.m_upperTranslation = h
    };
    k.prototype.IsMotorEnabled = function () {
        return this.m_enableMotor
    };
    k.prototype.EnableMotor = function (d) {
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_enableMotor = d
    };
    k.prototype.SetMotorSpeed = function (d) {
        if (d === undefined) d = 0;
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_motorSpeed = d
    };
    k.prototype.GetMotorSpeed = function () {
        return this.m_motorSpeed
    };
    k.prototype.SetMaxMotorForce = function (d) {
        if (d === undefined) d = 0;
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_maxMotorForce = d
    };
    k.prototype.GetMaxMotorForce = function () {
        return this.m_maxMotorForce
    };
    k.prototype.GetMotorForce = function () {
        return this.m_motorImpulse
    };
    k.prototype.b2LineJoint = function (d) {
        this.__super.b2Joint.call(this, d);
        this.m_localAnchor1.SetV(d.localAnchorA);
        this.m_localAnchor2.SetV(d.localAnchorB);
        this.m_localXAxis1.SetV(d.localAxisA);
        this.m_localYAxis1.x = -this.m_localXAxis1.y;
        this.m_localYAxis1.y = this.m_localXAxis1.x;
        this.m_impulse.SetZero();
        this.m_motorImpulse = this.m_motorMass = 0;
        this.m_lowerTranslation = d.lowerTranslation;
        this.m_upperTranslation = d.upperTranslation;
        this.m_maxMotorForce = d.maxMotorForce;
        this.m_motorSpeed = d.motorSpeed;
        this.m_enableLimit = d.enableLimit;
        this.m_enableMotor = d.enableMotor;
        this.m_limitState = I.e_inactiveLimit;
        this.m_axis.SetZero();
        this.m_perp.SetZero()
    };
    k.prototype.InitVelocityConstraints = function (d) {
        var h = this.m_bodyA,
            l = this.m_bodyB,
            j, o = 0;
        this.m_localCenterA.SetV(h.GetLocalCenter());
        this.m_localCenterB.SetV(l.GetLocalCenter());
        var q = h.GetTransform();
        l.GetTransform();
        j = h.m_xf.R;
        var n = this.m_localAnchor1.x - this.m_localCenterA.x,
            a = this.m_localAnchor1.y - this.m_localCenterA.y;
        o = j.col1.x * n + j.col2.x * a;
        a = j.col1.y * n + j.col2.y * a;
        n = o;
        j = l.m_xf.R;
        var c = this.m_localAnchor2.x - this.m_localCenterB.x,
            g = this.m_localAnchor2.y - this.m_localCenterB.y;
        o = j.col1.x * c + j.col2.x * g;
        g = j.col1.y * c + j.col2.y * g;
        c = o;
        j = l.m_sweep.c.x + c - h.m_sweep.c.x - n;
        o = l.m_sweep.c.y + g - h.m_sweep.c.y - a;
        this.m_invMassA = h.m_invMass;
        this.m_invMassB = l.m_invMass;
        this.m_invIA = h.m_invI;
        this.m_invIB = l.m_invI;
        this.m_axis.SetV(y.MulMV(q.R, this.m_localXAxis1));
        this.m_a1 = (j + n) * this.m_axis.y - (o + a) * this.m_axis.x;
        this.m_a2 = c * this.m_axis.y - g * this.m_axis.x;
        this.m_motorMass = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_a1 * this.m_a1 + this.m_invIB * this.m_a2 * this.m_a2;
        this.m_motorMass = this.m_motorMass > Number.MIN_VALUE ? 1 / this.m_motorMass : 0;
        this.m_perp.SetV(y.MulMV(q.R, this.m_localYAxis1));
        this.m_s1 = (j + n) * this.m_perp.y - (o + a) * this.m_perp.x;
        this.m_s2 = c * this.m_perp.y - g * this.m_perp.x;
        q = this.m_invMassA;
        n = this.m_invMassB;
        a = this.m_invIA;
        c = this.m_invIB;
        this.m_K.col1.x = q + n + a * this.m_s1 * this.m_s1 + c * this.m_s2 * this.m_s2;
        this.m_K.col1.y = a * this.m_s1 * this.m_a1 + c * this.m_s2 * this.m_a2;
        this.m_K.col2.x = this.m_K.col1.y;
        this.m_K.col2.y = q + n + a * this.m_a1 * this.m_a1 + c * this.m_a2 * this.m_a2;
        if (this.m_enableLimit) {
            j = this.m_axis.x * j + this.m_axis.y * o;
            if (y.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2 * F.b2_linearSlop) this.m_limitState = I.e_equalLimits;
            else if (j <= this.m_lowerTranslation) {
                if (this.m_limitState != I.e_atLowerLimit) {
                    this.m_limitState = I.e_atLowerLimit;
                    this.m_impulse.y = 0
                }
            } else if (j >= this.m_upperTranslation) {
                if (this.m_limitState != I.e_atUpperLimit) {
                    this.m_limitState = I.e_atUpperLimit;
                    this.m_impulse.y = 0
                }
            } else {
                this.m_limitState = I.e_inactiveLimit;
                this.m_impulse.y = 0
            }
        } else this.m_limitState = I.e_inactiveLimit; if (this.m_enableMotor == false) this.m_motorImpulse = 0;
        if (d.warmStarting) {
            this.m_impulse.x *= d.dtRatio;
            this.m_impulse.y *= d.dtRatio;
            this.m_motorImpulse *= d.dtRatio;
            d = this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.x;
            j = this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.y) * this.m_axis.y;
            o = this.m_impulse.x * this.m_s1 + (this.m_motorImpulse + this.m_impulse.y) * this.m_a1;
            q = this.m_impulse.x * this.m_s2 + (this.m_motorImpulse + this.m_impulse.y) * this.m_a2;
            h.m_linearVelocity.x -= this.m_invMassA * d;
            h.m_linearVelocity.y -= this.m_invMassA * j;
            h.m_angularVelocity -= this.m_invIA * o;
            l.m_linearVelocity.x += this.m_invMassB * d;
            l.m_linearVelocity.y += this.m_invMassB * j;
            l.m_angularVelocity += this.m_invIB * q
        } else {
            this.m_impulse.SetZero();
            this.m_motorImpulse = 0
        }
    };
    k.prototype.SolveVelocityConstraints = function (d) {
        var h = this.m_bodyA,
            l = this.m_bodyB,
            j = h.m_linearVelocity,
            o = h.m_angularVelocity,
            q = l.m_linearVelocity,
            n = l.m_angularVelocity,
            a = 0,
            c = 0,
            g = 0,
            b = 0;
        if (this.m_enableMotor && this.m_limitState != I.e_equalLimits) {
            b = this.m_motorMass * (this.m_motorSpeed - (this.m_axis.x * (q.x - j.x) + this.m_axis.y * (q.y - j.y) + this.m_a2 * n - this.m_a1 * o));
            a = this.m_motorImpulse;
            c = d.dt * this.m_maxMotorForce;
            this.m_motorImpulse = y.Clamp(this.m_motorImpulse + b, -c, c);
            b = this.m_motorImpulse - a;
            a = b * this.m_axis.x;
            c = b * this.m_axis.y;
            g = b * this.m_a1;
            b = b * this.m_a2;
            j.x -= this.m_invMassA * a;
            j.y -= this.m_invMassA * c;
            o -= this.m_invIA * g;
            q.x += this.m_invMassB * a;
            q.y += this.m_invMassB * c;
            n += this.m_invIB * b
        }
        c = this.m_perp.x * (q.x - j.x) + this.m_perp.y * (q.y - j.y) + this.m_s2 * n - this.m_s1 * o;
        if (this.m_enableLimit && this.m_limitState != I.e_inactiveLimit) {
            g = this.m_axis.x * (q.x - j.x) + this.m_axis.y * (q.y - j.y) + this.m_a2 * n - this.m_a1 * o;
            a = this.m_impulse.Copy();
            d = this.m_K.Solve(new w, -c, -g);
            this.m_impulse.Add(d);
            if (this.m_limitState == I.e_atLowerLimit) this.m_impulse.y = y.Max(this.m_impulse.y, 0);
            else if (this.m_limitState == I.e_atUpperLimit) this.m_impulse.y = y.Min(this.m_impulse.y, 0);
            c = -c - (this.m_impulse.y - a.y) * this.m_K.col2.x;
            g = 0;
            g = this.m_K.col1.x != 0 ? c / this.m_K.col1.x + a.x : a.x;
            this.m_impulse.x = g;
            d.x = this.m_impulse.x - a.x;
            d.y = this.m_impulse.y - a.y;
            a = d.x * this.m_perp.x + d.y * this.m_axis.x;
            c = d.x * this.m_perp.y + d.y * this.m_axis.y;
            g = d.x * this.m_s1 + d.y * this.m_a1;
            b = d.x * this.m_s2 + d.y * this.m_a2
        } else {
            d = 0;
            d = this.m_K.col1.x != 0 ? -c / this.m_K.col1.x : 0;
            this.m_impulse.x += d;
            a = d * this.m_perp.x;
            c = d * this.m_perp.y;
            g = d * this.m_s1;
            b = d * this.m_s2
        }
        j.x -= this.m_invMassA * a;
        j.y -= this.m_invMassA * c;
        o -= this.m_invIA * g;
        q.x += this.m_invMassB * a;
        q.y += this.m_invMassB * c;
        n += this.m_invIB * b;
        h.m_linearVelocity.SetV(j);
        h.m_angularVelocity = o;
        l.m_linearVelocity.SetV(q);
        l.m_angularVelocity = n
    };
    k.prototype.SolvePositionConstraints = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l = d.m_sweep.c,
            j = d.m_sweep.a,
            o = h.m_sweep.c,
            q = h.m_sweep.a,
            n, a = 0,
            c = 0,
            g = 0,
            b = 0,
            e = n = 0,
            f = 0;
        c = false;
        var m = 0,
            r = G.FromAngle(j);
        g = G.FromAngle(q);
        n = r;
        f = this.m_localAnchor1.x - this.m_localCenterA.x;
        var s = this.m_localAnchor1.y - this.m_localCenterA.y;
        a = n.col1.x * f + n.col2.x * s;
        s = n.col1.y * f + n.col2.y * s;
        f = a;
        n = g;
        g = this.m_localAnchor2.x - this.m_localCenterB.x;
        b = this.m_localAnchor2.y - this.m_localCenterB.y;
        a = n.col1.x * g + n.col2.x * b;
        b = n.col1.y * g + n.col2.y * b;
        g = a;
        n = o.x + g - l.x - f;
        a = o.y + b - l.y - s;
        if (this.m_enableLimit) {
            this.m_axis = y.MulMV(r, this.m_localXAxis1);
            this.m_a1 = (n + f) * this.m_axis.y - (a + s) * this.m_axis.x;
            this.m_a2 = g * this.m_axis.y - b * this.m_axis.x;
            var v = this.m_axis.x * n + this.m_axis.y * a;
            if (y.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2 * F.b2_linearSlop) {
                m = y.Clamp(v, -F.b2_maxLinearCorrection, F.b2_maxLinearCorrection);
                e = y.Abs(v);
                c = true
            } else if (v <= this.m_lowerTranslation) {
                m = y.Clamp(v - this.m_lowerTranslation + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0);
                e = this.m_lowerTranslation - v;
                c = true
            } else if (v >= this.m_upperTranslation) {
                m = y.Clamp(v - this.m_upperTranslation + F.b2_linearSlop, 0, F.b2_maxLinearCorrection);
                e = v - this.m_upperTranslation;
                c = true
            }
        }
        this.m_perp = y.MulMV(r, this.m_localYAxis1);
        this.m_s1 = (n + f) * this.m_perp.y - (a + s) * this.m_perp.x;
        this.m_s2 = g * this.m_perp.y - b * this.m_perp.x;
        r = new w;
        s = this.m_perp.x * n + this.m_perp.y * a;
        e = y.Max(e, y.Abs(s));
        f = 0;
        if (c) {
            c = this.m_invMassA;
            g = this.m_invMassB;
            b = this.m_invIA;
            n = this.m_invIB;
            this.m_K.col1.x = c + g + b * this.m_s1 * this.m_s1 + n * this.m_s2 * this.m_s2;
            this.m_K.col1.y = b * this.m_s1 * this.m_a1 + n * this.m_s2 * this.m_a2;
            this.m_K.col2.x = this.m_K.col1.y;
            this.m_K.col2.y = c + g + b * this.m_a1 * this.m_a1 + n * this.m_a2 * this.m_a2;
            this.m_K.Solve(r, -s, -m)
        } else {
            c = this.m_invMassA;
            g = this.m_invMassB;
            b = this.m_invIA;
            n = this.m_invIB;
            m = c + g + b * this.m_s1 * this.m_s1 + n * this.m_s2 * this.m_s2;
            c = 0;
            c = m != 0 ? -s / m : 0;
            r.x = c;
            r.y = 0
        }
        m = r.x * this.m_perp.x + r.y * this.m_axis.x;
        c = r.x * this.m_perp.y + r.y * this.m_axis.y;
        s = r.x * this.m_s1 + r.y * this.m_a1;
        r = r.x * this.m_s2 + r.y * this.m_a2;
        l.x -= this.m_invMassA * m;
        l.y -= this.m_invMassA * c;
        j -= this.m_invIA * s;
        o.x += this.m_invMassB * m;
        o.y += this.m_invMassB * c;
        q += this.m_invIB * r;
        d.m_sweep.a = j;
        h.m_sweep.a = q;
        d.SynchronizeTransform();
        h.SynchronizeTransform();
        return e <= F.b2_linearSlop && f <= F.b2_angularSlop
    };
    Box2D.inherit(z, Box2D.Dynamics.Joints.b2JointDef);
    z.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
    z.b2LineJointDef = function () {
        Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
        this.localAnchorA = new w;
        this.localAnchorB = new w;
        this.localAxisA = new w
    };
    z.prototype.b2LineJointDef = function () {
        this.__super.b2JointDef.call(this);
        this.type = I.e_lineJoint;
        this.localAxisA.Set(1, 0);
        this.enableLimit = false;
        this.upperTranslation = this.lowerTranslation = 0;
        this.enableMotor = false;
        this.motorSpeed = this.maxMotorForce = 0
    };
    z.prototype.Initialize = function (d, h, l, j) {
        this.bodyA = d;
        this.bodyB = h;
        this.localAnchorA = this.bodyA.GetLocalPoint(l);
        this.localAnchorB = this.bodyB.GetLocalPoint(l);
        this.localAxisA = this.bodyA.GetLocalVector(j)
    };
    Box2D.inherit(u, Box2D.Dynamics.Joints.b2Joint);
    u.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
    u.b2MouseJoint = function () {
        Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
        this.K = new G;
        this.K1 = new G;
        this.K2 = new G;
        this.m_localAnchor = new w;
        this.m_target = new w;
        this.m_impulse = new w;
        this.m_mass = new G;
        this.m_C = new w
    };
    u.prototype.GetAnchorA = function () {
        return this.m_target
    };
    u.prototype.GetAnchorB = function () {
        return this.m_bodyB.GetWorldPoint(this.m_localAnchor)
    };
    u.prototype.GetReactionForce = function (d) {
        if (d === undefined) d = 0;
        return new w(d * this.m_impulse.x, d * this.m_impulse.y)
    };
    u.prototype.GetReactionTorque = function () {
        return 0
    };
    u.prototype.GetTarget = function () {
        return this.m_target
    };
    u.prototype.SetTarget = function (d) {
        this.m_bodyB.IsAwake() == false && this.m_bodyB.SetAwake(true);
        this.m_target = d
    };
    u.prototype.GetMaxForce = function () {
        return this.m_maxForce
    };
    u.prototype.SetMaxForce = function (d) {
        if (d === undefined) d = 0;
        this.m_maxForce = d
    };
    u.prototype.GetFrequency = function () {
        return this.m_frequencyHz
    };
    u.prototype.SetFrequency = function (d) {
        if (d === undefined) d = 0;
        this.m_frequencyHz = d
    };
    u.prototype.GetDampingRatio = function () {
        return this.m_dampingRatio
    };
    u.prototype.SetDampingRatio = function (d) {
        if (d === undefined) d = 0;
        this.m_dampingRatio = d
    };
    u.prototype.b2MouseJoint = function (d) {
            this.__super.b2Joint.call(this, d);
            this.m_target.SetV(d.target);
            var h = this.m_target.x - this.m_bodyB.m_xf.position.x,
                l = this.m_target.y - this.m_bodyB.m_xf.position.y,
                j = this.m_bodyB.m_xf.R;
            this.m_localAnchor.x = h * j.col1.x + l * j.col1.y;
            this.m_localAnchor.y = h * j.col2.x + l * j.col2.y;
            this.m_maxForce = d.maxForce;
            this.m_impulse.SetZero();
            this.m_frequencyHz = d.frequencyHz;
            this.m_dampingRatio = d.dampingRatio;
            this.m_gamma = this.m_beta = 0
    };
    u.prototype.InitVelocityConstraints = function (d) {
        var h = this.m_bodyB,
            l = h.GetMass(),
            j = 2 * Math.PI * this.m_frequencyHz,
            o = l * j * j;
        this.m_gamma = d.dt * (2 * l * this.m_dampingRatio * j + d.dt * o);
        this.m_gamma = this.m_gamma != 0 ? 1 / this.m_gamma : 0;
        this.m_beta = d.dt * o * this.m_gamma;
        o = h.m_xf.R;
        l = this.m_localAnchor.x - h.m_sweep.localCenter.x;
        j = this.m_localAnchor.y - h.m_sweep.localCenter.y;
        var q = o.col1.x * l + o.col2.x * j;
        j = o.col1.y * l + o.col2.y * j;
        l = q;
        o = h.m_invMass;
        q = h.m_invI;
        this.K1.col1.x = o;
        this.K1.col2.x = 0;
        this.K1.col1.y = 0;
        this.K1.col2.y = o;
        this.K2.col1.x = q * j * j;
        this.K2.col2.x = -q * l * j;
        this.K2.col1.y = -q * l * j;
        this.K2.col2.y = q * l * l;
        this.K.SetM(this.K1);
        this.K.AddM(this.K2);
        this.K.col1.x += this.m_gamma;
        this.K.col2.y += this.m_gamma;
        this.K.GetInverse(this.m_mass);
        this.m_C.x = h.m_sweep.c.x + l - this.m_target.x;
        this.m_C.y = h.m_sweep.c.y + j - this.m_target.y;
        h.m_angularVelocity *= 0.98;
        this.m_impulse.x *= d.dtRatio;
        this.m_impulse.y *= d.dtRatio;
        h.m_linearVelocity.x += o * this.m_impulse.x;
        h.m_linearVelocity.y += o * this.m_impulse.y;
        h.m_angularVelocity += q * (l * this.m_impulse.y - j * this.m_impulse.x)
    };
    u.prototype.SolveVelocityConstraints = function (d) {
        var h = this.m_bodyB,
            l, j = 0,
            o = 0;
        l = h.m_xf.R;
        var q = this.m_localAnchor.x - h.m_sweep.localCenter.x,
            n = this.m_localAnchor.y - h.m_sweep.localCenter.y;
        j = l.col1.x * q + l.col2.x * n;
        n = l.col1.y * q + l.col2.y * n;
        q = j;
        j = h.m_linearVelocity.x + -h.m_angularVelocity * n;
        var a = h.m_linearVelocity.y + h.m_angularVelocity * q;
        l = this.m_mass;
        j = j + this.m_beta * this.m_C.x + this.m_gamma * this.m_impulse.x;
        o = a + this.m_beta * this.m_C.y + this.m_gamma * this.m_impulse.y;
        a = -(l.col1.x * j + l.col2.x * o);
        o = -(l.col1.y * j + l.col2.y * o);
        l = this.m_impulse.x;
        j = this.m_impulse.y;
        this.m_impulse.x += a;
        this.m_impulse.y += o;
        d = d.dt * this.m_maxForce;
        this.m_impulse.LengthSquared() > d * d && this.m_impulse.Multiply(d / this.m_impulse.Length());
        a = this.m_impulse.x - l;
        o = this.m_impulse.y - j;
        h.m_linearVelocity.x += h.m_invMass * a;
        h.m_linearVelocity.y += h.m_invMass * o;
        h.m_angularVelocity += h.m_invI * (q * o - n * a)
    };
    u.prototype.SolvePositionConstraints = function () {
        return true
    };
    Box2D.inherit(D, Box2D.Dynamics.Joints.b2JointDef);
    D.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
    D.b2MouseJointDef = function () {
        Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this,
            arguments);
        this.target = new w
    };
    D.prototype.b2MouseJointDef = function () {
        this.__super.b2JointDef.call(this);
        this.type = I.e_mouseJoint;
        this.maxForce = 0;
        this.frequencyHz = 5;
        this.dampingRatio = 0.7
    };
    Box2D.inherit(H, Box2D.Dynamics.Joints.b2Joint);
    H.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
    H.b2PrismaticJoint = function () {
        Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
        this.m_localAnchor1 = new w;
        this.m_localAnchor2 = new w;
        this.m_localXAxis1 = new w;
        this.m_localYAxis1 = new w;
        this.m_axis = new w;
        this.m_perp = new w;
        this.m_K = new K;
        this.m_impulse = new A
    };
    H.prototype.GetAnchorA = function () {
        return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)
    };
    H.prototype.GetAnchorB = function () {
        return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)
    };
    H.prototype.GetReactionForce = function (d) {
        if (d === undefined) d = 0;
        return new w(d * (this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.x), d * (this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.y))
    };
    H.prototype.GetReactionTorque = function (d) {
            if (d === undefined) d = 0;
            return d * this.m_impulse.y
    };
    H.prototype.GetJointTranslation = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l = d.GetWorldPoint(this.m_localAnchor1),
            j = h.GetWorldPoint(this.m_localAnchor2);
        h = j.x - l.x;
        l = j.y - l.y;
        d = d.GetWorldVector(this.m_localXAxis1);
        return d.x * h + d.y * l
    };
    H.prototype.GetJointSpeed = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l;
        l = d.m_xf.R;
        var j = this.m_localAnchor1.x - d.m_sweep.localCenter.x,
            o = this.m_localAnchor1.y - d.m_sweep.localCenter.y,
            q = l.col1.x * j + l.col2.x * o;
        o = l.col1.y * j + l.col2.y * o;
        j = q;
        l = h.m_xf.R;
        var n = this.m_localAnchor2.x - h.m_sweep.localCenter.x,
            a = this.m_localAnchor2.y - h.m_sweep.localCenter.y;
        q = l.col1.x * n + l.col2.x * a;
        a = l.col1.y * n + l.col2.y * a;
        n = q;
        l = h.m_sweep.c.x + n - (d.m_sweep.c.x + j);
        q = h.m_sweep.c.y + a - (d.m_sweep.c.y + o);
        var c = d.GetWorldVector(this.m_localXAxis1),
            g = d.m_linearVelocity,
            b = h.m_linearVelocity;
        d = d.m_angularVelocity;
        h = h.m_angularVelocity;
        return l * -d * c.y + q * d * c.x + (c.x * (b.x + -h * a - g.x - -d * o) + c.y * (b.y + h * n - g.y - d * j))
    };
    H.prototype.IsLimitEnabled = function () {
        return this.m_enableLimit
    };
    H.prototype.EnableLimit = function (d) {
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_enableLimit = d
    };
    H.prototype.GetLowerLimit = function () {
        return this.m_lowerTranslation
    };
    H.prototype.GetUpperLimit = function () {
        return this.m_upperTranslation
    };
    H.prototype.SetLimits = function (d, h) {
        if (d === undefined) d = 0;
        if (h === undefined) h = 0;
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_lowerTranslation = d;
        this.m_upperTranslation = h
    };
    H.prototype.IsMotorEnabled = function () {
        return this.m_enableMotor
    };
    H.prototype.EnableMotor = function (d) {
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_enableMotor = d
    };
    H.prototype.SetMotorSpeed = function (d) {
        if (d === undefined) d = 0;
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_motorSpeed = d
    };
    H.prototype.GetMotorSpeed = function () {
        return this.m_motorSpeed
    };
    H.prototype.SetMaxMotorForce = function (d) {
        if (d === undefined) d = 0;
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_maxMotorForce = d
    };
    H.prototype.GetMotorForce = function () {
        return this.m_motorImpulse
    };
    H.prototype.b2PrismaticJoint = function (d) {
        this.__super.b2Joint.call(this, d);
        this.m_localAnchor1.SetV(d.localAnchorA);
        this.m_localAnchor2.SetV(d.localAnchorB);
        this.m_localXAxis1.SetV(d.localAxisA);
        this.m_localYAxis1.x = -this.m_localXAxis1.y;
        this.m_localYAxis1.y = this.m_localXAxis1.x;
        this.m_refAngle = d.referenceAngle;
        this.m_impulse.SetZero();
        this.m_motorImpulse = this.m_motorMass = 0;
        this.m_lowerTranslation = d.lowerTranslation;
        this.m_upperTranslation = d.upperTranslation;
        this.m_maxMotorForce = d.maxMotorForce;
        this.m_motorSpeed = d.motorSpeed;
        this.m_enableLimit = d.enableLimit;
        this.m_enableMotor = d.enableMotor;
        this.m_limitState = I.e_inactiveLimit;
        this.m_axis.SetZero();
        this.m_perp.SetZero()
    };
    H.prototype.InitVelocityConstraints = function (d) {
        var h = this.m_bodyA,
            l = this.m_bodyB,
            j, o = 0;
        this.m_localCenterA.SetV(h.GetLocalCenter());
        this.m_localCenterB.SetV(l.GetLocalCenter());
        var q = h.GetTransform();
        l.GetTransform();
        j = h.m_xf.R;
        var n = this.m_localAnchor1.x - this.m_localCenterA.x,
            a = this.m_localAnchor1.y - this.m_localCenterA.y;
        o = j.col1.x * n + j.col2.x * a;
        a = j.col1.y * n + j.col2.y * a;
        n = o;
        j = l.m_xf.R;
        var c = this.m_localAnchor2.x - this.m_localCenterB.x,
            g = this.m_localAnchor2.y - this.m_localCenterB.y;
        o = j.col1.x * c + j.col2.x * g;
        g = j.col1.y * c + j.col2.y * g;
        c = o;
        j = l.m_sweep.c.x + c - h.m_sweep.c.x - n;
        o = l.m_sweep.c.y + g - h.m_sweep.c.y - a;
        this.m_invMassA = h.m_invMass;
        this.m_invMassB = l.m_invMass;
        this.m_invIA = h.m_invI;
        this.m_invIB = l.m_invI;
        this.m_axis.SetV(y.MulMV(q.R, this.m_localXAxis1));
        this.m_a1 = (j + n) * this.m_axis.y - (o + a) * this.m_axis.x;
        this.m_a2 = c * this.m_axis.y - g * this.m_axis.x;
        this.m_motorMass = this.m_invMassA + this.m_invMassB + this.m_invIA * this.m_a1 * this.m_a1 + this.m_invIB * this.m_a2 * this.m_a2;
        if (this.m_motorMass > Number.MIN_VALUE) this.m_motorMass = 1 / this.m_motorMass;
        this.m_perp.SetV(y.MulMV(q.R, this.m_localYAxis1));
        this.m_s1 = (j + n) * this.m_perp.y - (o + a) * this.m_perp.x;
        this.m_s2 = c * this.m_perp.y - g * this.m_perp.x;
        q = this.m_invMassA;
        n = this.m_invMassB;
        a = this.m_invIA;
        c = this.m_invIB;
        this.m_K.col1.x = q + n + a * this.m_s1 * this.m_s1 + c * this.m_s2 * this.m_s2;
        this.m_K.col1.y = a * this.m_s1 + c * this.m_s2;
        this.m_K.col1.z = a * this.m_s1 * this.m_a1 + c * this.m_s2 * this.m_a2;
        this.m_K.col2.x = this.m_K.col1.y;
        this.m_K.col2.y = a + c;
        this.m_K.col2.z = a * this.m_a1 + c * this.m_a2;
        this.m_K.col3.x = this.m_K.col1.z;
        this.m_K.col3.y = this.m_K.col2.z;
        this.m_K.col3.z = q + n + a * this.m_a1 * this.m_a1 + c * this.m_a2 * this.m_a2;
        if (this.m_enableLimit) {
            j = this.m_axis.x * j + this.m_axis.y * o;
            if (y.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2 * F.b2_linearSlop) this.m_limitState = I.e_equalLimits;
            else if (j <= this.m_lowerTranslation) {
                if (this.m_limitState != I.e_atLowerLimit) {
                    this.m_limitState = I.e_atLowerLimit;
                    this.m_impulse.z = 0
                }
            } else if (j >= this.m_upperTranslation) {
                if (this.m_limitState != I.e_atUpperLimit) {
                    this.m_limitState = I.e_atUpperLimit;
                    this.m_impulse.z = 0
                }
            } else {
                this.m_limitState = I.e_inactiveLimit;
                this.m_impulse.z = 0
            }
        } else this.m_limitState = I.e_inactiveLimit; if (this.m_enableMotor == false) this.m_motorImpulse = 0;
        if (d.warmStarting) {
            this.m_impulse.x *= d.dtRatio;
            this.m_impulse.y *= d.dtRatio;
            this.m_motorImpulse *= d.dtRatio;
            d = this.m_impulse.x * this.m_perp.x + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.x;
            j = this.m_impulse.x * this.m_perp.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_axis.y;
            o = this.m_impulse.x * this.m_s1 + this.m_impulse.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_a1;
            q = this.m_impulse.x * this.m_s2 + this.m_impulse.y + (this.m_motorImpulse + this.m_impulse.z) * this.m_a2;
            h.m_linearVelocity.x -= this.m_invMassA * d;
            h.m_linearVelocity.y -= this.m_invMassA * j;
            h.m_angularVelocity -= this.m_invIA * o;
            l.m_linearVelocity.x += this.m_invMassB * d;
            l.m_linearVelocity.y += this.m_invMassB * j;
            l.m_angularVelocity += this.m_invIB * q
        } else {
            this.m_impulse.SetZero();
            this.m_motorImpulse = 0
        }
    };
    H.prototype.SolveVelocityConstraints = function (d) {
        var h = this.m_bodyA,
            l = this.m_bodyB,
            j = h.m_linearVelocity,
            o = h.m_angularVelocity,
            q = l.m_linearVelocity,
            n = l.m_angularVelocity,
            a = 0,
            c = 0,
            g = 0,
            b = 0;
        if (this.m_enableMotor && this.m_limitState != I.e_equalLimits) {
            b = this.m_motorMass * (this.m_motorSpeed - (this.m_axis.x * (q.x - j.x) + this.m_axis.y * (q.y - j.y) + this.m_a2 * n - this.m_a1 * o));
            a = this.m_motorImpulse;
            d = d.dt * this.m_maxMotorForce;
            this.m_motorImpulse = y.Clamp(this.m_motorImpulse + b, -d, d);
            b = this.m_motorImpulse - a;
            a = b * this.m_axis.x;
            c = b * this.m_axis.y;
            g = b * this.m_a1;
            b = b * this.m_a2;
            j.x -= this.m_invMassA * a;
            j.y -= this.m_invMassA * c;
            o -= this.m_invIA * g;
            q.x += this.m_invMassB * a;
            q.y += this.m_invMassB * c;
            n += this.m_invIB * b
        }
        g = this.m_perp.x * (q.x - j.x) + this.m_perp.y * (q.y - j.y) + this.m_s2 * n - this.m_s1 * o;
        c = n - o;
        if (this.m_enableLimit && this.m_limitState != I.e_inactiveLimit) {
            d = this.m_axis.x * (q.x - j.x) + this.m_axis.y * (q.y - j.y) + this.m_a2 * n - this.m_a1 * o;
            a = this.m_impulse.Copy();
            d = this.m_K.Solve33(new A, -g, -c, -d);
            this.m_impulse.Add(d);
            if (this.m_limitState == I.e_atLowerLimit) this.m_impulse.z = y.Max(this.m_impulse.z, 0);
            else if (this.m_limitState == I.e_atUpperLimit) this.m_impulse.z = y.Min(this.m_impulse.z, 0);
            g = -g - (this.m_impulse.z - a.z) * this.m_K.col3.x;
            c = -c - (this.m_impulse.z - a.z) * this.m_K.col3.y;
            c = this.m_K.Solve22(new w, g, c);
            c.x += a.x;
            c.y += a.y;
            this.m_impulse.x = c.x;
            this.m_impulse.y = c.y;
            d.x = this.m_impulse.x - a.x;
            d.y = this.m_impulse.y - a.y;
            d.z = this.m_impulse.z - a.z;
            a = d.x * this.m_perp.x + d.z * this.m_axis.x;
            c = d.x * this.m_perp.y + d.z * this.m_axis.y;
            g = d.x * this.m_s1 + d.y + d.z * this.m_a1;
            b = d.x * this.m_s2 + d.y + d.z * this.m_a2
        } else {
            d = this.m_K.Solve22(new w, -g, -c);
            this.m_impulse.x += d.x;
            this.m_impulse.y += d.y;
            a = d.x * this.m_perp.x;
            c = d.x * this.m_perp.y;
            g = d.x * this.m_s1 + d.y;
            b = d.x * this.m_s2 + d.y
        }
        j.x -= this.m_invMassA * a;
        j.y -= this.m_invMassA * c;
        o -= this.m_invIA * g;
        q.x += this.m_invMassB * a;
        q.y += this.m_invMassB * c;
        n += this.m_invIB * b;
        h.m_linearVelocity.SetV(j);
        h.m_angularVelocity = o;
        l.m_linearVelocity.SetV(q);
        l.m_angularVelocity = n
    };
    H.prototype.SolvePositionConstraints = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l = d.m_sweep.c,
            j = d.m_sweep.a,
            o = h.m_sweep.c,
            q = h.m_sweep.a,
            n, a = 0,
            c = 0,
            g = 0,
            b = a = n = 0,
            e = 0;
        c = false;
        var f = 0,
            m = G.FromAngle(j),
            r = G.FromAngle(q);
        n = m;
        e = this.m_localAnchor1.x - this.m_localCenterA.x;
        var s = this.m_localAnchor1.y - this.m_localCenterA.y;
        a = n.col1.x * e + n.col2.x * s;
        s = n.col1.y * e + n.col2.y * s;
        e = a;
        n = r;
        r = this.m_localAnchor2.x - this.m_localCenterB.x;
        g = this.m_localAnchor2.y - this.m_localCenterB.y;
        a = n.col1.x * r + n.col2.x * g;
        g = n.col1.y * r + n.col2.y * g;
        r = a;
        n = o.x + r - l.x - e;
        a = o.y + g - l.y - s;
        if (this.m_enableLimit) {
            this.m_axis = y.MulMV(m, this.m_localXAxis1);
            this.m_a1 = (n + e) * this.m_axis.y - (a + s) * this.m_axis.x;
            this.m_a2 = r * this.m_axis.y - g * this.m_axis.x;
            var v = this.m_axis.x * n + this.m_axis.y * a;
            if (y.Abs(this.m_upperTranslation - this.m_lowerTranslation) < 2 * F.b2_linearSlop) {
                f = y.Clamp(v, -F.b2_maxLinearCorrection, F.b2_maxLinearCorrection);
                b = y.Abs(v);
                c = true
            } else if (v <= this.m_lowerTranslation) {
                f = y.Clamp(v - this.m_lowerTranslation + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0);
                b = this.m_lowerTranslation - v;
                c = true
            } else if (v >= this.m_upperTranslation) {
                f = y.Clamp(v - this.m_upperTranslation + F.b2_linearSlop, 0, F.b2_maxLinearCorrection);
                b = v - this.m_upperTranslation;
                c = true
            }
        }
        this.m_perp = y.MulMV(m, this.m_localYAxis1);
        this.m_s1 = (n + e) * this.m_perp.y - (a + s) * this.m_perp.x;
        this.m_s2 = r * this.m_perp.y - g * this.m_perp.x;
        m = new A;
        s = this.m_perp.x * n + this.m_perp.y * a;
        r = q - j - this.m_refAngle;
        b = y.Max(b, y.Abs(s));
        e = y.Abs(r);
        if (c) {
            c = this.m_invMassA;
            g = this.m_invMassB;
            n = this.m_invIA;
            a = this.m_invIB;
            this.m_K.col1.x = c + g + n * this.m_s1 * this.m_s1 + a * this.m_s2 * this.m_s2;
            this.m_K.col1.y = n * this.m_s1 + a * this.m_s2;
            this.m_K.col1.z = n * this.m_s1 * this.m_a1 + a * this.m_s2 * this.m_a2;
            this.m_K.col2.x = this.m_K.col1.y;
            this.m_K.col2.y = n + a;
            this.m_K.col2.z = n * this.m_a1 + a * this.m_a2;
            this.m_K.col3.x = this.m_K.col1.z;
            this.m_K.col3.y = this.m_K.col2.z;
            this.m_K.col3.z = c + g + n * this.m_a1 * this.m_a1 + a * this.m_a2 * this.m_a2;
            this.m_K.Solve33(m, -s, -r, -f)
        } else {
            c = this.m_invMassA;
            g = this.m_invMassB;
            n = this.m_invIA;
            a = this.m_invIB;
            f = n * this.m_s1 + a * this.m_s2;
            v = n + a;
            this.m_K.col1.Set(c + g + n * this.m_s1 * this.m_s1 + a * this.m_s2 * this.m_s2, f, 0);
            this.m_K.col2.Set(f,
                v, 0);
            f = this.m_K.Solve22(new w, -s, -r);
            m.x = f.x;
            m.y = f.y;
            m.z = 0
        }
        f = m.x * this.m_perp.x + m.z * this.m_axis.x;
        c = m.x * this.m_perp.y + m.z * this.m_axis.y;
        s = m.x * this.m_s1 + m.y + m.z * this.m_a1;
        m = m.x * this.m_s2 + m.y + m.z * this.m_a2;
        l.x -= this.m_invMassA * f;
        l.y -= this.m_invMassA * c;
        j -= this.m_invIA * s;
        o.x += this.m_invMassB * f;
        o.y += this.m_invMassB * c;
        q += this.m_invIB * m;
        d.m_sweep.a = j;
        h.m_sweep.a = q;
        d.SynchronizeTransform();
        h.SynchronizeTransform();
        return b <= F.b2_linearSlop && e <= F.b2_angularSlop
    };
    Box2D.inherit(O, Box2D.Dynamics.Joints.b2JointDef);
    O.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
    O.b2PrismaticJointDef = function () {
        Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
        this.localAnchorA = new w;
        this.localAnchorB = new w;
        this.localAxisA = new w
    };
    O.prototype.b2PrismaticJointDef = function () {
        this.__super.b2JointDef.call(this);
        this.type = I.e_prismaticJoint;
        this.localAxisA.Set(1, 0);
        this.referenceAngle = 0;
        this.enableLimit = false;
        this.upperTranslation = this.lowerTranslation = 0;
        this.enableMotor = false;
        this.motorSpeed = this.maxMotorForce = 0
    };
    O.prototype.Initialize = function (d, h, l, j) {
        this.bodyA = d;
        this.bodyB = h;
        this.localAnchorA = this.bodyA.GetLocalPoint(l);
        this.localAnchorB = this.bodyB.GetLocalPoint(l);
        this.localAxisA = this.bodyA.GetLocalVector(j);
        this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle()
    };
    Box2D.inherit(E, Box2D.Dynamics.Joints.b2Joint);
    E.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
    E.b2PulleyJoint = function () {
        Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
        this.m_groundAnchor1 = new w;
        this.m_groundAnchor2 = new w;
        this.m_localAnchor1 = new w;
        this.m_localAnchor2 = new w;
        this.m_u1 = new w;
        this.m_u2 = new w
    };
    E.prototype.GetAnchorA = function () {
        return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)
    };
    E.prototype.GetAnchorB = function () {
        return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)
    };
    E.prototype.GetReactionForce = function (d) {
        if (d === undefined) d = 0;
        return new w(d * this.m_impulse * this.m_u2.x, d * this.m_impulse * this.m_u2.y)
    };
    E.prototype.GetReactionTorque = function () {
        return 0
    };
    E.prototype.GetGroundAnchorA = function () {
        var d = this.m_ground.m_xf.position.Copy();
        d.Add(this.m_groundAnchor1);
        return d
    };
    E.prototype.GetGroundAnchorB = function () {
        var d = this.m_ground.m_xf.position.Copy();
        d.Add(this.m_groundAnchor2);
        return d
    };
    E.prototype.GetLength1 = function () {
        var d = this.m_bodyA.GetWorldPoint(this.m_localAnchor1),
            h = d.x - (this.m_ground.m_xf.position.x + this.m_groundAnchor1.x);
        d = d.y - (this.m_ground.m_xf.position.y + this.m_groundAnchor1.y);
        return Math.sqrt(h * h + d * d)
    };
    E.prototype.GetLength2 = function () {
        var d = this.m_bodyB.GetWorldPoint(this.m_localAnchor2),
            h = d.x - (this.m_ground.m_xf.position.x + this.m_groundAnchor2.x);
        d = d.y - (this.m_ground.m_xf.position.y + this.m_groundAnchor2.y);
        return Math.sqrt(h * h + d * d)
    };
    E.prototype.GetRatio = function () {
        return this.m_ratio
    };
    E.prototype.b2PulleyJoint = function (d) {
        this.__super.b2Joint.call(this, d);
        this.m_ground = this.m_bodyA.m_world.m_groundBody;
        this.m_groundAnchor1.x = d.groundAnchorA.x - this.m_ground.m_xf.position.x;
        this.m_groundAnchor1.y = d.groundAnchorA.y - this.m_ground.m_xf.position.y;
        this.m_groundAnchor2.x = d.groundAnchorB.x - this.m_ground.m_xf.position.x;
        this.m_groundAnchor2.y = d.groundAnchorB.y - this.m_ground.m_xf.position.y;
        this.m_localAnchor1.SetV(d.localAnchorA);
        this.m_localAnchor2.SetV(d.localAnchorB);
        this.m_ratio = d.ratio;
        this.m_constant = d.lengthA + this.m_ratio * d.lengthB;
        this.m_maxLength1 = y.Min(d.maxLengthA, this.m_constant - this.m_ratio * E.b2_minPulleyLength);
        this.m_maxLength2 = y.Min(d.maxLengthB, (this.m_constant - E.b2_minPulleyLength) / this.m_ratio);
        this.m_limitImpulse2 = this.m_limitImpulse1 = this.m_impulse = 0
    };
    E.prototype.InitVelocityConstraints = function (d) {
            var h = this.m_bodyA,
                l = this.m_bodyB,
                j;
            j = h.m_xf.R;
            var o = this.m_localAnchor1.x - h.m_sweep.localCenter.x,
                q = this.m_localAnchor1.y - h.m_sweep.localCenter.y,
                n = j.col1.x * o + j.col2.x * q;
            q = j.col1.y * o + j.col2.y * q;
            o = n;
            j = l.m_xf.R;
            var a = this.m_localAnchor2.x - l.m_sweep.localCenter.x,
                c = this.m_localAnchor2.y - l.m_sweep.localCenter.y;
            n = j.col1.x * a + j.col2.x * c;
            c = j.col1.y * a + j.col2.y * c;
            a = n;
            j = l.m_sweep.c.x + a;
            n = l.m_sweep.c.y + c;
            var g = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x,
                b = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y;
            this.m_u1.Set(h.m_sweep.c.x + o - (this.m_ground.m_xf.position.x + this.m_groundAnchor1.x), h.m_sweep.c.y + q - (this.m_ground.m_xf.position.y + this.m_groundAnchor1.y));
            this.m_u2.Set(j - g, n - b);
            j = this.m_u1.Length();
            n = this.m_u2.Length();
            j > F.b2_linearSlop ? this.m_u1.Multiply(1 / j) : this.m_u1.SetZero();
            n > F.b2_linearSlop ? this.m_u2.Multiply(1 / n) : this.m_u2.SetZero();
            if (this.m_constant - j - this.m_ratio * n > 0) {
                this.m_state = I.e_inactiveLimit;
                this.m_impulse = 0
            } else this.m_state = I.e_atUpperLimit; if (j < this.m_maxLength1) {
                this.m_limitState1 = I.e_inactiveLimit;
                this.m_limitImpulse1 = 0
            } else this.m_limitState1 = I.e_atUpperLimit; if (n < this.m_maxLength2) {
                this.m_limitState2 = I.e_inactiveLimit;
                this.m_limitImpulse2 = 0
            } else this.m_limitState2 = I.e_atUpperLimit;
            j = o * this.m_u1.y - q * this.m_u1.x;
            n = a * this.m_u2.y - c * this.m_u2.x;
            this.m_limitMass1 = h.m_invMass + h.m_invI * j * j;
            this.m_limitMass2 = l.m_invMass + l.m_invI * n * n;
            this.m_pulleyMass = this.m_limitMass1 + this.m_ratio * this.m_ratio * this.m_limitMass2;
            this.m_limitMass1 = 1 / this.m_limitMass1;
            this.m_limitMass2 = 1 / this.m_limitMass2;
            this.m_pulleyMass = 1 / this.m_pulleyMass;
            if (d.warmStarting) {
                this.m_impulse *= d.dtRatio;
                this.m_limitImpulse1 *= d.dtRatio;
                this.m_limitImpulse2 *= d.dtRatio;
                d = (-this.m_impulse - this.m_limitImpulse1) * this.m_u1.x;
                j = (-this.m_impulse - this.m_limitImpulse1) * this.m_u1.y;
                n = (-this.m_ratio * this.m_impulse - this.m_limitImpulse2) * this.m_u2.x;
                g = (-this.m_ratio * this.m_impulse - this.m_limitImpulse2) * this.m_u2.y;
                h.m_linearVelocity.x += h.m_invMass * d;
                h.m_linearVelocity.y += h.m_invMass * j;
                h.m_angularVelocity += h.m_invI * (o * j - q * d);
                l.m_linearVelocity.x += l.m_invMass * n;
                l.m_linearVelocity.y += l.m_invMass * g;
                l.m_angularVelocity += l.m_invI * (a * g - c * n)
            } else this.m_limitImpulse2 = this.m_limitImpulse1 = this.m_impulse = 0
    };
    E.prototype.SolveVelocityConstraints = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l;
        l = d.m_xf.R;
        var j = this.m_localAnchor1.x - d.m_sweep.localCenter.x,
            o = this.m_localAnchor1.y - d.m_sweep.localCenter.y,
            q = l.col1.x * j + l.col2.x * o;
        o = l.col1.y * j + l.col2.y * o;
        j = q;
        l = h.m_xf.R;
        var n = this.m_localAnchor2.x - h.m_sweep.localCenter.x,
            a = this.m_localAnchor2.y - h.m_sweep.localCenter.y;
        q = l.col1.x * n + l.col2.x * a;
        a = l.col1.y * n + l.col2.y * a;
        n = q;
        var c = q = l = 0,
            g = 0;
        l = g = l = g = c = q = l = 0;
        if (this.m_state == I.e_atUpperLimit) {
            l = d.m_linearVelocity.x + -d.m_angularVelocity * o;
            q = d.m_linearVelocity.y + d.m_angularVelocity * j;
            c = h.m_linearVelocity.x + -h.m_angularVelocity * a;
            g = h.m_linearVelocity.y + h.m_angularVelocity * n;
            l = -(this.m_u1.x * l + this.m_u1.y * q) - this.m_ratio * (this.m_u2.x * c + this.m_u2.y * g);
            g = this.m_pulleyMass * -l;
            l = this.m_impulse;
            this.m_impulse = y.Max(0, this.m_impulse + g);
            g = this.m_impulse - l;
            l = -g * this.m_u1.x;
            q = -g * this.m_u1.y;
            c = -this.m_ratio * g * this.m_u2.x;
            g = -this.m_ratio * g * this.m_u2.y;
            d.m_linearVelocity.x += d.m_invMass * l;
            d.m_linearVelocity.y += d.m_invMass * q;
            d.m_angularVelocity += d.m_invI * (j * q - o * l);
            h.m_linearVelocity.x += h.m_invMass * c;
            h.m_linearVelocity.y += h.m_invMass * g;
            h.m_angularVelocity += h.m_invI * (n * g - a * c)
        }
        if (this.m_limitState1 == I.e_atUpperLimit) {
            l = d.m_linearVelocity.x + -d.m_angularVelocity * o;
            q = d.m_linearVelocity.y + d.m_angularVelocity * j;
            l = -(this.m_u1.x * l + this.m_u1.y * q);
            g = -this.m_limitMass1 * l;
            l = this.m_limitImpulse1;
            this.m_limitImpulse1 = y.Max(0, this.m_limitImpulse1 + g);
            g = this.m_limitImpulse1 - l;
            l = -g * this.m_u1.x;
            q = -g * this.m_u1.y;
            d.m_linearVelocity.x += d.m_invMass * l;
            d.m_linearVelocity.y += d.m_invMass * q;
            d.m_angularVelocity += d.m_invI * (j * q - o * l)
        }
        if (this.m_limitState2 == I.e_atUpperLimit) {
            c = h.m_linearVelocity.x + -h.m_angularVelocity * a;
            g = h.m_linearVelocity.y + h.m_angularVelocity * n;
            l = -(this.m_u2.x * c + this.m_u2.y * g);
            g = -this.m_limitMass2 * l;
            l = this.m_limitImpulse2;
            this.m_limitImpulse2 = y.Max(0, this.m_limitImpulse2 + g);
            g = this.m_limitImpulse2 - l;
            c = -g * this.m_u2.x;
            g = -g * this.m_u2.y;
            h.m_linearVelocity.x += h.m_invMass * c;
            h.m_linearVelocity.y += h.m_invMass * g;
            h.m_angularVelocity += h.m_invI * (n * g - a * c)
        }
    };
    E.prototype.SolvePositionConstraints = function () {
        var d = this.m_bodyA,
            h = this.m_bodyB,
            l, j = this.m_ground.m_xf.position.x + this.m_groundAnchor1.x,
            o = this.m_ground.m_xf.position.y + this.m_groundAnchor1.y,
            q = this.m_ground.m_xf.position.x + this.m_groundAnchor2.x,
            n = this.m_ground.m_xf.position.y + this.m_groundAnchor2.y,
            a = 0,
            c = 0,
            g = 0,
            b = 0,
            e = l = 0,
            f = 0,
            m = 0,
            r = e = m = l = e = l = 0;
        if (this.m_state == I.e_atUpperLimit) {
            l = d.m_xf.R;
            a = this.m_localAnchor1.x - d.m_sweep.localCenter.x;
            c = this.m_localAnchor1.y - d.m_sweep.localCenter.y;
            e = l.col1.x * a + l.col2.x * c;
            c = l.col1.y * a + l.col2.y * c;
            a = e;
            l = h.m_xf.R;
            g = this.m_localAnchor2.x - h.m_sweep.localCenter.x;
            b = this.m_localAnchor2.y - h.m_sweep.localCenter.y;
            e = l.col1.x * g + l.col2.x * b;
            b = l.col1.y * g + l.col2.y * b;
            g = e;
            l = d.m_sweep.c.x + a;
            e = d.m_sweep.c.y + c;
            f = h.m_sweep.c.x + g;
            m = h.m_sweep.c.y + b;
            this.m_u1.Set(l - j, e - o);
            this.m_u2.Set(f - q, m - n);
            l = this.m_u1.Length();
            e = this.m_u2.Length();
            l > F.b2_linearSlop ? this.m_u1.Multiply(1 / l) : this.m_u1.SetZero();
            e > F.b2_linearSlop ? this.m_u2.Multiply(1 / e) : this.m_u2.SetZero();
            l = this.m_constant - l - this.m_ratio * e;
            r = y.Max(r, -l);
            l = y.Clamp(l + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0);
            m = -this.m_pulleyMass * l;
            l = -m * this.m_u1.x;
            e = -m * this.m_u1.y;
            f = -this.m_ratio * m * this.m_u2.x;
            m = -this.m_ratio * m * this.m_u2.y;
            d.m_sweep.c.x += d.m_invMass * l;
            d.m_sweep.c.y += d.m_invMass * e;
            d.m_sweep.a += d.m_invI * (a * e - c * l);
            h.m_sweep.c.x += h.m_invMass * f;
            h.m_sweep.c.y += h.m_invMass * m;
            h.m_sweep.a += h.m_invI * (g * m - b * f);
            d.SynchronizeTransform();
            h.SynchronizeTransform()
        }
        if (this.m_limitState1 == I.e_atUpperLimit) {
            l = d.m_xf.R;
            a = this.m_localAnchor1.x - d.m_sweep.localCenter.x;
            c = this.m_localAnchor1.y - d.m_sweep.localCenter.y;
            e = l.col1.x * a + l.col2.x * c;
            c = l.col1.y * a + l.col2.y * c;
            a = e;
            l = d.m_sweep.c.x + a;
            e = d.m_sweep.c.y + c;
            this.m_u1.Set(l - j, e - o);
            l = this.m_u1.Length();
            if (l > F.b2_linearSlop) {
                this.m_u1.x *= 1 / l;
                this.m_u1.y *= 1 / l
            } else this.m_u1.SetZero();
            l = this.m_maxLength1 - l;
            r = y.Max(r, -l);
            l = y.Clamp(l + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0);
            m = -this.m_limitMass1 * l;
            l = -m * this.m_u1.x;
            e = -m * this.m_u1.y;
            d.m_sweep.c.x += d.m_invMass * l;
            d.m_sweep.c.y += d.m_invMass * e;
            d.m_sweep.a += d.m_invI * (a * e - c * l);
            d.SynchronizeTransform()
        }
        if (this.m_limitState2 == I.e_atUpperLimit) {
            l = h.m_xf.R;
            g = this.m_localAnchor2.x - h.m_sweep.localCenter.x;
            b = this.m_localAnchor2.y - h.m_sweep.localCenter.y;
            e = l.col1.x * g + l.col2.x * b;
            b = l.col1.y * g + l.col2.y * b;
            g = e;
            f = h.m_sweep.c.x + g;
            m = h.m_sweep.c.y + b;
            this.m_u2.Set(f - q, m - n);
            e = this.m_u2.Length();
            if (e > F.b2_linearSlop) {
                this.m_u2.x *= 1 / e;
                this.m_u2.y *= 1 / e
            } else this.m_u2.SetZero();
            l = this.m_maxLength2 - e;
            r = y.Max(r, -l);
            l = y.Clamp(l + F.b2_linearSlop, -F.b2_maxLinearCorrection, 0);
            m = -this.m_limitMass2 * l;
            f = -m * this.m_u2.x;
            m = -m * this.m_u2.y;
            h.m_sweep.c.x += h.m_invMass * f;
            h.m_sweep.c.y += h.m_invMass * m;
            h.m_sweep.a += h.m_invI * (g * m - b * f);
            h.SynchronizeTransform()
        }
        return r < F.b2_linearSlop
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.Joints.b2PulleyJoint.b2_minPulleyLength = 2
    });
    Box2D.inherit(R, Box2D.Dynamics.Joints.b2JointDef);
    R.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
    R.b2PulleyJointDef = function () {
            Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
            this.groundAnchorA = new w;
            this.groundAnchorB = new w;
            this.localAnchorA = new w;
            this.localAnchorB = new w
    };
    R.prototype.b2PulleyJointDef = function () {
        this.__super.b2JointDef.call(this);
        this.type = I.e_pulleyJoint;
        this.groundAnchorA.Set(-1, 1);
        this.groundAnchorB.Set(1, 1);
        this.localAnchorA.Set(-1, 0);
        this.localAnchorB.Set(1, 0);
        this.maxLengthB = this.lengthB = this.maxLengthA = this.lengthA = 0;
        this.ratio = 1;
        this.collideConnected = true
    };
    R.prototype.Initialize = function (d, h, l, j, o, q, n) {
            if (n === undefined) n = 0;
            this.bodyA = d;
            this.bodyB = h;
            this.groundAnchorA.SetV(l);
            this.groundAnchorB.SetV(j);
            this.localAnchorA = this.bodyA.GetLocalPoint(o);
            this.localAnchorB = this.bodyB.GetLocalPoint(q);
            d = o.x - l.x;
            l = o.y - l.y;
            this.lengthA = Math.sqrt(d * d + l * l);
            l = q.x - j.x;
            j = q.y - j.y;
            this.lengthB = Math.sqrt(l * l + j * j);
            this.ratio = n;
            n = this.lengthA + this.ratio * this.lengthB;
            this.maxLengthA = n - this.ratio * E.b2_minPulleyLength;
            this.maxLengthB = (n - E.b2_minPulleyLength) / this.ratio
    };
    Box2D.inherit(N, Box2D.Dynamics.Joints.b2Joint);
    N.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
    N.b2RevoluteJoint = function () {
        Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
        this.K = new G;
        this.K1 = new G;
        this.K2 = new G;
        this.K3 = new G;
        this.impulse3 = new A;
        this.impulse2 = new w;
        this.reduced = new w;
        this.m_localAnchor1 = new w;
        this.m_localAnchor2 = new w;
        this.m_impulse = new A;
        this.m_mass = new K
    };
    N.prototype.GetAnchorA = function () {
        return this.m_bodyA.GetWorldPoint(this.m_localAnchor1)
    };
    N.prototype.GetAnchorB = function () {
        return this.m_bodyB.GetWorldPoint(this.m_localAnchor2)
    };
    N.prototype.GetReactionForce = function (d) {
        if (d === undefined) d = 0;
        return new w(d * this.m_impulse.x, d * this.m_impulse.y)
    };
    N.prototype.GetReactionTorque = function (d) {
        if (d === undefined) d = 0;
        return d * this.m_impulse.z
    };
    N.prototype.GetJointAngle = function () {
        return this.m_bodyB.m_sweep.a - this.m_bodyA.m_sweep.a - this.m_referenceAngle
    };
    N.prototype.GetJointSpeed = function () {
        return this.m_bodyB.m_angularVelocity - this.m_bodyA.m_angularVelocity
    };
    N.prototype.IsLimitEnabled = function () {
        return this.m_enableLimit
    };
    N.prototype.EnableLimit = function (d) {
            this.m_enableLimit = d
    };
    N.prototype.GetLowerLimit = function () {
        return this.m_lowerAngle
    };
    N.prototype.GetUpperLimit = function () {
        return this.m_upperAngle
    };
    N.prototype.SetLimits = function (d, h) {
        if (d === undefined) d = 0;
        if (h === undefined) h = 0;
        this.m_lowerAngle = d;
        this.m_upperAngle = h
    };
    N.prototype.IsMotorEnabled = function () {
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        return this.m_enableMotor
    };
    N.prototype.EnableMotor = function (d) {
        this.m_enableMotor = d
    };
    N.prototype.SetMotorSpeed = function (d) {
        if (d === undefined) d = 0;
        this.m_bodyA.SetAwake(true);
        this.m_bodyB.SetAwake(true);
        this.m_motorSpeed = d
    };
    N.prototype.GetMotorSpeed = function () {
        return this.m_motorSpeed
    };
    N.prototype.SetMaxMotorTorque = function (d) {
        if (d === undefined) d = 0;
        this.m_maxMotorTorque = d
    };
    N.prototype.GetMotorTorque = function () {
        return this.m_maxMotorTorque
    };
    N.prototype.b2RevoluteJoint = function (d) {
        this.__super.b2Joint.call(this, d);
        this.m_localAnchor1.SetV(d.localAnchorA);
        this.m_localAnchor2.SetV(d.localAnchorB);
        this.m_referenceAngle = d.referenceAngle;
        this.m_impulse.SetZero();
        this.m_motorImpulse = 0;
        this.m_lowerAngle = d.lowerAngle;
        this.m_upperAngle = d.upperAngle;
        this.m_maxMotorTorque = d.maxMotorTorque;
        this.m_motorSpeed = d.motorSpeed;
        this.m_enableLimit = d.enableLimit;
        this.m_enableMotor = d.enableMotor;
        this.m_limitState = I.e_inactiveLimit
    };
    N.prototype.InitVelocityConstraints = function (d) {
        var h = this.m_bodyA,
            l = this.m_bodyB,
            j, o = 0;
        j = h.m_xf.R;
        var q = this.m_localAnchor1.x - h.m_sweep.localCenter.x,
            n = this.m_localAnchor1.y - h.m_sweep.localCenter.y;
        o = j.col1.x * q + j.col2.x * n;
        n = j.col1.y * q + j.col2.y * n;
        q = o;
        j = l.m_xf.R;
        var a = this.m_localAnchor2.x - l.m_sweep.localCenter.x,
            c = this.m_localAnchor2.y - l.m_sweep.localCenter.y;
        o = j.col1.x * a + j.col2.x * c;
        c = j.col1.y * a + j.col2.y * c;
        a = o;
        j = h.m_invMass;
        o = l.m_invMass;
        var g = h.m_invI,
            b = l.m_invI;
        this.m_mass.col1.x = j + o + n * n * g + c * c * b;
        this.m_mass.col2.x = -n * q * g - c * a * b;
        this.m_mass.col3.x = -n * g - c * b;
        this.m_mass.col1.y = this.m_mass.col2.x;
        this.m_mass.col2.y = j + o + q * q * g + a * a * b;
        this.m_mass.col3.y = q * g + a * b;
        this.m_mass.col1.z = this.m_mass.col3.x;
        this.m_mass.col2.z = this.m_mass.col3.y;
        this.m_mass.col3.z = g + b;
        this.m_motorMass = 1 / (g + b);
        if (this.m_enableMotor == false) this.m_motorImpulse = 0;
        if (this.m_enableLimit) {
            var e = l.m_sweep.a - h.m_sweep.a - this.m_referenceAngle;
            if (y.Abs(this.m_upperAngle - this.m_lowerAngle) < 2 * F.b2_angularSlop) this.m_limitState = I.e_equalLimits;
            else if (e <= this.m_lowerAngle) {
                if (this.m_limitState != I.e_atLowerLimit) this.m_impulse.z = 0;
                this.m_limitState = I.e_atLowerLimit
            } else if (e >= this.m_upperAngle) {
                if (this.m_limitState != I.e_atUpperLimit) this.m_impulse.z = 0;
                this.m_limitState = I.e_atUpperLimit
            } else {
                this.m_limitState = I.e_inactiveLimit;
                this.m_impulse.z = 0
            }
        } else this.m_limitState = I.e_inactiveLimit; if (d.warmStarting) {
            this.m_impulse.x *= d.dtRatio;
            this.m_impulse.y *= d.dtRatio;
            this.m_motorImpulse *= d.dtRatio;
            d = this.m_impulse.x;
            e = this.m_impulse.y;
            h.m_linearVelocity.x -= j * d;
            h.m_linearVelocity.y -= j * e;
            h.m_angularVelocity -= g * (q * e - n * d + this.m_motorImpulse + this.m_impulse.z);
            l.m_linearVelocity.x += o * d;
            l.m_linearVelocity.y += o * e;
            l.m_angularVelocity += b * (a * e - c * d + this.m_motorImpulse + this.m_impulse.z)
        } else {
            this.m_impulse.SetZero();
            this.m_motorImpulse = 0
        }
    };
    N.prototype.SolveVelocityConstraints = function (d) {
        var h = this.m_bodyA,
            l = this.m_bodyB,
            j = 0,
            o = j = 0,
            q = 0,
            n = 0,
            a = 0,
            c = h.m_linearVelocity,
            g = h.m_angularVelocity,
            b = l.m_linearVelocity,
            e = l.m_angularVelocity,
            f = h.m_invMass,
            m = l.m_invMass,
            r = h.m_invI,
            s = l.m_invI;
        if (this.m_enableMotor && this.m_limitState != I.e_equalLimits) {
            o = this.m_motorMass * -(e - g - this.m_motorSpeed);
            q = this.m_motorImpulse;
            n = d.dt * this.m_maxMotorTorque;
            this.m_motorImpulse = y.Clamp(this.m_motorImpulse + o, -n, n);
            o = this.m_motorImpulse - q;
            g -= r * o;
            e += s * o
        }
        if (this.m_enableLimit && this.m_limitState != I.e_inactiveLimit) {
            d = h.m_xf.R;
            o = this.m_localAnchor1.x - h.m_sweep.localCenter.x;
            q = this.m_localAnchor1.y - h.m_sweep.localCenter.y;
            j = d.col1.x * o + d.col2.x * q;
            q = d.col1.y * o + d.col2.y * q;
            o = j;
            d = l.m_xf.R;
            n = this.m_localAnchor2.x - l.m_sweep.localCenter.x;
            a = this.m_localAnchor2.y - l.m_sweep.localCenter.y;
            j = d.col1.x * n + d.col2.x * a;
            a = d.col1.y * n + d.col2.y * a;
            n = j;
            d = b.x + -e * a - c.x - -g * q;
            var v = b.y + e * n - c.y - g * o;
            this.m_mass.Solve33(this.impulse3, -d, -v, -(e - g));
            if (this.m_limitState == I.e_equalLimits) this.m_impulse.Add(this.impulse3);
            else if (this.m_limitState == I.e_atLowerLimit) {
                j = this.m_impulse.z + this.impulse3.z;
                if (j < 0) {
                    this.m_mass.Solve22(this.reduced, -d, -v);
                    this.impulse3.x = this.reduced.x;
                    this.impulse3.y = this.reduced.y;
                    this.impulse3.z = -this.m_impulse.z;
                    this.m_impulse.x += this.reduced.x;
                    this.m_impulse.y += this.reduced.y;
                    this.m_impulse.z = 0
                }
            } else if (this.m_limitState == I.e_atUpperLimit) {
                j = this.m_impulse.z + this.impulse3.z;
                if (j > 0) {
                    this.m_mass.Solve22(this.reduced, -d, -v);
                    this.impulse3.x = this.reduced.x;
                    this.impulse3.y = this.reduced.y;
                    this.impulse3.z = -this.m_impulse.z;
                    this.m_impulse.x += this.reduced.x;
                    this.m_impulse.y += this.reduced.y;
                    this.m_impulse.z = 0
                }
            }
            c.x -= f * this.impulse3.x;
            c.y -= f * this.impulse3.y;
            g -= r * (o * this.impulse3.y - q * this.impulse3.x + this.impulse3.z);
            b.x += m * this.impulse3.x;
            b.y += m * this.impulse3.y;
            e += s * (n * this.impulse3.y - a * this.impulse3.x + this.impulse3.z)
        } else {
            d = h.m_xf.R;
            o = this.m_localAnchor1.x - h.m_sweep.localCenter.x;
            q = this.m_localAnchor1.y - h.m_sweep.localCenter.y;
            j = d.col1.x * o + d.col2.x * q;
            q = d.col1.y * o + d.col2.y * q;
            o = j;
            d = l.m_xf.R;
            n = this.m_localAnchor2.x - l.m_sweep.localCenter.x;
            a = this.m_localAnchor2.y - l.m_sweep.localCenter.y;
            j = d.col1.x * n + d.col2.x * a;
            a = d.col1.y * n + d.col2.y * a;
            n = j;
            this.m_mass.Solve22(this.impulse2, -(b.x + -e * a - c.x - -g * q), -(b.y + e * n - c.y - g * o));
            this.m_impulse.x += this.impulse2.x;
            this.m_impulse.y += this.impulse2.y;
            c.x -= f * this.impulse2.x;
            c.y -= f * this.impulse2.y;
            g -= r * (o * this.impulse2.y - q * this.impulse2.x);
            b.x += m * this.impulse2.x;
            b.y += m * this.impulse2.y;
            e += s * (n * this.impulse2.y - a * this.impulse2.x)
        }
        h.m_linearVelocity.SetV(c);
        h.m_angularVelocity = g;
        l.m_linearVelocity.SetV(b);
        l.m_angularVelocity = e
    };
    N.prototype.SolvePositionConstraints = function () {
        var d = 0,
            h, l = this.m_bodyA,
            j = this.m_bodyB,
            o = 0,
            q = h = 0,
            n = 0,
            a = 0;
        if (this.m_enableLimit && this.m_limitState != I.e_inactiveLimit) {
            d = j.m_sweep.a - l.m_sweep.a - this.m_referenceAngle;
            var c = 0;
            if (this.m_limitState == I.e_equalLimits) {
                d = y.Clamp(d - this.m_lowerAngle, -F.b2_maxAngularCorrection, F.b2_maxAngularCorrection);
                c = -this.m_motorMass * d;
                o = y.Abs(d)
            } else if (this.m_limitState == I.e_atLowerLimit) {
                d = d - this.m_lowerAngle;
                o = -d;
                d = y.Clamp(d + F.b2_angularSlop, -F.b2_maxAngularCorrection, 0);
                c = -this.m_motorMass * d
            } else if (this.m_limitState == I.e_atUpperLimit) {
                o = d = d - this.m_upperAngle;
                d = y.Clamp(d - F.b2_angularSlop, 0, F.b2_maxAngularCorrection);
                c = -this.m_motorMass * d
            }
            l.m_sweep.a -= l.m_invI * c;
            j.m_sweep.a += j.m_invI * c;
            l.SynchronizeTransform();
            j.SynchronizeTransform()
        }
        h = l.m_xf.R;
        c = this.m_localAnchor1.x - l.m_sweep.localCenter.x;
        d = this.m_localAnchor1.y - l.m_sweep.localCenter.y;
        q = h.col1.x * c + h.col2.x * d;
        d = h.col1.y * c + h.col2.y * d;
        c = q;
        h = j.m_xf.R;
        var g = this.m_localAnchor2.x - j.m_sweep.localCenter.x,
            b = this.m_localAnchor2.y - j.m_sweep.localCenter.y;
        q = h.col1.x * g + h.col2.x * b;
        b = h.col1.y * g + h.col2.y * b;
        g = q;
        n = j.m_sweep.c.x + g - l.m_sweep.c.x - c;
        a = j.m_sweep.c.y + b - l.m_sweep.c.y - d;
        var e = n * n + a * a;
        h = Math.sqrt(e);
        q = l.m_invMass;
        var f = j.m_invMass,
            m = l.m_invI,
            r = j.m_invI,
            s = 10 * F.b2_linearSlop;
        if (e > s * s) {
            e = 1 / (q + f);
            n = e * -n;
            a = e * -a;
            l.m_sweep.c.x -= 0.5 * q * n;
            l.m_sweep.c.y -= 0.5 * q * a;
            j.m_sweep.c.x += 0.5 * f * n;
            j.m_sweep.c.y += 0.5 * f * a;
            n = j.m_sweep.c.x + g - l.m_sweep.c.x - c;
            a = j.m_sweep.c.y + b - l.m_sweep.c.y - d
        }
        this.K1.col1.x = q + f;
        this.K1.col2.x = 0;
        this.K1.col1.y = 0;
        this.K1.col2.y = q + f;
        this.K2.col1.x = m * d * d;
        this.K2.col2.x = -m * c * d;
        this.K2.col1.y = -m * c * d;
        this.K2.col2.y = m * c * c;
        this.K3.col1.x = r * b * b;
        this.K3.col2.x = -r * g * b;
        this.K3.col1.y = -r * g * b;
        this.K3.col2.y = r * g * g;
        this.K.SetM(this.K1);
        this.K.AddM(this.K2);
        this.K.AddM(this.K3);
        this.K.Solve(N.tImpulse, -n, -a);
        n = N.tImpulse.x;
        a = N.tImpulse.y;
        l.m_sweep.c.x -= l.m_invMass * n;
        l.m_sweep.c.y -= l.m_invMass * a;
        l.m_sweep.a -= l.m_invI * (c * a - d * n);
        j.m_sweep.c.x += j.m_invMass * n;
        j.m_sweep.c.y += j.m_invMass * a;
        j.m_sweep.a += j.m_invI * (g * a - b * n);
        l.SynchronizeTransform();
        j.SynchronizeTransform();
        return h <= F.b2_linearSlop && o <= F.b2_angularSlop
    };
    Box2D.postDefs.push(function () {
        Box2D.Dynamics.Joints.b2RevoluteJoint.tImpulse = new w
    });
    Box2D.inherit(S, Box2D.Dynamics.Joints.b2JointDef);
    S.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
    S.b2RevoluteJointDef = function () {
        Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
        this.localAnchorA = new w;
        this.localAnchorB = new w
    };
    S.prototype.b2RevoluteJointDef = function () {
        this.__super.b2JointDef.call(this);
        this.type = I.e_revoluteJoint;
        this.localAnchorA.Set(0, 0);
        this.localAnchorB.Set(0, 0);
        this.motorSpeed = this.maxMotorTorque = this.upperAngle = this.lowerAngle = this.referenceAngle = 0;
        this.enableMotor = this.enableLimit = false
    };
    S.prototype.Initialize = function (d, h, l) {
        this.bodyA = d;
        this.bodyB = h;
        this.localAnchorA = this.bodyA.GetLocalPoint(l);
        this.localAnchorB = this.bodyB.GetLocalPoint(l);
        this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle()
    };
    Box2D.inherit(aa, Box2D.Dynamics.Joints.b2Joint);
    aa.prototype.__super = Box2D.Dynamics.Joints.b2Joint.prototype;
    aa.b2WeldJoint = function () {
        Box2D.Dynamics.Joints.b2Joint.b2Joint.apply(this, arguments);
        this.m_localAnchorA = new w;
        this.m_localAnchorB = new w;
        this.m_impulse = new A;
        this.m_mass = new K
    };
    aa.prototype.GetAnchorA = function () {
        return this.m_bodyA.GetWorldPoint(this.m_localAnchorA)
    };
    aa.prototype.GetAnchorB = function () {
        return this.m_bodyB.GetWorldPoint(this.m_localAnchorB)
    };
    aa.prototype.GetReactionForce = function (d) {
            if (d === undefined) d = 0;
            return new w(d * this.m_impulse.x, d * this.m_impulse.y)
    };
    aa.prototype.GetReactionTorque = function (d) {
        if (d === undefined) d = 0;
        return d * this.m_impulse.z
    };
    aa.prototype.b2WeldJoint = function (d) {
        this.__super.b2Joint.call(this, d);
        this.m_localAnchorA.SetV(d.localAnchorA);
        this.m_localAnchorB.SetV(d.localAnchorB);
        this.m_referenceAngle = d.referenceAngle;
        this.m_impulse.SetZero();
        this.m_mass = new K
    };
    aa.prototype.InitVelocityConstraints = function (d) {
        var h, l = 0,
            j = this.m_bodyA,
            o = this.m_bodyB;
        h = j.m_xf.R;
        var q = this.m_localAnchorA.x - j.m_sweep.localCenter.x,
            n = this.m_localAnchorA.y - j.m_sweep.localCenter.y;
        l = h.col1.x * q + h.col2.x * n;
        n = h.col1.y * q + h.col2.y * n;
        q = l;
        h = o.m_xf.R;
        var a = this.m_localAnchorB.x - o.m_sweep.localCenter.x,
            c = this.m_localAnchorB.y - o.m_sweep.localCenter.y;
        l = h.col1.x * a + h.col2.x * c;
        c = h.col1.y * a + h.col2.y * c;
        a = l;
        h = j.m_invMass;
        l = o.m_invMass;
        var g = j.m_invI,
            b = o.m_invI;
        this.m_mass.col1.x = h + l + n * n * g + c * c * b;
        this.m_mass.col2.x = -n * q * g - c * a * b;
        this.m_mass.col3.x = -n * g - c * b;
        this.m_mass.col1.y = this.m_mass.col2.x;
        this.m_mass.col2.y = h + l + q * q * g + a * a * b;
        this.m_mass.col3.y = q * g + a * b;
        this.m_mass.col1.z = this.m_mass.col3.x;
        this.m_mass.col2.z = this.m_mass.col3.y;
        this.m_mass.col3.z = g + b;
        if (d.warmStarting) {
            this.m_impulse.x *= d.dtRatio;
            this.m_impulse.y *= d.dtRatio;
            this.m_impulse.z *= d.dtRatio;
            j.m_linearVelocity.x -= h * this.m_impulse.x;
            j.m_linearVelocity.y -= h * this.m_impulse.y;
            j.m_angularVelocity -= g * (q * this.m_impulse.y - n * this.m_impulse.x + this.m_impulse.z);
            o.m_linearVelocity.x += l * this.m_impulse.x;
            o.m_linearVelocity.y += l * this.m_impulse.y;
            o.m_angularVelocity += b * (a * this.m_impulse.y - c * this.m_impulse.x + this.m_impulse.z)
        } else this.m_impulse.SetZero()
    };
    aa.prototype.SolveVelocityConstraints = function () {
        var d, h = 0,
            l = this.m_bodyA,
            j = this.m_bodyB,
            o = l.m_linearVelocity,
            q = l.m_angularVelocity,
            n = j.m_linearVelocity,
            a = j.m_angularVelocity,
            c = l.m_invMass,
            g = j.m_invMass,
            b = l.m_invI,
            e = j.m_invI;
        d = l.m_xf.R;
        var f = this.m_localAnchorA.x - l.m_sweep.localCenter.x,
            m = this.m_localAnchorA.y - l.m_sweep.localCenter.y;
        h = d.col1.x * f + d.col2.x * m;
        m = d.col1.y * f + d.col2.y * m;
        f = h;
        d = j.m_xf.R;
        var r = this.m_localAnchorB.x - j.m_sweep.localCenter.x,
            s = this.m_localAnchorB.y - j.m_sweep.localCenter.y;
        h = d.col1.x * r + d.col2.x * s;
        s = d.col1.y * r + d.col2.y * s;
        r = h;
        d = n.x - a * s - o.x + q * m;
        h = n.y + a * r - o.y - q * f;
        var v = a - q,
            t = new A;
        this.m_mass.Solve33(t, -d, -h, -v);
        this.m_impulse.Add(t);
        o.x -= c * t.x;
        o.y -= c * t.y;
        q -= b * (f * t.y - m * t.x + t.z);
        n.x += g * t.x;
        n.y += g * t.y;
        a += e * (r * t.y - s * t.x + t.z);
        l.m_angularVelocity = q;
        j.m_angularVelocity = a
    };
    aa.prototype.SolvePositionConstraints = function () {
        var d, h = 0,
            l = this.m_bodyA,
            j = this.m_bodyB;
        d = l.m_xf.R;
        var o = this.m_localAnchorA.x - l.m_sweep.localCenter.x,
            q = this.m_localAnchorA.y - l.m_sweep.localCenter.y;
        h = d.col1.x * o + d.col2.x * q;
        q = d.col1.y * o + d.col2.y * q;
        o = h;
        d = j.m_xf.R;
        var n = this.m_localAnchorB.x - j.m_sweep.localCenter.x,
            a = this.m_localAnchorB.y - j.m_sweep.localCenter.y;
        h = d.col1.x * n + d.col2.x * a;
        a = d.col1.y * n + d.col2.y * a;
        n = h;
        d = l.m_invMass;
        h = j.m_invMass;
        var c = l.m_invI,
            g = j.m_invI,
            b = j.m_sweep.c.x + n - l.m_sweep.c.x - o,
            e = j.m_sweep.c.y + a - l.m_sweep.c.y - q,
            f = j.m_sweep.a - l.m_sweep.a - this.m_referenceAngle,
            m = 10 * F.b2_linearSlop,
            r = Math.sqrt(b * b + e * e),
            s = y.Abs(f);
        if (r > m) {
            c *= 1;
            g *= 1
        }
        this.m_mass.col1.x = d + h + q * q * c + a * a * g;
        this.m_mass.col2.x = -q * o * c - a * n * g;
        this.m_mass.col3.x = -q * c - a * g;
        this.m_mass.col1.y = this.m_mass.col2.x;
        this.m_mass.col2.y = d + h + o * o * c + n * n * g;
        this.m_mass.col3.y = o * c + n * g;
        this.m_mass.col1.z = this.m_mass.col3.x;
        this.m_mass.col2.z = this.m_mass.col3.y;
        this.m_mass.col3.z = c + g;
        m = new A;
        this.m_mass.Solve33(m, -b, -e, -f);
        l.m_sweep.c.x -= d * m.x;
        l.m_sweep.c.y -= d * m.y;
        l.m_sweep.a -= c * (o * m.y - q * m.x + m.z);
        j.m_sweep.c.x += h * m.x;
        j.m_sweep.c.y += h * m.y;
        j.m_sweep.a += g * (n * m.y - a * m.x + m.z);
        l.SynchronizeTransform();
        j.SynchronizeTransform();
        return r <= F.b2_linearSlop && s <= F.b2_angularSlop
    };
    Box2D.inherit(Z, Box2D.Dynamics.Joints.b2JointDef);
    Z.prototype.__super = Box2D.Dynamics.Joints.b2JointDef.prototype;
    Z.b2WeldJointDef = function () {
        Box2D.Dynamics.Joints.b2JointDef.b2JointDef.apply(this, arguments);
        this.localAnchorA = new w;
        this.localAnchorB = new w
    };
    Z.prototype.b2WeldJointDef = function () {
        this.__super.b2JointDef.call(this);
        this.type = I.e_weldJoint;
        this.referenceAngle = 0
    };
    Z.prototype.Initialize = function (d, h, l) {
        this.bodyA = d;
        this.bodyB = h;
        this.localAnchorA.SetV(this.bodyA.GetLocalPoint(l));
        this.localAnchorB.SetV(this.bodyB.GetLocalPoint(l));
        this.referenceAngle = this.bodyB.GetAngle() - this.bodyA.GetAngle()
    }
})();
(function () {
    var F = Box2D.Dynamics.b2DebugDraw;
    F.b2DebugDraw = function () {
        this.m_xformScale = this.m_fillAlpha = this.m_alpha = this.m_lineThickness = this.m_drawScale = 1;
        var G = this;
        this.m_sprite = {
            graphics: {
                clear: function () {
                    G.m_ctx.clearRect(0, 0, G.m_ctx.canvas.width, G.m_ctx.canvas.height)
                }
            }
        }
    };
    F.prototype._color = function (G, K) {
        return "rgba(" + ((G & 16711680) >> 16) + "," + ((G & 65280) >> 8) + "," + (G & 255) + "," + K + ")"
    };
    F.prototype.b2DebugDraw = function () {
        this.m_drawFlags = 0
    };
    F.prototype.SetFlags = function (G) {
        if (G === undefined) G = 0;
        this.m_drawFlags = G
    };
    F.prototype.GetFlags = function () {
        return this.m_drawFlags
    };
    F.prototype.AppendFlags = function (G) {
        if (G === undefined) G = 0;
        this.m_drawFlags |= G
    };
    F.prototype.ClearFlags = function (G) {
        if (G === undefined) G = 0;
        this.m_drawFlags &= ~G
    };
    F.prototype.SetSprite = function (G) {
        this.m_ctx = G
    };
    F.prototype.GetSprite = function () {
        return this.m_ctx
    };
    F.prototype.SetDrawScale = function (G) {
        if (G === undefined) G = 0;
        this.m_drawScale = G
    };
    F.prototype.GetDrawScale = function () {
        return this.m_drawScale
    };
    F.prototype.SetLineThickness = function (G) {
        if (G === undefined) G = 0;
        this.m_lineThickness = G;
        this.m_ctx.strokeWidth = G
    };
    F.prototype.GetLineThickness = function () {
        return this.m_lineThickness
    };
    F.prototype.SetAlpha = function (G) {
        if (G === undefined) G = 0;
        this.m_alpha = G
    };
    F.prototype.GetAlpha = function () {
        return this.m_alpha
    };
    F.prototype.SetFillAlpha = function (G) {
        if (G === undefined) G = 0;
        this.m_fillAlpha = G
    };
    F.prototype.GetFillAlpha = function () {
        return this.m_fillAlpha
    };
    F.prototype.SetXFormScale = function (G) {
        if (G === undefined) G = 0;
        this.m_xformScale = G
    };
    F.prototype.GetXFormScale = function () {
        return this.m_xformScale
    };
    F.prototype.DrawPolygon = function (G, K, y) {
        if (K) {
            var w = this.m_ctx,
                A = this.m_drawScale;
            w.beginPath();
            w.strokeStyle = this._color(y.color, this.m_alpha);
            w.moveTo(G[0].x * A, G[0].y * A);
            for (y = 1; y < K; y++) w.lineTo(G[y].x * A, G[y].y * A);
            w.lineTo(G[0].x * A, G[0].y * A);
            w.closePath();
            w.stroke()
        }
    };
    F.prototype.DrawSolidPolygon = function (G, K, y) {
        if (K) {
            var w = this.m_ctx,
                A = this.m_drawScale;
            w.beginPath();
            w.strokeStyle = this._color(y.color, this.m_alpha);
            w.fillStyle = this._color(y.color, this.m_fillAlpha);
            w.moveTo(G[0].x * A, G[0].y * A);
            for (y = 1; y < K; y++) w.lineTo(G[y].x * A, G[y].y * A);
            w.lineTo(G[0].x * A, G[0].y * A);
            w.closePath();
            w.fill();
            w.stroke()
        }
    };
    F.prototype.DrawCircle = function (G, K, y) {
        if (K) {
            var w = this.m_ctx,
                A = this.m_drawScale;
            w.beginPath();
            w.strokeStyle = this._color(y.color, this.m_alpha);
            w.arc(G.x * A, G.y * A, K * A, 0, Math.PI * 2, true);
            w.closePath();
            w.stroke()
        }
    };
    F.prototype.DrawSolidCircle = function (G, K, y, w) {
        if (K) {
            var A = this.m_ctx,
                U = this.m_drawScale,
                p = G.x * U,
                B = G.y * U;
            A.moveTo(0, 0);
            A.beginPath();
            A.strokeStyle = this._color(w.color, this.m_alpha);
            A.fillStyle = this._color(w.color, this.m_fillAlpha);
            A.arc(p, B, K * U, 0, Math.PI * 2, true);
            A.moveTo(p, B);
            A.lineTo((G.x + y.x * K) * U, (G.y + y.y * K) * U);
            A.closePath();
            A.fill();
            A.stroke()
        }
    };
    F.prototype.DrawSegment = function (G, K, y) {
        var w = this.m_ctx,
            A = this.m_drawScale;
        w.strokeStyle = this._color(y.color, this.m_alpha);
        w.beginPath();
        w.moveTo(G.x * A, G.y * A);
        w.lineTo(K.x * A, K.y * A);
        w.closePath();
        w.stroke()
    };
    F.prototype.DrawTransform = function (G) {
        var K = this.m_ctx,
            y = this.m_drawScale;
        K.beginPath();
        K.strokeStyle = this._color(16711680, this.m_alpha);
        K.moveTo(G.position.x * y, G.position.y * y);
        K.lineTo((G.position.x + this.m_xformScale * G.R.col1.x) * y, (G.position.y + this.m_xformScale * G.R.col1.y) * y);
        K.strokeStyle = this._color(65280, this.m_alpha);
        K.moveTo(G.position.x * y, G.position.y * y);
        K.lineTo((G.position.x + this.m_xformScale * G.R.col2.x) * y, (G.position.y + this.m_xformScale * G.R.col2.y) * y);
        K.closePath();
        K.stroke()
    }
})();
var i;
for (i = 0; i < Box2D.postDefs.length; ++i) Box2D.postDefs[i]();
delete Box2D.postDefs;

// Copyright 2013 the V8 project authors. All rights reserved.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

function MakeNewWorld () {
  var Vec2 = Box2D.Common.Math.b2Vec2,
      BodyDef = Box2D.Dynamics.b2BodyDef,
      Body = Box2D.Dynamics.b2Body,
      FixtureDef = Box2D.Dynamics.b2FixtureDef,
      Fixture = Box2D.Dynamics.b2Fixture,
      World = Box2D.Dynamics.b2World,
      MassData = Box2D.Collision.Shapes.b2MassData,
      PolygonShape = Box2D.Collision.Shapes.b2PolygonShape,
      CircleShape = Box2D.Collision.Shapes.b2CircleShape;

  var gravity = new Vec2(0, -10);
  var world = new World(gravity, true);

  var shape = new PolygonShape();
  shape.SetAsEdge(new Vec2(-40.0, 0), new Vec2(40.0, 0));

  var fd = new FixtureDef();
  fd.density = 0.0;
  fd.shape = shape;
  var bd = new BodyDef();
  var ground = world.CreateBody(bd);
  ground.CreateFixture(fd);

  var a = .5;
  var shape = new PolygonShape();
  shape.SetAsBox(a, a);

  var x = new Vec2(-7.0, 0.75);
  var y = new Vec2();
  var deltaX = new Vec2(0.5625, 1);
  var deltaY = new Vec2(1.125, 0.0);

  for (var i = 0; i < 10; ++i) {
    y.Set(x.x, x.y);

    for (var j = 0; j < 5; ++j) {
      var fd = new FixtureDef();
      fd.density = 5.0;
      fd.shape = shape;

      var bd = new BodyDef();
      bd.type = Body.b2_dynamicBody;
      bd.position.Set(y.x, y.y);
      var body = world.CreateBody(bd);
      body.CreateFixture(fd);
      y.Add(deltaY);
    }

    x.Add(deltaX);
  }

  return world;
}

var world = null;

var Box2DBenchmark = new BenchmarkSuite('Box2D', [5432788],
                                        [new Benchmark('Box2D',
                                                       false, 
                                                       false,
                                                       60,
                                                       runBox2D,
                                                       setupBox2D,
                                                       tearDownBox2D,
                                                       null,
                                                       8)]);

function runBox2D() {
  var world = MakeNewWorld();
  for (var i = 0; i < 20; i++) {
    world.Step(1 / 60, 10, 3);
  }
}

function setupBox2D() {
}

function tearDownBox2D() {
  world = null;
  Box2D = null;
}

////////////////////////////////////////////////////////////////////////////////
// Runner
////////////////////////////////////////////////////////////////////////////////

var success = true;

function NotifyStart(name) {
}

function NotifyError(name, error) {
  WScript.Echo(name + " : ERROR : " +error.stack);
  success = false;
}

function NotifyResult(name, score) {
  if (success) {
    WScript.Echo("### SCORE:", score);
  }
}

function NotifyScore(score) {
}

BenchmarkSuite.RunSuites({
        NotifyStart : NotifyStart,
    NotifyError : NotifyError,
    NotifyResult : NotifyResult,
    NotifyScore : NotifyScore
});

