{
  "id": "7875aac3-f583-4351-a4b0-c283491c6d4f",
  "revision": 0,
  "last_node_id": 204,
  "last_link_id": 142,
  "nodes": [
    {
      "id": 147,
      "type": "bde8681c-adbd-4b44-a31c-2a4acb8cf45a",
      "pos": [
        -120,
        2270
      ],
      "size": [
        330,
        500
      ],
      "flags": {},
      "order": 13,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 122
        }
      ],
      "outputs": [
        {
          "label": "IMAGE",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            131
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "34",
            "value"
          ],
          [
            "35",
            "value"
          ],
          [
            "33",
            "value"
          ],
          [
            "146",
            "choice"
          ],
          [
            "32",
            "color"
          ],
          [
            "145",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 148,
      "type": "e864f288-0bda-497b-a111-800d4c0cd171",
      "pos": [
        -120,
        3480
      ],
      "size": [
        250,
        500
      ],
      "flags": {},
      "order": 14,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 123
        }
      ],
      "outputs": [
        {
          "label": "IMAGE",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            132
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "17",
            "value"
          ],
          [
            "18",
            "value"
          ],
          [
            "19",
            "value"
          ],
          [
            "20",
            "value"
          ],
          [
            "21",
            "choice"
          ],
          [
            "15",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 160,
      "type": "b5143322-553a-4d96-9539-76b3707ef275",
      "pos": [
        -120,
        2910
      ],
      "size": [
        270,
        420
      ],
      "flags": {},
      "order": 17,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 126
        }
      ],
      "outputs": [
        {
          "label": "IMAGE",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            135
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "159",
            "choice"
          ],
          [
            "158",
            "value"
          ],
          [
            "16",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 171,
      "type": "1d319b86-6e4f-43d0-83e1-99dc988e1db3",
      "pos": [
        -120,
        4130
      ],
      "size": [
        270,
        470
      ],
      "flags": {},
      "order": 18,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 127
        }
      ],
      "outputs": [
        {
          "label": "IMAGE",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            136
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "170",
            "value"
          ],
          [
            "169",
            "value"
          ],
          [
            "168",
            "value"
          ],
          [
            "167",
            "value"
          ],
          [
            "166",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 179,
      "type": "bf0f7afe-2f48-42b1-9e47-57e362efc6dd",
      "pos": [
        -120,
        1610
      ],
      "size": [
        330,
        540
      ],
      "flags": {},
      "order": 16,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 125
        }
      ],
      "outputs": [
        {
          "label": "IMAGE",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            134
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "172",
            "choice"
          ],
          [
            "174",
            "value"
          ],
          [
            "175",
            "value"
          ],
          [
            "176",
            "value"
          ],
          [
            "173",
            "value"
          ],
          [
            "177",
            "value"
          ],
          [
            "178",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 165,
      "type": "b7c3a768-1a1c-4a3d-bddf-043f4a8ffb20",
      "pos": [
        -120,
        4770
      ],
      "size": [
        300,
        540
      ],
      "flags": {},
      "order": 19,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 128
        }
      ],
      "outputs": [
        {
          "label": "IMAGE",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            137
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "2",
            "choice"
          ],
          [
            "164",
            "value"
          ],
          [
            "163",
            "value"
          ],
          [
            "162",
            "value"
          ],
          [
            "161",
            "value"
          ],
          [
            "3",
            "choice"
          ],
          [
            "1",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 29,
      "type": "1cccc258-98ed-4c17-8a0b-392e48a99dfa",
      "pos": [
        -170,
        -430
      ],
      "size": [
        230,
        410
      ],
      "flags": {},
      "order": 11,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 120
        }
      ],
      "outputs": [
        {
          "label": "R",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            138
          ]
        },
        {
          "label": "G",
          "name": "IMAGE1",
          "type": "IMAGE",
          "links": [
            139
          ]
        },
        {
          "label": "B",
          "name": "IMAGE2",
          "type": "IMAGE",
          "links": [
            142
          ]
        },
        {
          "label": "A",
          "name": "IMAGE3",
          "type": "IMAGE",
          "links": [
            141
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "23",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 180,
      "type": "LoadImage",
      "pos": [
        -1170,
        2270
      ],
      "size": [
        290,
        370
      ],
      "flags": {},
      "order": 0,
      "mode": 0,
      "inputs": [],
      "outputs": [
        {
          "name": "IMAGE",
          "type": "IMAGE",
          "links": [
            119,
            120,
            121,
            122,
            123,
            124,
            125,
            126,
            127,
            128
          ]
        },
        {
          "name": "MASK",
          "type": "MASK",
          "links": null
        }
      ],
      "properties": {
        "Node name for S&R": "LoadImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": [
        "example.png",
        "image"
      ]
    },
    {
      "id": 182,
      "type": "PreviewImage",
      "pos": [
        320,
        950
      ],
      "size": [
        380,
        460
      ],
      "flags": {},
      "order": 25,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 130
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 183,
      "type": "PreviewImage",
      "pos": [
        320,
        2280
      ],
      "size": [
        380,
        490
      ],
      "flags": {},
      "order": 26,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 131
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 184,
      "type": "PreviewImage",
      "pos": [
        320,
        3480
      ],
      "size": [
        380,
        500
      ],
      "flags": {},
      "order": 27,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 132
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 187,
      "type": "PreviewImage",
      "pos": [
        320,
        1610
      ],
      "size": [
        380,
        540
      ],
      "flags": {},
      "order": 29,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 134
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 188,
      "type": "PreviewImage",
      "pos": [
        320,
        2910
      ],
      "size": [
        380,
        420
      ],
      "flags": {},
      "order": 30,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 135
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 189,
      "type": "PreviewImage",
      "pos": [
        320,
        4140
      ],
      "size": [
        380,
        480
      ],
      "flags": {},
      "order": 31,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 136
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 190,
      "type": "PreviewImage",
      "pos": [
        320,
        4770
      ],
      "size": [
        380,
        500
      ],
      "flags": {},
      "order": 32,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 137
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 193,
      "type": "PreviewImage",
      "pos": [
        980,
        -430
      ],
      "size": [
        230,
        410
      ],
      "flags": {},
      "order": 24,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 141
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 194,
      "type": "PreviewImage",
      "pos": [
        690,
        -430
      ],
      "size": [
        230,
        410
      ],
      "flags": {},
      "order": 23,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 142
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 191,
      "type": "PreviewImage",
      "pos": [
        120,
        -430
      ],
      "size": [
        230,
        410
      ],
      "flags": {},
      "order": 21,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 138
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 192,
      "type": "PreviewImage",
      "pos": [
        410,
        -430
      ],
      "size": [
        230,
        410
      ],
      "flags": {},
      "order": 22,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 139
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 10,
      "type": "8e3709c0-2209-4184-8a96-264ee9f1eed2",
      "pos": [
        1510,
        190
      ],
      "size": [
        270,
        1470
      ],
      "flags": {},
      "order": 10,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 119
        }
      ],
      "outputs": [
        {
          "label": "IMAGE",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            129
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "4",
            "curve"
          ],
          [
            "5",
            "curve"
          ],
          [
            "6",
            "curve"
          ],
          [
            "7",
            "curve"
          ],
          [
            "8",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 181,
      "type": "PreviewImage",
      "pos": [
        1870,
        190
      ],
      "size": [
        570,
        640
      ],
      "flags": {},
      "order": 20,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 129
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 157,
      "type": "ed876eb4-358d-4e40-af28-de21afc3af7f",
      "pos": [
        -130,
        130
      ],
      "size": [
        400,
        660
      ],
      "flags": {},
      "order": 15,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 124
        }
      ],
      "outputs": [
        {
          "label": "IMAGE",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            133
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "149",
            "value"
          ],
          [
            "150",
            "value"
          ],
          [
            "151",
            "value"
          ],
          [
            "152",
            "value"
          ],
          [
            "153",
            "value"
          ],
          [
            "154",
            "value"
          ],
          [
            "155",
            "value"
          ],
          [
            "11",
            "value"
          ],
          [
            "12",
            "value"
          ],
          [
            "13",
            "value"
          ],
          [
            "156",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 186,
      "type": "PreviewImage",
      "pos": [
        320,
        130
      ],
      "size": [
        380,
        650
      ],
      "flags": {},
      "order": 28,
      "mode": 0,
      "inputs": [
        {
          "name": "images",
          "type": "IMAGE",
          "link": 133
        }
      ],
      "outputs": [],
      "properties": {
        "Node name for S&R": "PreviewImage",
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    },
    {
      "id": 196,
      "type": "MarkdownNote",
      "pos": [
        730,
        140
      ],
      "size": [
        430,
        640
      ],
      "flags": {},
      "order": 1,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "title": "Color Balance",
      "properties": {},
      "widgets_values": [
        "## Color Balance\n\n**Purpose**: Adjust RGB color balance separately in **shadows, midtones, and highlights**.\n\n**Highlights**: Real-time GPU fragment shader; independent sliders for precise color grading.\n\n**Use when**: Fixing color casts, matching tone across the image, or cinematic split-toning without crushing contrast."
      ],
      "color": "#222",
      "bgcolor": "#000"
    },
    {
      "id": 197,
      "type": "MarkdownNote",
      "pos": [
        730,
        960
      ],
      "size": [
        410,
        470
      ],
      "flags": {},
      "order": 2,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "title": "Brightness and Contrast",
      "properties": {},
      "widgets_values": [
        "## Brightness and Contrast\n\n**Purpose**: Change overall image **brightness** and **contrast**.\n\n**Highlights**: GPU shader; simple controls with fast preview for exposure tweaks.\n\n**Use when**: Brightening underexposed shots, taming highlights, or boosting/separating subject from background."
      ],
      "color": "#222",
      "bgcolor": "#000"
    },
    {
      "id": 198,
      "type": "MarkdownNote",
      "pos": [
        730,
        1630
      ],
      "size": [
        410,
        470
      ],
      "flags": {},
      "order": 3,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "title": "Image Levels",
      "properties": {},
      "widgets_values": [
        "## Image Levels\n\n**Purpose**: Set **black point, white point, and gamma** to control tonal distribution.\n\n**Highlights**: Familiar Levels-style workflow; GPU shader with live preview.\n\n**Use when**: Expanding dynamic range, fixing flat or crushed blacks, before other color passes."
      ],
      "color": "#222",
      "bgcolor": "#000"
    },
    {
      "id": 199,
      "type": "MarkdownNote",
      "pos": [
        730,
        2290
      ],
      "size": [
        410,
        470
      ],
      "flags": {},
      "order": 4,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "title": "Glow",
      "properties": {},
      "widgets_values": [
        "## Glow\n\n**Purpose**: Add **bloom / glow** around bright areas of the image.\n\n**Highlights**: GPU shader; adjustable strength, radius, blend mode, and tint color.\n\n**Use when**: Dreamy, neon, or cinematic halation around lights and specular highlights."
      ],
      "color": "#222",
      "bgcolor": "#000"
    },
    {
      "id": 200,
      "type": "MarkdownNote",
      "pos": [
        730,
        2920
      ],
      "size": [
        410,
        420
      ],
      "flags": {},
      "order": 5,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "title": "Chromatic Aberration",
      "properties": {},
      "widgets_values": [
        "## Chromatic Aberration\n\n**Purpose**: Simulate lens **color fringing** (e.g. red/cyan edges).\n\n**Highlights**: GPU real-time; adjustable strength and direction for strong stylization.\n\n**Use when**: Vintage, film, or lo-fi lens character; subtle edge accent effects."
      ],
      "color": "#222",
      "bgcolor": "#000"
    },
    {
      "id": 201,
      "type": "MarkdownNote",
      "pos": [
        730,
        3510
      ],
      "size": [
        410,
        420
      ],
      "flags": {},
      "order": 6,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "title": "Film Grain",
      "properties": {},
      "widgets_values": [
        "## Film Grain\n\n**Purpose**: Overlay procedural **film grain** texture.\n\n**Highlights**: GPU shader; control grain size, amount, and related parameters.\n\n**Use when**: Reducing overly clean digital look; adding cinematic texture and depth."
      ],
      "color": "#222",
      "bgcolor": "#000"
    },
    {
      "id": 202,
      "type": "MarkdownNote",
      "pos": [
        730,
        4140
      ],
      "size": [
        410,
        420
      ],
      "flags": {},
      "order": 7,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "title": "Color Adjustment",
      "properties": {},
      "widgets_values": [
        "## Color Adjustment\n\n**Purpose**: Tune global **saturation, temperature, tint, and vibrance**.\n\n**Highlights**: GPU real-time; broad global grade that complements zone-based Color Balance.\n\n**Use when**: Quick warm/cool shifts or overall saturation changes for mood."
      ],
      "color": "#222",
      "bgcolor": "#000"
    },
    {
      "id": 203,
      "type": "MarkdownNote",
      "pos": [
        730,
        4830
      ],
      "size": [
        410,
        420
      ],
      "flags": {},
      "order": 8,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "title": "Hue and Saturation",
      "properties": {},
      "widgets_values": [
        "## Hue and Saturation\n\n**Purpose**: Shift **hue**, **saturation**, and **lightness**.\n\n**Highlights**: GPU shader; channel or global modes depending on subgraph controls.\n\n**Use when**: Creative recoloring, desaturation, or pushing a specific color palette."
      ],
      "color": "#222",
      "bgcolor": "#000"
    },
    {
      "id": 204,
      "type": "MarkdownNote",
      "pos": [
        -1710,
        2260
      ],
      "size": [
        480,
        650
      ],
      "flags": {},
      "order": 9,
      "mode": 0,
      "inputs": [],
      "outputs": [],
      "title": "About this workflow",
      "properties": {},
      "widgets_values": [
        "## Built-in Color Adjustment Blueprints Demo\n\nThis workflow demonstrates built-in image color and tone **subgraphs** from ComfyUI **blueprints**. **Load Image** on the left feeds every branch; **Preview Image** on the right shows each result side by side.\n\n### Tips\n- Drag any subgraph from the Comfy Subgraph in the Node library into your own graphs, or keep this layout for comparison.\n- All color subgraphs use **GPU fragment shaders** for low-latency preview and export.\n\n### Strongly recommended\nEnable **[Nodes 2.0](https://docs.comfy.org/interface/nodes-2)** in ComfyUI settings for proxied subgraph widgets, canvas previews, and a smoother editing experience."
      ],
      "color": "#222",
      "bgcolor": "#000"
    },
    {
      "id": 144,
      "type": "45b59a1a-ac53-4f90-8ebd-9f3ab79f21e3",
      "pos": [
        -120,
        950
      ],
      "size": [
        320,
        460
      ],
      "flags": {},
      "order": 12,
      "mode": 0,
      "inputs": [
        {
          "label": "image",
          "name": "images.image0",
          "type": "IMAGE",
          "link": 121
        }
      ],
      "outputs": [
        {
          "label": "IMAGE",
          "name": "IMAGE0",
          "type": "IMAGE",
          "links": [
            130
          ]
        }
      ],
      "properties": {
        "proxyWidgets": [
          [
            "30",
            "value"
          ],
          [
            "31",
            "value"
          ],
          [
            "143",
            "$$canvas-image-preview"
          ]
        ],
        "cnr_id": "comfy-core",
        "ver": "0.22.0",
        "enableTabs": false,
        "tabWidth": 65,
        "tabXOffset": 10,
        "hasSecondTab": false,
        "secondTabText": "Send Back",
        "secondTabOffset": 80,
        "secondTabWidth": 65
      },
      "widgets_values": []
    }
  ],
  "links": [
    [
      119,
      180,
      0,
      10,
      0,
      "IMAGE"
    ],
    [
      120,
      180,
      0,
      29,
      0,
      "IMAGE"
    ],
    [
      121,
      180,
      0,
      144,
      0,
      "IMAGE"
    ],
    [
      122,
      180,
      0,
      147,
      0,
      "IMAGE"
    ],
    [
      123,
      180,
      0,
      148,
      0,
      "IMAGE"
    ],
    [
      124,
      180,
      0,
      157,
      0,
      "IMAGE"
    ],
    [
      125,
      180,
      0,
      179,
      0,
      "IMAGE"
    ],
    [
      126,
      180,
      0,
      160,
      0,
      "IMAGE"
    ],
    [
      127,
      180,
      0,
      171,
      0,
      "IMAGE"
    ],
    [
      128,
      180,
      0,
      165,
      0,
      "IMAGE"
    ],
    [
      129,
      10,
      0,
      181,
      0,
      "IMAGE"
    ],
    [
      130,
      144,
      0,
      182,
      0,
      "IMAGE"
    ],
    [
      131,
      147,
      0,
      183,
      0,
      "IMAGE"
    ],
    [
      132,
      148,
      0,
      184,
      0,
      "IMAGE"
    ],
    [
      133,
      157,
      0,
      186,
      0,
      "IMAGE"
    ],
    [
      134,
      179,
      0,
      187,
      0,
      "IMAGE"
    ],
    [
      135,
      160,
      0,
      188,
      0,
      "IMAGE"
    ],
    [
      136,
      171,
      0,
      189,
      0,
      "IMAGE"
    ],
    [
      137,
      165,
      0,
      190,
      0,
      "IMAGE"
    ],
    [
      138,
      29,
      0,
      191,
      0,
      "IMAGE"
    ],
    [
      139,
      29,
      1,
      192,
      0,
      "IMAGE"
    ],
    [
      141,
      29,
      3,
      193,
      0,
      "IMAGE"
    ],
    [
      142,
      29,
      2,
      194,
      0,
      "IMAGE"
    ]
  ],
  "groups": [
    {
      "id": 1,
      "title": "Image Channels",
      "bounding": [
        -180,
        -500,
        1393,
        490
      ],
      "color": "#3f789e",
      "flags": {}
    },
    {
      "id": 2,
      "title": "Color Balance",
      "bounding": [
        -180,
        30,
        1390,
        820
      ],
      "color": "#3f789e",
      "flags": {}
    },
    {
      "id": 3,
      "title": "Brightness and Contrast",
      "bounding": [
        -180,
        880,
        1390,
        620
      ],
      "color": "#3f789e",
      "flags": {}
    },
    {
      "id": 4,
      "title": "Image Levels",
      "bounding": [
        -180,
        1540,
        1390,
        630
      ],
      "color": "#3f789e",
      "flags": {}
    },
    {
      "id": 5,
      "title": "Glow",
      "bounding": [
        -180,
        2200,
        1390,
        600
      ],
      "color": "#3f789e",
      "flags": {}
    },
    {
      "id": 6,
      "title": "Chromatic Aberration",
      "bounding": [
        -180,
        2840,
        1390,
        530
      ],
      "color": "#3f789e",
      "flags": {}
    },
    {
      "id": 7,
      "title": "Film Grain",
      "bounding": [
        -180,
        3410,
        1390,
        620
      ],
      "color": "#3f789e",
      "flags": {}
    },
    {
      "id": 8,
      "title": "Color Adjustment",
      "bounding": [
        -180,
        4060,
        1390,
        600
      ],
      "color": "#3f789e",
      "flags": {}
    },
    {
      "id": 9,
      "title": "Hue and Saturation",
      "bounding": [
        -180,
        4700,
        1390,
        650
      ],
      "color": "#3f789e",
      "flags": {}
    }
  ],
  "definitions": {
    "subgraphs": [
      {
        "id": "8e3709c0-2209-4184-8a96-264ee9f1eed2",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Color Curves",
        "description": "Fine-tunes tone and color with per-channel curve adjustments using a real-time GPU fragment shader.",
        "inputNode": {
          "id": -10,
          "bounding": [
            2660,
            -4500,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            4270,
            -4500,
            120,
            60
          ]
        },
        "inputs": [
          {
            "id": "abc345b7-f55e-4f32-a11d-3aa4c2b0936b",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              29,
              34
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              2760,
              -4480
            ]
          }
        ],
        "outputs": [
          {
            "id": "eb0ec079-46da-4408-8263-9ef85569d33d",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              28
            ],
            "localized_name": "IMAGE0",
            "label": "IMAGE",
            "pos": [
              4290,
              -4480
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 4,
            "type": "CurveEditor",
            "pos": [
              3060,
              -4500
            ],
            "size": [
              270,
              200
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "histogram",
                "localized_name": "histogram",
                "name": "histogram",
                "shape": 7,
                "type": "HISTOGRAM",
                "link": 35
              },
              {
                "label": "curve",
                "localized_name": "curve",
                "name": "curve",
                "type": "CURVE",
                "widget": {
                  "name": "curve"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "curve",
                "name": "curve",
                "type": "CURVE",
                "links": [
                  30
                ]
              }
            ],
            "title": "RGB Master",
            "properties": {
              "Node name for S&R": "CurveEditor",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              {
                "points": [
                  [
                    0,
                    0
                  ],
                  [
                    0.3890328631875253,
                    0.5266163706133749
                  ],
                  [
                    0.7358435323017858,
                    0.4499509575506062
                  ],
                  [
                    1,
                    1
                  ]
                ],
                "interpolation": "monotone_cubic"
              }
            ]
          },
          {
            "id": 5,
            "type": "CurveEditor",
            "pos": [
              3060,
              -4250
            ],
            "size": [
              270,
              200
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
              {
                "label": "histogram",
                "localized_name": "histogram",
                "name": "histogram",
                "shape": 7,
                "type": "HISTOGRAM",
                "link": 36
              },
              {
                "label": "curve",
                "localized_name": "curve",
                "name": "curve",
                "type": "CURVE",
                "widget": {
                  "name": "curve"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "curve",
                "name": "curve",
                "type": "CURVE",
                "links": [
                  31
                ]
              }
            ],
            "title": "Red",
            "properties": {
              "Node name for S&R": "CurveEditor",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              {
                "points": [
                  [
                    0,
                    0
                  ],
                  [
                    0.5142255201011272,
                    0.5774399905293097
                  ],
                  [
                    0.6955375075900738,
                    0.4189873777462001
                  ],
                  [
                    1,
                    1
                  ]
                ],
                "interpolation": "monotone_cubic"
              }
            ]
          },
          {
            "id": 6,
            "type": "CurveEditor",
            "pos": [
              3060,
              -4000
            ],
            "size": [
              270,
              200
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "label": "histogram",
                "localized_name": "histogram",
                "name": "histogram",
                "shape": 7,
                "type": "HISTOGRAM",
                "link": 37
              },
              {
                "label": "curve",
                "localized_name": "curve",
                "name": "curve",
                "type": "CURVE",
                "widget": {
                  "name": "curve"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "curve",
                "name": "curve",
                "type": "CURVE",
                "links": [
                  32
                ]
              }
            ],
            "title": "Green",
            "properties": {
              "Node name for S&R": "CurveEditor",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              {
                "points": [
                  [
                    0,
                    0
                  ],
                  [
                    0.4243823305151788,
                    0.6834676161170985
                  ],
                  [
                    0.648385876985464,
                    0.6135687127234282
                  ],
                  [
                    0.7751285241199568,
                    0.5661072416153683
                  ],
                  [
                    1,
                    1
                  ]
                ],
                "interpolation": "monotone_cubic"
              }
            ]
          },
          {
            "id": 7,
            "type": "CurveEditor",
            "pos": [
              3060,
              -3750
            ],
            "size": [
              270,
              200
            ],
            "flags": {},
            "order": 3,
            "mode": 0,
            "inputs": [
              {
                "label": "histogram",
                "localized_name": "histogram",
                "name": "histogram",
                "shape": 7,
                "type": "HISTOGRAM",
                "link": 38
              },
              {
                "label": "curve",
                "localized_name": "curve",
                "name": "curve",
                "type": "CURVE",
                "widget": {
                  "name": "curve"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "curve",
                "name": "curve",
                "type": "CURVE",
                "links": [
                  33
                ]
              }
            ],
            "title": "Blue",
            "properties": {
              "Node name for S&R": "CurveEditor",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              {
                "points": [
                  [
                    0,
                    0
                  ],
                  [
                    1,
                    1
                  ]
                ],
                "interpolation": "monotone_cubic"
              }
            ]
          },
          {
            "id": 8,
            "type": "GLSLShader",
            "pos": [
              3590,
              -4500
            ],
            "size": [
              420,
              280
            ],
            "flags": {},
            "order": 4,
            "mode": 0,
            "inputs": [
              {
                "label": "image0",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 29
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": 30
              },
              {
                "label": "u_curve1",
                "localized_name": "curves.u_curve1",
                "name": "curves.u_curve1",
                "shape": 7,
                "type": "CURVE",
                "link": 31
              },
              {
                "label": "u_curve2",
                "localized_name": "curves.u_curve2",
                "name": "curves.u_curve2",
                "shape": 7,
                "type": "CURVE",
                "link": 32
              },
              {
                "label": "u_curve3",
                "localized_name": "curves.u_curve3",
                "name": "curves.u_curve3",
                "shape": 7,
                "type": "CURVE",
                "link": 33
              }
            ],
            "outputs": [
              {
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  28
                ]
              },
              {
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\nuniform sampler2D u_curve0;  // RGB master curve (256x1 LUT)\nuniform sampler2D u_curve1;  // Red channel curve\nuniform sampler2D u_curve2;  // Green channel curve\nuniform sampler2D u_curve3;  // Blue channel curve\n\nin vec2 v_texCoord;\nlayout(location = 0) out vec4 fragColor0;\n\n// GIMP-compatible curve lookup with manual linear interpolation.\n// Matches gimp_curve_map_value_inline() from gimpcurve-map.c:\n//   index = value * (n_samples - 1)\n//   f = fract(index)\n//   result = (1-f) * samples[floor] + f * samples[ceil]\n//\n// Uses texelFetch (NEAREST) to avoid GPU half-texel offset issues\n// that occur with texture() + GL_LINEAR on small 256x1 LUTs.\nfloat applyCurve(sampler2D curve, float value) {\n    value = clamp(value, 0.0, 1.0);\n\n    float pos = value * 255.0;\n    int lo = int(floor(pos));\n    int hi = min(lo + 1, 255);\n    float f = pos - float(lo);\n\n    float a = texelFetch(curve, ivec2(lo, 0), 0).r;\n    float b = texelFetch(curve, ivec2(hi, 0), 0).r;\n\n    return a + f * (b - a);\n}\n\nvoid main() {\n    vec4 color = texture(u_image0, v_texCoord);\n\n    // GIMP order: per-channel curves first, then RGB master curve.\n    // See gimp_curve_map_pixels() default case in gimpcurve-map.c:\n    //   dest = colors_curve( channel_curve( src ) )\n    float tmp_r = applyCurve(u_curve1, color.r);\n    float tmp_g = applyCurve(u_curve2, color.g);\n    float tmp_b = applyCurve(u_curve3, color.b);\n    color.r = applyCurve(u_curve0, tmp_r);\n    color.g = applyCurve(u_curve0, tmp_g);\n    color.b = applyCurve(u_curve0, tmp_b);\n\n    fragColor0 = vec4(color.rgb, color.a);\n}\n",
              "from_input"
            ]
          },
          {
            "id": 9,
            "type": "ImageHistogram",
            "pos": [
              2800,
              -4300
            ],
            "size": [
              210,
              150
            ],
            "flags": {},
            "order": 5,
            "mode": 0,
            "inputs": [
              {
                "label": "image",
                "localized_name": "image",
                "name": "image",
                "type": "IMAGE",
                "link": 34
              }
            ],
            "outputs": [
              {
                "localized_name": "rgb",
                "name": "rgb",
                "type": "HISTOGRAM",
                "links": [
                  35
                ]
              },
              {
                "localized_name": "luminance",
                "name": "luminance",
                "type": "HISTOGRAM",
                "links": []
              },
              {
                "localized_name": "red",
                "name": "red",
                "type": "HISTOGRAM",
                "links": [
                  36
                ]
              },
              {
                "localized_name": "green",
                "name": "green",
                "type": "HISTOGRAM",
                "links": [
                  37
                ]
              },
              {
                "localized_name": "blue",
                "name": "blue",
                "type": "HISTOGRAM",
                "links": [
                  38
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "ImageHistogram",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": []
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 29,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 8,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 28,
            "origin_id": 8,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 30,
            "origin_id": 4,
            "origin_slot": 0,
            "target_id": 8,
            "target_slot": 5,
            "type": "CURVE"
          },
          {
            "id": 31,
            "origin_id": 5,
            "origin_slot": 0,
            "target_id": 8,
            "target_slot": 6,
            "type": "CURVE"
          },
          {
            "id": 32,
            "origin_id": 6,
            "origin_slot": 0,
            "target_id": 8,
            "target_slot": 7,
            "type": "CURVE"
          },
          {
            "id": 33,
            "origin_id": 7,
            "origin_slot": 0,
            "target_id": 8,
            "target_slot": 8,
            "type": "CURVE"
          },
          {
            "id": 34,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 9,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 35,
            "origin_id": 9,
            "origin_slot": 0,
            "target_id": 4,
            "target_slot": 0,
            "type": "HISTOGRAM"
          },
          {
            "id": 36,
            "origin_id": 9,
            "origin_slot": 2,
            "target_id": 5,
            "target_slot": 0,
            "type": "HISTOGRAM"
          },
          {
            "id": 37,
            "origin_id": 9,
            "origin_slot": 3,
            "target_id": 6,
            "target_slot": 0,
            "type": "HISTOGRAM"
          },
          {
            "id": 38,
            "origin_id": 9,
            "origin_slot": 4,
            "target_id": 7,
            "target_slot": 0,
            "type": "HISTOGRAM"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      },
      {
        "id": "1cccc258-98ed-4c17-8a0b-392e48a99dfa",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Image Channels",
        "description": "Manipulates individual RGBA channels for masking, compositing, and channel effects.",
        "inputNode": {
          "id": -10,
          "bounding": [
            1820,
            -185,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            2460,
            -215,
            120,
            120
          ]
        },
        "inputs": [
          {
            "id": "3522932b-2d86-4a1f-a02a-cb29f3a9d7fe",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              39
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              1920,
              -165
            ]
          }
        ],
        "outputs": [
          {
            "id": "605cb9c3-b065-4d9b-81d2-3ec331889b2b",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              26
            ],
            "localized_name": "IMAGE0",
            "label": "R",
            "pos": [
              2480,
              -195
            ]
          },
          {
            "id": "fb44a77e-0522-43e9-9527-82e7465b3596",
            "name": "IMAGE1",
            "type": "IMAGE",
            "linkIds": [
              27
            ],
            "localized_name": "IMAGE1",
            "label": "G",
            "pos": [
              2480,
              -175
            ]
          },
          {
            "id": "81460ee6-0131-402a-874f-6bf3001fc4ff",
            "name": "IMAGE2",
            "type": "IMAGE",
            "linkIds": [
              28
            ],
            "localized_name": "IMAGE2",
            "label": "B",
            "pos": [
              2480,
              -155
            ]
          },
          {
            "id": "ae690246-80d4-4951-b1d9-9306d8a77417",
            "name": "IMAGE3",
            "type": "IMAGE",
            "linkIds": [
              29
            ],
            "localized_name": "IMAGE3",
            "label": "A",
            "pos": [
              2480,
              -135
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 23,
            "type": "GLSLShader",
            "pos": [
              2000,
              -330
            ],
            "size": [
              400,
              220
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "image",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 39
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": null
              }
            ],
            "outputs": [
              {
                "label": "R",
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  26
                ]
              },
              {
                "label": "G",
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": [
                  27
                ]
              },
              {
                "label": "B",
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": [
                  28
                ]
              },
              {
                "label": "A",
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": [
                  29
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\n\nin vec2 v_texCoord;\nlayout(location = 0) out vec4 fragColor0;\nlayout(location = 1) out vec4 fragColor1;\nlayout(location = 2) out vec4 fragColor2;\nlayout(location = 3) out vec4 fragColor3;\n\nvoid main() {\n  vec4 color = texture(u_image0, v_texCoord);\n  // Output each channel as grayscale to separate render targets\n  fragColor0 = vec4(vec3(color.r), 1.0);  // Red channel\n  fragColor1 = vec4(vec3(color.g), 1.0);  // Green channel\n  fragColor2 = vec4(vec3(color.b), 1.0);  // Blue channel\n  fragColor3 = vec4(vec3(color.a), 1.0);  // Alpha channel\n}\n",
              "from_input"
            ]
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 39,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 23,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 26,
            "origin_id": 23,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 27,
            "origin_id": 23,
            "origin_slot": 1,
            "target_id": -20,
            "target_slot": 1,
            "type": "IMAGE"
          },
          {
            "id": 28,
            "origin_id": 23,
            "origin_slot": 2,
            "target_id": -20,
            "target_slot": 2,
            "type": "IMAGE"
          },
          {
            "id": 29,
            "origin_id": 23,
            "origin_slot": 3,
            "target_id": -20,
            "target_slot": 3,
            "type": "IMAGE"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      },
      {
        "id": "45b59a1a-ac53-4f90-8ebd-9f3ab79f21e3",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Brightness and Contrast",
        "description": "Adjusts image brightness and contrast using a real-time GPU fragment shader.",
        "inputNode": {
          "id": -10,
          "bounding": [
            360,
            -176,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            1410,
            -176,
            120,
            60
          ]
        },
        "inputs": [
          {
            "id": "a5aae7ea-b511-4045-b5da-94101e269cd7",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              117
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              460,
              -156
            ]
          }
        ],
        "outputs": [
          {
            "id": "30b72604-69b3-4944-b253-a9099bbd73a9",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              118
            ],
            "localized_name": "IMAGE0",
            "label": "IMAGE",
            "pos": [
              1430,
              -156
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 30,
            "type": "PrimitiveFloat",
            "pos": [
              540,
              -280
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "brightness",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  115
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 100,
              "precision": 1,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    0,
                    0
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    255,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              13
            ]
          },
          {
            "id": 31,
            "type": "PrimitiveFloat",
            "pos": [
              540,
              -170
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
              {
                "label": "contrast",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  116
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 100,
              "precision": 1,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    136,
                    136,
                    136
                  ]
                },
                {
                  "offset": 0.4,
                  "color": [
                    68,
                    68,
                    68
                  ]
                },
                {
                  "offset": 0.6,
                  "color": [
                    187,
                    187,
                    187
                  ]
                },
                {
                  "offset": 0.8,
                  "color": [
                    0,
                    0,
                    0
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    255,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              51
            ]
          },
          {
            "id": 143,
            "type": "GLSLShader",
            "pos": [
              840,
              -280
            ],
            "size": [
              400,
              260
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "label": "image0",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 117
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": 115
              },
              {
                "label": "u_float1",
                "localized_name": "floats.u_float1",
                "name": "floats.u_float1",
                "shape": 7,
                "type": "FLOAT",
                "link": 116
              },
              {
                "label": "u_float2",
                "localized_name": "floats.u_float2",
                "name": "floats.u_float2",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  118
                ]
              },
              {
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\nuniform float u_float0; // Brightness slider -100..100\nuniform float u_float1; // Contrast slider -100..100\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nconst float MID_GRAY = 0.18;  // 18% reflectance\n\n// sRGB gamma 2.2 approximation\nvec3 srgbToLinear(vec3 c) {\n    return pow(max(c, 0.0), vec3(2.2));\n}\n\nvec3 linearToSrgb(vec3 c) {\n    return pow(max(c, 0.0), vec3(1.0/2.2));\n}\n\nfloat mapBrightness(float b) {\n    return clamp(b / 100.0, -1.0, 1.0);\n}\n\nfloat mapContrast(float c) {\n    return clamp(c / 100.0 + 1.0, 0.0, 2.0);\n}\n\nvoid main() {\n    vec4 orig = texture(u_image0, v_texCoord);\n\n    float brightness = mapBrightness(u_float0);\n    float contrast   = mapContrast(u_float1);\n\n    vec3 lin = srgbToLinear(orig.rgb);\n\n    lin = (lin - MID_GRAY) * contrast + brightness + MID_GRAY;\n\n    // Convert back to sRGB\n    vec3 result = linearToSrgb(clamp(lin, 0.0, 1.0));\n\n    fragColor = vec4(result, orig.a);\n}\n",
              "from_input"
            ]
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 115,
            "origin_id": 30,
            "origin_slot": 0,
            "target_id": 143,
            "target_slot": 2,
            "type": "FLOAT"
          },
          {
            "id": 116,
            "origin_id": 31,
            "origin_slot": 0,
            "target_id": 143,
            "target_slot": 3,
            "type": "FLOAT"
          },
          {
            "id": 117,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 143,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 118,
            "origin_id": 143,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      },
      {
        "id": "bde8681c-adbd-4b44-a31c-2a4acb8cf45a",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Glow",
        "description": "Adds a glow/bloom effect around bright image areas via GPU fragment shader.",
        "inputNode": {
          "id": -10,
          "bounding": [
            2110,
            -165,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            3170,
            -165,
            120,
            60
          ]
        },
        "inputs": [
          {
            "id": "ffc7cf94-be90-4d56-a3b8-d0514d61c015",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              45
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              2210,
              -145
            ]
          }
        ],
        "outputs": [
          {
            "id": "04986101-50be-4762-8957-8e2a5e460bbb",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              53
            ],
            "localized_name": "IMAGE0",
            "label": "IMAGE",
            "pos": [
              3190,
              -145
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 145,
            "type": "GLSLShader",
            "pos": [
              2590,
              -520
            ],
            "size": [
              520,
              320
            ],
            "flags": {},
            "order": 5,
            "mode": 0,
            "inputs": [
              {
                "label": "image0",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 45
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": 51
              },
              {
                "label": "u_float1",
                "localized_name": "floats.u_float1",
                "name": "floats.u_float1",
                "shape": 7,
                "type": "FLOAT",
                "link": 50
              },
              {
                "label": "u_float2",
                "localized_name": "floats.u_float2",
                "name": "floats.u_float2",
                "shape": 7,
                "type": "FLOAT",
                "link": 52
              },
              {
                "label": "u_float3",
                "localized_name": "floats.u_float3",
                "name": "floats.u_float3",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": 46
              },
              {
                "label": "u_int1",
                "localized_name": "ints.u_int1",
                "name": "ints.u_int1",
                "shape": 7,
                "type": "INT",
                "link": 47
              },
              {
                "label": "u_int2",
                "localized_name": "ints.u_int2",
                "name": "ints.u_int2",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  53
                ]
              },
              {
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision mediump float;\n\nuniform sampler2D u_image0;\nuniform int u_int0;      // Blend mode\nuniform int u_int1;      // Color tint\nuniform float u_float0;  // Intensity\nuniform float u_float1;  // Radius\nuniform float u_float2;  // Threshold\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nconst int BLEND_ADD      = 0;\nconst int BLEND_SCREEN   = 1;\nconst int BLEND_SOFT     = 2;\nconst int BLEND_OVERLAY  = 3;\nconst int BLEND_LIGHTEN  = 4;\n\nconst float GOLDEN_ANGLE = 2.39996323;\nconst int MAX_SAMPLES = 48;\nconst vec3 LUMA = vec3(0.299, 0.587, 0.114);\n\nfloat hash(vec2 p) {\n    p = fract(p * vec2(123.34, 456.21));\n    p += dot(p, p + 45.32);\n    return fract(p.x * p.y);\n}\n\nvec3 hexToRgb(int h) {\n    return vec3(\n        float((h >> 16) & 255),\n        float((h >> 8) & 255),\n        float(h & 255)\n    ) * (1.0 / 255.0);\n}\n\nvec3 blend(vec3 base, vec3 glow, int mode) {\n    if (mode == BLEND_SCREEN) {\n        return 1.0 - (1.0 - base) * (1.0 - glow);\n    }\n    if (mode == BLEND_SOFT) {\n        return mix(\n            base - (1.0 - 2.0 * glow) * base * (1.0 - base),\n            base + (2.0 * glow - 1.0) * (sqrt(base) - base),\n            step(0.5, glow)\n        );\n    }\n    if (mode == BLEND_OVERLAY) {\n        return mix(\n            2.0 * base * glow,\n            1.0 - 2.0 * (1.0 - base) * (1.0 - glow),\n            step(0.5, base)\n        );\n    }\n    if (mode == BLEND_LIGHTEN) {\n        return max(base, glow);\n    }\n    return base + glow;\n}\n\nvoid main() {\n    vec4 original = texture(u_image0, v_texCoord);\n    \n    float intensity = u_float0 * 0.05;\n    float radius = u_float1 * u_float1 * 0.012;\n    \n    if (intensity < 0.001 || radius < 0.1) {\n        fragColor = original;\n        return;\n    }\n    \n    float threshold = 1.0 - u_float2 * 0.01;\n    float t0 = threshold - 0.15;\n    float t1 = threshold + 0.15;\n    \n    vec2 texelSize = 1.0 / vec2(textureSize(u_image0, 0));\n    float radius2 = radius * radius;\n    \n    float sampleScale = clamp(radius * 0.75, 0.35, 1.0);\n    int samples = int(float(MAX_SAMPLES) * sampleScale);\n    \n    float noise = hash(gl_FragCoord.xy);\n    float angleOffset = noise * GOLDEN_ANGLE;\n    float radiusJitter = 0.85 + noise * 0.3;\n    \n    float ca = cos(GOLDEN_ANGLE);\n    float sa = sin(GOLDEN_ANGLE);\n    vec2 dir = vec2(cos(angleOffset), sin(angleOffset));\n    \n    vec3 glow = vec3(0.0);\n    float totalWeight = 0.0;\n    \n    // Center tap\n    float centerMask = smoothstep(t0, t1, dot(original.rgb, LUMA));\n    glow += original.rgb * centerMask * 2.0;\n    totalWeight += 2.0;\n    \n    for (int i = 1; i < MAX_SAMPLES; i++) {\n        if (i >= samples) break;\n        \n        float fi = float(i);\n        float dist = sqrt(fi / float(samples)) * radius * radiusJitter;\n        \n        vec2 offset = dir * dist * texelSize;\n        vec3 c = texture(u_image0, v_texCoord + offset).rgb;\n        float mask = smoothstep(t0, t1, dot(c, LUMA));\n        \n        float w = 1.0 - (dist * dist) / (radius2 * 1.5);\n        w = max(w, 0.0);\n        w *= w;\n        \n        glow += c * mask * w;\n        totalWeight += w;\n        \n        dir = vec2(\n            dir.x * ca - dir.y * sa,\n            dir.x * sa + dir.y * ca\n        );\n    }\n    \n    glow *= intensity / max(totalWeight, 0.001);\n    \n    if (u_int1 > 0) {\n        glow *= hexToRgb(u_int1);\n    }\n    \n    vec3 result = blend(original.rgb, glow, u_int0);\n    result += (noise - 0.5) * (1.0 / 255.0);\n    \n    fragColor = vec4(clamp(result, 0.0, 1.0), original.a);\n}",
              "from_input"
            ]
          },
          {
            "id": 34,
            "type": "PrimitiveFloat",
            "pos": [
              2290,
              -510
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "intensity",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  51
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 100,
              "precision": 1,
              "step": 1
            },
            "widgets_values": [
              2
            ]
          },
          {
            "id": 35,
            "type": "PrimitiveFloat",
            "pos": [
              2290,
              -410
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
              {
                "label": "radius",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  50
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 100,
              "precision": 1,
              "step": 1
            },
            "widgets_values": [
              29
            ]
          },
          {
            "id": 33,
            "type": "PrimitiveFloat",
            "pos": [
              2290,
              -310
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "label": "threshold",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  52
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 100,
              "precision": 1,
              "step": 1
            },
            "widgets_values": [
              100
            ]
          },
          {
            "id": 32,
            "type": "ColorToRGBInt",
            "pos": [
              2290,
              -210
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 3,
            "mode": 0,
            "inputs": [
              {
                "label": "color_tint",
                "localized_name": "color",
                "name": "color",
                "type": "COLOR",
                "widget": {
                  "name": "color"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "rgb_int",
                "name": "rgb_int",
                "type": "INT",
                "links": [
                  47
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "ColorToRGBInt",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#0a9299"
            ]
          },
          {
            "id": 146,
            "type": "CustomCombo",
            "pos": [
              2290,
              -110
            ],
            "size": [
              270,
              230
            ],
            "flags": {},
            "order": 4,
            "mode": 0,
            "inputs": [
              {
                "label": "blend_mode",
                "localized_name": "choice",
                "name": "choice",
                "type": "COMBO",
                "widget": {
                  "name": "choice"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "STRING",
                "name": "STRING",
                "type": "STRING",
                "links": null
              },
              {
                "localized_name": "INDEX",
                "name": "INDEX",
                "type": "INT",
                "links": [
                  46
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "CustomCombo",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "screen",
              1,
              "add",
              "screen",
              "soft",
              "overlay",
              "lighten",
              ""
            ]
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 51,
            "origin_id": 34,
            "origin_slot": 0,
            "target_id": 145,
            "target_slot": 2,
            "type": "FLOAT"
          },
          {
            "id": 50,
            "origin_id": 35,
            "origin_slot": 0,
            "target_id": 145,
            "target_slot": 3,
            "type": "FLOAT"
          },
          {
            "id": 52,
            "origin_id": 33,
            "origin_slot": 0,
            "target_id": 145,
            "target_slot": 4,
            "type": "FLOAT"
          },
          {
            "id": 46,
            "origin_id": 146,
            "origin_slot": 1,
            "target_id": 145,
            "target_slot": 6,
            "type": "INT"
          },
          {
            "id": 47,
            "origin_id": 32,
            "origin_slot": 0,
            "target_id": 145,
            "target_slot": 7,
            "type": "INT"
          },
          {
            "id": 45,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 145,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 53,
            "origin_id": 145,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      },
      {
        "id": "e864f288-0bda-497b-a111-800d4c0cd171",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Film Grain",
        "description": "Adds procedural film grain texture for a cinematic look via GPU fragment shader.",
        "inputNode": {
          "id": -10,
          "bounding": [
            4096.671470760602,
            -948.2184031393472,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            4900,
            -948.2184031393472,
            120,
            60
          ]
        },
        "inputs": [
          {
            "id": "062968ea-da25-47e7-a180-d913c267f148",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              22
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              4196.671470760602,
              -928.2184031393472
            ]
          }
        ],
        "outputs": [
          {
            "id": "43247d06-a39f-4733-9828-c39400fe02a4",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              23
            ],
            "localized_name": "IMAGE0",
            "label": "IMAGE",
            "pos": [
              4920,
              -928.2184031393472
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 15,
            "type": "GLSLShader",
            "pos": [
              4510,
              -1180
            ],
            "size": [
              330,
              320
            ],
            "flags": {},
            "order": 5,
            "mode": 0,
            "inputs": [
              {
                "label": "image0",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 22
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": 26
              },
              {
                "label": "u_float1",
                "localized_name": "floats.u_float1",
                "name": "floats.u_float1",
                "shape": 7,
                "type": "FLOAT",
                "link": 27
              },
              {
                "label": "u_float2",
                "localized_name": "floats.u_float2",
                "name": "floats.u_float2",
                "shape": 7,
                "type": "FLOAT",
                "link": 28
              },
              {
                "label": "u_float3",
                "localized_name": "floats.u_float3",
                "name": "floats.u_float3",
                "shape": 7,
                "type": "FLOAT",
                "link": 29
              },
              {
                "label": "u_float4",
                "localized_name": "floats.u_float4",
                "name": "floats.u_float4",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": 30
              },
              {
                "label": "u_int1",
                "localized_name": "ints.u_int1",
                "name": "ints.u_int1",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  23
                ]
              },
              {
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\nuniform vec2 u_resolution;\nuniform float u_float0; // grain amount      [0.0 – 1.0]   typical: 0.2–0.8\nuniform float u_float1; // grain size        [0.3 – 3.0]   lower = finer grain\nuniform float u_float2; // color amount      [0.0 – 1.0]   0 = monochrome, 1 = RGB grain\nuniform float u_float3; // luminance bias    [0.0 – 1.0]   0 = uniform, 1 = shadows only\nuniform int   u_int0;   // noise mode        [0 or 1]      0 = smooth, 1 = grainy\n\nin vec2 v_texCoord;\nlayout(location = 0) out vec4 fragColor0;\n\n// High-quality integer hash (pcg-like)\nuint pcg(uint v) {\n    uint state = v * 747796405u + 2891336453u;\n    uint word = ((state >> ((state >> 28u) + 4u)) ^ state) * 277803737u;\n    return (word >> 22u) ^ word;\n}\n\n// 2D -> 1D hash input\nuint hash2d(uvec2 p) {\n    return pcg(p.x + pcg(p.y));\n}\n\n// Hash to float [0, 1]\nfloat hashf(uvec2 p) {\n    return float(hash2d(p)) / float(0xffffffffu);\n}\n\n// Hash to float with offset (for RGB channels)\nfloat hashf(uvec2 p, uint offset) {\n    return float(pcg(hash2d(p) + offset)) / float(0xffffffffu);\n}\n\n// Convert uniform [0,1] to roughly Gaussian distribution\n// Using simple approximation: average of multiple samples\nfloat toGaussian(uvec2 p) {\n    float sum = hashf(p, 0u) + hashf(p, 1u) + hashf(p, 2u) + hashf(p, 3u);\n    return (sum - 2.0) * 0.7;  // Centered, scaled\n}\n\nfloat toGaussian(uvec2 p, uint offset) {\n    float sum = hashf(p, offset) + hashf(p, offset + 1u) \n              + hashf(p, offset + 2u) + hashf(p, offset + 3u);\n    return (sum - 2.0) * 0.7;\n}\n\n// Smooth noise with better interpolation\nfloat smoothNoise(vec2 p) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    \n    // Quintic interpolation (less banding than cubic)\n    f = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n    \n    uvec2 ui = uvec2(i);\n    float a = toGaussian(ui);\n    float b = toGaussian(ui + uvec2(1u, 0u));\n    float c = toGaussian(ui + uvec2(0u, 1u));\n    float d = toGaussian(ui + uvec2(1u, 1u));\n    \n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\nfloat smoothNoise(vec2 p, uint offset) {\n    vec2 i = floor(p);\n    vec2 f = fract(p);\n    \n    f = f * f * f * (f * (f * 6.0 - 15.0) + 10.0);\n    \n    uvec2 ui = uvec2(i);\n    float a = toGaussian(ui, offset);\n    float b = toGaussian(ui + uvec2(1u, 0u), offset);\n    float c = toGaussian(ui + uvec2(0u, 1u), offset);\n    float d = toGaussian(ui + uvec2(1u, 1u), offset);\n    \n    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\nvoid main() {\n    vec4 color = texture(u_image0, v_texCoord);\n    \n    // Luminance (Rec.709)\n    float luma = dot(color.rgb, vec3(0.2126, 0.7152, 0.0722));\n    \n    // Grain UV (resolution-independent)\n    vec2 grainUV = v_texCoord * u_resolution / max(u_float1, 0.01);\n    uvec2 grainPixel = uvec2(grainUV);\n    \n    float g;\n    vec3 grainRGB;\n    \n    if (u_int0 == 1) {\n        // Grainy mode: pure hash noise (no interpolation = no banding)\n        g = toGaussian(grainPixel);\n        grainRGB = vec3(\n            toGaussian(grainPixel, 100u),\n            toGaussian(grainPixel, 200u),\n            toGaussian(grainPixel, 300u)\n        );\n    } else {\n        // Smooth mode: interpolated with quintic curve\n        g = smoothNoise(grainUV);\n        grainRGB = vec3(\n            smoothNoise(grainUV, 100u),\n            smoothNoise(grainUV, 200u),\n            smoothNoise(grainUV, 300u)\n        );\n    }\n    \n    // Luminance weighting (less grain in highlights)\n    float lumWeight = mix(1.0, 1.0 - luma, clamp(u_float3, 0.0, 1.0));\n    \n    // Strength\n    float strength = u_float0 * 0.15;\n    \n    // Color vs monochrome grain\n    vec3 grainColor = mix(vec3(g), grainRGB, clamp(u_float2, 0.0, 1.0));\n    \n    color.rgb += grainColor * strength * lumWeight;\n    fragColor0 = vec4(clamp(color.rgb, 0.0, 1.0), color.a);\n}\n",
              "from_input"
            ]
          },
          {
            "id": 21,
            "type": "CustomCombo",
            "pos": [
              4280,
              -780
            ],
            "size": [
              210,
              160
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "grain_mode",
                "localized_name": "choice",
                "name": "choice",
                "type": "COMBO",
                "widget": {
                  "name": "choice"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "STRING",
                "name": "STRING",
                "type": "STRING",
                "links": null
              },
              {
                "localized_name": "INDEX",
                "name": "INDEX",
                "type": "INT",
                "links": [
                  30
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "CustomCombo",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "Smooth",
              0,
              "Smooth",
              "Grainy",
              ""
            ]
          },
          {
            "id": 17,
            "type": "PrimitiveFloat",
            "pos": [
              4280,
              -1180
            ],
            "size": [
              210,
              60
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
              {
                "label": "grain_amount",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  26
                ]
              }
            ],
            "title": "Grain amount",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 1,
              "step": 0.05,
              "precision": 2
            },
            "widgets_values": [
              0.75
            ]
          },
          {
            "id": 18,
            "type": "PrimitiveFloat",
            "pos": [
              4280,
              -1080
            ],
            "size": [
              210,
              60
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "label": "grain_size",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  27
                ]
              }
            ],
            "title": "Grain size",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0.05,
              "max": 3,
              "precision": 2,
              "step": 0.05
            },
            "widgets_values": [
              0.45
            ]
          },
          {
            "id": 19,
            "type": "PrimitiveFloat",
            "pos": [
              4280,
              -980
            ],
            "size": [
              210,
              60
            ],
            "flags": {},
            "order": 3,
            "mode": 0,
            "inputs": [
              {
                "label": "color_amount",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  28
                ]
              }
            ],
            "title": "Color amount",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 1,
              "precision": 2,
              "step": 0.05
            },
            "widgets_values": [
              0.35
            ]
          },
          {
            "id": 20,
            "type": "PrimitiveFloat",
            "pos": [
              4280,
              -880
            ],
            "size": [
              210,
              60
            ],
            "flags": {},
            "order": 4,
            "mode": 0,
            "inputs": [
              {
                "label": "shadow_focus",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  29
                ]
              }
            ],
            "title": "Luminance bias",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 1,
              "precision": 2,
              "step": 0.05
            },
            "widgets_values": [
              0.15
            ]
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 26,
            "origin_id": 17,
            "origin_slot": 0,
            "target_id": 15,
            "target_slot": 2,
            "type": "FLOAT"
          },
          {
            "id": 27,
            "origin_id": 18,
            "origin_slot": 0,
            "target_id": 15,
            "target_slot": 3,
            "type": "FLOAT"
          },
          {
            "id": 28,
            "origin_id": 19,
            "origin_slot": 0,
            "target_id": 15,
            "target_slot": 4,
            "type": "FLOAT"
          },
          {
            "id": 29,
            "origin_id": 20,
            "origin_slot": 0,
            "target_id": 15,
            "target_slot": 5,
            "type": "FLOAT"
          },
          {
            "id": 30,
            "origin_id": 21,
            "origin_slot": 1,
            "target_id": 15,
            "target_slot": 7,
            "type": "INT"
          },
          {
            "id": 22,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 15,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 23,
            "origin_id": 15,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      },
      {
        "id": "ed876eb4-358d-4e40-af28-de21afc3af7f",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Color Balance",
        "description": "Balances colors across shadows, midtones, and highlights using a real-time GPU fragment shader.",
        "inputNode": {
          "id": -10,
          "bounding": [
            2660,
            -4500,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            4270,
            -4500,
            120,
            60
          ]
        },
        "inputs": [
          {
            "id": "d24c0b6d-00bd-4e95-be80-8114e8376ec0",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              29
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              2760,
              -4480
            ]
          }
        ],
        "outputs": [
          {
            "id": "92723f62-996e-496d-ad4f-81a38be4ad64",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              28
            ],
            "localized_name": "IMAGE0",
            "label": "IMAGE",
            "pos": [
              4290,
              -4480
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 149,
            "type": "PrimitiveFloat",
            "pos": [
              3060,
              -4500
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "shadows red",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  30
                ]
              }
            ],
            "title": "Shadows Red",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    255,
                    255
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    0,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              -100
            ]
          },
          {
            "id": 150,
            "type": "PrimitiveFloat",
            "pos": [
              3060,
              -4390
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
              {
                "label": "shadows green",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  31
                ]
              }
            ],
            "title": "Shadows Green",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    255,
                    0,
                    255
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    0,
                    255,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              47
            ]
          },
          {
            "id": 151,
            "type": "PrimitiveFloat",
            "pos": [
              3060,
              -4280
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "label": "shadows blue",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  32
                ]
              }
            ],
            "title": "Shadows Blue",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    255,
                    255,
                    0
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    0,
                    0,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              6
            ]
          },
          {
            "id": 152,
            "type": "PrimitiveFloat",
            "pos": [
              3060,
              -4170
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 3,
            "mode": 0,
            "inputs": [
              {
                "label": "midtones red",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  33
                ]
              }
            ],
            "title": "Midtones Red",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    255,
                    255
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    0,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              -6
            ]
          },
          {
            "id": 153,
            "type": "PrimitiveFloat",
            "pos": [
              3060,
              -4060
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 4,
            "mode": 0,
            "inputs": [
              {
                "label": "midtones green",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  34
                ]
              }
            ],
            "title": "Midtones Green",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    255,
                    0,
                    255
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    0,
                    255,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              7
            ]
          },
          {
            "id": 154,
            "type": "PrimitiveFloat",
            "pos": [
              3060,
              -3950
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 5,
            "mode": 0,
            "inputs": [
              {
                "label": "midtones blue",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  35
                ]
              }
            ],
            "title": "Midtones Blue",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    255,
                    255,
                    0
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    0,
                    0,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              0
            ]
          },
          {
            "id": 155,
            "type": "PrimitiveFloat",
            "pos": [
              3060,
              -3840
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 6,
            "mode": 0,
            "inputs": [
              {
                "label": "highlights red",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  36
                ]
              }
            ],
            "title": "Highlights Red",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    255,
                    255
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    0,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              0
            ]
          },
          {
            "id": 11,
            "type": "PrimitiveFloat",
            "pos": [
              3060,
              -3730
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 7,
            "mode": 0,
            "inputs": [
              {
                "label": "highlights green",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  37
                ]
              }
            ],
            "title": "Highlights Green",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    255,
                    0,
                    255
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    0,
                    255,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              0
            ]
          },
          {
            "id": 12,
            "type": "PrimitiveFloat",
            "pos": [
              3060,
              -3620
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 8,
            "mode": 0,
            "inputs": [
              {
                "label": "highlights blue",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  38
                ]
              }
            ],
            "title": "Highlights Blue",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    255,
                    255,
                    0
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    0,
                    0,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              58
            ]
          },
          {
            "id": 13,
            "type": "PrimitiveBoolean",
            "pos": [
              3060,
              -3510
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 9,
            "mode": 0,
            "inputs": [
              {
                "label": "preserve luminosity",
                "localized_name": "value",
                "name": "value",
                "type": "BOOLEAN",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "BOOLEAN",
                "name": "BOOLEAN",
                "type": "BOOLEAN",
                "links": [
                  39
                ]
              }
            ],
            "title": "Preserve Luminosity",
            "properties": {
              "Node name for S&R": "PrimitiveBoolean",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              true
            ]
          },
          {
            "id": 156,
            "type": "GLSLShader",
            "pos": [
              3590,
              -4500
            ],
            "size": [
              420,
              420
            ],
            "flags": {},
            "order": 10,
            "mode": 0,
            "inputs": [
              {
                "label": "image0",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 29
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": 30
              },
              {
                "label": "u_float1",
                "localized_name": "floats.u_float1",
                "name": "floats.u_float1",
                "shape": 7,
                "type": "FLOAT",
                "link": 31
              },
              {
                "label": "u_float2",
                "localized_name": "floats.u_float2",
                "name": "floats.u_float2",
                "shape": 7,
                "type": "FLOAT",
                "link": 32
              },
              {
                "label": "u_float3",
                "localized_name": "floats.u_float3",
                "name": "floats.u_float3",
                "shape": 7,
                "type": "FLOAT",
                "link": 33
              },
              {
                "label": "u_float4",
                "localized_name": "floats.u_float4",
                "name": "floats.u_float4",
                "shape": 7,
                "type": "FLOAT",
                "link": 34
              },
              {
                "label": "u_float5",
                "localized_name": "floats.u_float5",
                "name": "floats.u_float5",
                "shape": 7,
                "type": "FLOAT",
                "link": 35
              },
              {
                "label": "u_float6",
                "localized_name": "floats.u_float6",
                "name": "floats.u_float6",
                "shape": 7,
                "type": "FLOAT",
                "link": 36
              },
              {
                "label": "u_float7",
                "localized_name": "floats.u_float7",
                "name": "floats.u_float7",
                "shape": 7,
                "type": "FLOAT",
                "link": 37
              },
              {
                "label": "u_float8",
                "localized_name": "floats.u_float8",
                "name": "floats.u_float8",
                "shape": 7,
                "type": "FLOAT",
                "link": 38
              },
              {
                "label": "u_float9",
                "localized_name": "floats.u_float9",
                "name": "floats.u_float9",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": 39
              },
              {
                "label": "u_bool1",
                "localized_name": "bools.u_bool1",
                "name": "bools.u_bool1",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  28
                ]
              },
              {
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\nuniform float u_float0; // shadows red (-100 to 100)\nuniform float u_float1; // shadows green (-100 to 100)\nuniform float u_float2; // shadows blue (-100 to 100)\nuniform float u_float3; // midtones red (-100 to 100)\nuniform float u_float4; // midtones green (-100 to 100)\nuniform float u_float5; // midtones blue (-100 to 100)\nuniform float u_float6; // highlights red (-100 to 100)\nuniform float u_float7; // highlights green (-100 to 100)\nuniform float u_float8; // highlights blue (-100 to 100)\nuniform bool u_bool0;   // preserve luminosity\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nvec3 rgb2hsl(vec3 c) {\n    float maxC = max(c.r, max(c.g, c.b));\n    float minC = min(c.r, min(c.g, c.b));\n    float l = (maxC + minC) * 0.5;\n    if (maxC == minC) return vec3(0.0, 0.0, l);\n    float d = maxC - minC;\n    float s = l > 0.5 ? d / (2.0 - maxC - minC) : d / (maxC + minC);\n    float h;\n    if (maxC == c.r) {\n        h = (c.g - c.b) / d + (c.g < c.b ? 6.0 : 0.0);\n    } else if (maxC == c.g) {\n        h = (c.b - c.r) / d + 2.0;\n    } else {\n        h = (c.r - c.g) / d + 4.0;\n    }\n    h /= 6.0;\n    return vec3(h, s, l);\n}\n\nfloat hue2rgb(float p, float q, float t) {\n    if (t < 0.0) t += 1.0;\n    if (t > 1.0) t -= 1.0;\n    if (t < 1.0 / 6.0) return p + (q - p) * 6.0 * t;\n    if (t < 1.0 / 2.0) return q;\n    if (t < 2.0 / 3.0) return p + (q - p) * (2.0 / 3.0 - t) * 6.0;\n    return p;\n}\n\nvec3 hsl2rgb(vec3 hsl) {\n    float h = hsl.x, s = hsl.y, l = hsl.z;\n    if (s == 0.0) return vec3(l);\n    float q = l < 0.5 ? l * (1.0 + s) : l + s - l * s;\n    float p = 2.0 * l - q;\n    return vec3(\n        hue2rgb(p, q, h + 1.0 / 3.0),\n        hue2rgb(p, q, h),\n        hue2rgb(p, q, h - 1.0 / 3.0)\n    );\n}\n\nvoid main() {\n    vec4 tex = texture(u_image0, v_texCoord);\n    vec3 color = tex.rgb;\n\n    // Build shadows/midtones/highlights vectors (scale -100..100 to -1..1)\n    vec3 shadows = vec3(u_float0, u_float1, u_float2) * 0.01;\n    vec3 midtones = vec3(u_float3, u_float4, u_float5) * 0.01;\n    vec3 highlights = vec3(u_float6, u_float7, u_float8) * 0.01;\n\n    // GIMP: HSL lightness for weight calculation\n    float maxC = max(color.r, max(color.g, color.b));\n    float minC = min(color.r, min(color.g, color.b));\n    float lightness = (maxC + minC) * 0.5;\n\n    // GIMP weight curves: linear ramps with constants a=0.25, b=0.333, scale=0.7\n    const float a = 0.25;\n    const float b = 0.333;\n    const float scale = 0.7;\n\n    float sw = clamp((lightness - b) / -a + 0.5, 0.0, 1.0) * scale;\n    float mw = clamp((lightness - b) / a + 0.5, 0.0, 1.0) *\n               clamp((lightness + b - 1.0) / -a + 0.5, 0.0, 1.0) * scale;\n    float hw = clamp((lightness + b - 1.0) / a + 0.5, 0.0, 1.0) * scale;\n\n    color += sw * shadows + mw * midtones + hw * highlights;\n\n    if (u_bool0) {\n        vec3 hsl = rgb2hsl(clamp(color, 0.0, 1.0));\n        hsl.z = lightness;\n        color = hsl2rgb(hsl);\n    }\n\n    fragColor = vec4(clamp(color, 0.0, 1.0), tex.a);\n}",
              "from_input"
            ]
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 29,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 28,
            "origin_id": 156,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 30,
            "origin_id": 149,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 2,
            "type": "FLOAT"
          },
          {
            "id": 31,
            "origin_id": 150,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 3,
            "type": "FLOAT"
          },
          {
            "id": 32,
            "origin_id": 151,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 4,
            "type": "FLOAT"
          },
          {
            "id": 33,
            "origin_id": 152,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 5,
            "type": "FLOAT"
          },
          {
            "id": 34,
            "origin_id": 153,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 6,
            "type": "FLOAT"
          },
          {
            "id": 35,
            "origin_id": 154,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 7,
            "type": "FLOAT"
          },
          {
            "id": 36,
            "origin_id": 155,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 8,
            "type": "FLOAT"
          },
          {
            "id": 37,
            "origin_id": 11,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 9,
            "type": "FLOAT"
          },
          {
            "id": 38,
            "origin_id": 12,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 10,
            "type": "FLOAT"
          },
          {
            "id": 39,
            "origin_id": 13,
            "origin_slot": 0,
            "target_id": 156,
            "target_slot": 13,
            "type": "BOOLEAN"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      },
      {
        "id": "b5143322-553a-4d96-9539-76b3707ef275",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Chromatic Aberration",
        "description": "Adds lens-style chromatic aberration (color fringing) using a real-time GPU fragment shader.",
        "inputNode": {
          "id": -10,
          "bounding": [
            3270,
            -2050,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            4260,
            -2050,
            120,
            60
          ]
        },
        "inputs": [
          {
            "id": "3b33ac46-93a6-4b1c-896a-ed6fbd24e59c",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              20
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              3370,
              -2030
            ]
          }
        ],
        "outputs": [
          {
            "id": "abe7cd79-a87b-4bd0-8923-d79a57d81a6e",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              23
            ],
            "localized_name": "IMAGE0",
            "label": "IMAGE",
            "pos": [
              4280,
              -2030
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 16,
            "type": "GLSLShader",
            "pos": [
              3810,
              -2320
            ],
            "size": [
              390,
              260
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "label": "image0",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 20
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": 22
              },
              {
                "label": "u_float1",
                "localized_name": "floats.u_float1",
                "name": "floats.u_float1",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": 21
              },
              {
                "label": "u_int1",
                "localized_name": "ints.u_int1",
                "name": "ints.u_int1",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  23
                ]
              },
              {
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\nuniform vec2 u_resolution;\nuniform int u_int0;      // Mode\nuniform float u_float0;  // Amount (0 to 100)\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nconst int MODE_LINEAR   = 0;\nconst int MODE_RADIAL   = 1;\nconst int MODE_BARREL   = 2;\nconst int MODE_SWIRL    = 3;\nconst int MODE_DIAGONAL = 4;\n\nconst float AMOUNT_SCALE = 0.0005;\nconst float RADIAL_MULT = 4.0;\nconst float BARREL_MULT = 8.0;\nconst float INV_SQRT2 = 0.70710678118;\n\nvoid main() {\n    vec2 uv = v_texCoord;\n    vec4 original = texture(u_image0, uv);\n\n    float amount = u_float0 * AMOUNT_SCALE;\n\n    if (amount < 0.000001) {\n        fragColor = original;\n        return;\n    }\n\n    // Aspect-corrected coordinates for circular effects\n    float aspect = u_resolution.x / u_resolution.y;\n    vec2 centered = uv - 0.5;\n    vec2 corrected = vec2(centered.x * aspect, centered.y);\n    float r = length(corrected);\n    vec2 dir = r > 0.0001 ? corrected / r : vec2(0.0);\n    vec2 offset = vec2(0.0);\n\n    if (u_int0 == MODE_LINEAR) {\n        // Horizontal shift (no aspect correction needed)\n        offset = vec2(amount, 0.0);\n    }\n    else if (u_int0 == MODE_RADIAL) {\n        // Outward from center, stronger at edges\n        offset = dir * r * amount * RADIAL_MULT;\n        offset.x /= aspect;  // Convert back to UV space\n    }\n    else if (u_int0 == MODE_BARREL) {\n        // Lens distortion simulation (r² falloff)\n        offset = dir * r * r * amount * BARREL_MULT;\n        offset.x /= aspect;  // Convert back to UV space\n    }\n    else if (u_int0 == MODE_SWIRL) {\n        // Perpendicular to radial (rotational aberration)\n        vec2 perp = vec2(-dir.y, dir.x);\n        offset = perp * r * amount * RADIAL_MULT;\n        offset.x /= aspect;  // Convert back to UV space\n    }\n    else if (u_int0 == MODE_DIAGONAL) {\n        // 45° offset (no aspect correction needed)\n        offset = vec2(amount, amount) * INV_SQRT2;\n    }\n    \n    float red = texture(u_image0, uv + offset).r;\n    float green = original.g;\n    float blue = texture(u_image0, uv - offset).b;\n    \n    fragColor = vec4(red, green, blue, original.a);\n}",
              "from_input"
            ]
          },
          {
            "id": 158,
            "type": "PrimitiveFloat",
            "pos": [
              3810,
              -2430
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "amount",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  22
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 100,
              "step": 1
            },
            "widgets_values": [
              31
            ]
          },
          {
            "id": 159,
            "type": "CustomCombo",
            "pos": [
              3520,
              -2320
            ],
            "size": [
              270,
              230
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
              {
                "label": "mode",
                "localized_name": "choice",
                "name": "choice",
                "type": "COMBO",
                "widget": {
                  "name": "choice"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "STRING",
                "name": "STRING",
                "type": "STRING",
                "links": null
              },
              {
                "localized_name": "INDEX",
                "name": "INDEX",
                "type": "INT",
                "links": [
                  21
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "CustomCombo",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "Linear",
              0,
              "Linear",
              "Radial",
              "Barrel",
              "Swirl",
              "Diagonal",
              ""
            ]
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 22,
            "origin_id": 158,
            "origin_slot": 0,
            "target_id": 16,
            "target_slot": 2,
            "type": "FLOAT"
          },
          {
            "id": 21,
            "origin_id": 159,
            "origin_slot": 1,
            "target_id": 16,
            "target_slot": 4,
            "type": "INT"
          },
          {
            "id": 20,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 16,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 23,
            "origin_id": 16,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      },
      {
        "id": "b7c3a768-1a1c-4a3d-bddf-043f4a8ffb20",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Hue and Saturation",
        "description": "Adjusts hue, saturation, and lightness of an image using a real-time GPU fragment shader.",
        "inputNode": {
          "id": -10,
          "bounding": [
            360,
            -176,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            1410,
            -176,
            120,
            60
          ]
        },
        "inputs": [
          {
            "id": "a5aae7ea-b511-4045-b5da-94101e269cd7",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              10
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              460,
              -156
            ]
          }
        ],
        "outputs": [
          {
            "id": "30b72604-69b3-4944-b253-a9099bbd73a9",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              8
            ],
            "localized_name": "IMAGE0",
            "label": "IMAGE",
            "pos": [
              1430,
              -156
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 3,
            "type": "CustomCombo",
            "pos": [
              540,
              -240
            ],
            "size": [
              270,
              150
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "color_space",
                "localized_name": "choice",
                "name": "choice",
                "type": "COMBO",
                "widget": {
                  "name": "choice"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "STRING",
                "name": "STRING",
                "type": "STRING",
                "links": null
              },
              {
                "localized_name": "INDEX",
                "name": "INDEX",
                "type": "INT",
                "links": [
                  2
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "CustomCombo",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "HSL",
              0,
              "HSL",
              "HSB/HSV",
              ""
            ]
          },
          {
            "id": 2,
            "type": "CustomCombo",
            "pos": [
              540,
              -580
            ],
            "size": [
              270,
              300
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
              {
                "label": "mode",
                "localized_name": "choice",
                "name": "choice",
                "type": "COMBO",
                "widget": {
                  "name": "choice"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "STRING",
                "name": "STRING",
                "type": "STRING",
                "links": null
              },
              {
                "localized_name": "INDEX",
                "name": "INDEX",
                "type": "INT",
                "links": [
                  1
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "CustomCombo",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "Master",
              0,
              "Master",
              "Reds",
              "Yellows",
              "Greens",
              "Cyans",
              "Blues",
              "Magentas",
              "Colorize",
              ""
            ]
          },
          {
            "id": 161,
            "type": "PrimitiveFloat",
            "pos": [
              540,
              260
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "label": "overlap",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  6
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 100,
              "precision": 1,
              "step": 1
            },
            "widgets_values": [
              50
            ]
          },
          {
            "id": 162,
            "type": "PrimitiveFloat",
            "pos": [
              540,
              160
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 3,
            "mode": 0,
            "inputs": [
              {
                "label": "brightness",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  5
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": -100,
              "max": 100,
              "precision": 1,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    0,
                    0
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    255,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              0
            ]
          },
          {
            "id": 163,
            "type": "PrimitiveFloat",
            "pos": [
              540,
              60
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 4,
            "mode": 0,
            "inputs": [
              {
                "label": "saturation",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  4
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": -100,
              "max": 100,
              "precision": 1,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    0,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              0
            ]
          },
          {
            "id": 164,
            "type": "PrimitiveFloat",
            "pos": [
              540,
              -40
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 5,
            "mode": 0,
            "inputs": [
              {
                "label": "hue",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  3
                ]
              }
            ],
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": -180,
              "max": 180,
              "precision": 1,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    255,
                    0,
                    0
                  ]
                },
                {
                  "offset": 0.16666666666666666,
                  "color": [
                    255,
                    255,
                    0
                  ]
                },
                {
                  "offset": 0.3333333333333333,
                  "color": [
                    0,
                    255,
                    0
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    0,
                    255,
                    255
                  ]
                },
                {
                  "offset": 0.6666666666666666,
                  "color": [
                    0,
                    0,
                    255
                  ]
                },
                {
                  "offset": 0.8333333333333334,
                  "color": [
                    255,
                    0,
                    255
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    0,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              3.9
            ]
          },
          {
            "id": 1,
            "type": "GLSLShader",
            "pos": [
              880,
              -300
            ],
            "size": [
              470,
              340
            ],
            "flags": {},
            "order": 6,
            "mode": 0,
            "inputs": [
              {
                "label": "image0",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 10
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": 3
              },
              {
                "label": "u_float1",
                "localized_name": "floats.u_float1",
                "name": "floats.u_float1",
                "shape": 7,
                "type": "FLOAT",
                "link": 4
              },
              {
                "label": "u_float2",
                "localized_name": "floats.u_float2",
                "name": "floats.u_float2",
                "shape": 7,
                "type": "FLOAT",
                "link": 5
              },
              {
                "label": "u_float3",
                "localized_name": "floats.u_float3",
                "name": "floats.u_float3",
                "shape": 7,
                "type": "FLOAT",
                "link": 6
              },
              {
                "label": "u_float4",
                "localized_name": "floats.u_float4",
                "name": "floats.u_float4",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": 1
              },
              {
                "label": "u_int1",
                "localized_name": "ints.u_int1",
                "name": "ints.u_int1",
                "shape": 7,
                "type": "INT",
                "link": 2
              },
              {
                "label": "u_int2",
                "localized_name": "ints.u_int2",
                "name": "ints.u_int2",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  8
                ]
              },
              {
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\nuniform int u_int0;      // Mode: 0=Master, 1=Reds, 2=Yellows, 3=Greens, 4=Cyans, 5=Blues, 6=Magentas, 7=Colorize\nuniform int u_int1;      // Color Space: 0=HSL, 1=HSB/HSV\nuniform float u_float0;  // Hue (-180 to 180)\nuniform float u_float1;  // Saturation (-100 to 100)\nuniform float u_float2;  // Lightness/Brightness (-100 to 100)\nuniform float u_float3;  // Overlap (0 to 100) - feathering between adjacent color ranges\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\n// Color range modes\nconst int MODE_MASTER   = 0;\nconst int MODE_RED      = 1;\nconst int MODE_YELLOW   = 2;\nconst int MODE_GREEN    = 3;\nconst int MODE_CYAN     = 4;\nconst int MODE_BLUE     = 5;\nconst int MODE_MAGENTA  = 6;\nconst int MODE_COLORIZE = 7;\n\n// Color space modes\nconst int COLORSPACE_HSL = 0;\nconst int COLORSPACE_HSB = 1;\n\nconst float EPSILON = 0.0001;\n\n//=============================================================================\n// RGB <-> HSL Conversions\n//=============================================================================\n\nvec3 rgb2hsl(vec3 c) {\n    float maxC = max(max(c.r, c.g), c.b);\n    float minC = min(min(c.r, c.g), c.b);\n    float delta = maxC - minC;\n\n    float h = 0.0;\n    float s = 0.0;\n    float l = (maxC + minC) * 0.5;\n\n    if (delta > EPSILON) {\n        s = l < 0.5\n            ? delta / (maxC + minC)\n            : delta / (2.0 - maxC - minC);\n\n        if (maxC == c.r) {\n            h = (c.g - c.b) / delta + (c.g < c.b ? 6.0 : 0.0);\n        } else if (maxC == c.g) {\n            h = (c.b - c.r) / delta + 2.0;\n        } else {\n            h = (c.r - c.g) / delta + 4.0;\n        }\n        h /= 6.0;\n    }\n\n    return vec3(h, s, l);\n}\n\nfloat hue2rgb(float p, float q, float t) {\n    t = fract(t);\n    if (t < 1.0/6.0) return p + (q - p) * 6.0 * t;\n    if (t < 0.5)       return q;\n    if (t < 2.0/3.0)   return p + (q - p) * (2.0/3.0 - t) * 6.0;\n    return p;\n}\n\nvec3 hsl2rgb(vec3 hsl) {\n    if (hsl.y < EPSILON) return vec3(hsl.z);\n\n    float q = hsl.z < 0.5\n        ? hsl.z * (1.0 + hsl.y)\n        : hsl.z + hsl.y - hsl.z * hsl.y;\n    float p = 2.0 * hsl.z - q;\n\n    return vec3(\n        hue2rgb(p, q, hsl.x + 1.0/3.0),\n        hue2rgb(p, q, hsl.x),\n        hue2rgb(p, q, hsl.x - 1.0/3.0)\n    );\n}\n\nvec3 rgb2hsb(vec3 c) {\n    float maxC = max(max(c.r, c.g), c.b);\n    float minC = min(min(c.r, c.g), c.b);\n    float delta = maxC - minC;\n\n    float h = 0.0;\n    float s = (maxC > EPSILON) ? delta / maxC : 0.0;\n    float b = maxC;\n\n    if (delta > EPSILON) {\n        if (maxC == c.r) {\n            h = (c.g - c.b) / delta + (c.g < c.b ? 6.0 : 0.0);\n        } else if (maxC == c.g) {\n            h = (c.b - c.r) / delta + 2.0;\n        } else {\n            h = (c.r - c.g) / delta + 4.0;\n        }\n        h /= 6.0;\n    }\n\n    return vec3(h, s, b);\n}\n\nvec3 hsb2rgb(vec3 hsb) {\n    vec3 rgb = clamp(abs(mod(hsb.x * 6.0 + vec3(0.0, 4.0, 2.0), 6.0) - 3.0) - 1.0, 0.0, 1.0);\n    return hsb.z * mix(vec3(1.0), rgb, hsb.y);\n}\n\n//=============================================================================\n// Color Range Weight Calculation\n//=============================================================================\n\nfloat hueDistance(float a, float b) {\n    float d = abs(a - b);\n    return min(d, 1.0 - d);\n}\n\nfloat getHueWeight(float hue, float center, float overlap) {\n    float baseWidth = 1.0 / 6.0;\n    float feather = baseWidth * overlap;\n\n    float d = hueDistance(hue, center);\n\n    float inner = baseWidth * 0.5;\n    float outer = inner + feather;\n\n    return 1.0 - smoothstep(inner, outer, d);\n}\n\nfloat getModeWeight(float hue, int mode, float overlap) {\n    if (mode == MODE_MASTER || mode == MODE_COLORIZE) return 1.0;\n\n    if (mode == MODE_RED) {\n        return max(\n            getHueWeight(hue, 0.0, overlap),\n            getHueWeight(hue, 1.0, overlap)\n        );\n    }\n\n    float center = float(mode - 1) / 6.0;\n    return getHueWeight(hue, center, overlap);\n}\n\n//=============================================================================\n// Adjustment Functions\n//=============================================================================\n\nfloat adjustLightness(float l, float amount) {\n    return amount > 0.0\n        ? l + (1.0 - l) * amount\n        : l + l * amount;\n}\n\nfloat adjustBrightness(float b, float amount) {\n    return clamp(b + amount, 0.0, 1.0);\n}\n\nfloat adjustSaturation(float s, float amount) {\n    return amount > 0.0\n        ? s + (1.0 - s) * amount\n        : s + s * amount;\n}\n\nvec3 colorize(vec3 rgb, float hue, float sat, float light) {\n    float lum = dot(rgb, vec3(0.299, 0.587, 0.114));\n    float l = adjustLightness(lum, light);\n\n    vec3 hsl = vec3(fract(hue), clamp(sat, 0.0, 1.0), clamp(l, 0.0, 1.0));\n    return hsl2rgb(hsl);\n}\n\n//=============================================================================\n// Main\n//=============================================================================\n\nvoid main() {\n    vec4 original = texture(u_image0, v_texCoord);\n\n    float hueShift   = u_float0 / 360.0;   // -180..180 -> -0.5..0.5\n    float satAmount  = u_float1 / 100.0;   // -100..100 -> -1..1\n    float lightAmount= u_float2 / 100.0;   // -100..100 -> -1..1\n    float overlap    = u_float3 / 100.0;   // 0..100 -> 0..1\n\n    vec3 result;\n\n    if (u_int0 == MODE_COLORIZE) {\n        result = colorize(original.rgb, hueShift, satAmount, lightAmount);\n        fragColor = vec4(result, original.a);\n        return;\n    }\n\n    vec3 hsx = (u_int1 == COLORSPACE_HSL)\n        ? rgb2hsl(original.rgb)\n        : rgb2hsb(original.rgb);\n\n    float weight = getModeWeight(hsx.x, u_int0, overlap);\n\n    if (u_int0 != MODE_MASTER && hsx.y < EPSILON) {\n        weight = 0.0;\n    }\n\n    if (weight > EPSILON) {\n        float h = fract(hsx.x + hueShift * weight);\n        float s = clamp(adjustSaturation(hsx.y, satAmount * weight), 0.0, 1.0);\n        float v = (u_int1 == COLORSPACE_HSL)\n            ? clamp(adjustLightness(hsx.z, lightAmount * weight), 0.0, 1.0)\n            : clamp(adjustBrightness(hsx.z, lightAmount * weight), 0.0, 1.0);\n\n        vec3 adjusted = vec3(h, s, v);\n        result = (u_int1 == COLORSPACE_HSL)\n            ? hsl2rgb(adjusted)\n            : hsb2rgb(adjusted);\n    } else {\n        result = original.rgb;\n    }\n\n    fragColor = vec4(result, original.a);\n}\n",
              "from_input"
            ]
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 3,
            "origin_id": 164,
            "origin_slot": 0,
            "target_id": 1,
            "target_slot": 2,
            "type": "FLOAT"
          },
          {
            "id": 4,
            "origin_id": 163,
            "origin_slot": 0,
            "target_id": 1,
            "target_slot": 3,
            "type": "FLOAT"
          },
          {
            "id": 5,
            "origin_id": 162,
            "origin_slot": 0,
            "target_id": 1,
            "target_slot": 4,
            "type": "FLOAT"
          },
          {
            "id": 6,
            "origin_id": 161,
            "origin_slot": 0,
            "target_id": 1,
            "target_slot": 5,
            "type": "FLOAT"
          },
          {
            "id": 1,
            "origin_id": 2,
            "origin_slot": 1,
            "target_id": 1,
            "target_slot": 7,
            "type": "INT"
          },
          {
            "id": 2,
            "origin_id": 3,
            "origin_slot": 1,
            "target_id": 1,
            "target_slot": 8,
            "type": "INT"
          },
          {
            "id": 10,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 1,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 8,
            "origin_id": 1,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      },
      {
        "id": "1d319b86-6e4f-43d0-83e1-99dc988e1db3",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Color Adjustment",
        "description": "Adjusts saturation, temperature, tint, and vibrance using a real-time GPU fragment shader.",
        "inputNode": {
          "id": -10,
          "bounding": [
            3110,
            -3560,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            4070,
            -3560,
            120,
            60
          ]
        },
        "inputs": [
          {
            "id": "0431d493-5f28-4430-bd00-84733997fc08",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              29
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              3210,
              -3540
            ]
          }
        ],
        "outputs": [
          {
            "id": "bee8ea06-a114-4612-8937-939f2c927bdb",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              28
            ],
            "localized_name": "IMAGE0",
            "label": "IMAGE",
            "pos": [
              4090,
              -3540
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 166,
            "type": "GLSLShader",
            "pos": [
              3590,
              -3940
            ],
            "size": [
              420,
              300
            ],
            "flags": {},
            "order": 4,
            "mode": 0,
            "inputs": [
              {
                "label": "image0",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 29
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": 34
              },
              {
                "label": "u_float1",
                "localized_name": "floats.u_float1",
                "name": "floats.u_float1",
                "shape": 7,
                "type": "FLOAT",
                "link": 30
              },
              {
                "label": "u_float2",
                "localized_name": "floats.u_float2",
                "name": "floats.u_float2",
                "shape": 7,
                "type": "FLOAT",
                "link": 31
              },
              {
                "label": "u_float3",
                "localized_name": "floats.u_float3",
                "name": "floats.u_float3",
                "shape": 7,
                "type": "FLOAT",
                "link": 33
              },
              {
                "label": "u_float4",
                "localized_name": "floats.u_float4",
                "name": "floats.u_float4",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  28
                ]
              },
              {
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision highp float;\n\nuniform sampler2D u_image0;\nuniform float u_float0; // temperature (-100 to 100)\nuniform float u_float1; // tint (-100 to 100)\nuniform float u_float2; // vibrance (-100 to 100)\nuniform float u_float3; // saturation (-100 to 100)\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nconst float INPUT_SCALE = 0.01;\nconst float TEMP_TINT_PRIMARY = 0.3;\nconst float TEMP_TINT_SECONDARY = 0.15;\nconst float VIBRANCE_BOOST = 2.0;\nconst float SATURATION_BOOST = 2.0;\nconst float SKIN_PROTECTION = 0.5;\nconst float EPSILON = 0.001;\nconst vec3 LUMA_WEIGHTS = vec3(0.299, 0.587, 0.114);\n\nvoid main() {\n    vec4 tex = texture(u_image0, v_texCoord);\n    vec3 color = tex.rgb;\n    \n    // Scale inputs: -100/100 → -1/1\n    float temperature = u_float0 * INPUT_SCALE;\n    float tint = u_float1 * INPUT_SCALE;\n    float vibrance = u_float2 * INPUT_SCALE;\n    float saturation = u_float3 * INPUT_SCALE;\n    \n    // Temperature (warm/cool): positive = warm, negative = cool\n    color.r += temperature * TEMP_TINT_PRIMARY;\n    color.b -= temperature * TEMP_TINT_PRIMARY;\n    \n    // Tint (green/magenta): positive = green, negative = magenta\n    color.g += tint * TEMP_TINT_PRIMARY;\n    color.r -= tint * TEMP_TINT_SECONDARY;\n    color.b -= tint * TEMP_TINT_SECONDARY;\n    \n    // Single clamp after temperature/tint\n    color = clamp(color, 0.0, 1.0);\n    \n    // Vibrance with skin protection\n    if (vibrance != 0.0) {\n        float maxC = max(color.r, max(color.g, color.b));\n        float minC = min(color.r, min(color.g, color.b));\n        float sat = maxC - minC;\n        float gray = dot(color, LUMA_WEIGHTS);\n        \n        if (vibrance < 0.0) {\n            // Desaturate: -100 → gray\n            color = mix(vec3(gray), color, 1.0 + vibrance);\n        } else {\n            // Boost less saturated colors more\n            float vibranceAmt = vibrance * (1.0 - sat);\n            \n            // Branchless skin tone protection\n            float isWarmTone = step(color.b, color.g) * step(color.g, color.r);\n            float warmth = (color.r - color.b) / max(maxC, EPSILON);\n            float skinTone = isWarmTone * warmth * sat * (1.0 - sat);\n            vibranceAmt *= (1.0 - skinTone * SKIN_PROTECTION);\n            \n            color = mix(vec3(gray), color, 1.0 + vibranceAmt * VIBRANCE_BOOST);\n        }\n    }\n    \n    // Saturation\n    if (saturation != 0.0) {\n        float gray = dot(color, LUMA_WEIGHTS);\n        float satMix = saturation < 0.0\n            ? 1.0 + saturation                      // -100 → gray\n            : 1.0 + saturation * SATURATION_BOOST;  // +100 → 3x boost\n        color = mix(vec3(gray), color, satMix);\n    }\n    \n    fragColor = vec4(clamp(color, 0.0, 1.0), tex.a);\n}",
              "from_input"
            ]
          },
          {
            "id": 167,
            "type": "PrimitiveFloat",
            "pos": [
              3290,
              -3610
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "vibrance",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  26,
                  31
                ]
              }
            ],
            "title": "Vibrance",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    0,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              0
            ]
          },
          {
            "id": 168,
            "type": "PrimitiveFloat",
            "pos": [
              3290,
              -3720
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
              {
                "label": "saturation",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  33
                ]
              }
            ],
            "title": "Saturation",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    0,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              0
            ]
          },
          {
            "id": 169,
            "type": "PrimitiveFloat",
            "pos": [
              3290,
              -3830
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "label": "tint",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  30
                ]
              }
            ],
            "title": "Tint",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    255,
                    0
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    255,
                    255,
                    255
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    0,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              0
            ]
          },
          {
            "id": 170,
            "type": "PrimitiveFloat",
            "pos": [
              3290,
              -3940
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 3,
            "mode": 0,
            "inputs": [
              {
                "label": "temperature",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  34
                ]
              }
            ],
            "title": "Temperature",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 100,
              "min": -100,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    68,
                    136,
                    255
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    255,
                    255,
                    255
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    136,
                    0
                  ]
                }
              ]
            },
            "widgets_values": [
              0
            ]
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 34,
            "origin_id": 170,
            "origin_slot": 0,
            "target_id": 166,
            "target_slot": 2,
            "type": "FLOAT"
          },
          {
            "id": 30,
            "origin_id": 169,
            "origin_slot": 0,
            "target_id": 166,
            "target_slot": 3,
            "type": "FLOAT"
          },
          {
            "id": 31,
            "origin_id": 167,
            "origin_slot": 0,
            "target_id": 166,
            "target_slot": 4,
            "type": "FLOAT"
          },
          {
            "id": 33,
            "origin_id": 168,
            "origin_slot": 0,
            "target_id": 166,
            "target_slot": 5,
            "type": "FLOAT"
          },
          {
            "id": 29,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 166,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 28,
            "origin_id": 166,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      },
      {
        "id": "bf0f7afe-2f48-42b1-9e47-57e362efc6dd",
        "version": 1,
        "state": {
          "lastGroupId": 9,
          "lastNodeId": 204,
          "lastLinkId": 142,
          "lastRerouteId": 0
        },
        "revision": 0,
        "config": {},
        "name": "Image Levels",
        "description": "Adjusts black point, white point, and gamma for tonal range control via GPU shader.",
        "inputNode": {
          "id": -10,
          "bounding": [
            3840,
            -3430,
            120,
            60
          ]
        },
        "outputNode": {
          "id": -20,
          "bounding": [
            4950,
            -3430,
            120,
            60
          ]
        },
        "inputs": [
          {
            "id": "b53e5012-fa47-400f-a324-28c74854ccae",
            "name": "images.image0",
            "type": "IMAGE",
            "linkIds": [
              1
            ],
            "localized_name": "images.image0",
            "label": "image",
            "pos": [
              3940,
              -3410
            ]
          }
        ],
        "outputs": [
          {
            "id": "de7f2ffa-155f-41fd-b054-aa4d91ef49ca",
            "name": "IMAGE0",
            "type": "IMAGE",
            "linkIds": [
              8
            ],
            "localized_name": "IMAGE0",
            "label": "IMAGE",
            "pos": [
              4970,
              -3410
            ]
          }
        ],
        "widgets": [],
        "nodes": [
          {
            "id": 172,
            "type": "CustomCombo",
            "pos": [
              4020,
              -3350
            ],
            "size": [
              270,
              200
            ],
            "flags": {},
            "order": 0,
            "mode": 0,
            "inputs": [
              {
                "label": "channel",
                "localized_name": "choice",
                "name": "choice",
                "type": "COMBO",
                "widget": {
                  "name": "choice"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "STRING",
                "name": "STRING",
                "type": "STRING",
                "links": null
              },
              {
                "localized_name": "INDEX",
                "name": "INDEX",
                "type": "INT",
                "links": [
                  3
                ]
              }
            ],
            "title": "Channel",
            "properties": {
              "Node name for S&R": "CustomCombo",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "RGB",
              0,
              "RGB",
              "R",
              "G",
              "B",
              ""
            ]
          },
          {
            "id": 173,
            "type": "PrimitiveFloat",
            "pos": [
              4020,
              -3550
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 1,
            "mode": 0,
            "inputs": [
              {
                "label": "output_black",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  6
                ]
              }
            ],
            "title": "Output Black",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 255,
              "min": 0,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    0,
                    0
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    255,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              36
            ]
          },
          {
            "id": 174,
            "type": "PrimitiveFloat",
            "pos": [
              4020,
              -3850
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 2,
            "mode": 0,
            "inputs": [
              {
                "label": "input_black",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  2
                ]
              }
            ],
            "title": "Input Black",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "min": 0,
              "max": 255,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    0,
                    0
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    255,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              85
            ]
          },
          {
            "id": 175,
            "type": "PrimitiveFloat",
            "pos": [
              4020,
              -3750
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 3,
            "mode": 0,
            "inputs": [
              {
                "label": "input_white",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  4
                ]
              }
            ],
            "title": "Input White",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 255,
              "min": 0,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    0,
                    0
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    255,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              255
            ]
          },
          {
            "id": 176,
            "type": "PrimitiveFloat",
            "pos": [
              4020,
              -3650
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 4,
            "mode": 0,
            "inputs": [
              {
                "label": "gamma",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  5
                ]
              }
            ],
            "title": "Gamma",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 10,
              "min": 0,
              "step": 0.01,
              "precision": 2,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    0,
                    0
                  ]
                },
                {
                  "offset": 0.5,
                  "color": [
                    128,
                    128,
                    128
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    255,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              4.33
            ]
          },
          {
            "id": 177,
            "type": "PrimitiveFloat",
            "pos": [
              4020,
              -3450
            ],
            "size": [
              270,
              60
            ],
            "flags": {},
            "order": 5,
            "mode": 0,
            "inputs": [
              {
                "label": "output_white",
                "localized_name": "value",
                "name": "value",
                "type": "FLOAT",
                "widget": {
                  "name": "value"
                },
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "FLOAT",
                "name": "FLOAT",
                "type": "FLOAT",
                "links": [
                  7
                ]
              }
            ],
            "title": "Output White",
            "properties": {
              "Node name for S&R": "PrimitiveFloat",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65,
              "max": 255,
              "min": 0,
              "step": 1,
              "display": "gradientslider",
              "gradient_stops": [
                {
                  "offset": 0,
                  "color": [
                    0,
                    0,
                    0
                  ]
                },
                {
                  "offset": 1,
                  "color": [
                    255,
                    255,
                    255
                  ]
                }
              ]
            },
            "widgets_values": [
              201
            ]
          },
          {
            "id": 178,
            "type": "GLSLShader",
            "pos": [
              4310,
              -3850
            ],
            "size": [
              580,
              340
            ],
            "flags": {},
            "order": 6,
            "mode": 0,
            "inputs": [
              {
                "label": "image0",
                "localized_name": "images.image0",
                "name": "images.image0",
                "type": "IMAGE",
                "link": 1
              },
              {
                "label": "image1",
                "localized_name": "images.image1",
                "name": "images.image1",
                "shape": 7,
                "type": "IMAGE",
                "link": null
              },
              {
                "label": "u_float0",
                "localized_name": "floats.u_float0",
                "name": "floats.u_float0",
                "shape": 7,
                "type": "FLOAT",
                "link": 2
              },
              {
                "label": "u_float1",
                "localized_name": "floats.u_float1",
                "name": "floats.u_float1",
                "shape": 7,
                "type": "FLOAT",
                "link": 4
              },
              {
                "label": "u_float2",
                "localized_name": "floats.u_float2",
                "name": "floats.u_float2",
                "shape": 7,
                "type": "FLOAT",
                "link": 5
              },
              {
                "label": "u_float3",
                "localized_name": "floats.u_float3",
                "name": "floats.u_float3",
                "shape": 7,
                "type": "FLOAT",
                "link": 6
              },
              {
                "label": "u_float4",
                "localized_name": "floats.u_float4",
                "name": "floats.u_float4",
                "shape": 7,
                "type": "FLOAT",
                "link": 7
              },
              {
                "label": "u_float5",
                "localized_name": "floats.u_float5",
                "name": "floats.u_float5",
                "shape": 7,
                "type": "FLOAT",
                "link": null
              },
              {
                "label": "u_int0",
                "localized_name": "ints.u_int0",
                "name": "ints.u_int0",
                "shape": 7,
                "type": "INT",
                "link": 3
              },
              {
                "label": "u_int1",
                "localized_name": "ints.u_int1",
                "name": "ints.u_int1",
                "shape": 7,
                "type": "INT",
                "link": null
              },
              {
                "label": "u_bool0",
                "localized_name": "bools.u_bool0",
                "name": "bools.u_bool0",
                "shape": 7,
                "type": "BOOLEAN",
                "link": null
              },
              {
                "label": "u_curve0",
                "localized_name": "curves.u_curve0",
                "name": "curves.u_curve0",
                "shape": 7,
                "type": "CURVE",
                "link": null
              }
            ],
            "outputs": [
              {
                "localized_name": "IMAGE0",
                "name": "IMAGE0",
                "type": "IMAGE",
                "links": [
                  8
                ]
              },
              {
                "localized_name": "IMAGE1",
                "name": "IMAGE1",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE2",
                "name": "IMAGE2",
                "type": "IMAGE",
                "links": null
              },
              {
                "localized_name": "IMAGE3",
                "name": "IMAGE3",
                "type": "IMAGE",
                "links": null
              }
            ],
            "properties": {
              "Node name for S&R": "GLSLShader",
              "cnr_id": "comfy-core",
              "ver": "0.22.0",
              "enableTabs": false,
              "tabWidth": 65,
              "tabXOffset": 10,
              "hasSecondTab": false,
              "secondTabText": "Send Back",
              "secondTabOffset": 80,
              "secondTabWidth": 65
            },
            "widgets_values": [
              "#version 300 es\nprecision highp float;\n\n// Levels Adjustment\n// u_int0:   channel      (0=RGB, 1=R, 2=G, 3=B)         default: 0\n// u_float0: input black  (0-255)                        default: 0\n// u_float1: input white  (0-255)                        default: 255\n// u_float2: gamma        (0.01-9.99)                    default: 1.0\n// u_float3: output black (0-255)                        default: 0\n// u_float4: output white (0-255)                        default: 255\n\nuniform sampler2D u_image0;\nuniform int u_int0;\nuniform float u_float0;\nuniform float u_float1;\nuniform float u_float2;\nuniform float u_float3;\nuniform float u_float4;\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nvec3 applyLevels(vec3 color, float inBlack, float inWhite, float gamma, float outBlack, float outWhite) {\n    float inRange = max(inWhite - inBlack, 0.0001);\n    vec3 result = clamp((color - inBlack) / inRange, 0.0, 1.0);\n    result = pow(result, vec3(1.0 / gamma));\n    result = mix(vec3(outBlack), vec3(outWhite), result);\n    return result;\n}\n\nfloat applySingleChannel(float value, float inBlack, float inWhite, float gamma, float outBlack, float outWhite) {\n    float inRange = max(inWhite - inBlack, 0.0001);\n    float result = clamp((value - inBlack) / inRange, 0.0, 1.0);\n    result = pow(result, 1.0 / gamma);\n    result = mix(outBlack, outWhite, result);\n    return result;\n}\n\nvoid main() {\n    vec4 texColor = texture(u_image0, v_texCoord);\n    vec3 color = texColor.rgb;\n    \n    float inBlack = u_float0 / 255.0;\n    float inWhite = u_float1 / 255.0;\n    float gamma = u_float2;\n    float outBlack = u_float3 / 255.0;\n    float outWhite = u_float4 / 255.0;\n    \n    vec3 result;\n    \n    if (u_int0 == 0) {\n        result = applyLevels(color, inBlack, inWhite, gamma, outBlack, outWhite);\n    }\n    else if (u_int0 == 1) {\n        result = color;\n        result.r = applySingleChannel(color.r, inBlack, inWhite, gamma, outBlack, outWhite);\n    }\n    else if (u_int0 == 2) {\n        result = color;\n        result.g = applySingleChannel(color.g, inBlack, inWhite, gamma, outBlack, outWhite);\n    }\n    else if (u_int0 == 3) {\n        result = color;\n        result.b = applySingleChannel(color.b, inBlack, inWhite, gamma, outBlack, outWhite);\n    }\n    else {\n        result = color;\n    }\n    \n    fragColor = vec4(result, texColor.a);\n}",
              "from_input"
            ]
          }
        ],
        "groups": [],
        "links": [
          {
            "id": 2,
            "origin_id": 174,
            "origin_slot": 0,
            "target_id": 178,
            "target_slot": 2,
            "type": "FLOAT"
          },
          {
            "id": 4,
            "origin_id": 175,
            "origin_slot": 0,
            "target_id": 178,
            "target_slot": 3,
            "type": "FLOAT"
          },
          {
            "id": 5,
            "origin_id": 176,
            "origin_slot": 0,
            "target_id": 178,
            "target_slot": 4,
            "type": "FLOAT"
          },
          {
            "id": 6,
            "origin_id": 173,
            "origin_slot": 0,
            "target_id": 178,
            "target_slot": 5,
            "type": "FLOAT"
          },
          {
            "id": 7,
            "origin_id": 177,
            "origin_slot": 0,
            "target_id": 178,
            "target_slot": 6,
            "type": "FLOAT"
          },
          {
            "id": 3,
            "origin_id": 172,
            "origin_slot": 1,
            "target_id": 178,
            "target_slot": 8,
            "type": "INT"
          },
          {
            "id": 1,
            "origin_id": -10,
            "origin_slot": 0,
            "target_id": 178,
            "target_slot": 0,
            "type": "IMAGE"
          },
          {
            "id": 8,
            "origin_id": 178,
            "origin_slot": 0,
            "target_id": -20,
            "target_slot": 0,
            "type": "IMAGE"
          }
        ],
        "extra": {
          "workflowRendererVersion": "LG"
        }
      }
    ]
  },
  "config": {},
  "extra": {
    "ds": {
      "scale": 0.13310000000000147,
      "offset": [
        7040.666964526875,
        1586.6273200719797
      ]
    },
    "frontendVersion": "1.43.18",
    "VHS_latentpreview": false,
    "VHS_latentpreviewrate": 0,
    "VHS_MetadataImage": true,
    "VHS_KeepIntermediate": true
  },
  "version": 0.4
}