@ -18,11 +18,8 @@ pub struct Evaluations {  
															
														 
														
													
														
															
																 
																 
																pub   struct  UniversalParams < E : PairingEngine >   { 
  
																 
																 
																pub   struct  UniversalParams < E : PairingEngine >   { 
  
															
														 
														
													
														
															
																 
																 
																     /// prover parameters
  
																 
																 
																     /// prover parameters
  
															
														 
														
													
														
															
																 
																 
																     pub   prover_param : ProverParam < E > , 
  
																 
																 
																     pub   prover_param : ProverParam < E > , 
  
															
														 
														
													
														
															
																 
																 
																     /// g^randomness: g^t1, g^t2, ...
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   g_mask : Vec < E ::G1Affine > , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   g_mask : Vec < E ::G2Affine > , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																     /// h^randomness: h^t1, h^t2, ..., **h^{t_nv}**
  
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																     pub   h_mask : Vec < E ::G2Affine > , 
  
															
														 
														
													
														
															
																 
																 
																} 
  
																 
																 
																} 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																/// Prover Parameters
  
																 
																 
																/// Prover Parameters
  
															
														 
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																		 
																	
																 
																@ -32,26 +29,11 @@ pub struct ProverParam {  
															
														 
														
													
														
															
																 
																 
																     pub   num_vars : usize , 
  
																 
																 
																     pub   num_vars : usize , 
  
															
														 
														
													
														
															
																 
																 
																     /// `pp_{num_vars}`, `pp_{num_vars - 1}`, `pp_{num_vars - 2}`, ..., defined
  
																 
																 
																     /// `pp_{num_vars}`, `pp_{num_vars - 1}`, `pp_{num_vars - 2}`, ..., defined
  
															
														 
														
													
														
															
																 
																 
																     /// by XZZPD19
  
																 
																 
																     /// by XZZPD19
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   powers_of_g : Vec < Evaluations < E ::G1Affine > > , 
  
																 
																 
																     pub   powers_of_g : Vec < Evaluations < E ::G1Affine > > , 
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   powers_of_g : Vec < Evaluations < E ::G2Affine > > , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     /// `pp_{num_vars}`, `pp_{num_vars - 1}`, `pp_{num_vars - 2}`, ..., defined
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     /// by XZZPD19
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   powers_of_h : Vec < Evaluations < E ::G2Affine > > , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   powers_of_h : Vec < Evaluations < E ::G1Affine > > , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     /// generator for G1
  
																 
																 
																     /// generator for G1
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   g : E ::G1Affine , 
  
																 
																 
																     pub   g : E ::G1Affine , 
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   g : E ::G2Affine , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     /// generator for G2
  
																 
																 
																     /// generator for G2
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   h : E ::G2Affine , 
  
																 
																 
																     pub   h : E ::G2Affine , 
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   h : E ::G1Affine , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																} 
  
																 
																 
																} 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																/// Verifier Parameters
  
																 
																 
																/// Verifier Parameters
  
															
														 
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																		 
																	
																 
																@ -61,22 +43,13 @@ pub struct VerifierParam {  
															
														 
														
													
														
															
																 
																 
																     pub   num_vars : usize , 
  
																 
																 
																     pub   num_vars : usize , 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																     /// generator of G1
  
																 
																 
																     /// generator of G1
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   g : E ::G1Affine , 
  
																 
																 
																     pub   g : E ::G1Affine , 
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   g : E ::G2Affine , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																     /// generator of G2
  
																 
																 
																     /// generator of G2
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   h : E ::G2Affine , 
  
																 
																 
																     pub   h : E ::G2Affine , 
  
															
														 
														
													
														
															
																 
																 
																     #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   h : E ::G1Affine , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     /// g^t1, g^t2, ...
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   g_mask : Vec < E ::G1Affine > , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																     pub   g_mask : Vec < E ::G2Affine > , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																     /// h^randomness: h^t1, h^t2, ..., **h^{t_nv}**
  
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																     pub   h_mask : Vec < E ::G2Affine > , 
  
															
														 
														
													
														
															
																 
																 
																} 
  
																 
																 
																} 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																impl < E : PairingEngine >   UniversalParams < E >   { 
  
																 
																 
																impl < E : PairingEngine >   UniversalParams < E >   { 
  
															
														 
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																		 
																	
																 
																@ -91,7 +64,7 @@ impl UniversalParams {   
															
														 
														
													
														
															
																 
																 
																             num_vars : self . prover_param . num_vars , 
  
																 
																 
																             num_vars : self . prover_param . num_vars , 
  
															
														 
														
													
														
															
																 
																 
																             g : self . prover_param . g , 
  
																 
																 
																             g : self . prover_param . g , 
  
															
														 
														
													
														
															
																 
																 
																             h : self . prover_param . h , 
  
																 
																 
																             h : self . prover_param . h , 
  
															
														 
														
													
														
															
																 
																 
																             g_mask : self . g _mask. clone ( ) , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																             h_mask : self . h _mask. clone ( ) , 
  
															
														 
														
													
														
															
																 
																 
																         } 
  
																 
																 
																         } 
  
															
														 
														
													
														
															
																 
																 
																     } 
  
																 
																 
																     } 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																		 
																	
																 
																@ -112,7 +85,6 @@ impl UniversalParams {   
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																         let   to_reduce   =   self . prover_param . num_vars   -   supported_num_vars ; 
  
																 
																 
																         let   to_reduce   =   self . prover_param . num_vars   -   supported_num_vars ; 
  
															
														 
														
													
														
															
																 
																 
																         let   ck   =   ProverParam   { 
  
																 
																 
																         let   ck   =   ProverParam   { 
  
															
														 
														
													
														
															
																 
																 
																             powers_of_h : self . prover_param . powers_of_h [ to_reduce . . ] . to_vec ( ) , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             powers_of_g : self . prover_param . powers_of_g [ to_reduce . . ] . to_vec ( ) , 
  
																 
																 
																             powers_of_g : self . prover_param . powers_of_g [ to_reduce . . ] . to_vec ( ) , 
  
															
														 
														
													
														
															
																 
																 
																             g : self . prover_param . g , 
  
																 
																 
																             g : self . prover_param . g , 
  
															
														 
														
													
														
															
																 
																 
																             h : self . prover_param . h , 
  
																 
																 
																             h : self . prover_param . h , 
  
															
														 
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																		 
																	
																 
																@ -122,7 +94,7 @@ impl UniversalParams {   
															
														 
														
													
														
															
																 
																 
																             num_vars : supported_num_vars , 
  
																 
																 
																             num_vars : supported_num_vars , 
  
															
														 
														
													
														
															
																 
																 
																             g : self . prover_param . g , 
  
																 
																 
																             g : self . prover_param . g , 
  
															
														 
														
													
														
															
																 
																 
																             h : self . prover_param . h , 
  
																 
																 
																             h : self . prover_param . h , 
  
															
														 
														
													
														
															
																 
																 
																             g_mask : self . g _mask[ to_reduce . . ] . to_vec ( ) , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																             h_mask : self . h _mask[ to_reduce . . ] . to_vec ( ) , 
  
															
														 
														
													
														
															
																 
																 
																         } ; 
  
																 
																 
																         } ; 
  
															
														 
														
													
														
															
																 
																 
																         Ok ( ( ck ,   vk ) ) 
  
																 
																 
																         Ok ( ( ck ,   vk ) ) 
  
															
														 
														
													
														
															
																 
																 
																     } 
  
																 
																 
																     } 
  
															
														 
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																		 
																	
																 
																@ -144,18 +116,11 @@ impl UniversalParams {   
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																         let   pp_generation_timer   =   start_timer ! ( | |   "Prover Param generation" ) ; 
  
																 
																 
																         let   pp_generation_timer   =   start_timer ! ( | |   "Prover Param generation" ) ; 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																         #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         let   g   =   E ::G1Projective ::rand ( rng ) ; 
  
																 
																 
																         let   g   =   E ::G1Projective ::rand ( rng ) ; 
  
															
														 
														
													
														
															
																 
																 
																         #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         let   g   =   E ::G2Projective ::rand ( rng ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         let   h   =   E ::G2Projective ::rand ( rng ) ; 
  
																 
																 
																         let   h   =   E ::G2Projective ::rand ( rng ) ; 
  
															
														 
														
													
														
															
																 
																 
																         #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         let   h   =   E ::G1Projective ::rand ( rng ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																         let   mut   powers_of_g   =   Vec ::new ( ) ; 
  
																 
																 
																         let   mut   powers_of_g   =   Vec ::new ( ) ; 
  
															
														 
														
													
														
															
																 
																 
																         let   mut   powers_of_h   =   Vec ::new ( ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																         let   t : Vec < _ >   =   ( 0 . . num_vars ) . map ( | _ |   E ::Fr ::rand ( rng ) ) . collect ( ) ; 
  
																 
																 
																         let   t : Vec < _ >   =   ( 0 . . num_vars ) . map ( | _ |   E ::Fr ::rand ( rng ) ) . collect ( ) ; 
  
															
														 
														
													
														
															
																 
																 
																         let   scalar_bits   =   E ::Fr ::size_in_bits ( ) ; 
  
																 
																 
																         let   scalar_bits   =   E ::Fr ::size_in_bits ( ) ; 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
												
													
														
															
																
																	
																		
																			 
																		 
																	
																	
																		
																			 
																		 
																	
																	
																 
																@ -186,35 +151,18 @@ impl UniversalParams {   
															
														 
														
													
														
															
																 
																 
																         } 
  
																 
																 
																         } 
  
															
														 
														
													
														
															
																 
																 
																         let   window_size   =   FixedBaseMSM ::get_mul_window_size ( total_scalars ) ; 
  
																 
																 
																         let   window_size   =   FixedBaseMSM ::get_mul_window_size ( total_scalars ) ; 
  
															
														 
														
													
														
															
																 
																 
																         let   g_table   =   FixedBaseMSM ::get_window_table ( scalar_bits ,   window_size ,   g ) ; 
  
																 
																 
																         let   g_table   =   FixedBaseMSM ::get_window_table ( scalar_bits ,   window_size ,   g ) ; 
  
															
														 
														
													
														
															
																 
																 
																         let   h_table   =   FixedBaseMSM ::get_window_table ( scalar_bits ,   window_size ,   h ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																         #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         let   pp_g   =   E ::G1Projective ::batch_normalization_into_affine ( 
  
																 
																 
																         let   pp_g   =   E ::G1Projective ::batch_normalization_into_affine ( 
  
															
														 
														
													
														
															
																 
																 
																             & FixedBaseMSM ::multi_scalar_mul ( scalar_bits ,   window_size ,   & g_table ,   & pp_powers ) , 
  
																 
																 
																             & FixedBaseMSM ::multi_scalar_mul ( scalar_bits ,   window_size ,   & g_table ,   & pp_powers ) , 
  
															
														 
														
													
														
															
																 
																 
																         ) ; 
  
																 
																 
																         ) ; 
  
															
														 
														
													
														
															
																 
																 
																         #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         let   pp_g   =   E ::G2Projective ::batch_normalization_into_affine ( 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             & FixedBaseMSM ::multi_scalar_mul ( scalar_bits ,   window_size ,   & g_table ,   & pp_powers ) , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         let   pp_h   =   E ::G2Projective ::batch_normalization_into_affine ( 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             & FixedBaseMSM ::multi_scalar_mul ( scalar_bits ,   window_size ,   & h_table ,   & pp_powers ) , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         let   pp_h   =   E ::G1Projective ::batch_normalization_into_affine ( 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             & FixedBaseMSM ::multi_scalar_mul ( scalar_bits ,   window_size ,   & h_table ,   & pp_powers ) , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																         let   mut   start   =   0 ; 
  
																 
																 
																         let   mut   start   =   0 ; 
  
															
														 
														
													
														
															
																 
																 
																         for   i   in   0 . . num_vars   { 
  
																 
																 
																         for   i   in   0 . . num_vars   { 
  
															
														 
														
													
														
															
																 
																 
																             let   size   =   1   < <   ( num_vars   -   i ) ; 
  
																 
																 
																             let   size   =   1   < <   ( num_vars   -   i ) ; 
  
															
														 
														
													
														
															
																 
																 
																             let   pp_k_g   =   Evaluations   { 
  
																 
																 
																             let   pp_k_g   =   Evaluations   { 
  
															
														 
														
													
														
															
																 
																 
																                 evals : pp_g [ start . . ( start   +   size ) ] . to_vec ( ) , 
  
																 
																 
																                 evals : pp_g [ start . . ( start   +   size ) ] . to_vec ( ) , 
  
															
														 
														
													
														
															
																 
																 
																             } ; 
  
																 
																 
																             } ; 
  
															
														 
														
													
														
															
																 
																 
																             let   pp_k_h   =   Evaluations   { 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																                 evals : pp_h [ start . . ( start   +   size ) ] . to_vec ( ) , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             } ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             powers_of_g . push ( pp_k_g ) ; 
  
																 
																 
																             powers_of_g . push ( pp_k_g ) ; 
  
															
														 
														
													
														
															
																 
																 
																             powers_of_h . push ( pp_k_h ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             start   + =   size ; 
  
																 
																 
																             start   + =   size ; 
  
															
														 
														
													
														
															
																 
																 
																         } 
  
																 
																 
																         } 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
												
													
														
															
																
																	
																	
																	
																		
																			 
																		 
																	
																 
																@ -223,32 +171,26 @@ impl UniversalParams {   
															
														 
														
													
														
															
																 
																 
																             g : g . into_affine ( ) , 
  
																 
																 
																             g : g . into_affine ( ) , 
  
															
														 
														
													
														
															
																 
																 
																             h : h . into_affine ( ) , 
  
																 
																 
																             h : h . into_affine ( ) , 
  
															
														 
														
													
														
															
																 
																 
																             powers_of_g , 
  
																 
																 
																             powers_of_g , 
  
															
														 
														
													
														
															
																 
																 
																             powers_of_h , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																         } ; 
  
																 
																 
																         } ; 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																         end_timer ! ( pp_generation_timer ) ; 
  
																 
																 
																         end_timer ! ( pp_generation_timer ) ; 
  
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																
 
															
														 
														
													
														
															
																 
																 
																         let   vp_generation_timer   =   start_timer ! ( | |   "VP generation" ) ; 
  
																 
																 
																         let   vp_generation_timer   =   start_timer ! ( | |   "VP generation" ) ; 
  
															
														 
														
													
														
															
																 
																 
																         let   g _mask  =   { 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																         let   h _mask  =   { 
  
															
														 
														
													
														
															
																 
																 
																             let   window_size   =   FixedBaseMSM ::get_mul_window_size ( num_vars ) ; 
  
																 
																 
																             let   window_size   =   FixedBaseMSM ::get_mul_window_size ( num_vars ) ; 
  
															
														 
														
													
														
															
																 
																 
																             let   g_table   =   FixedBaseMSM ::get_window_table ( scalar_bits ,   window_size ,   g ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             #[ cfg(not(feature =  " group-switched " )) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             let   res   =   E ::G1Projective ::batch_normalization_into_affine ( 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																                 & FixedBaseMSM ::multi_scalar_mul ( scalar_bits ,   window_size ,   & g_table ,   & t ) , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																
 
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             #[ cfg(feature =  " group-switched " ) ] 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             let   res   =   E ::G2Projective ::batch_normalization_into_affine ( 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																                 & FixedBaseMSM ::multi_scalar_mul ( scalar_bits ,   window_size ,   & g_table ,   & t ) , 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             ) ; 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																             res 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																             let   h_table   =   FixedBaseMSM ::get_window_table ( scalar_bits ,   window_size ,   h ) ; 
  
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																             E ::G2Projective ::batch_normalization_into_affine ( & FixedBaseMSM ::multi_scalar_mul ( 
  
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																                 scalar_bits , 
  
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																                 window_size , 
  
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																                 & h_table , 
  
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																                 & t , 
  
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																             ) ) 
  
															
														 
														
													
														
															
																 
																 
																         } ; 
  
																 
																 
																         } ; 
  
															
														 
														
													
														
															
																 
																 
																         end_timer ! ( vp_generation_timer ) ; 
  
																 
																 
																         end_timer ! ( vp_generation_timer ) ; 
  
															
														 
														
													
														
															
																 
																 
																         end_timer ! ( total_timer ) ; 
  
																 
																 
																         end_timer ! ( total_timer ) ; 
  
															
														 
														
													
														
															
																 
																 
																         Ok ( Self   { 
  
																 
																 
																         Ok ( Self   { 
  
															
														 
														
													
														
															
																 
																 
																             prover_param : pp , 
  
																 
																 
																             prover_param : pp , 
  
															
														 
														
													
														
															
																 
																 
																             g _mask, 
  
																 
																 
																 
															
														 
														
													
														
															
																 
																 
																 
																 
																 
																             h _mask, 
  
															
														 
														
													
														
															
																 
																 
																         } ) 
  
																 
																 
																         } ) 
  
															
														 
														
													
														
															
																 
																 
																     } 
  
																 
																 
																     } 
  
															
														 
														
													
														
															
																 
																 
																} 
  
																 
																 
																}