@Override
    public boolean isExpired(final TicketGrantingTicketAwareTicket ticketState) {
        if (ticketState == null) {
            return true;
        }
        val expiringTime = toMaximumExpirationTime(ticketState);
        val now = ZonedDateTime.now(getClock());
        val expired = expiringTime.isBefore(now);
        val result = expired || super.isExpired(ticketState);
        if (result) {
            LOGGER.trace("Ticket [{}] is expired because its expiration time [{}] is before [{}] or its parent ticket, if any, has expired",
                ticketState.getId(), expiringTime, now);
        }
        return result;
    }
Ticket expiration policy based on a hard timeout from ticket creation time rather than the
"idle" timeout provided by {@link TimeoutExpirationPolicy}.

@author Andrew Feller
@since 3.1.2
core/cas-server-core-tickets-api/src/main/java/org/apereo/cas/ticket/expiration/HardTimeoutExpirationPolicy.java