Skip to main content

Workgroup API (JSON)

The workgroup web service provides a programmatic way to perform all of the same transactions that can be done in Workgroup Manager.

This includes:

  • Search for a workgroup by name
  • Search for workgroups by an identifier (Certificate, Person or Workgroup Name)
  • Getting the details of a workgroup
  • Creating and deleting a new workgroup from an existing stem
  • Updating workgroup attributes
  • Getting the privgroup of a workgroup
  • Getting the workgroup integrations linkage of a workgroup
  • Adding and deleting members
  • Adding and deleting administrators
  • Adding and delete workgroup integration linkage

How to get started with the Workgroup API

Follow the Middleware and Integration Services Integration (MaIS) checklist for RESTful Web Services. If you need help, are not sure whether the Web APIs are the best method for integrating with the registry, or just have some questions, contact the MaIS team.

HTTP Status codes

CODECONDITIONS
200 OKThe usual successful return code.
201 OKThe usual successful return code for a create (POST).
400 Bad RequestMissing required parameters or identifier is in wrong format.
401 Authorization RequiredThe request was made without certificate.
403 Access DeniedThe request was made without valid certificate.
404 Not FoundThe record you're looking for doesn't exist.
500 Internal Server ErrorSomething broke with our code. Please tell us about it.

Error handling

Workgroup API sends error status via standard HTTP status codes (4xx) and always returns an Json document detailing the error. For example, when a client makes a call to update a workgroup filter with no supported filter value, the system will return the following Json error document:

PUT https://workgroupsvc.stanford.edu/workgroups/2.0/mais:new?filter=standard 

Status: 400
Content-Type: application/json

{
  "notification": "Unsupported FILTER value of STANDARD. Supported values are ACADEMIC_ADMINISTRATIVE, FACULTY, STAFF, STUDENT, FACULTY_STAFF, FACULTY_STUDENT, STAFF_STUDENT, FACULTY_STAFF_STUDENT, NONE",
  "code": 400,
  "message": "Bad Request",
  "status": 400
}

Search workgroup by name

DescriptionRetrieve a list of active workgroups based on {SEARCH STRING}. Search String length must be at least 4 characters before using wildcards. If no wildcards are used then it will search for an exact match of the {SEARCH STRING}. You cannot start with a wildcard. If timeout happens then increase the search string characters before the wildcard. 
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/search/{SEARCH STRING}
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/search/{SEARCH STRING}
MethodGET
Returns200 OK 
401 Unauthorized 

GET https://workgroupsvc.stanford.edu/workgroups/2.0/search/mais*
Status: 200
Content-Type: application/json
{
  "search" : "mais:*",
  "results": [
    {
      "name": "mais:staff",
      "description": "Staff of AS/Middleware and Integration Services",
      "integrations": [{ "GOOGLE": "mais-staff" },
                       { "MAILING_LIST": "mais-all-staff" } ],
      "lastUpdate": "22-JUL-2019", 
      "lastUpdateBy": "workgroup_maint",
      "memberCount": "8"
    }, {
      "name": "workgroup:mais",
      "description": "Staff of AS/Middleware and Integration Services",
      "integrations": [" {"PTS": "workgroup:mais" } ],
      "lastUpdate": "22-JUL-2019",
      "lastUpdateBy": "workgroup_maint",
      "memberCount": "8"
    }, ...
  ]
}

Search for workgroups by an identifier (Certificate, Person or Workgroup Name)

DescriptionRetrieve a list of active workgroups where the identifier of that type (Certificate, Person or Workgroup) is a member or administrator including where the identifier is nested.
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/
or
https://workgroupsvc.stanford.edu/workgroups/2.0?type={CERTIFICATE | USER | WORKGROUP}&id={input value}
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/
or
https://workgroupsvc-uat.stanford.edu/workgroups/2.0?type={CERTIFICATE | USER | WORKGROUP}&id={input value}
MethodGET
Parameter Fieldstype:    CERTIFICATE | USER | WORKGROUP
id:    Identifier value
Returns201 Created
400 Bad Request
401 Unauthorized
409 Conflict

GET https://workgroupsvc.stanford.edu/workgroups/2.0

{
  "type" : "WORKGROUP",
  "id": "mais:staff"
}

Status: 200
Content-Type: application/json
{
  "type": "WORKGROUP",
  "id": "mais:staff",
  "members": [
    {
      "name": "asview:mais-admin-prd",
      "description": "Workgroup for SUNAC access to MAIS PRD env",
      "integrations": [{ "MAILING_LIST": "mais-all-staff" }],
      "lastUpdate": "22-JUL-2019", 
      "lastUpdateBy": "workgroup_maint",
      "memberCount": "5"
    }, {
      "name": "deviceregistry:mydevices-search",
      "description": "My Devices Search tab access",
      "integrations": [],
      "lastUpdate": "22-JUL-2019",
      "lastUpdate_by": "workgroup_maint",
      "memberCount": "193"
    }
  ],
  "administrators": [
    {
      "name": "deviceregistry:mydevices-search",
      "description": "My Devices Search tab access",
      "integrations": [],
      "lastUpdate": "22-JUL-2019", 
      "lastUpdateBy": "workgroup_maint",
      "memberCount": "193"
    }
  ]
}

Get workgroup

DescriptionRetrieve information on an active workgroup including integration, members and administrators
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}
MethodGET
Returns200 OK & workgroup JSON
404 Not Found

If authenticated user is an administrator of the workgroup, return Json document include public (description, filter, visibility, privgroup, and reusable) and private (members and administrators) information. If authenticated user is not an administrator of the workgroup, return JSON document includes only public information of the workgroup. Please note that "authenticated user" may refer to a certificate name, in which case the certificate needs to be configured as a workgroup administrator.

GET https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff
Status: 200
Content-Type: application/json
{
  "name": "mais:staff",
  "description": "Staff of AS/Middleware and Integration Services",
  "filter": "NONE",
  "visibility": "STANFORD",
  "reusable": "TRUE",
  "privgroup": "TRUE",
  "integrations": [{ "GOOGLE": "mais-staff" },
                   { "MAILING_LIST": "mais-all-staff" }],
  "lastUpdate": "22-JUL-2019",
  "lastUpdateBy": "workgroup_maint",
  "members": [
    {
      "type": "PERSON",
      "id": "chowhan",
      "name": "Chowhan, Sangeetha"
    }, {
      "type": "PERSON",
      "id": "hlclark",
      "name": "Clark, Helen"
    }, {
      "type": "WORKGROUP",
      "id": "workgroup:mais",
      "name": "workgroup:mais"
    }, {
      "type": "CERTIFICATE",
      "id": "www.stanford.edu",
      "name": "www.stanford.edu"
    } ],
  "administrators" : [
    {
      "type": "PERSON",
      "id": "smarella",
      "name": "Marella, Sameer"
    }, {
      "type": "WORKGROUP",
      "id": "workgroup:mais-owners",
      "name": "workgroup:mais-owners"
    } ]
}

Create workgroup

DescriptionCreate a new workgroup, where the name is limited to 60 characters or less and items parameters in RED are the default values
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}?description={description}&filter={filter}&visibility={visibility}&privgroup={privgroup}
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}
or
https://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}?description={description}&filter={filter}&visibility={visibility}&privgroup={privgroup}
MethodPOST
Parameter Fieldsdescription*:    If the workgroup description contains more than 255 characters, only the first 255 characters are used. *Cannot be empty or blank.
filter:    ACADEMIC_ADMINISTRATIVE | STUDENT | FACULTY | STAFF | FACULTY_STAFF | FACULTY_STUDENT | STAFF_STUDENT | FACULTY_STAFF_STUDENT | NONE
reusable:    TRUE | FALSE
visibility:    PRIVATE | STANFORD
privgroup:    TRUE | FALSE
Returns201 Created and workgroup JSON
400 Bad Request
401 Unauthorized
409 Conflict

Please note that authenticated user has to be an administrator of the workgroup, return JSON document include public (description, filter, visibility, privgroup and reusable) and private (members and administrators) information. If authenticated user is not an administrator of the workgroup, return Json document includes only public information of the workgroup. Please note that "authenticated user" may refer to a certificate name, in which case the certificate needs to be configured as a workgroup administrator.

POST https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff

{
  "description" : "Staff of AS/Middleware and Integration Services",
  "reusable" : "TRUE",
  "privgroup" : "FALSE",
}


Status: 201
Content-Type: application/json
{
  "name": "mais:staff",
  "description": "Staff of AS/Middleware and Integration Services",
  "filter": "NONE",
  "visibility": "STANFORD",
  "reusable": "TRUE",
  "privgroup": "FALSE",
  "integrations": [],
  "lastUpdate": "22-JUL-2019",
  "lastUpdateBy": "workgroup_maint",
  "members": [],
  "administrators" : [
    {
      "type" : "PERSON",
      "id" : "etlouie",
      "name" : "Louie, Edward",
    } ]
}

Update workgroup

DescriptionUpdate information of a workgroup. The returning JSON will be the return the same information as if the user called the Get Workgroup By Name API call. You only need to specify the fields you wish to update. If no fields are passed then nothing is updated.
Adding and Removing Members or Administrators or Linking and Unlinking Integration Points are not available in this API, there are separate API end points to perform those functionalities.
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}?description={description}&filter={filter}&visibility={visibility}&privgroup={privgroup}
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}
or
https://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}?description={description}&filter={filter}&visibility={visibility}&privgroup={privgroup}
MethodPUT
Paramater Fieldsdescription*:    If the workgroup description contains more than 255 characters, only the first 255 characters are used. *Cannot be empty or blank.
filter:    ACADEMIC_ADMINISTRATIVE | STUDENT | FACULTY | STAFF | FACULTY_STAFF | FACULTY_STUDENT | STAFF_STUDENT | FACULTY_STAFF_STUDENT | NONE
reusable:    TRUE | FALSE
visibility:    PRIVATE | STANFORD
privgroup:    TRUE | FALSE
Returns200 OK and Workgroup JSON
400 Bad Request
401 Unauthorized
409 Conflict

Please note that authenticated user has to be an administrator of the workgroup, return Json document include public (description, filter, visibility, privgroup and reusable) and private (members and administrators) information. If authenticated user is not an administrator of the workgroup, return Json document includes only public information of the workgroup. Please note that "authenticated user" may refer to a certificate name, in which case the certificate needs to be configured as a workgroup administrator.

PUT https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff 

{
  "description" : "Staff of AS/Middleware and Integration Services",
  "reusable" : "TRUE",
  "privgroup" : "FALSE",
}


Status: 201
Content-Type: application/json
{
  "name": "mais:staff",
  "description": "Staff of AS/Middleware and Integration Services",
  "filter": "NONE",
  "visibility": "STANFORD",
  "reusable": "TRUE",
  "privgroup": "FALSE",
  "integrations": [],
  "lastUpdate": "22-JUL-2019",
  "lastUpdateBy": "workgroup_maint",
  "members": [],
  "administrators" : [
    {
      "type" : "PERSON",
      "id" : "etlouie",
      "name" : "Louie, Edward",
    } ]
}

Delete workgroup

DescriptionThese active workgroups are marked inactive and are retained in the system for future reference, however all members and administrators will be removed. If you try to inactivate an inactive workgroup, you'll get a 404 Not Found error.
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}
MethodDELETE
Returns200 OK and JSON
400 Bad Request
401 Unauthorized
404 Not Found

Only workgroup administrators are allowed to operate on a workgroup. Please note that the certificate used to authenticate with the API needs to be configured as a workgroup administrator.

DELETE https://workgroupsvc.stanford.edu/workgroups/2.0/mais:wgapi 

Status: 200
Content-Type: application/json
{
  "status": "200",
  "code": "200",
  "message": "Deleted",
  "notification": "Workgroup: mais:wgapi has been deleted and all members and administrators removed"
}

Get privilege group for a workgroup

DescriptionGet Privilege Group Members from a Workgroup. By default, if no Query Parameter or JSON body is used, the API will return both MEMBERS and ADMINISTRATORS within its own key. If the workgroup is private and your certificate is not an administrator, you will receive a 200 response, but with empty lists and the message: "This is a private workgroup!".
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/privgroup
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/privgroup?role={ MEMBERS | ADMINISTRATORS}
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/privgroup
or
https://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/privgroup?role={ MEMBERS | ADMINISTRATORS}
MethodGET
Parameter Fieldsrole:    MEMBERS | ADMINISTRATORS
Returns200 OK and workgroup Json
400 Bad Request
401 Unauthorized
404 Not Found

GET https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff/privgroup 

{
  "role": "MEMBER"

Status: 200
Content-Type: application/json
{
  "name": "mais:staff",
  "members": [
    {
      "name": "Louie, Edward ",
      "id": "etlouie",
      "lastUpdate": "22-JUL-2019"
    }, {
      "name": "Chowhan, Sangeetha",
      "id": "chowhan",
      "lastUpdate": "22-JUL-2019"
    }
  ],
  "administrators": [
    {
      "name": "Chowhan, Sangeetha",
      "id": "chowhan",
      "lastUpdate": "22-JUL-2019"
    }
  ]
}

Add member to workgroup

DescriptionAdd an existing SUNet ID or workgroup to a workgroup as a member
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/members/{sunetid | workgroup-name}
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/members/{sunetid | workgroup-name}?type={ USER | WORKGROUP }
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/members/{sunetid | workgroup-name}
or
https://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/members/{sunetid | workgroup-name}?type={ USER | WORKGROUP }
MethodPUT
Paramter Fieldstype:    USER | WORKGROUP
Returns200 OK and JSON Message
400 Bad Request
401 Unauthorized
404 Not Found

Only workgroup administrators are allowed to operate on a workgroup. Please note that the certificate used to authenticate with the API needs to be configured as a workgroup administrator.

PUT https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff/members/etlouie 

{
  "type": "USER"
}

Status: 200
Content-Type: application/json
{
  "status": "200",
  "code": "200",
  "message": "Added",
  "notification": "etlouie was added as a member to the workgroup: mais:staff"
}

Remove member from workgroup

DescriptionRemove a member of type person or workgroup from a workgroup
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/members/{sunetid | workgroup-name}
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/members/{sunetid | workgroup-name}?type={ USER | WORKGROUP }
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/members/{sunetid | workgroup-name}
or
https://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/members/{sunetid | workgroup-name}?type={ USER | WORKGROUP }
MethodDELETE
Parameter Fieldstype:    USER | WORKGROUP
Returns200 OK and JSON Message
400 Bad Request
401 Unauthorized
404 Not Found

Only workgroup administrators are allowed to operate on a workgroup. Please note that the certificate used to authenticate with the API needs to be configured as a workgroup administrator.

Note: Deleted workgroups and memberships are marked inactive and retained in the system for future reference.

DELETE  https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff/members/etlouie 

{
  "type": "USER"
}

Status: 200
Content-Type: application/json
{
  "status": "200",
  "code": "200",
  "message": "Removed",
  "notification": "etlouie was removed as a member to the workgroup: mais:staff"
}

Add administrator to workgroup

DescriptionAdd an existing SUNet ID, workgroup or certificate to a workgroup as an administrator.
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/administrators/{sunetid | workgroup-name | certificate-name}
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/administrators/{sunetid | workgroup-name | certificate-name}?type={ USER | WORKGROUP | CERTIFICATE }
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/administrators/{sunetid | workgroup-name | certificate-name}
or
https://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/administrators/{sunetid | workgroup-name | certificate-name}?type={ USER | WORKGROUP | CERTIFICATE }
MethodPUT
Parameter Fieldstype:    CERTIFICATE | USER | WORKGROUP
Returns200 OK and JSON Message
400 Bad Request
401 Unauthorized
404 Not Found

Only workgroup administrators are allowed to operate on a workgroup. Please note that the certificate used to authenticate with the API needs to be configured as a workgroup administrator.

PUT https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff/administrators/etlouie 

{
  "type": "USER"
}

Status: 200
Content-Type: application/json
{
  "status": "200",
  "code": "200",
  "message": "Added",
  "notification": "etlouie was added as an administrator to the workgroup: mais:staff"
}

Remove administrator from workgroup

DescriptionRemove an administrator of type person, workgroup or certificate from a workgroup.
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/administrators/{sunetid | workgroup-name | certificate-name}
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/administrators/{sunetid | workgroup-name | certificate-name}?type={ USER | WORKGROUP | CERTIFICATE }
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/administrators/{sunetid | workgroup-name | certificate-name}
or
https://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/administrators/{sunetid | workgroup-name | certificate-name}?type={ USER | WORKGROUP | CERTIFICATE }
MethodDELETE
Parameter Fieldstype:    USER | WORKGROUP
Returns200 OK and JSON Message
400 Bad Request
401 Unauthorized
404 Not Found

Only workgroup administrators are allowed to operate on a workgroup. Please note that the certificate used to authenticate with the API needs to be configured as a workgroup administrator.

Note: Deleted workgroups and memberships are marked inactive and retained in the system for future reference.

DELETE  https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff/administrators/etlouie 

{
  "type": "USER"
}

Status: 200
Content-Type: application/json
{
  "status": "200",
  "code": "200",
  "message": "Removed",
  "notification": "etlouie was removed as an administrator to the workgroup: mais:staff"
}

Get integration of a workgroup

DescriptionShow only the integration link of a workgroup
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/links
UAT URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/links
MethodGET
Returns200 OK and JSON Message
401 Unauthorized
404 Not Found

Only workgroup administrators are allowed to operate on a workgroup. Please note that the certificate used to authenticate with the API needs to be configured as a workgroup administrator.

GET https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff/links 

Status: 200
Content-Type: application/json
{
  "name" : "mais:staff",
  "integrations": [{ "OFFICE365": "mais-staff" },
                   { "MAILING_LIST": "mais-all-staff" }]
}

Add link integration to a workgroup

DescriptionAdd an integration link to a Workgroup. Using parameter Link require a secondary parameter Value for Mailing List and PTS. All the other values are defaulted to the workgroup name which cannot be changed. Google currently has a 60 character limit so if you cannot create a link then the reason is that the workgroup could be greater than the allowed integration character length. The resulting JSON will return back the name of the workgroup and the current Integration Links of that workgroup.
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/links
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/links?link={ GOOGLE | MAILING_LIST | OFFICE365 | PTS | WIN_DIRECTORY }&value={input value}
UAT URLhttps://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/links
or
https://workgroupsvc-uat.stanford.edu/workgroups/2.0/{workgroup-name}/links?link={ GOOGLE | MAILING_LIST | OFFICE365 | PTS | WIN_DIRECTORY }&value={input value}
MethodPUT
Parameter Fieldslink:    GOOGLE | MAILING_LIST | OFFICE365 | PTS | WIN_DIRECTORY
Returns200 OK and JSON Message
400 Bad Request
401 Unauthorized
404 Not Found

Only workgroup administrators are allowed to operate on a workgroup. Please note that the certificate used to authenticate with the API needs to be configured as a workgroup administrator.

PUT https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff/links 

{
  "link": "MAILING_LIST",
  "value": "mymailinglist"
}

Status: 200
Content-Type: application/json
{
  "name" : "mais:staff",
  "integrations": [{ "OFFICE365": "mais-staff" },
                   { "MAILING_LIST": "mais-all-staff" }]
}

Remove link integration from a workgroup

DescriptionRemove an integration link from a Workgroup. The resulting JSON will return back the name of the workgroup and the current Integration Links of that workgroup, if any.
URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/links
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/links?link={ BOX | GOOGLE | MAILING_LIST | OFFICE365 | PTS | WIN_DIRECTORY }
UAT URLhttps://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/links
or
https://workgroupsvc.stanford.edu/workgroups/2.0/{workgroup-name}/links?link={ BOX | GOOGLE | MAILING_LIST | OFFICE365 | PTS | WIN_DIRECTORY }
MethodDELETE
Parameter Fieldslink:    GOOGLE | MAILING_LIST | OFFICE365 | PTS | WIN_DIRECTORY
Returns200 OK and JSON Message
400 Bad Request
401 Unauthorized
404 Not Found

Only workgroup administrators are allowed to operate on a workgroup. Please note that the certificate used to authenticate with the API needs to be configured as a workgroup administrator.

DELETE https://workgroupsvc.stanford.edu/workgroups/2.0/mais:staff/links

{
  "link": "MAILING_LIST",
}

Status: 200
Content-Type: application/json
{
  "name" : "mais:staff",
  "integrations": [{ "OFFICE365": "mais-staff" } ]
}

Last modified