1. process u const n var result : array [integer] of 0..1, x : integer, {index of result, init.0} ready : boolean, {init. true} voted : array [0..n-1] of boolean, num : 0..n, {number of u[i] who voted} k : 0..n, b : 0..1 par j : 0..n-1 begin ready --> ready, result[x], num := false, 0, 0; k := 0; do k < n --> send vrqst to v[k]; voted[k] := false; k := k + 1; od [] rcv vote(b) from v[j] --> if b = 0 --> skip [] b = 1 --> result[x] := 1 fi; voted[j], num := true, num + 1 [] num = n --> ready, x := true, x + 1 [] timeout ~ready ^ ~voted[j] ^ (#ch.u.v[j] + #ch.v[j].u = 0) --> if result[x] = 0 --> send vrqst to v[j] [] result[x] = 1 --> voted[j], num := true, num+1 fi end process v[i: 0..n-1] var b : 0..1 begin rcv vrqst from u --> b := any; send vote(b) to u end 2. - Add to process p the following action: rcv data(x,y) from q --> if sp = x --> {accept data} skip [] sp != x --> {discard data} skip fi - Modify the rcv data action in process q to become as follows: rcv data(x,y) from p --> if sq != y --> {discard data} send drply(x,y) to p [] sq = y --> {accept data} skip [] sq = y --> {accept data} send data(x,y) to p fi