|  | @@ -329,8 +329,10 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		function mixin(src, target, what) {
 | 
	
		
			
				|  |  |  			for (var keys = Object.keys(what||src), l=keys.length, i=0; i<l; ++i) {
 | 
	
		
			
				|  |  | -				var value = src[keys[i]];
 | 
	
		
			
				|  |  | -				if (typeof value !== "undefined") { target[keys[i]] = value; }
 | 
	
		
			
				|  |  | +				if (src == null) { target[keys[i]] = undefined; } else {
 | 
	
		
			
				|  |  | +					var value = src[keys[i]];
 | 
	
		
			
				|  |  | +					if (typeof value !== "undefined") { target[keys[i]] = value; }
 | 
	
		
			
				|  |  | +				}
 | 
	
		
			
				|  |  |  			}
 | 
	
		
			
				|  |  |  			return target;
 | 
	
		
			
				|  |  |  		}
 | 
	
	
		
			
				|  | @@ -341,13 +343,13 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		this.rebuild = function () {
 | 
	
		
			
				|  |  |  			Object.keys(backup).forEach(function (key) {
 | 
	
		
			
				|  |  | -				mixin({}, api, (backup[key]||0)[apiKey]);
 | 
	
		
			
				|  |  | +				mixin(null, api, (backup[key]||0)[apiKey]||{});
 | 
	
		
			
				|  |  |  			});
 | 
	
		
			
				|  |  |  			var oapi = mixin(api, {}), order = [], chk = {};
 | 
	
		
			
				|  |  |  			brikz.ensure = function(key) {
 | 
	
		
			
				|  |  |  				if (key in exclude) { return null; }
 | 
	
		
			
				|  |  |  				var b = brikz[key], bak = backup[key];
 | 
	
		
			
				|  |  | -				mixin({}, api, api);
 | 
	
		
			
				|  |  | +				mixin(null, api, api);
 | 
	
		
			
				|  |  |  				while (typeof b === "function") { b = new b(brikz, api, bak); }
 | 
	
		
			
				|  |  |  				if (b && !chk[key]) { chk[key]=true; order.push(b); }
 | 
	
		
			
				|  |  |  				if (b && !b[apiKey]) { b[apiKey] = mixin(api, {}); }
 | 
	
	
		
			
				|  | @@ -355,7 +357,7 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  			};
 | 
	
		
			
				|  |  |  			Object.keys(brikz).forEach(function (key) { brikz.ensure(key); });
 | 
	
		
			
				|  |  |  			brikz.ensure = null;
 | 
	
		
			
				|  |  | -			mixin(oapi, mixin({}, api, api));
 | 
	
		
			
				|  |  | +			mixin(oapi, mixin(null, api, api));
 | 
	
		
			
				|  |  |  			order.forEach(function(brik) { mixin(brik[apiKey] || {}, api); });
 | 
	
		
			
				|  |  |  			order.forEach(function(brik) { brik[initKey] && brik[initKey](); });
 | 
	
		
			
				|  |  |  			backup = mixin(brikz, {});
 | 
	
	
		
			
				|  | @@ -1432,8 +1434,8 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  	brikz.methods = MethodsBrik;
 | 
	
		
			
				|  |  |  	brikz.stInit = SmalltalkInitBrik;
 | 
	
		
			
				|  |  |  	brikz.augments = AugmentsBrik;
 | 
	
		
			
				|  |  | -	brikz.amdBrik = AMDBrik;
 | 
	
		
			
				|  |  | -	brikz.asReceiverBrik = AsReceiverBrik;
 | 
	
		
			
				|  |  | +	brikz.asReceiver = AsReceiverBrik;
 | 
	
		
			
				|  |  | +	brikz.amd = AMDBrik;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	brikz.rebuild();
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -1447,7 +1449,7 @@ define("amber/boot", [ 'require', './browser-compatibility' ], function (require
 | 
	
		
			
				|  |  |  		brikz.rebuild();
 | 
	
		
			
				|  |  |  	};
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	return { vm: api, nil: brikz.root.nil, globals: globals, asReceiver: brikz.asReceiverBrik.asReceiver };
 | 
	
		
			
				|  |  | +	return { vm: api, nil: brikz.root.nil, globals: globals, asReceiver: brikz.asReceiver.asReceiver };
 | 
	
		
			
				|  |  |  });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  define("amber_vm/smalltalk", ["./boot"], function (boot) {
 | 
	
	
		
			
				|  | @@ -1846,21 +1848,6 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  globals.ProtoObject);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "heliosClass",
 | 
	
		
			
				|  |  | -protocol: 'accessing',
 | 
	
		
			
				|  |  | -fn: function (){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -return "class";
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: [],
 | 
	
		
			
				|  |  | -source: "heliosClass\x0a\x09\x22Should be an Helios extension. Unfortunately, since helios can browse remote\x0a\x09environments, we can't extend base classes\x22\x0a\x09\x0a\x09^ 'class'",
 | 
	
		
			
				|  |  | -messageSends: [],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -globals.ProtoObject.klass);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "initialize",
 | 
	
	
		
			
				|  | @@ -2712,21 +2699,6 @@ referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Object.klass);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "heliosClass",
 | 
	
		
			
				|  |  | -protocol: 'helios',
 | 
	
		
			
				|  |  | -fn: function (){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -return "class";
 | 
	
		
			
				|  |  | -},
 | 
	
		
			
				|  |  | -args: [],
 | 
	
		
			
				|  |  | -source: "heliosClass\x0a\x09\x22Should be an Helios extension. Unfortunately, since helios can browse remote\x0a\x09environments, we can't extend base classes\x22\x0a\x09\x0a\x09^ 'class'",
 | 
	
		
			
				|  |  | -messageSends: [],
 | 
	
		
			
				|  |  | -referencedClasses: []
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -globals.Object.klass);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "initialize",
 | 
	
	
		
			
				|  | @@ -6936,6 +6908,21 @@ referencedClasses: ["String"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Class);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +smalltalk.addMethod(
 | 
	
		
			
				|  |  | +smalltalk.method({
 | 
	
		
			
				|  |  | +selector: "heliosClass",
 | 
	
		
			
				|  |  | +protocol: 'accessing',
 | 
	
		
			
				|  |  | +fn: function (){
 | 
	
		
			
				|  |  | +var self=this;
 | 
	
		
			
				|  |  | +return "class";
 | 
	
		
			
				|  |  | +},
 | 
	
		
			
				|  |  | +args: [],
 | 
	
		
			
				|  |  | +source: "heliosClass\x0a\x09\x22Should be an Helios extension. Unfortunately, since helios can browse remote\x0a\x09environments, we can't extend base classes\x22\x0a\x09\x0a\x09^ 'class'",
 | 
	
		
			
				|  |  | +messageSends: [],
 | 
	
		
			
				|  |  | +referencedClasses: []
 | 
	
		
			
				|  |  | +}),
 | 
	
		
			
				|  |  | +globals.Class);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "isClass",
 | 
	
	
		
			
				|  | @@ -10986,12 +10973,15 @@ var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  |  var $2,$1;
 | 
	
		
			
				|  |  |  $2=self._isEmpty();
 | 
	
		
			
				|  |  | -$1=_st($2)._ifTrue_ifFalse_(aBlock,anotherBlock);
 | 
	
		
			
				|  |  | +$1=_st($2)._ifTrue_ifFalse_(aBlock,(function(){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  | +return _st(anotherBlock)._value_(self);
 | 
	
		
			
				|  |  | +}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)})}));
 | 
	
		
			
				|  |  |  return $1;
 | 
	
		
			
				|  |  |  }, function($ctx1) {$ctx1.fill(self,"ifEmpty:ifNotEmpty:",{aBlock:aBlock,anotherBlock:anotherBlock},globals.Collection)})},
 | 
	
		
			
				|  |  |  args: ["aBlock", "anotherBlock"],
 | 
	
		
			
				|  |  | -source: "ifEmpty: aBlock ifNotEmpty: anotherBlock\x0a\x09^ self isEmpty\x0a\x09\x09ifTrue: aBlock\x0a\x09\x09ifFalse: anotherBlock",
 | 
	
		
			
				|  |  | -messageSends: ["ifTrue:ifFalse:", "isEmpty"],
 | 
	
		
			
				|  |  | +source: "ifEmpty: aBlock ifNotEmpty: anotherBlock\x0a\x09^ self isEmpty\x0a\x09\x09ifTrue: aBlock\x0a\x09\x09ifFalse: [ anotherBlock value: self ]",
 | 
	
		
			
				|  |  | +messageSends: ["ifTrue:ifFalse:", "isEmpty", "value:"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Collection);
 | 
	
	
		
			
				|  | @@ -11005,14 +10995,16 @@ var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  |  var $2,$1;
 | 
	
		
			
				|  |  |  $2=self._notEmpty();
 | 
	
		
			
				|  |  | -$1=_st($2)._ifTrue_ifFalse_(aBlock,(function(){
 | 
	
		
			
				|  |  | -return self;
 | 
	
		
			
				|  |  | -}));
 | 
	
		
			
				|  |  | +if(smalltalk.assert($2)){
 | 
	
		
			
				|  |  | +$1=_st(aBlock)._value_(self);
 | 
	
		
			
				|  |  | +} else {
 | 
	
		
			
				|  |  | +$1=self;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  |  return $1;
 | 
	
		
			
				|  |  |  }, function($ctx1) {$ctx1.fill(self,"ifNotEmpty:",{aBlock:aBlock},globals.Collection)})},
 | 
	
		
			
				|  |  |  args: ["aBlock"],
 | 
	
		
			
				|  |  | -source: "ifNotEmpty: aBlock\x0a\x09^ self notEmpty\x0a\x09\x09ifTrue: aBlock\x0a\x09\x09ifFalse: [ self ]",
 | 
	
		
			
				|  |  | -messageSends: ["ifTrue:ifFalse:", "notEmpty"],
 | 
	
		
			
				|  |  | +source: "ifNotEmpty: aBlock\x0a\x09^ self notEmpty\x0a\x09\x09ifTrue: [ aBlock value: self ]\x0a\x09\x09ifFalse: [ self ]",
 | 
	
		
			
				|  |  | +messageSends: ["ifTrue:ifFalse:", "notEmpty", "value:"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Collection);
 | 
	
	
		
			
				|  | @@ -11026,12 +11018,15 @@ var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  |  var $2,$1;
 | 
	
		
			
				|  |  |  $2=self._notEmpty();
 | 
	
		
			
				|  |  | -$1=_st($2)._ifTrue_ifFalse_(aBlock,anotherBlock);
 | 
	
		
			
				|  |  | +$1=_st($2)._ifTrue_ifFalse_((function(){
 | 
	
		
			
				|  |  | +return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  | +return _st(aBlock)._value_(self);
 | 
	
		
			
				|  |  | +}, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)})}),anotherBlock);
 | 
	
		
			
				|  |  |  return $1;
 | 
	
		
			
				|  |  |  }, function($ctx1) {$ctx1.fill(self,"ifNotEmpty:ifEmpty:",{aBlock:aBlock,anotherBlock:anotherBlock},globals.Collection)})},
 | 
	
		
			
				|  |  |  args: ["aBlock", "anotherBlock"],
 | 
	
		
			
				|  |  | -source: "ifNotEmpty: aBlock ifEmpty: anotherBlock\x0a\x09^ self notEmpty\x0a\x09\x09ifTrue: aBlock\x0a\x09\x09ifFalse: anotherBlock",
 | 
	
		
			
				|  |  | -messageSends: ["ifTrue:ifFalse:", "notEmpty"],
 | 
	
		
			
				|  |  | +source: "ifNotEmpty: aBlock ifEmpty: anotherBlock\x0a\x09^ self notEmpty\x0a\x09\x09ifTrue: [ aBlock value: self ]\x0a\x09\x09ifFalse: anotherBlock",
 | 
	
		
			
				|  |  | +messageSends: ["ifTrue:ifFalse:", "notEmpty", "value:"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.Collection);
 | 
	
	
		
			
				|  | @@ -20046,18 +20041,14 @@ protocol: 'accessing',
 | 
	
		
			
				|  |  |  fn: function (aKey,aBlock){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | -var $2,$1;
 | 
	
		
			
				|  |  | -$2=self._includesKey_(aKey);
 | 
	
		
			
				|  |  | -if(smalltalk.assert($2)){
 | 
	
		
			
				|  |  | -$1=self._at_(aKey);
 | 
	
		
			
				|  |  | -} else {
 | 
	
		
			
				|  |  | -$1=_st(aBlock)._value();
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | +var $1;
 | 
	
		
			
				|  |  | +self._deprecatedAPI();
 | 
	
		
			
				|  |  | +$1=_st(self._globals())._at_ifAbsent_(aKey,aBlock);
 | 
	
		
			
				|  |  |  return $1;
 | 
	
		
			
				|  |  |  }, function($ctx1) {$ctx1.fill(self,"at:ifAbsent:",{aKey:aKey,aBlock:aBlock},globals.SmalltalkImage)})},
 | 
	
		
			
				|  |  |  args: ["aKey", "aBlock"],
 | 
	
		
			
				|  |  | -source: "at: aKey ifAbsent: aBlock\x0a\x09^ (self includesKey: aKey)\x0a\x09\x09ifTrue: [ self at: aKey ]\x0a\x09\x09ifFalse: [ aBlock value ]",
 | 
	
		
			
				|  |  | -messageSends: ["ifTrue:ifFalse:", "includesKey:", "at:", "value"],
 | 
	
		
			
				|  |  | +source: "at: aKey ifAbsent: aBlock\x0a\x09self deprecatedAPI.\x0a\x09^ self globals at: aKey ifAbsent: aBlock",
 | 
	
		
			
				|  |  | +messageSends: ["deprecatedAPI", "at:ifAbsent:", "globals"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.SmalltalkImage);
 | 
	
	
		
			
				|  | @@ -46661,7 +46652,7 @@ protocol: 'tests',
 | 
	
		
			
				|  |  |  fn: function (){
 | 
	
		
			
				|  |  |  var self=this;
 | 
	
		
			
				|  |  |  return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | -var $3,$2,$1,$5,$4,$6,$9,$8,$7,$11,$10,$13,$12,$16,$15,$14,$18,$17,$19;
 | 
	
		
			
				|  |  | +var $3,$2,$1,$5,$4,$6,$9,$8,$7,$11,$10,$13,$12,$15,$14,$16,$19,$18,$17,$21,$20,$23,$22,$24,$25,$27,$26,$29,$28;
 | 
	
		
			
				|  |  |  $3=self._collectionClass();
 | 
	
		
			
				|  |  |  $ctx1.sendIdx["collectionClass"]=1;
 | 
	
		
			
				|  |  |  $2=_st($3)._new();
 | 
	
	
		
			
				|  | @@ -46700,45 +46691,80 @@ $ctx1.sendIdx["collection"]=3;
 | 
	
		
			
				|  |  |  $12=_st($13)._ifNotEmpty_((function(){
 | 
	
		
			
				|  |  |  return (42);
 | 
	
		
			
				|  |  |  }));
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["ifNotEmpty:"]=2;
 | 
	
		
			
				|  |  |  self._assert_equals_($12,(42));
 | 
	
		
			
				|  |  |  $ctx1.sendIdx["assert:equals:"]=4;
 | 
	
		
			
				|  |  | -$16=self._collectionClass();
 | 
	
		
			
				|  |  | +$15=self._collection();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["collection"]=4;
 | 
	
		
			
				|  |  | +$14=_st($15)._ifNotEmpty_((function(col){
 | 
	
		
			
				|  |  | +return col;
 | 
	
		
			
				|  |  | +}));
 | 
	
		
			
				|  |  | +$16=self._collection();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["collection"]=5;
 | 
	
		
			
				|  |  | +self._assert_equals_($14,$16);
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["assert:equals:"]=5;
 | 
	
		
			
				|  |  | +$19=self._collectionClass();
 | 
	
		
			
				|  |  |  $ctx1.sendIdx["collectionClass"]=4;
 | 
	
		
			
				|  |  | -$15=_st($16)._new();
 | 
	
		
			
				|  |  | +$18=_st($19)._new();
 | 
	
		
			
				|  |  |  $ctx1.sendIdx["new"]=4;
 | 
	
		
			
				|  |  | -$14=_st($15)._ifEmpty_ifNotEmpty_((function(){
 | 
	
		
			
				|  |  | +$17=_st($18)._ifEmpty_ifNotEmpty_((function(){
 | 
	
		
			
				|  |  |  return (42);
 | 
	
		
			
				|  |  |  }),(function(){
 | 
	
		
			
				|  |  |  return (999);
 | 
	
		
			
				|  |  |  }));
 | 
	
		
			
				|  |  |  $ctx1.sendIdx["ifEmpty:ifNotEmpty:"]=1;
 | 
	
		
			
				|  |  | -self._assert_equals_($14,(42));
 | 
	
		
			
				|  |  | -$ctx1.sendIdx["assert:equals:"]=5;
 | 
	
		
			
				|  |  | -$18=self._collection();
 | 
	
		
			
				|  |  | -$ctx1.sendIdx["collection"]=4;
 | 
	
		
			
				|  |  | -$17=_st($18)._ifEmpty_ifNotEmpty_((function(){
 | 
	
		
			
				|  |  | +self._assert_equals_($17,(42));
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["assert:equals:"]=6;
 | 
	
		
			
				|  |  | +$21=self._collection();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["collection"]=6;
 | 
	
		
			
				|  |  | +$20=_st($21)._ifEmpty_ifNotEmpty_((function(){
 | 
	
		
			
				|  |  |  return (42);
 | 
	
		
			
				|  |  |  }),(function(){
 | 
	
		
			
				|  |  |  return (999);
 | 
	
		
			
				|  |  |  }));
 | 
	
		
			
				|  |  | -self._assert_equals_($17,(999));
 | 
	
		
			
				|  |  | -$ctx1.sendIdx["assert:equals:"]=6;
 | 
	
		
			
				|  |  | -$19=_st(_st(self._collectionClass())._new())._ifNotEmpty_ifEmpty_((function(){
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["ifEmpty:ifNotEmpty:"]=2;
 | 
	
		
			
				|  |  | +self._assert_equals_($20,(999));
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["assert:equals:"]=7;
 | 
	
		
			
				|  |  | +$23=self._collection();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["collection"]=7;
 | 
	
		
			
				|  |  | +$22=_st($23)._ifEmpty_ifNotEmpty_((function(){
 | 
	
		
			
				|  |  | +return (42);
 | 
	
		
			
				|  |  | +}),(function(col){
 | 
	
		
			
				|  |  | +return col;
 | 
	
		
			
				|  |  | +}));
 | 
	
		
			
				|  |  | +$24=self._collection();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["collection"]=8;
 | 
	
		
			
				|  |  | +self._assert_equals_($22,$24);
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["assert:equals:"]=8;
 | 
	
		
			
				|  |  | +$25=_st(_st(self._collectionClass())._new())._ifNotEmpty_ifEmpty_((function(){
 | 
	
		
			
				|  |  |  return (42);
 | 
	
		
			
				|  |  |  }),(function(){
 | 
	
		
			
				|  |  |  return (999);
 | 
	
		
			
				|  |  |  }));
 | 
	
		
			
				|  |  |  $ctx1.sendIdx["ifNotEmpty:ifEmpty:"]=1;
 | 
	
		
			
				|  |  | -self._assert_equals_($19,(999));
 | 
	
		
			
				|  |  | -$ctx1.sendIdx["assert:equals:"]=7;
 | 
	
		
			
				|  |  | -self._assert_equals_(_st(self._collection())._ifNotEmpty_ifEmpty_((function(){
 | 
	
		
			
				|  |  | +self._assert_equals_($25,(999));
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["assert:equals:"]=9;
 | 
	
		
			
				|  |  | +$27=self._collection();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["collection"]=9;
 | 
	
		
			
				|  |  | +$26=_st($27)._ifNotEmpty_ifEmpty_((function(){
 | 
	
		
			
				|  |  |  return (42);
 | 
	
		
			
				|  |  |  }),(function(){
 | 
	
		
			
				|  |  |  return (999);
 | 
	
		
			
				|  |  | -})),(42));
 | 
	
		
			
				|  |  | +}));
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["ifNotEmpty:ifEmpty:"]=2;
 | 
	
		
			
				|  |  | +self._assert_equals_($26,(42));
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["assert:equals:"]=10;
 | 
	
		
			
				|  |  | +$29=self._collection();
 | 
	
		
			
				|  |  | +$ctx1.sendIdx["collection"]=10;
 | 
	
		
			
				|  |  | +$28=_st($29)._ifNotEmpty_ifEmpty_((function(col){
 | 
	
		
			
				|  |  | +return col;
 | 
	
		
			
				|  |  | +}),(function(){
 | 
	
		
			
				|  |  | +return (999);
 | 
	
		
			
				|  |  | +}));
 | 
	
		
			
				|  |  | +self._assert_equals_($28,self._collection());
 | 
	
		
			
				|  |  |  return self}, function($ctx1) {$ctx1.fill(self,"testIfEmptyFamily",{},globals.CollectionTest)})},
 | 
	
		
			
				|  |  |  args: [],
 | 
	
		
			
				|  |  | -source: "testIfEmptyFamily\x0a\x09self assert: (self collectionClass new ifEmpty: [ 42 ]) equals: 42.\x0a\x09self assert: (self collection ifEmpty: [ 42 ]) equals: self collection.\x0a\x0a\x09self assert: (self collectionClass new ifNotEmpty: [ 42 ]) equals: self collectionClass new.\x0a\x09self assert: (self collection ifNotEmpty: [ 42 ]) equals: 42.\x0a\x09\x0a\x09self assert: (self collectionClass new ifEmpty: [ 42 ] ifNotEmpty: [ 999 ]) equals: 42.\x0a\x09self assert: (self collection ifEmpty: [ 42 ] ifNotEmpty: [ 999 ]) equals: 999.\x0a\x0a\x09self assert: (self collectionClass new ifNotEmpty: [ 42 ] ifEmpty: [ 999 ]) equals: 999.\x0a\x09self assert: (self collection ifNotEmpty: [ 42 ] ifEmpty: [ 999 ]) equals: 42",
 | 
	
		
			
				|  |  | +source: "testIfEmptyFamily\x0a\x09self assert: (self collectionClass new ifEmpty: [ 42 ]) equals: 42.\x0a\x09self assert: (self collection ifEmpty: [ 42 ]) equals: self collection.\x0a\x0a\x09self assert: (self collectionClass new ifNotEmpty: [ 42 ]) equals: self collectionClass new.\x0a\x09self assert: (self collection ifNotEmpty: [ 42 ]) equals: 42.\x0a\x09self assert: (self collection ifNotEmpty: [ :col | col ]) equals: self collection.\x0a\x09\x0a\x09self assert: (self collectionClass new ifEmpty: [ 42 ] ifNotEmpty: [ 999 ]) equals: 42.\x0a\x09self assert: (self collection ifEmpty: [ 42 ] ifNotEmpty: [ 999 ]) equals: 999.\x0a\x09self assert: (self collection ifEmpty: [ 42 ] ifNotEmpty: [ :col | col ]) equals: self collection.\x0a\x0a\x09self assert: (self collectionClass new ifNotEmpty: [ 42 ] ifEmpty: [ 999 ]) equals: 999.\x0a\x09self assert: (self collection ifNotEmpty: [ 42 ] ifEmpty: [ 999 ]) equals: 42.\x0a\x09self assert: (self collection ifNotEmpty: [ :col | col ] ifEmpty: [ 999 ]) equals: self collection.",
 | 
	
		
			
				|  |  |  messageSends: ["assert:equals:", "ifEmpty:", "new", "collectionClass", "collection", "ifNotEmpty:", "ifEmpty:ifNotEmpty:", "ifNotEmpty:ifEmpty:"],
 | 
	
		
			
				|  |  |  referencedClasses: []
 | 
	
		
			
				|  |  |  }),
 | 
	
	
		
			
				|  | @@ -56536,25 +56562,6 @@ referencedClasses: ["FileServer"]
 | 
	
		
			
				|  |  |  }),
 | 
	
		
			
				|  |  |  globals.AmberCli.klass);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "tests:",
 | 
	
		
			
				|  |  | -protocol: 'commands',
 | 
	
		
			
				|  |  | -fn: function (arguments){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -function $NodeTestRunner(){return globals.NodeTestRunner||(typeof NodeTestRunner=="undefined"?nil:NodeTestRunner)}
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | -var $1;
 | 
	
		
			
				|  |  | -$1=_st($NodeTestRunner())._runTestSuite();
 | 
	
		
			
				|  |  | -return $1;
 | 
	
		
			
				|  |  | -}, function($ctx1) {$ctx1.fill(self,"tests:",{arguments:arguments},globals.AmberCli.klass)})},
 | 
	
		
			
				|  |  | -args: ["arguments"],
 | 
	
		
			
				|  |  | -source: "tests: arguments\x0a\x09^ NodeTestRunner runTestSuite",
 | 
	
		
			
				|  |  | -messageSends: ["runTestSuite"],
 | 
	
		
			
				|  |  | -referencedClasses: ["NodeTestRunner"]
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -globals.AmberCli.klass);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 | 
	
		
			
				|  |  |  smalltalk.method({
 | 
	
		
			
				|  |  |  selector: "version:",
 | 
	
	
		
			
				|  | @@ -58002,129 +58009,6 @@ globals.Initer);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -smalltalk.addClass('NodeTestRunner', globals.Object, [], 'AmberCli');
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -smalltalk.addMethod(
 | 
	
		
			
				|  |  | -smalltalk.method({
 | 
	
		
			
				|  |  | -selector: "runTestSuite",
 | 
	
		
			
				|  |  | -protocol: 'not yet classified',
 | 
	
		
			
				|  |  | -fn: function (){
 | 
	
		
			
				|  |  | -var self=this;
 | 
	
		
			
				|  |  | -var suite,worker;
 | 
	
		
			
				|  |  | -function $OrderedCollection(){return globals.OrderedCollection||(typeof OrderedCollection=="undefined"?nil:OrderedCollection)}
 | 
	
		
			
				|  |  | -function $TestCase(){return globals.TestCase||(typeof TestCase=="undefined"?nil:TestCase)}
 | 
	
		
			
				|  |  | -function $TestSuiteRunner(){return globals.TestSuiteRunner||(typeof TestSuiteRunner=="undefined"?nil:TestSuiteRunner)}
 | 
	
		
			
				|  |  | -function $ResultAnnouncement(){return globals.ResultAnnouncement||(typeof ResultAnnouncement=="undefined"?nil:ResultAnnouncement)}
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx1) { 
 | 
	
		
			
				|  |  | -var $2,$1,$3,$9,$8,$12,$11,$10,$7,$6,$15,$14,$13,$5,$4,$17,$16,$19,$18,$26,$25,$24,$23,$22,$28,$27,$21,$20,$30,$29,$32,$31,$39,$38,$37,$36,$35,$34,$33;
 | 
	
		
			
				|  |  | -suite=_st($OrderedCollection())._new();
 | 
	
		
			
				|  |  | -_st(_st(_st($TestCase())._allSubclasses())._select_((function(each){
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  | -return _st(_st(each)._isAbstract())._not();
 | 
	
		
			
				|  |  | -}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)})})))._do_((function(each){
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  | -return _st(suite)._addAll_(_st(each)._buildSuite());
 | 
	
		
			
				|  |  | -}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,2)})}));
 | 
	
		
			
				|  |  | -worker=_st($TestSuiteRunner())._on_(suite);
 | 
	
		
			
				|  |  | -_st(_st(worker)._announcer())._on_do_($ResultAnnouncement(),(function(ann){
 | 
	
		
			
				|  |  | -var result;
 | 
	
		
			
				|  |  | -return smalltalk.withContext(function($ctx2) {
 | 
	
		
			
				|  |  | -result=_st(ann)._result();
 | 
	
		
			
				|  |  | -result;
 | 
	
		
			
				|  |  | -$2=_st(result)._runs();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["runs"]=1;
 | 
	
		
			
				|  |  | -$1=_st($2).__eq(_st(result)._total());
 | 
	
		
			
				|  |  | -if(smalltalk.assert($1)){
 | 
	
		
			
				|  |  | -$3=console;
 | 
	
		
			
				|  |  | -$9=_st(_st(result)._runs())._asString();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["asString"]=1;
 | 
	
		
			
				|  |  | -$8=_st($9).__comma(" tests run, ");
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=5;
 | 
	
		
			
				|  |  | -$12=_st(result)._failures();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["failures"]=1;
 | 
	
		
			
				|  |  | -$11=_st($12)._size();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["size"]=1;
 | 
	
		
			
				|  |  | -$10=_st($11)._asString();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["asString"]=2;
 | 
	
		
			
				|  |  | -$7=_st($8).__comma($10);
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=4;
 | 
	
		
			
				|  |  | -$6=_st($7).__comma(" failures, ");
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=3;
 | 
	
		
			
				|  |  | -$15=_st(result)._errors();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["errors"]=1;
 | 
	
		
			
				|  |  | -$14=_st($15)._size();
 | 
	
		
			
				|  |  | -$13=_st($14)._asString();
 | 
	
		
			
				|  |  | -$5=_st($6).__comma($13);
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=2;
 | 
	
		
			
				|  |  | -$4=_st($5).__comma(" errors.");
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=1;
 | 
	
		
			
				|  |  | -_st($3)._log_($4);
 | 
	
		
			
				|  |  | -$17=_st(result)._failures();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["failures"]=2;
 | 
	
		
			
				|  |  | -$16=_st($17)._isEmpty();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["isEmpty"]=1;
 | 
	
		
			
				|  |  | -if(! smalltalk.assert($16)){
 | 
	
		
			
				|  |  | -$19=_st(result)._failures();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["failures"]=3;
 | 
	
		
			
				|  |  | -$18=_st($19)._first();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["first"]=1;
 | 
	
		
			
				|  |  | -_st($18)._runCase();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["runCase"]=1;
 | 
	
		
			
				|  |  | -$26=_st(result)._failures();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["failures"]=4;
 | 
	
		
			
				|  |  | -$25=_st($26)._first();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["first"]=2;
 | 
	
		
			
				|  |  | -$24=_st($25)._class();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["class"]=1;
 | 
	
		
			
				|  |  | -$23=_st($24)._name();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["name"]=1;
 | 
	
		
			
				|  |  | -$22=_st($23).__comma(" >> ");
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=8;
 | 
	
		
			
				|  |  | -$28=_st(_st(result)._failures())._first();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["first"]=3;
 | 
	
		
			
				|  |  | -$27=_st($28)._selector();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["selector"]=1;
 | 
	
		
			
				|  |  | -$21=_st($22).__comma($27);
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=7;
 | 
	
		
			
				|  |  | -$20=_st($21).__comma(" is failing!!");
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=6;
 | 
	
		
			
				|  |  | -self._throw_($20);
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["throw:"]=1;
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -$30=_st(result)._errors();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["errors"]=2;
 | 
	
		
			
				|  |  | -$29=_st($30)._isEmpty();
 | 
	
		
			
				|  |  | -if(! smalltalk.assert($29)){
 | 
	
		
			
				|  |  | -$32=_st(result)._errors();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["errors"]=3;
 | 
	
		
			
				|  |  | -$31=_st($32)._first();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["first"]=4;
 | 
	
		
			
				|  |  | -_st($31)._runCase();
 | 
	
		
			
				|  |  | -$39=_st(result)._errors();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["errors"]=4;
 | 
	
		
			
				|  |  | -$38=_st($39)._first();
 | 
	
		
			
				|  |  | -$ctx2.sendIdx["first"]=5;
 | 
	
		
			
				|  |  | -$37=_st($38)._class();
 | 
	
		
			
				|  |  | -$36=_st($37)._name();
 | 
	
		
			
				|  |  | -$35=_st($36).__comma(" >> ");
 | 
	
		
			
				|  |  | -$34=_st($35).__comma(_st(_st(_st(result)._errors())._first())._selector());
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=10;
 | 
	
		
			
				|  |  | -$33=_st($34).__comma(" has errors!!");
 | 
	
		
			
				|  |  | -$ctx2.sendIdx[","]=9;
 | 
	
		
			
				|  |  | -return self._throw_($33);
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -}, function($ctx2) {$ctx2.fillBlock({ann:ann,result:result},$ctx1,3)})}));
 | 
	
		
			
				|  |  | -_st(worker)._run();
 | 
	
		
			
				|  |  | -return self}, function($ctx1) {$ctx1.fill(self,"runTestSuite",{suite:suite,worker:worker},globals.NodeTestRunner.klass)})},
 | 
	
		
			
				|  |  | -args: [],
 | 
	
		
			
				|  |  | -source: "runTestSuite\x0a\x09| suite worker |\x0a\x0a\x09suite := OrderedCollection new.\x0a\x09(TestCase allSubclasses select: [ :each | each isAbstract not ])\x0a\x09\x09do: [ :each | suite addAll: each buildSuite ].\x0a\x0a\x09worker := TestSuiteRunner on: suite.\x0a\x09worker announcer on: ResultAnnouncement do:\x0a\x09\x09[ :ann | | result |\x0a\x09\x09\x09result := ann result.\x0a\x09\x09\x09result runs = result total ifTrue: [\x0a\x09\x09\x09\x09console log: result runs asString, ' tests run, ', result failures size asString, ' failures, ', result errors size asString, ' errors.'.\x0a\x0a\x09\x09\x09\x09result failures isEmpty ifFalse: [\x0a\x09\x09\x09\x09\x09result failures first runCase.\x0a\x09\x09\x09\x09\x09\x22the line above should throw, normally, but just in case I leave the line below\x22\x0a\x09\x09\x09\x09\x09self throw: result failures first class name, ' >> ', result failures first selector, ' is failing!!' ].\x0a\x09\x09\x09\x09result errors isEmpty ifFalse: [\x0a\x09\x09\x09\x09\x09result errors first runCase.\x0a\x09\x09\x09\x09\x09\x22the line above should throw, normally, but just in case I leave the line below\x22\x0a\x09\x09\x09\x09\x09self throw: result errors first class name, ' >> ', result errors first selector, ' has errors!!' ].\x0a\x09]].\x0a\x09worker run",
 | 
	
		
			
				|  |  | -messageSends: ["new", "do:", "select:", "allSubclasses", "not", "isAbstract", "addAll:", "buildSuite", "on:", "on:do:", "announcer", "result", "ifTrue:", "=", "runs", "total", "log:", ",", "asString", "size", "failures", "errors", "ifFalse:", "isEmpty", "runCase", "first", "throw:", "name", "class", "selector", "run"],
 | 
	
		
			
				|  |  | -referencedClasses: ["OrderedCollection", "TestCase", "TestSuiteRunner", "ResultAnnouncement"]
 | 
	
		
			
				|  |  | -}),
 | 
	
		
			
				|  |  | -globals.NodeTestRunner.klass);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  smalltalk.addClass('Repl', globals.Object, ['readline', 'interface', 'util', 'session', 'resultCount', 'commands'], 'AmberCli');
 | 
	
		
			
				|  |  |  globals.Repl.comment="I am a class representing a REPL (Read Evaluate Print Loop) and provide a command line interface to Amber Smalltalk.\x0aOn the prompt you can type Amber statements which will be evaluated after pressing <Enter>.\x0aThe evaluation is comparable with executing a 'DoIt' in a workspace.\x0a\x0aMy runtime requirement is a functional Node.js executable with working Readline support.";
 | 
	
		
			
				|  |  |  smalltalk.addMethod(
 |