as in assignment 8, a complete binary tree of threads should be created. each leaf thread will compute the hash value of n/m consecutive blocks assigned to it and return the hash value to its parent thread (through pthread exit() call). an interior thread will compute the hash value of the blocks assigned to it, and then wait for its children to return hash values. these hash values should be combined to form a string: . (note that the sign here means concatenation and not addition. also, if the interior thread has no right child, only the hash value of the interior thread and the hash value from the left child are combined.) the interior thread then computes hash value of the concatenated string as before and returns the value to its parent, the value returned by the root thread is the hash value of the file. how to assign blocks to threads? each thread is assigned a number when it is created. the number of root thread is 0. for a thread with number i, the number of its left child is 2 * i 1, and the number of its right child is 2 * i 2. for a thread with number i, n/m consecutive blocks starting from block number i * n/m are assigned. for example, let n