code: func SignatureFragment(bundleHash Trits, keyFragment Trits, startOffset int, spongeFunc ...SpongeFunction) (Trits, error) {
  
  	secLvl, err := GetSecurityLevel(bundleHash)
  	if err != nil {
  		return nil, err
  	}
  
  	keyLength := int(secLvl) * int(ISSKeyLength)
  	sigFrag := make(Trits, keyLength)
  
  	h := GetSpongeFunc(spongeFunc, kerl.NewKerl)
  	defer h.Reset()
  
  	sig := make(Trits, HashTrinarySize)
  
  	i := startOffset % int(secLvl)
  	for sigLength := 0; sigLength < keyLength; {
  		for j := i * ISSChunkLength; j < (i+1)*ISSChunkLength && sigLength < keyLength; j += TrinaryRadix {
  			copy(sig, keyFragment[sigLength:sigLength+HashTrinarySize])
  
  			to := MaxTryteValue - (bundleHash[j] + bundleHash[j+1]*3 + bundleHash[j+2]*9)
  
  			for k := 0; k < int(to); k++ {
  				err := h.Absorb(sig)
  				if err != nil {
  					return nil, err
  				}
  				sig, err = h.Squeeze(HashTrinarySize)
  				if err != nil {
  					return nil, err
  				}
  				h.Reset()
  			}
  
  			copy(sigFrag[sigLength:], sig)
  			sigLength += HashTrinarySize
  		}
  
  		i = (i + 1) % int(secLvl)
  	}
  
  	return sigFrag, nil
  }
docs: // SignatureFragment returns signed fragments using the given bundle hash and key fragment.
  // Optionally takes the SpongeFunction to use. Default is Kerl.