| 
					
				 | 
			
			
				@@ -1,10 +1,10 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package outbound 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import ( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	"math/rand" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"sync" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"time" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	"github.com/v2ray/v2ray-core/common/dice" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	v2net "github.com/v2ray/v2ray-core/common/net" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	"github.com/v2ray/v2ray-core/proxy/vmess" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 ) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -44,12 +44,7 @@ func (this *Receiver) AddUser(user *vmess.User) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (this *Receiver) PickUser() *vmess.User { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	userLen := len(this.Accounts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	userIdx := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if userLen > 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		userIdx = rand.Intn(userLen) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return this.Accounts[userIdx] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return this.Accounts[dice.Roll(len(this.Accounts))] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 type ExpiringReceiver struct { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -108,11 +103,7 @@ func (this *ReceiverManager) pickDetour() *Receiver { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		return nil 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	this.detourAccess.RLock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	idx := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	detourLen := len(this.detours) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if detourLen > 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		idx = rand.Intn(detourLen) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	idx := dice.Roll(len(this.detours)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	rec := this.detours[idx] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	this.detourAccess.RUnlock() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -129,14 +120,7 @@ func (this *ReceiverManager) pickDetour() *Receiver { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (this *ReceiverManager) pickStdReceiver() *Receiver { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	receiverLen := len(this.receivers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	receiverIdx := 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	if receiverLen > 1 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		receiverIdx = rand.Intn(receiverLen) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-	return this.receivers[receiverIdx] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	return this.receivers[dice.Roll(len(this.receivers))] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 func (this *ReceiverManager) PickReceiver() (v2net.Destination, *vmess.User) { 
			 |