/

Groups


Create Group

Description

Create a new node group.

REQUEST

  • URI :

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup?accessToken=<accessToken>
  • Method: POST
  • Data: JSON
    {
        "regions": [
            "<region-code>"
        ],
        "launchConfig": "<launch-config-name>",
        "scalePolicy": "<scale-policy-name>"
    }

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • Data:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 201
  • Data:
    {
      "id": <autogen-group-id>,
      "name": "<autogen-nodegroup>",
      "originConnections": <min-origin-connections>,
      "regions": [
        "<region-code>"
      ],
      "launchConfig": "<launch-config-name>",
      "scalePolicy": "<scale-policy-name>",
      "state": "<nodegroup-state>",
      "timestamp": <timestamp>
    }

Example

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup?accessToken=xyz123
  • Method: POST
  • Data : JSON
    {
        "regions": [
            "us-central1",
            "us-east1"
        ],
        "launchConfig": "default",
        "scalePolicy": "default"
    }

RESPONSE

  • Success: HTTP CODE 201
  • Data:
    {
      "id": 2,
      "name": "group-d2f6aade-c6eb-4b92-b056-3f3a9f99b96f",
      "originConnections": 0,
      "regions": [
        "us-central1",
        "us-east1"
      ],
      "launchConfig": "default",
      "scalePolicy": "default",
      "state": "new",
      "timestamp": 1452595891000
    }

regions

The geographical regions where you would like the nodes to be created. Stream Manager usually lets the Autoscaler use this list in a round-robin style. You can find a list of available Google Cloud regions here or a list of available AWS regions here.

originConnections

An attribute reserved for future use. Currently this is always set to zero, whena new group is created.

launchConfig

Name of the launch configuration to be used for launching each new instance in the nodegroup. Usually this implies the consistent machine configuration for a group. A launch configuration defines your machine type, max connections, etc. for each instance type (origin and edge).

scalePolicy

Name of the scale policy to be used by Autoscaler to launch new edges when load conditions occur. A scale policy defines details such as min-max edges allowed, instances warm-up time, cooldown period, etc.

Create Group (Smart)

Create a new node group using information about expected traffic. Optionally a boolean query parameter - autoinit can be provided to specify whether the nodegroup should automatically be initialized with an origin after successful creation.

NOTES FOR NodeGroup Smart API Call:

  • The launch configuration must already exist in the Stream Manager data store before attempting to use this API.
  • A unique scale policy name should be specified. When the nodegroup is created using the smart api call, the scale policy is automatically generated from the publisher-subscriber data provided.
  • Currently the API supports groups that involve only origin and edge nodetypes; relay and transcoder specifications will be supported in future releases.

REQUEST

  • URI :

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup?accessToken=<accessToken>
  • Method: POST
  • Data: JSON
    {
      "launchConfig": "<existing-launch-config-name>",
      "scalePolicy": "<new-scale-policy-name>",
      "region": [{
        "name": "<region-code>",
        "info": {
          "minPublishers": "<min-publishers>",
          "maxPublishers": "<max-publishers>",
          "minSubscribers": "<min-subscribers>",
          "maxSubscribers": "<max-subscribers>"
        }
      }]
    }

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • Data:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 201
  • Data:
    {
      "id": <autogen-group-id>,
      "name": "<autogen-group-name>",
      "originConnections": <min-origin-connections>,
      "regions": [
        "<region-code>"
      ],
      "launchConfig": "<launch-config-name>",
      "scalePolicy": "<scale-policy-name>",
      "state": "<nodegroup-state>",
      "timestamp": <timestamp>
    }
    ]

Example1: Create smart nodegroup without auto-initializing it.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup?accessToken=xyz123
  • Method: POST
  • Data: JSON
    {
      "launchConfig": "default-v3",
      "scalePolicy": "mypolicy",
      "region": [{
        "name": "us-east-1",
        "info": {
          "minPublishers": "500",
          "maxPublishers": "500",
          "minSubscribers": "20000",
          "maxSubscribers": "60000"
        }
      }]
    }

RESPONSE

  • Success: HTTP CODE 201
  • Data:
    {
        "id": 10,
        "name": "group-01cd747b-c649-4165-bdec-81141e494490",
        "originConnections": 0,
        "regions": [
            "us-east-1"
        ],
        "launchConfig": "default-v2",
        "scalePolicy": "mypolicy",
        "state": "new",
        "timestamp": 1525248471265
    }

Example2: Create smart nodegroup and auto-initialize it with an origin.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup?accessToken=xyz123&autoinit=true
  • Method: POST
  • Data : JSON
    {
      "launchConfig": "default-v2",
      "scalePolicy": "mypolicy",
      "region": [{
        "name": "us-east-1",
        "info": {
          "minPublishers": "500",
          "maxPublishers": "500",
          "minSubscribers": "20000",
          "maxSubscribers": "60000"
        }
      }]
    }

RESPONSE

  • Success: HTTP CODE 201
  • Data:
    {
        "id": 10,
        "name": "group-01cd747b-c649-4165-bdec-81141e494490",
        "originConnections": 0,
        "regions": [
            "us-east-1"
        ],
        "launchConfig": "default-v2",
        "scalePolicy": "mypolicy",
        "state": "initializing",
        "timestamp": 1525248471265
    }

NOTE: If the origin initialization fails, the group will be automatically removed from data store.

Read Group

Description

Reads a node group.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/<nodegroup>?accessToken=<accessToken>
  • Method: GET

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • Data:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 200
  • Data:
    {
      "id": <autogen-group-id>,
      "originConnections": 0,
      "name": "<autogen-nodegroup>",
      "region": [
        "<region-code>"
      ],
      "launchConfig": "<launch-config-name>",
      "scalePolicy": "<scale-policy-name>",
      "state": "<nodegroup-state>",
      "timestamp": <timestamp>
    }

Example

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-d2f6aade-c6eb-4b92-b056-3f3a9f99b96f?accessToken=xyz123
  • Method : GET

RESPONSE

  • Success: HTTP CODE 200
  • Data:
    {
      "id": 2,
      "name": "group-d2f6aade-c6eb-4b92-b056-3f3a9f99b96f",
      "originConnections": 0,
      "regions": [
        "us-central1",
        "us-east1"
      ],
      "launchConfig": "default",
      "scalePolicy": "default",
      "state": "active",
      "timestamp": 1452595891000
    }

Delete Group

Description

Deletes a node group. If the group has no nodes in it then it is deleted right away, otherwise all the nodes of the group are deleted in the background separately, and then the group itself is deleted once it is empty.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/<nodeGroup>?accessToken=<accessToken>
  • Method: DELETE

RESPONSE

  • FAILURE: HTTP CODE 400 or 404
  • Data:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 200
  • Data:
    {
      "id": <autogen-group-id>,
      "name": "<autogen-nodegroup>",
      "originConnections": 0,
      "regions": [
        "<compute-region-code>"
      ],
      "launchConfig": "<launch-config-name>",
      "scalePolicy": "<scale-policy-name>",
      "state": "<nodegroup-state>",
      "timestamp": <timestamp>
    }

Example

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-d2f6aade-c6eb-4b92-b056-3f3a9f99b96f?accessToken=xyz123
  • Method: DELETE

RESPONSE

  • Success: HTTP CODE 200
  • Data:
    {
      "id": 2,
      "name": "group-d2f6aade-c6eb-4b92-b056-3f3a9f99b96f",
      "originConnections": 0,
      "regions": [
        "us-central1",
        "us-central1"
      ],
      "launchConfig": "default",
      "scalePolicy": "default",
      "state": "active",
      "timestamp": 1452595891000
    }

Resize Group

Description

Lets you specify the minimum/maximum range of publishers and subscribers you expect to have. Stream Manager evaluates the minimum and maximum number of nodes that you should have in your nodegroup and updates the scale policy for your nodegroup based on the calculated minLimit and maxLimit.

REQUEST

  • URI :

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/<nodeGroup>?accessToken=<accessToken>
  • Method: PUT
  • Data: JSON
    {
      "region": [{
        "name": "default",
        "info": {
          "minPublishers": "<min-publishers>",
          "maxPublishers": "<max-publishers>",
          "minSubscribers": "<min-subscribers>",
          "maxSubscribers": "<max-subscribers>"
        }
      }]
    }

RESPONSE

  • Success: HTTP CODE 200
  • Data:
   {
     "id": <group-id>,
     "name": "<autogen-nodegroup>",
     "originConnections": <min-origin-connections>,
     "regions": [
       "<region-code>"
     ],
     "launchConfig": "<launch-config-name>",
     "scalePolicy": "<scale-policy-name>",
     "state": "<nodegroup-state>",
     "timestamp": <timestamp>
   }

NOTES:

  • You cannot add a new region using this api. Only regions originally specified can be modified.
  • Currently the api supports TIER-1 nodegroups only (groups that involve only origin & edge). relays and transcoders specifications will be supported in future releases.
  • The region property is an array of regional capacity definitions. Therefore you can specify definition for more than one region at a time.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-01cd747b-c649-4165-bdec-81141e494490?accessToken=xyz123
  • Method: PUT
  • Data : JSON
    {
      "region": [{
        "name": "us-east-1",
        "info": {
          "minPublishers": "500",
          "maxPublishers": "1000",
          "minSubscribers": "1000",
          "maxSubscribers": "3000"
        }
      }]
    }

RESPONSE

  • Success: HTTP CODE 201
  • Data:
    {
        "id": 10,
        "name": "group-01cd747b-c649-4165-bdec-81141e494490",
        "originConnections": 0,
        "regions": [
            "us-east-1"
        ],
        "launchConfig": "default-v2",
        "scalePolicy": "mypolicy",
        "state": "active",
        "timestamp": 1525248471265
    }

List Groups

Description

List all available groups in the system.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup?accessToken=<accessToken>
  • Method: GET

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • Data:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 200
  • Data:
    [
    {
      "id": <autogen-group-id>,
      "name": "<autogen-nodegroup>"
      "originConnections": <min-origin-connections>,
      "regions": [
        "<compute-region-code>"
      ],
      "launchConfig": "<launch-config-name>",
      "scalePolicy": "<scale-policy-name>",
      "state": "<nodegroup-state>",
      "timestamp": <timestamp>
    }
    ]

Example

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup?accessToken=xyz123
  • Method: GET

RESPONSE

  • Success: HTTP CODE 200
  • Data:
    [
      {
        "id": 3,
        "name": "group-e658a196-cb39-411a-86c1-d1e618222100",
        "originConnections": 0,
        "regions": [
          "us-central1-a",
          "us-central1-f"
        ],
        "launchConfig": "default",
        "scalePolicy": "default",
        "state": "active",
        "timestamp": null
      },
      {
        "id": 4,
        "name": "group-51921df1-d68e-4fee-8332-6dbdf7102e47",
        "originConnections": 0,
        "regions": [
          "us-central1-a",
          "us-central1-f"
        ],
        "launchConfig": "default",
        "scalePolicy": "default",
        "state": "active",
        "timestamp": null
      }
    ]

List Group Nodes

Description

List all nodes in a group and their status. The different statuses for a node are:

  • pending (stream manager has contacted the cloud service to start an instance)
  • running (instance has been launched, and services are starting up)
  • inservice (node is active and available for streaming)
  • terminating (node is being deactivated)

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/{nodeGroup}/node?accessToken=<accessToken>
  • Method: GET

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • DATA:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 200
  • Data:
    [
     {
        "identifier": "<node-identifier>",
        "role": "<role>",
        "availabilityZone": "<availability-zone-code>",
        "address": "<host>",
        "state": "<node-state>",
        "launchConfig": "<launch-config-name>",
        "capacity": <connection-capacity>
      }
    ]

Example

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-8bcc96ed-b7e5-4044-b797-1bc93d5f0be4/node?accessToken=xyz123
  • Method: GET

RESPONSE

  • Success: HTTP CODE 200
  • Data:
    [
      {
        "identifier": "node-us-central1-a-1452586832022",
        "role": "origin",
        "availabilityZone": "us-central1-a",
        "address": "104.197.131.87",
        "state": "inservice",
        "launchConfig": "default",
        "capacity": 1500
      },
      {
        "identifier": "node-us-central1-a-1452587484090",
        "role": "edge",
        "availabilityZone": "us-central1-a",
        "address": "104.197.138.228",
        "state": "inservice",
        "launchConfig": "default",
        "capacity": 500
      }
      ]

List Group Origins

Description

List all origin nodes in a group.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/{nodeGroup}/node/origin?accessToken=<accessToken>
  • Method: GET

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • DATA:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 200
  • Data:
    [
     {
        "identifier": "<node-identifier>",
        "role": "<role>",
        "availabilityZone": "<availability-zone-code",
        "address": "<host>",
        "state": "<node-state>",
        "launchConfig": "<launch-config-name>",
        "capacity": <connection-capacity>
      }
    ]

Example

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-8bcc96ed-b7e5-4044-b797-1bc93d5f0be4/node/origin?accessToken=xyz123
  • Method: GET

RESPONSE

  • Success: HTTP CODE 200
  • DATA:
    [
      {
        "identifier": "node-us-central1-a-1452586832022",
        "role": "origin",
        "availabilityZone": "us-central1-a",
        "address": "104.197.131.87",
        "state": "inservice",
        "launchConfig": "default",
        "capacity": 1500
      }
    ]

List Group Edges

Description

List all edge nodes in a group.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/{nodeGroup}/node/edge?accessToken=<accessToken>
  • Method: GET

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • Data:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 200
  • Data:
    [
     {
        "identifier": "<node-identifier>",
        "role": "<role>",
        "availabilityZone": "<availability-zone-code",
        "address": "<host>",
        "state": "<node-state>",
        "launchConfig": "<launch-config-name>",
        "capacity": <connection-capacity>
      }
    ]

Example

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-8bcc96ed-b7e5-4044-b797-1bc93d5f0be4/node/edge?accessToken=xyz123
  • Method: GET

RESPONSE

  • Success: HTTP CODE 200
  • Data:
    [
      {
        "identifier": "node-us-central1-a-1452587484090",
        "role": "edge",
        "availabilityZone": "us-central1-a",
        "address": "104.197.138.228",
        "state": "inservice",
        "launchConfig": "default",
        "capacity": 500
      },
      {
        "identifier": "node-us-central1-f-1452587643929",
        "role": "edge",
        "availabilityZone": "us-central1-f",
        "address": "104.197.234.171",
        "state": "inservice",
        "launchConfig": "default",
        "capacity": 500
      }
    ]

Launch New Origin

Description

Launches a new origin for a node group - this will initiate the nodegroup and populate it per the nodegroup's scaling policy. The REST gateway will provide you a response as soon as it knows that the cloud platform has acknowledged the request.

The actual instance boot up may take up to two minutes, depending on the environment.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/{nodeGroup}/node/origin?accessToken=<accessToken>
  • Method: POST

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • Data:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 201
  • Data:
    {
      "id": <auto-gen-id>,
      "identifier": "<node-identifier>",
      "availabilityZone": "<availability-zone-code>",
      "role": "<role>",
      "group": "<group-identifier>",
      "requestTime": <timestamp>
    }

Example

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-51921df1-d68e-4fee-8332-6dbdf7102e47/node/origin?accessToken=xyz123
  • Method: POST

RESPONSE

  • Success: HTTP CODE 201
  • Data:
    {
      "id": 6,
      "identifier": "node-us-central1-a-1452600712264",
      "availabilityZone": "us-central1-a",
      "role": "origin",
      "group": "group-51921df1-d68e-4fee-8332-6dbdf7102e47",
      "requestTime": 1452600723615
    }

Read Group Stats

Description

Displays the load statistics for this node group.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/{nodeGroup}/stats?accessToken=<accessToken>
  • Method: GET

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • DATA:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 200
  • Data:
    {
      "totalConnections": <total-group-connections>,
      "targetTypeLoadSummary": [
        {
          "type": "<role>",
          "totalNodeCount": <total-node-count>,
          "totalActiveNodeCount": <total-active-nodes>,
          "netConnectionCapacity": <total-available-capacity>,
          "netConnectionLoad": <total-connection-load>
        }
      ]
    }

Example

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-8bcc96ed-b7e5-4044-b797-1bc93d5f0be4/stats?accessToken=xyz123
  • Method: GET

RESPONSE

  • Success: HTTP CODE 200
  • Data:
    {
      "totalConnections": 0,
      "targetTypeLoadSummary": [
        {
          "type": "origin",
          "totalNodeCount": 1,
          "totalActiveNodeCount": 1,
          "netConnectionCapacity": 5,
          "netConnectionLoad": 0
        },
        {
          "type": "edge",
          "totalNodeCount": 1,
          "totalActiveNodeCount": 0,
          "netConnectionCapacity": 30,
          "netConnectionLoad": 0
        }
      ]
    }

Read Group Node Relations

Description

Reads cluster relations between nodes of a nodegroup. Cluster relations in a Red5 Pro cluster comprises of nodes acting as parent or child. Parents are usually the point of ingest (origin, relay) and child nodes are the point of egress (edge).

Optionally, you can also track the clustering link state between the parent and child nodes by specifying the query param linkstate. If linkstate is set to true the result includes clustering link state between the nodes otherwise it renders just the parent and child information. The default value for linkstate is false.

CLUSTERING LINK STATES:

Once a cluster relation is created it tracked in Stream Manager as transitioning between several expected states owing to the nature of the sequence of network events. Given below are the states that a clustering link may transition through.

  • prospective:The default state of a parent child association.At this stage Stream Manager marked the parent and child nodes for clustering. The relation is created in the data store, but there is no active connection between the two nodes.
  • connecting:An intermittent state that indicates that Stream Manager has issued a clustering call to the child node with information about the parent.
  • established:Indicates a successful clustering link between the parent and the child nodes.
  • disconnecting:An intermittent state that indicates that Stream Manager has issued a de-clustering call to the child node with information about the parent.
  • disconnected:Indicates that an active clustering link between the parent and the child has been closed.This state can also be intermittent in nature if the one of the nodes involved in the relation is being terminated.
  • error: Represents an erroneous state of the clustering link owing to an improper sequence of clustering events or a internal failure in selecting the next appropriate link state for a relation.

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/{nodeGroup}/node/relations?accessToken=<accessToken>
  • Method: GET

RESPONSE

  • Failure: HTTP CODE 400 or 404
  • DATA:
    {
      "errorMessage": "<error-message-string>",
      "timestamp": <error-timestamp>
    }
  • Success: HTTP CODE 200
  • Data:
    [
    {
        "parent": {
            "address": "<host>",
            "state": "<node-state>",
            "role": "<role>",
            "availabilityZone": "<availability-zone-code>",
            "identifier": "<node-identifier>",
            "launchTime": <node-launch-time>
        },
        "child": {
            "address": "<host>",
            "state": "<node-state>",
            "role": "<role>",
            "availabilityZone": "<availability-zone-code>",
            "identifier": "<node-identifier>",
            "launchTime": <node-launch-time>
        },
        "link": {
            "state": "<clustering-link-state",
            "stateUpdated": <cluster-link-last-update>
        }
    }
    ]

Example : Displaying Node relations

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-9e8eedc4-08d0-4af7-b80c-4460efceb19c/node/relations?accessToken=xyz123
  • Method: GET

RESPONSE

  • Success: HTTP CODE 200
  • Data:
    [
        {
            "parent": {
                "address": "104.197.234.171",
                "state": "inservice",
                "role": "origin",
                "availabilityZone": "india-east-1a",
                "identifier": "node-india-east-1a-1525859616627",
                "launchTime": 1525859621693
            },
            "child": {
                "address": "104.197.138.228",
                "state": "inservice",
                "role": "edge",
                "availabilityZone": "india-east-1a",
                "identifier": "node-india-east-1a-1525859641793",
                "launchTime": 1525859646836
            }
        }
    ]

Example : Displaying node relations with link state

REQUEST

  • URI:

    http://{host}:{port}/streammanager/api/3.1/admin/nodegroup/group-9e8eedc4-08d0-4af7-b80c-4460efceb19c/node/relations?accessToken=xyz123&linkstate=true
  • Method: GET

RESPONSE

  • Success: HTTP CODE 200
  • Data:
    [
        {
            "parent": {
                "address": "104.197.234.171",
                "state": "inservice",
                "role": "origin",
                "availabilityZone": "india-east-1a",
                "identifier": "node-india-east-1a-1525859616627",
                "launchTime": 1525859621693
            },
            "child": {
                "address": "104.197.138.228",
                "state": "inservice",
                "role": "edge",
                "availabilityZone": "india-east-1a",
                "identifier": "node-india-east-1a-1525859641793",
                "launchTime": 1525859646836
            },
            "link": {
                "state": "established",
                "stateUpdated": 1525859664662
            }
        }
    ]