Avigilon

Avigilon

ID: uniflow.plugin.avigilon Category: Security & Video Version: v1.7.0 Min Uniflow Version: Uniflow ≥ v1.4.0

Avigilon Plugin Reference Manual

1. Overview

Plugin Name: Avigilon

Type: Security & Video

Identifier: uniflow.plugin.avigilon

Description

Integration with Avigilon Control Center via Web Endpoint API.


2. Technical Architecture

The Avigilon plugin connects to Avigilon Control Center (ACC) instances via the ACC Web Endpoint REST API over HTTP/HTTPS. It implements secure token authentication, nonce/user key generation, dynamic discovery polling loops for sites, servers, cameras, and alarms, and optionally hosts a local HTTP Webhook endpoint for receiving real-time push event notifications from ACC.

System Interaction & Exposed Catalog Routes

The Avigilon ACC plugin establishes a secure HTTPS REST and WebSocket session with Avigilon Control Center (ACC) Web Endpoint Service. It subscribes to real-time video analytics alarms, motion detection events, and camera status changes, while exposing actions to acknowledge alarms, retrieve video clips, and insert/update video bookmarks.

Catalog Routes & Node Integration

Input Event Triggers (Input Nodes):

  • Alarm Events: ALARM_TRIGGERED, ALARM_ACKNOWLEDGED, ALARM_ASSIGNED, ALARM_UNASSIGNED, ALARM_PURGED, ALARM_RECORD_START, ALARM_RECORD_END
  • Video Analytics & Motion Events: DEVICE_MOTION_START, DEVICE_MOTION_STOP, DEVICE_ANALYTICS_START, DEVICE_ANALYTICS_STOP, DEVICE_TAMPERING, DEVICE_UNUSUAL_STARTED, DEVICE_UNUSUAL_STOPPED, DEVICE_ANOMALY_START, DEVICE_ANOMALY_STOP, DEVICE_PRESENCE_STARTED, DEVICE_PRESENCE_STOPPED, DEVICE_RECORDING_STARTED, DEVICE_RECORDING_STOPPED, DEVICE_VIDEO_SIGNAL_LOST, DEVICE_VIDEO_SIGNAL_RESTORED
  • LPR & Face Detection Events: DEVICE_LPR_MATCH, DEVICE_LPR_PLATE_FOUND, DEVICE_LPR_PLATE_LOST, DEVICE_LPR_PLATE_UPDATE, DEVICE_FACE_MATCH_START, DEVICE_FACE_MATCH_STOP
  • Access Control & Door Events: ACCESS_CONTROL_DOOR_ACCESS_GRANTED, ACCESS_CONTROL_DOOR_ACCESS_DENIED, ACCESS_CONTROL_DOOR_FORCED, ACCESS_CONTROL_DURESS, ACCESS_CONTROL_REX, ACCESS_CONTROL_DOOR_HELD_OPEN, ACCESS_CONTROL_DOOR_OPENED, ACCESS_CONTROL_DOOR_CLOSED, ACCESS_CONTROL_CONNECTED, ACCESS_CONTROL_DISCONNECTED, ACCESS_CONTROL_INPUT_ACTIVATED, ACCESS_CONTROL_INPUT_DEACTIVATED
  • Device Connection & I/O Events: DEVICE_CONNECTED, DEVICE_DISCONNECTED, DEVICE_COMMUNICATION_LOST, DEVICE_COMMUNICATION_RESTORED, DEVICE_CONNECTION_ERROR, DEVICE_DIGITAL_INPUT_ON, DEVICE_DIGITAL_INPUT_OFF
  • User & Storage Audit Events: USER_LOGIN, USER_LOGOUT, STORAGE_LOW_DISK_SPACE, SYSTEM_NETWORK_ERROR, APPLICATION_SERVER_START, APPLICATION_SERVER_STOP
  • Media Export Action Event: MediaDownloaded (MEDIA_DOWNLOAD) - Fired when media clip export completes downloading and saving to disk (SavePath + FileName) or encounters an error. Carries status ("Success" or "Failed"), filename, path, payload, cameraId, format, contentType, fileSizeBytes, error, and timestamp.
  • Executable Actions (Action Nodes):

  • avigilon.acknowledge_alarm - Acknowledges an active ACC alarm.
  • avigilon.create_bookmark / avigilon:bookmark:insert - Creates a video bookmark with camera list, time interval, name, description, and protection status.
  • avigilon:bookmark:update - Updates an existing video bookmark in Avigilon Control Center.
  • avigilon.manual_record / avigilon:camera:record:manual - Manually starts or stops recording on selected camera IDs for up to 24 hours.
  • avigilon.trigger_digital_output / avigilon:trigger_digital_output - Triggers a specific digital output entity (EntityId) or all digital outputs linked to a camera (Id). Accepts EntityId (helper validation with Entities collection; priority) or Id (helper validation with Cameras collection) and IsToggle.
  • avigilon.start_ptz_preset / avigilon:camera:commands:preset - Triggers a specific PTZ preset (PresetId converted to integer) on a target camera (Id). Configured via a 2-column Camera + PTZ Preset selection helper in the Rule Editor.
  • avigilon.ptz_home / avigilon:camera:commands:preset:home - Commands a camera (Id) to return to its configured PTZ home position.
  • avigilon.get_media - Dispatches an asynchronous video/media request to ACC Web Endpoint (/mt/getMedia) without blocking the rule gate. Downloads and saves the file to disk (SavePath + FileName) in the background, emitting a MediaDownloaded event with file details, request status, and the forwarded user Payload.
  • Architecture Diagram

    VISUAL ARCHITECTURE FLOW DIAGRAM
    Rendering Flow Architecture Diagram...

    3. Configuration Parameters

    The following configuration fields are available in the User Interface for this plugin:

    Configuration SettingDescription
    Base URLSpecifies the base url.
    UsernameSpecifies the username.
    PasswordSpecifies the password (secure).
    Client NameSpecifies the client name.
    Site Name FilterSpecifies the site name filter.
    User NonceSpecifies the user nonce.
    User KeySpecifies the user key.
    Connect Timeout (ms)Numeric value specifying the connect timeout (ms).
    Reconnect Interval (ms)Numeric value specifying the reconnect interval (ms).
    Reconnect Delay (ms)Specifies the reconnect delay (ms).
    Webhook URLSpecifies the webhook url.
    Local Webhook Server PortNumeric value specifying the local webhook server port.
    PFX Certificate PathSpecifies the pfx certificate path.
    Certificate PasswordSpecifies the certificate password (secure).
    Poll SitesSpecifies the poll sites.
    Poll ServersSpecifies the poll servers.
    Poll CamerasSpecifies the poll cameras.
    Poll AlarmsSpecifies the poll alarms.
    Poll EventsSpecifies the poll events.
    Poll BookmarksEnables or disables periodic polling of video bookmarks.
    Bookmarks Poll Interval (ms)Interval in milliseconds for polling bookmarks.
    Poll EntitiesEnables or disables periodic polling of generic/RTSP entities.
    Entities Poll Interval (ms)Interval in milliseconds for polling entities.
    Enable SSL (HTTPS)Toggle to enable or disable enable ssl (https).

    3.1 Helper Windows & Catalog Explorers

    A. Source Row Catalog Helper Window (SourceHelperWindow)

    Clicking the Helper button (🔍) on the Avigilon source row in the Sources list table opens the host's Source Catalog Helper Window:

  • Purpose: Provides live catalog exploration across discovered Avigilon Control Center assets and telemetry objects.
  • Collections Presented:
  • Sites & Servers: Explores site cluster definitions, Management Server nodes, version numbers, and connection states.
  • Cameras & Video Channels: Lists connected IP cameras, stream formats, resolutions, framerates, and recording statuses.
  • Alarms & Security Targets: Browses active alarm definitions, priorities (Level 1 to Level 5), lifecycle states, and notes.
  • Bookmarks & Video Clips: Browses created video bookmarks, associated camera IDs, start/end timestamps, and protection status.
  • Events & Telemetry Streams: Browses historical event logs, analytics detections (ANALYTICS_OBJECT_DETECTED, LPR_PLATE_READ), and payload schemas.
  • Interactive Capabilities: Live search filtering by ID or Name, 3-column structured object browsing, and one-click JSON schema copying (Copy JSON).
  • B. Source Editor Topics Dialog (AvigilonTopicsConfigurationDialog)

    Inside the Avigilon source settings editor, clicking Configure Topics... opens the Avigilon Topics Configuration Dialog:

  • Purpose: Provides a visual topic explorer for configuring complex Socket.IO and Webhook event subscription filters without typing raw strings.
  • Data Presented:
  • Main Topic Buckets: Categorized event streams (DEVICE, APPLICATION, STORAGE, SYSTEM, USER, ALARM, ACCESS_CONTROL).
  • Atomic Events Selection Tree: Granular event filters (e.g., DEVICE_CONNECTED, ALARM_TRIGGERED, ACCESS_CONTROL_DOOR_FORCED).
  • Search & Connection Mode Logic: Real-time keyword filtering; adapts options dynamically based on Webhook push vs Socket.IO polling.
  • Output: Automatically updates SourceDto.Settings["avigilon.topics"] and SourceDto.Settings["avigilon.subtopics"] with normalized CSV strings.

  • 4. Exposed Routes & Data Types

    This plugin exposes catalog fields across the following rule graph nodes:

    Input Source

    The Input Source node reads system health, camera online status, and active alarm metrics.

    Human-Readable Field NameData TypeDescription
    Connected Camera Count  Int32
    Total count of cameras currently connected and streaming to Avigilon Control Center server.
    Active Alarm Count  Int32
    Number of unacknowledged active alarms currently in alarm queue.
    Server Connection State  Bool
    System status flag indicating whether the Avigilon Web Endpoint session is connected (True).

    Event Input

    The Event Input node discovers and subscribes dynamically to ACC Web Endpoint native event streams, Socket.IO topic catalog updates, and custom plugin notifications.

    Event Type IdentifierEvent CategoryData TypeExposed Schema Ports & Data TypesDescription
    ALARM_TRIGGERED  Alarm
    Event Object
    ID (String)
    Name (String)
    State (String)
    CameraId (String)
    Priority (Int32)
    Timestamp (DateTime)
    Notes (String)
    Real-time event triggered when an ACC alarm is raised or sensor alarm activates.
    ALARM_ACKNOWLEDGED  Alarm
    Event Object
    ID (String)
    Name (String)
    State (String)
    CameraId (String)
    Priority (Int32)
    Timestamp (DateTime)
    Notes (String)
    Real-time event triggered when an operator acknowledges an active ACC alarm.
    ALARM_ASSIGNED / ALARM_UNASSIGNED  Alarm
    Event Object
    ID (String)
    Name (String)
    State (String)
    CameraId (String)
    Priority (Int32)
    Timestamp (DateTime)
    Notes (String)
    Real-time event triggered when an alarm is assigned to or unassigned from an operator.
    ALARM_PURGED / ALARM_RECORD_START / END  Alarm
    Event Object
    ID (String)
    Name (String)
    State (String)
    Timestamp (DateTime)
    Alarm lifecycle state changes and recording boundary events.
    DEVICE_MOTION_START / DEVICE_MOTION_STOP  Motion
    Event Object
    ID (String)
    Name (String)
    State (String)
    CameraId (String)
    Timestamp (DateTime)
    Triggered when VMD pixel motion starts or stops on a camera channel.
    DEVICE_ANALYTICS_START / DEVICE_ANALYTICS_STOP  Analytics
    Event Object
    ID (String)
    Name (String)
    State (String)
    CameraId (String)
    Timestamp (DateTime)
    Triggered when an ACC video analytics rule match starts or stops.
    DEVICE_TAMPERING / DEVICE_UNUSUAL_STARTED  Analytics
    Event Object
    ID (String)
    Name (String)
    State (String)
    CameraId (String)
    Timestamp (DateTime)
    Triggered on camera occlusion, scene change, or unusual activity detection.
    DEVICE_LPR_MATCH  LPR
    Event Object
    ID (String)
    Name (String)
    State (String)
    CameraId (String)
    Plate (String)
    Confidence (Double)
    Timestamp (DateTime)
    Triggered when a license plate recognition match occurs against watchlists.
    DEVICE_FACE_MATCH_START / STOP  Facial Recognition
    Event Object
    ID (String)
    Name (String)
    State (String)
    CameraId (String)
    PersonId (String)
    Confidence (Double)
    Timestamp (DateTime)
    Triggered when facial recognition detects a watchlist match.
    ACCESS_CONTROL_DOOR_ACCESS_GRANTED / DENIED  Access Control
    Event Object
    ID (String)
    Name (String)
    State (String)
    DoorId (String)
    CardId (String)
    PersonName (String)
    Timestamp (DateTime)
    Triggered on ACM door credential access granted or denied events.
    ACCESS_CONTROL_DOOR_FORCED / HELD_OPEN  Access Control
    Event Object
    ID (String)
    Name (String)
    State (String)
    DoorId (String)
    Timestamp (DateTime)
    Triggered on door forced entry or door held open alarm events.
    DEVICE_CONNECTED / DEVICE_DISCONNECTED  Connectivity
    Event Object
    ID (String)
    Name (String)
    State (String)
    DeviceId (String)
    Timestamp (DateTime)
    Triggered when an IP camera or encoder connects or loses network connection.
    DEVICE_DIGITAL_INPUT_ON / OFF  Hardware I/O
    Event Object
    ID (String)
    Name (String)
    State (String)
    InputId (String)
    Timestamp (DateTime)
    Triggered when camera dry contact input state changes (on/off).
    USER_LOGIN / USER_LOGOUT  System Audit
    Event Object
    ID (String)
    Name (String)
    State (String)
    Username (String)
    ClientIp (String)
    Timestamp (DateTime)
    Audit event logged when an ACC user logs into or out of the system.
    HELLO / HEARTBEAT / SLOW_HEARTBEAT  System Health
    Event Object
    Timestamp (DateTime)
    Status (String)
    Socket.IO connection keepalive and system health heartbeats.
    MediaDownloaded / MEDIA_DOWNLOAD  Video Export
    Event Object
    status (String)
    filename (String)
    path (String)
    payload (String)
    cameraId (String)
    format (String)
    contentType (String)
    fileSizeBytes (Int)
    error (String)
    timestamp (String)
    Triggered when a video clip or media export completes downloading and is saved to disk (or fails) following an avigilon.get_media request.

    Data Source

    The Data Source node queries structured collections of VMS assets, security alarms, hardware nodes, and historical event records.

    Human-Readable Collection NameData TypeExposed Fields & Data TypesDescription
    Cameras  Json` (`collection`)
    Id (String)
    ServerId (String)
    LogicalId (Int64)
    Name (String)
    Serial (String)
    Active (Bool)
    Connected (Bool)
    ConnectionState (String)
    Location (String)
    Full list of connected IP video cameras, stream status, hardware serial numbers, and channel locations.
    Alarms  Json` (`collection`)
    Id (String)
    Name (String)
    State (String)
    Type (String)
    IsAssignedToCurrentUser (Bool)
    AssociatedCameras (String[])
    Cameras (List<CameraModel>)
    IsNoteRequired (Bool)
    TimeOfMostRecentActivation (String)
    MissedTriggers (Int32)
    Complete list of registered ACC alarms, active states, assigned users, associated camera channels, and activation metrics.
    Sites  Json` (`collection`)
    Id (String)
    Name (String)
    Reachable (String)
    List of configured Avigilon site clusters and network reachability status.
    Servers  Json` (`collection`)
    Id (String)
    Name (String)
    List of ACC Management Server instances in the site cluster hierarchy.
    Events  Json` (`collection`)
    thisId (String)
    type (String)
    rootType (String)
    siteId (String)
    cameraId (String)
    cameraIds (List<String>)
    entityIds (List<String>)
    originatingServerId (String)
    originatingServerName (String)
    location (String)
    timestamp (String)
    licensePlate (String)
    confidence (Float)
    rebootReason (Int32)
    Complete historical log of system telemetry, video analytics detections, door events, and hardware alerts.
    Bookmarks  Json` (`collection`)
    Id (String)
    Name (String)
    Description (String)
    CameraIds (String[])
    CreationTime (String)
    StartTime (String)
    EndTime (String)
    IsProtected (Bool)
    Complete list of video bookmarks created in Avigilon Control Center.

    Output Target

    The Output Target node acts as an action sink node to execute alarm management, bookmark management, and video export operations on Avigilon ACC.

    Target NameData TypeAssociated ParametersParameter Data TypeRequiredDescription
    Alarms  Json
    AlarmId (AlarmId)StringTrueTarget Avigilon alarm identifier GUID.
    Notes (Notes)StringTrueNote or audit log comment text to attach to alarm action.
    Action (Action)StringTrueAlarm lifecycle operation (TRIGGER, ACKNOWLEDGE, CLAIM, UNCLAIM, PURGE).
    Insert Bookmark  Json
    Name (Name)StringTrueBookmark name/title string.
    Description (Description)StringFalseOptional bookmark detail or event notes string.
    CameraIds (Camera IDs)StringTrueComma-separated list of target camera ID GUIDs.
    StartTime (Start Time)StringTrueISO 8601 bookmark start timestamp.
    EndTime (End Time)StringTrueISO 8601 bookmark end timestamp.
    IsProtected (Is Protected)BoolFalseFlag to protect bookmark from automatic retention purge (true/false).
    Update Bookmark  Json
    Id (Bookmark ID)StringTrueUnique identifier GUID of existing bookmark to update.
    Name (Name)StringTrueUpdated bookmark name/title string.
    Description (Description)StringFalseUpdated bookmark detail or event notes string.
    CameraIds (Camera IDs)StringTrueComma-separated list of target camera ID GUIDs.
    StartTime (Start Time)StringTrueUpdated ISO 8601 bookmark start timestamp.
    EndTime (End Time)StringTrueUpdated ISO 8601 bookmark end timestamp.
    IsProtected (Is Protected)BoolFalseFlag to protect bookmark from automatic retention purge (true/false).
    Manual Record  Json
    CameraIds (Camera IDs)StringTrueComma-separated list of target camera ID GUIDs selected via multi-select helper.
    Action (Action)StringTrueManual recording action dropdown (START or STOP).
    MaxDurationSec (Max Duration (sec))Int32FalseMaximum recording duration in seconds for START action (minimum 15s up to 86400 / 24 hours, default 15s; automatically omitted for STOP action).
    Trigger Digital Output  Json
    EntityId (Entity ID)StringFalseSpecific digital output entity ID GUID (helper validation with Entities collection; takes priority over Camera ID).
    Id (Camera ID)StringFalseCamera ID GUID linked to digital output entities (helper validation with Cameras collection).
    IsToggle (Is Toggle)BoolFalseFlag to toggle digital output state (true/false, default true).
    Start PTZ Preset  Json
    Id (Camera ID)StringTrueTarget camera ID GUID (selected via 2-column PTZ Preset helper).
    PresetId (Preset ID)Int32TrueInteger ID of the PTZ preset to start (selected via 2-column PTZ Preset helper).
    PTZ Home  Json
    Id (Camera ID)StringTrueTarget camera ID GUID (selected via Camera collection helper).
    Get Media  Json
    CameraId (Camera ID)StringTrueTarget camera identifier. Note: this sink node dispatches the request to the API asynchronously without blocking the rule gate.
    Format (Format)StringFalseMedia output format (mp4, avi, mkv, jpeg, png, ave, native).
    ContentType (Response Content Type)StringFalseHTTP Accept response content type (Auto (From Format), video/mp4, image/jpeg, etc.).
    SavePath (Save Path)StringTrueFolder path on disk where media will be saved, e.g. C:\Exports.
    FileName (File Name)StringTrueOutput file name template, e.g. video_cam1.mp4. Supports {camera} and {timestamp}.
    Payload (Payload / User Data)StringFalseCustom user payload string passed through to the MediaDownloaded event.
    Media (Media Stream)StringFalseStream channels (video, audio, video,audio).
    Quality (Quality)StringFalseStream quality level (high, medium, low, original).
    Range (Time Range)StringFalseISO 8601 time interval string (e.g. 2026-08-15T12:00:00Z/2026-08-15T12:05:00Z).
    T (Start Time)StringFalseStart timestamp (ISO 8601 or UNIX epoch).
    Frames (Frames Filter)StringFalseFrame subsampling filter (all, key, 1, 5, 10, 15, 30).
    Burnin (Burn In Overlay)StringFalseBurn timestamp and camera overlays into video (false, true).
    Rotate (Rotate Video)StringFalseRotate video frame (false, true).
    Size (Resolution Size)StringFalseVideo resolution size (original, 1920x1080, 1280x720, 640x480).
    VCoding (Video Codec)StringFalseVideo codec encoding (copy, h264, h265, mjpeg).

    5. Usage Examples

    Scenario A: Modbus TCP Fire Alarm Input Triggers ACC Camera Alarm

    Workflow Overview:

    When a physical Modbus TCP field I/O module detects a discrete input state change from a ceiling fire detector (DiscreteInput[101] == True), Uniflow evaluates the rule and immediately issues an ACC alarm trigger command via the Avigilon Output Target node. This raises a high-priority security alarm (AlarmId: 1042-FIRE-ZONE-1) linked to the corresponding ceiling camera (CamId: CAM-04-NORTH-WING) in Avigilon Control Center, alerting security dispatchers and initiating local ACC recording.

    Rule Node Configuration:

    1. Input Source Node: Modbus TCP Field I/O

  • Point / Field: DiscreteInput_101 (Boolean)
  • 2. Logic Condition Node: IsTrue

  • Evaluation: DiscreteInput_101 == True
  • 3. Output Target Node: Avigilon ACC

  • Action Target: Alarms (avigilon:alarm)
  • AlarmId: 1042-FIRE-ZONE-1
  • Action: TRIGGER
  • Notes: Automatic fire alarm trigger from Modbus input 101 (North Wing Smoke Detector)
  • Logic Flow Diagram:

    VISUAL ARCHITECTURE FLOW DIAGRAM
    Rendering Flow Architecture Diagram...

    Scenario B: Hexagon LiDAR IntrusionDetections Trigger ACC Alarm & Capture Snapshot (Get Media)

    Workflow Overview:

    When a Hexagon 3D LiDAR perimeter sensor detects target motion or intrusion within designated security zone "Zone A" (Zone == "Zone A" & Status == "INTRUSION"), Uniflow triggers a two-fold automated response:

    1. Triggers an active ACC alarm (AlarmId: 201-LIDAR-ZONE-A, Action: TRIGGER) via the Avigilon Output Target node to alert control room staff.

    2. Simultaneously invokes avigilon.get_media to request a high-resolution JPEG snapshot from the PTZ camera aimed at Zone A (CameraId: CAM-01-PERIMETER-PTZ, Format: jpeg, SavePath: C:\Uniflow\Snapshots). Once downloaded, the media exporter publishes a MEDIA_DOWNLOAD event with file metadata for downstream auditing.

    Rule Node Configuration:

    1. Event Input Node: Hexagon LiDAR Sensor

  • Exposed Schema Fields: Zone (String), Status (String), Timestamp (DateTime)
  • 2. Logic Filter Node: And Condition

  • Expression: Zone == "Zone A" AND Status == "INTRUSION"
  • 3. Output Target Node A: Avigilon ACC Alarm

  • Action Target: Alarms (avigilon:alarm)
  • AlarmId: 201-LIDAR-ZONE-A
  • Action: TRIGGER
  • Notes: LiDAR intrusion detection in Zone A
  • 4. Output Target Node B: Avigilon Media Exporter

  • Action Target: Get Media (avigilon.get_media)
  • CameraId: CAM-01-PERIMETER-PTZ
  • Format: jpeg
  • SavePath: C:\Uniflow\Snapshots
  • FileName: lidar_zone_a_{timestamp}.jpg
  • Payload: lidar_intrusion_event_201
  • Logic Flow Diagram:

    VISUAL ARCHITECTURE FLOW DIAGRAM
    Rendering Flow Architecture Diagram...

    Scenario C: Create Protected Video Bookmark on License Plate (LPR) Match

    Workflow Overview:

    When an Avigilon camera detects a blacklisted license plate (DEVICE_LPR_MATCH), Uniflow automatically inserts a protected video bookmark into Avigilon Control Center spanning 2 minutes before and after the detection timestamp.

    Rule Node Configuration:

    1. Event Input Node: Avigilon LPR Event (DEVICE_LPR_MATCH)

  • Exposed Schema Fields: CameraId (String), Plate (String), Timestamp (DateTime)
  • 2. Output Target Node: Insert Bookmark (avigilon:bookmark:insert)

  • Name: Blacklist LPR Match - {Plate}
  • Description: Automatic bookmark generated for license plate match {Plate}
  • CameraIds: {CameraId}
  • StartTime: {Timestamp - 2m}
  • EndTime: {Timestamp + 2m}
  • IsProtected: True
  • Logic Flow Diagram:

    VISUAL ARCHITECTURE FLOW DIAGRAM
    Rendering Flow Architecture Diagram...
    Architecture Flow Diagram — Full Preview