hunk.code_window:   - bower_components/splitargs/src/splitargs.js
     - bower_components/toastr/toastr.min.js
     - bower_components/xterm.js/dist/xterm.js
     - assets/js/legend.js
   css:
     regular:
  
hunk.labels: keep keep add keep keep keep
hunk.after_edit:   - bower_components/xterm.js/dist/addons/fit/fit.js
  
hunk.file_path: vendor.yml
hunk.type: add
file: package proxy
  
  import "github.com/portainer/portainer"
  
  // decorateVolumeList loops through all volumes and will decorate any volume with an existing resource control.
  // Volume object schema reference: https://docs.docker.com/engine/api/v1.28/#operation/VolumeList
  func decorateVolumeList(volumeData []interface{}, resourceControls []portainer.ResourceControl) ([]interface{}, error) {
  	decoratedVolumeData := make([]interface{}, 0)
  
  	for _, volume := range volumeData {
  
  		volumeObject := volume.(map[string]interface{})
  		if volumeObject[volumeIdentifier] == nil {
  			return nil, ErrDockerVolumeIdentifierNotFound
  		}
  
  		volumeID := volumeObject[volumeIdentifier].(string)
  		resourceControl := getResourceControlByResourceID(volumeID, resourceControls)
  		if resourceControl != nil {
  			volumeObject = decorateObject(volumeObject, resourceControl)
  		}
  		decoratedVolumeData = append(decoratedVolumeData, volumeObject)
  	}
  
  	return decoratedVolumeData, nil
  }
  
  // decorateContainerList loops through all containers and will decorate any container with an existing resource control.
  // Check is based on the container ID and optional Swarm service ID.
  // Container object schema reference: https://docs.docker.com/engine/api/v1.28/#operation/ContainerList
  func decorateContainerList(containerData []interface{}, resourceControls []portainer.ResourceControl) ([]interface{}, error) {
  	decoratedContainerData := make([]interface{}, 0)
  
  	for _, container := range containerData {
  
  		containerObject := container.(map[string]interface{})
  		if containerObject[containerIdentifier] == nil {
  			return nil, ErrDockerContainerIdentifierNotFound
  		}
  
  		containerID := containerObject[containerIdentifier].(string)
  		resourceControl := getResourceControlByResourceID(containerID, resourceControls)
  		if resourceControl != nil {
  			containerObject = decorateObject(containerObject, resourceControl)
  		}
  
  		containerLabels := extractContainerLabelsFromContainerListObject(containerObject)
  		if containerLabels != nil && containerLabels[containerLabelForServiceIdentifier] != nil {
  			serviceID := containerLabels[containerLabelForServiceIdentifier].(string)
  			resourceControl := getResourceControlByResourceID(serviceID, resourceControls)
  			if resourceControl != nil {
  				containerObject = decorateObject(containerObject, resourceControl)
  			}
  		}
  
  		decoratedContainerData = append(decoratedContainerData, containerObject)
  	}
  
  	return decoratedContainerData, nil
  }
  
  // decorateServiceList loops through all services and will decorate any service with an existing resource control.
  // Service object schema reference: https://docs.docker.com/engine/api/v1.28/#operation/ServiceList
  func decorateServiceList(serviceData []interface{}, resourceControls []portainer.ResourceControl) ([]interface{}, error) {
  	decoratedServiceData := make([]interface{}, 0)
  
  	for _, service := range serviceData {
  
  		serviceObject := service.(map[string]interface{})
  		if serviceObject[serviceIdentifier] == nil {
  			return nil, ErrDockerServiceIdentifierNotFound
  		}
  
  		serviceID := serviceObject[serviceIdentifier].(string)
  		resourceControl := getResourceControlByResourceID(serviceID, resourceControls)
  		if resourceControl != nil {
  			serviceObject = decorateObject(serviceObject, resourceControl)
  		}
  		decoratedServiceData = append(decoratedServiceData, serviceObject)
  	}
  
  	return decoratedServiceData, nil
  }
  
  func decorateObject(object map[string]interface{}, resourceControl *portainer.ResourceControl) map[string]interface{} {
  	metadata := make(map[string]interface{})
  	metadata["ResourceControl"] = resourceControl
  	object["Portainer"] = metadata
  	return object
  }
  