library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;

class DeltaBlue extends core::Object {
  synthetic constructor •() → self::DeltaBlue
    ;
  method run() → void
    ;
}
class Strength extends core::Object /*hasConstConstructor*/  {
  final field core::int value;
  final field core::String name;
  const constructor •(core::int value, core::String name) → self::Strength
    : self::Strength::value = value, self::Strength::name = name, super core::Object::•()
    ;
  method nextWeaker() → self::Strength
    ;
  static method stronger(self::Strength s1, self::Strength s2) → core::bool
    ;
  static method weaker(self::Strength s1, self::Strength s2) → core::bool
    ;
  static method weakest(self::Strength s1, self::Strength s2) → self::Strength
    ;
  static method strongest(self::Strength s1, self::Strength s2) → self::Strength
    ;
}
abstract class Constraint extends core::Object /*hasConstConstructor*/  {
  final field self::Strength strength;
  const constructor •(self::Strength strength) → self::Constraint
    : self::Constraint::strength = strength, super core::Object::•()
    ;
  abstract method isSatisfied() → core::bool;
  abstract method markUnsatisfied() → void;
  abstract method addToGraph() → void;
  abstract method removeFromGraph() → void;
  abstract method chooseMethod(core::int mark) → void;
  abstract method markInputs(core::int mark) → void;
  abstract method inputsKnown(core::int mark) → core::bool;
  abstract method output() → self::Variable;
  abstract method execute() → void;
  abstract method recalculate() → void;
  method addConstraint() → void
    ;
  method satisfy(dynamic mark) → self::Constraint?
    ;
  method destroyConstraint() → void
    ;
  method isInput() → core::bool
    ;
}
abstract class UnaryConstraint extends self::Constraint {
  final field self::Variable myOutput;
  field core::bool satisfied;
  constructor •(self::Variable myOutput, self::Strength strength) → self::UnaryConstraint
    ;
  method addToGraph() → void
    ;
  method chooseMethod(core::int mark) → void
    ;
  method isSatisfied() → core::bool
    ;
  method markInputs(core::int mark) → void
    ;
  method output() → self::Variable
    ;
  method recalculate() → void
    ;
  method markUnsatisfied() → void
    ;
  method inputsKnown(core::int mark) → core::bool
    ;
  method removeFromGraph() → void
    ;
}
class StayConstraint extends self::UnaryConstraint {
  constructor •(self::Variable v, self::Strength str) → self::StayConstraint
    ;
  method execute() → void
    ;
}
class EditConstraint extends self::UnaryConstraint {
  constructor •(self::Variable v, self::Strength str) → self::EditConstraint
    ;
  method isInput() → core::bool
    ;
  method execute() → void
    ;
}
abstract class BinaryConstraint extends self::Constraint {
  field self::Variable v1;
  field self::Variable v2;
  field core::int direction;
  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::BinaryConstraint
    ;
  method chooseMethod(core::int mark) → void
    ;
  method addToGraph() → void
    ;
  method isSatisfied() → core::bool
    ;
  method markInputs(core::int mark) → void
    ;
  method input() → self::Variable
    ;
  method output() → self::Variable
    ;
  method recalculate() → void
    ;
  method markUnsatisfied() → void
    ;
  method inputsKnown(core::int mark) → core::bool
    ;
  method removeFromGraph() → void
    ;
}
class ScaleConstraint extends self::BinaryConstraint {
  final field self::Variable scale;
  final field self::Variable offset;
  constructor •(self::Variable src, self::Variable scale, self::Variable offset, self::Variable dest, self::Strength strength) → self::ScaleConstraint
    ;
  method addToGraph() → void
    ;
  method removeFromGraph() → void
    ;
  method markInputs(core::int mark) → void
    ;
  method execute() → void
    ;
  method recalculate() → void
    ;
}
class EqualityConstraint extends self::BinaryConstraint {
  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::EqualityConstraint
    ;
  method execute() → void
    ;
}
class Variable extends core::Object {
  field core::List<self::Constraint> constraints;
  field self::Constraint? determinedBy;
  field core::int mark;
  field self::Strength walkStrength;
  field core::bool stay;
  field core::int value;
  final field core::String name;
  constructor •(core::String name, core::int value) → self::Variable
    ;
  method addConstraint(self::Constraint c) → void
    ;
  method removeConstraint(self::Constraint c) → void
    ;
}
class Planner extends core::Object {
  field core::int currentMark;
  synthetic constructor •() → self::Planner
    ;
  method incrementalAdd(self::Constraint c) → void
    ;
  method incrementalRemove(self::Constraint c) → void
    ;
  method newMark() → core::int
    ;
  method makePlan(core::List<self::Constraint> sources) → self::Plan
    ;
  method extractPlanFromConstraints(core::List<self::Constraint> constraints) → self::Plan
    ;
  method addPropagate(self::Constraint c, core::int mark) → core::bool
    ;
  method removePropagateFrom(self::Variable out) → core::List<self::Constraint>
    ;
  method addConstraintsConsumingTo(self::Variable v, core::List<self::Constraint> coll) → void
    ;
}
class Plan extends core::Object {
  field core::List<self::Constraint> list;
  synthetic constructor •() → self::Plan
    ;
  method addConstraint(self::Constraint c) → void
    ;
  method size() → core::int
    ;
  method execute() → void
    ;
}
static const field self::Strength REQUIRED = const self::Strength::•(0, "required");
static const field self::Strength STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
static const field self::Strength PREFERRED = const self::Strength::•(2, "preferred");
static const field self::Strength STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
static const field self::Strength NORMAL = const self::Strength::•(4, "normal");
static const field self::Strength WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
static const field self::Strength WEAKEST = const self::Strength::•(6, "weakest");
static const field core::int NONE = 1;
static const field core::int FORWARD = 2;
static const field core::int BACKWARD = 0;
late static field self::Planner planner;
static method main() → dynamic
  ;
static method chainTest(core::int n) → void
  ;
static method projectionTest(core::int n) → void
  ;
static method change(self::Variable v, core::int newValue) → void
  ;


Extra constant evaluation status:
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:88:24 -> InstanceConstant(const Strength{Strength.value: 0, Strength.name: "required"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:89:32 -> InstanceConstant(const Strength{Strength.value: 1, Strength.name: "strongPreferred"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:90:25 -> InstanceConstant(const Strength{Strength.value: 2, Strength.name: "preferred"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:91:30 -> InstanceConstant(const Strength{Strength.value: 3, Strength.name: "strongDefault"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:92:22 -> InstanceConstant(const Strength{Strength.value: 4, Strength.name: "normal"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:93:28 -> InstanceConstant(const Strength{Strength.value: 5, Strength.name: "weakDefault"})
Evaluated: ConstructorInvocation @ org-dartlang-testcase:///DeltaBlue.dart:94:23 -> InstanceConstant(const Strength{Strength.value: 6, Strength.name: "weakest"})
Extra constant evaluation: evaluated: 10, effectively constant: 7
