def METHOD_NAME(soup):
    threads = soup.select('core thread')
    threads = {thread.attrs['id']: thread.select_one('cpu_id').text for thread in threads}
    caches = soup.select('caches cache')
    cat_info = []
    for cache in caches:
        cache_level = int(cache.attrs['level'])
        # ignore cache_level 1 and single core cache region
        if cache_level == 1 or len(processors := cache.select('processors processor')) <= 1:
            continue
        # ignore no CAT capability cache region
        if cache.select_one('#CAT') is None:
            continue
        capacity_mask_length = cache.select_one('capability capacity_mask_length')
        capacity_mask_length = int(capacity_mask_length.text)
        processors = [int(threads[processor.text]) for processor in processors]
        processors.sort()
        cache_info = {
            'id': cache.attrs['id'],
            'level': cache_level,
            'type': cache.attrs['type'],
            'cache_size': int(cache.select_one('cache_size').text),
            'capacity_mask_length': capacity_mask_length,
            'processors': processors,
        }
        cat_info.append(cache_info)
    cat_info.sort(key=lambda x: int(x['id'], 16))
    cat_info.sort(key=lambda x: x['level'], reverse=True)
    return cat_info