docs: def get_TGS(self, spn_user, override_etype = None):
  		"""
  		Requests a TGS ticket for the specified user.
  		Retruns the TGS ticket, end the decrpyted encTGSRepPart.
  
  		spn_user: KerberosTarget: the service user you want to get TGS for.
  		override_etype: None or list of etype values (int) Used mostly for kerberoasting, will override the AP_REQ supported etype values (which is derived from the TGT) to be able to recieve whatever tgs tiecket 
  		"""
  		#construct tgs_req
  		logger.debug('Constructing TGS request for user %s' % spn_user.get_formatted_pname())
  		now = datetime.datetime.utcnow() 
  		kdc_req_body = {}
  		kdc_req_body['kdc-options'] = KDCOptions(set(['forwardable','renewable','renewable_ok', 'canonicalize']))
  		kdc_req_body['realm'] = spn_user.domain.upper()
  		kdc_req_body['sname'] = PrincipalName({'name-type': NAME_TYPE.SRV_INST.value, 'name-string': spn_user.get_principalname()})
  		kdc_req_body['till'] = now + datetime.timedelta(days=1)
  		kdc_req_body['nonce'] = secrets.randbits(31)
  		if override_etype:
  			kdc_req_body['etype'] = override_etype
  		else:
  			kdc_req_body['etype'] = [self.kerberos_cipher_type]
  
  		authenticator_data = {}
  		authenticator_data['authenticator-vno'] = krb5_pvno
  		authenticator_data['crealm'] = Realm(self.kerberos_TGT['crealm'])
  		authenticator_data['cname'] = self.kerberos_TGT['cname']
  		authenticator_data['cusec'] = now.microsecond
  		authenticator_data['ctime'] = now
  		
  		authenticator_data_enc = self.kerberos_cipher.encrypt(self.kerberos_session_key, 7, Authenticator(authenticator_data).dump(), None)
  		
  		ap_req = {}
  		ap_req['pvno'] = krb5_pvno
  		ap_req['msg-type'] = MESSAGE_TYPE.KRB_AP_REQ.value
  		ap_req['ap-options'] = APOptions(set())
  		ap_req['ticket'] = Ticket(self.kerberos_TGT['ticket'])
  		ap_req['authenticator'] = EncryptedData({'etype': self.kerberos_cipher_type, 'cipher': authenticator_data_enc})
  		
  		pa_data_1 = {}
  		pa_data_1['padata-type'] = PaDataType.TGS_REQ.value
  		pa_data_1['padata-value'] = AP_REQ(ap_req).dump()
  		
  		
  		kdc_req = {}
  		kdc_req['pvno'] = krb5_pvno
  		kdc_req['msg-type'] = MESSAGE_TYPE.KRB_TGS_REQ.value
  		kdc_req['padata'] = [pa_data_1]
  		kdc_req['req-body'] = KDC_REQ_BODY(kdc_req_body)
  		
  		req = TGS_REQ(kdc_req)
  		logger.debug('Constructing TGS request to server')
  		rep = self.ksoc.sendrecv(req.dump())
  		logger.debug('Got TGS reply, decrypting...')
  		tgs = rep.native
  		
  		encTGSRepPart = EncTGSRepPart.load(self.kerberos_cipher.decrypt(self.kerberos_session_key, 8, tgs['enc-part']['cipher'])).native
  		key = Key(encTGSRepPart['key']['keytype'], encTGSRepPart['key']['keyvalue'])
  		
  		self.ccache.add_tgs(tgs, encTGSRepPart)
  		logger.debug('Got valid TGS reply')
  		self.kerberos_TGS = tgs
  		return tgs, encTGSRepPart, key