{% import 'macros.html' as m with context %}

{{ ctx.data.service_rows|length|num }} services answered on {{ addresses|num }} addresses. {{ web|num }} of them answer HTTP.{% if sensitive %} {{ sensitive|num }} {{ 'is' if sensitive == 1 else 'are' }} administrative or data.{% endif %}

{% if classes %}
Composition
{% set items = [] %} {% for row in classes %}{% set _ = items.append(Slice(row.label, row.count, ctx.hue(loop.index0))) %}{% endfor %} {{ stack_bar(items)|safe }}
{% for row in classes %} {{ row.label }} {{ row.count|num }}{% endfor %}
{% endif %} {% if policies %}
Scan coverage
{% for key, count in policies.items() %} {% endfor %}
{{ {'full':'Scanned in full','web':'Web ports only, CDN edge','skip':'Not scanned'}.get(key, key) }}{{ count|num }} addresses
{% endif %}
Services
{% if show_banner %}{% endif %} {% for row in rows %} {% if show_banner %}{% endif %} {% endfor %}
AddressPortServiceClassSoftwareHostnames
{{ row.ip }} {{ row.port }}{% if row.tls %} tls{% endif %} {{ row.service_name or '—' }}{% if row.sensitive %} sensitive{% endif %} {{ row.service_class|svc }}{{ ((row.product ~ ' ' ~ (row.version or '')) if row.product else (row.banner or ''))|clip(48) or '—' }}{{ row.hosts[:2]|join(', ')|clip(46) or '—' }}
{% if hidden %}

{{ hidden|num }} further services are not listed.

{% endif %}