{% extends "skeleton.html" -%} {% set sorted_by_label = sorted_by.split(',')[0].split('.')[1] -%} {% block title -%}Tor Relays :: Families By {{ sorted_by_label|replace('_', ' ')|title }}{% endblock -%} {% block body -%}

Home :: Families By {{ sorted_by_label|replace('_', ' ')|title }}

The set of all relay families with > 1 effective members, sorted by {{ sorted_by_label|replace('_', ' ') }}. The first seen parameter is taken from the oldest relay in the family.

{% if sorted_by_label == 'bandwidth' -%} {% else -%} {% endif -%} {% if sorted_by_label == 'exit_count' -%} {% elif sorted_by_label == 'middle_count' -%} {% else -%} {% endif -%} {% if sorted_by_label == 'first_seen' -%} {% else -%} {% endif -%} {% set processed = dict() -%} {% for k, v in relays.json['sorted']['family'].items()|sort(attribute=sorted_by, reverse=True) -%} {% if relays.json['relays'][v['relays'][0]]['fingerprint'] not in processed -%} {% if v['bandwidth'] > 1000000 -%} {% set obs_bandwidth = '%s %s'|format((v['bandwidth'] / 1000000)|round(2, 'common'), 'MB/s') -%} {% else -%} {% set obs_bandwidth = '%s %s'|format((v['bandwidth'] / 1000)|round(2, 'common'), 'KB/s') -%}{% endif -%} {% if v['contact'] -%} {% else -%} {% endif -%} {% for r in v['relays'] -%} {% set _dummy = processed.update({relays.json['relay_subset'][r]['fingerprint']: None}) -%} {% endfor -%} {% endif -%} {% endfor -%}
FamilyBandwidthBandwidthContactExit / MiddleExit / MiddleExit / MiddleFirst SeenFirst Seen
{{ k|escape }} {{ obs_bandwidth }}{{ v['contact']|truncate(50)|escape }}none{{ v['exit_count'] }} / {{ v['middle_count'] }} {{ v['first_seen'].split(' ', 1)[0]|escape }}
{% endblock -%}