'use strict';
const dart_sdk = require('dart_sdk');
const core = dart_sdk.core;
const dart = dart_sdk.dart;
const dartx = dart_sdk.dartx;
const _root = Object.create(null);
const node_modules = Object.create(_root);
let B = () => (B = dart.constFn(node_modules.B$()))();
let _B = () => (_B = dart.constFn(node_modules._B$()))();
let VoidTodynamic = () => (VoidTodynamic = dart.constFn(dart.fnType(dart.dynamic, [])))();
let VoidToString = () => (VoidToString = dart.constFn(dart.fnType(core.String, [])))();
node_modules.Callback = dart.typedef('Callback', () => dart.fnTypeFuzzy(dart.void, [], {i: core.int}));
node_modules.A = class A extends core.Object {};
(node_modules.A.new = function() {
}).prototype = node_modules.A.prototype;
dart.addTypeTests(node_modules.A);
node_modules._A = class _A extends core.Object {};
(node_modules._A.new = function() {
}).prototype = node_modules._A.prototype;
dart.addTypeTests(node_modules._A);
const _is_B_default = Symbol('_is_B_default');
node_modules.B$ = dart.generic(T => {
  class B extends core.Object {}
  (B.new = function() {
  }).prototype = B.prototype;
  dart.addTypeTests(B);
  B.prototype[_is_B_default] = true;
  return B;
});
node_modules.B = B();
dart.addTypeTests(node_modules.B, _is_B_default);
const _is__B_default = Symbol('_is__B_default');
node_modules._B$ = dart.generic(T => {
  class _B extends core.Object {}
  (_B.new = function() {
  }).prototype = _B.prototype;
  dart.addTypeTests(_B);
  _B.prototype[_is__B_default] = true;
  return _B;
});
node_modules._B = _B();
dart.addTypeTests(node_modules._B, _is__B_default);
node_modules.f = function() {
};
dart.fn(node_modules.f, VoidTodynamic());
node_modules._f = function() {
};
dart.fn(node_modules._f, VoidTodynamic());
dart.defineLazy(node_modules, {
  get constant() {
    return "abc";
  },
  get finalConstant() {
    return "abc";
  },
  get lazy() {
    return dart.fn(() => {
      core.print('lazy');
      return "abc";
    }, VoidToString())();
  },
  get mutable() {
    return "abc";
  },
  set mutable(_) {},
  get lazyMutable() {
    return dart.fn(() => {
      core.print('lazyMutable');
      return "abc";
    }, VoidToString())();
  },
  set lazyMutable(_) {}
});
dart.trackLibraries("node_modules", {
  "node_modules.dart": node_modules
}, null);
// Exports:
exports.node_modules = node_modules;
