@classmethod
def all(cls, otp=False, ccid=False, u2f=False):
    """Returns a set of all PIDs, with optional filtering"""
    pids = set([cls.YUBIKEY, cls.NEO_OTP, cls.NEO_OTP_CCID, cls.NEO_CCID,
        cls.NEO_U2F, cls.NEO_OTP_U2F, cls.NEO_U2F_CCID, cls.
        NEO_OTP_U2F_CCID, cls.NEO_SKY, cls.YK4_OTP, cls.YK4_U2F, cls.
        YK4_OTP_U2F, cls.YK4_CCID, cls.YK4_OTP_CCID, cls.YK4_U2F_CCID, cls.
        YK4_OTP_U2F_CCID, cls.PLUS_U2F_OTP])
    if otp:
        pids.difference_update(set([cls.NEO_CCID, cls.NEO_U2F, cls.
            NEO_U2F_CCID, cls.NEO_SKY, cls.YK4_U2F, cls.YK4_CCID, cls.
            YK4_U2F_CCID]))
    if ccid:
        pids.difference_update(set([cls.YUBIKEY, cls.NEO_OTP, cls.NEO_U2F,
            cls.NEO_OTP_U2F, cls.NEO_SKY, cls.YK4_OTP, cls.YK4_U2F, cls.
            YK4_OTP_U2F, cls.PLUS_U2F_OTP]))
    if u2f:
        pids.difference_update(set([cls.YUBIKEY, cls.NEO_OTP, cls.
            NEO_OTP_CCID, cls.NEO_CCID, cls.YK4_OTP, cls.YK4_CCID, cls.
            YK4_OTP_CCID]))
    return pids
