TypeDefinitionFixedArrayImpl (Media Authoring with Java API)
Date: 2016-02-05

tv.amwa.maj.meta.impl

## Class TypeDefinitionFixedArrayImpl

- java.lang.Object
- - tv.amwa.maj.meta.impl.MetaDefinitionImpl
  - - tv.amwa.maj.meta.impl.TypeDefinitionImpl
    - - tv.amwa.maj.meta.impl.SingletonTypeDefinitionImpl
      - - tv.amwa.maj.meta.impl.TypeDefinitionFixedArrayImpl

- All Implemented Interfaces:
    Serializable, Cloneable, CommonConstants, MetadataObject, WeakReferenceTarget, MetaDefinition, TypeDefinition, TypeDefinitionFixedArray, DefinitionType

      @MediaClass(uuid1=218169601,
                  uuid2=520,
                  uuid3=0,
                  uuid4={6,14,43,52,2,6,1,1},
                  definedName="TypeDefinitionFixedArray",
                  description="The TypeDefinitionFixedArray class defines a property type that has a fixed number of values of the underlying type. The order of the values is meaningful.",
                  symbol="TypeDefinitionFixedArray")
      public final class TypeDefinitionFixedArrayImpl
      extends SingletonTypeDefinitionImpl
      implements TypeDefinitionFixedArray, Serializable, Cloneable

  Implements the definition of a property type that has a fixed number of values of the underlying type. The order of the values is meaningful.

  See Also:
    Serialized Form

- - ### Nested Class Summary

    Nested Classes
    Modifier and Type | Class and Description
    --- | ---
    `static class` | `TypeDefinitionFixedArrayImpl.FixedArrayValue`

    - ### Nested classes/interfaces inherited from class tv.amwa.maj.meta.impl.SingletonTypeDefinitionImpl

      `SingletonTypeDefinitionImpl.SingletonMethodBag`

    - ### Nested classes/interfaces inherited from class tv.amwa.maj.meta.impl.TypeDefinitionImpl

      `TypeDefinitionImpl.PropertyValueImpl`

  - ### Field Summary

    - ### Fields inherited from interface tv.amwa.maj.constant.CommonConstants

      `AAF_METADICT_NAMESPACE, AAF_METADICT_PREFIX, AAF_XML_NAMESPACE, AAF_XML_PREFIX, ApplicationPluginObjectID, ApplicationPluginsID, MAX_NUM_RGBA_COMPS, MemberOfID, ObjectClassID, ParentClassID, PropertiesID, XMLClassIDAsAttributeName`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `TypeDefinitionFixedArrayImpl(AUID identification, String typeName, TypeDefinition elementType, int numberElements)` Creates and initializes a new fixed array type definition, which defines a property type that has a fixed number of values of the underlying type.

  - ### Method Summary

    All Methods Static Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `appendMetadictXML(Node metadict, String namespace, String prefix)` Append an XML representation of this meta definition to the given XML node.
    `TypeDefinitionFixedArray` | `clone()` Create a cloned copy of this meta definition.
    `PropertyValue` | `createFromBytes(ByteBuffer buffer)` Create a value of this type by reading the bytes in the given byte buffer.
    `PropertyValue` | `createValue(Object javaValue)` Create a property value from the given Java object.
    `PropertyValue` | `createValueFromArray(Object[] initData)` Creates and returns a new fixed array property value from the given Java array.
    `PropertyValue` | `createValueFromValues(PropertyValue[] elementValues)` Creates and returns a fixed array property value from the given array of property values.
    `Object[]` | `getArray(PropertyValue arrayProperty)` Returns a Java array created from the elements of the given fixed array property value.
    `int` | `getCount()` Returns the number of elements of an array defined by this fixed array type definition.
    `List<PropertyValue>` | `getElements(PropertyValue arrayProperty)` Returns a list over all the property values of the given fixed array property value.
    `PropertyValue` | `getElementValue(PropertyValue arrayProperty, int index)` Returns the member property value at the given index through the given fixed array property value.
    `TypeDefinition` | `getType()` Returns the underlying type of that defines the type of each element of the array defined by this fixed array type definition.
    `TypeCategory` | `getTypeCategory()` Returns the type category to which this type definition belongs, which corresponds to its sub interface.
    `static int` | `initializeElementCount()`
    `static TypeDefinition` | `initializeFixedArrayElementType()`
    `long` | `lengthAsBytes(PropertyValue value)` Returns the number of bytes that the given value of this type is serialized as a sequence of bytes.
    `String` | `nameToAAFName(String name)`
    `void` | `setArray(PropertyValue arrayProperty, Object[] data)` Sets the value of the given fixed array property value using the given Java array, setting the elements of the fixed array to be values given by the elements of the Java array.
    `void` | `setElementCount(int elementCount)` Set the element count of this fixed array type definition.
    `void` | `setElementType(TypeDefinition elementType)` Sets the element type for all elements of the array defined by this fixed array type definition.
    `void` | `setElementValue(PropertyValue arrayProperty, int index, PropertyValue memberProperty)` Sets the value of a member of the given fixed array property value at the given index using the given value.
    `List<PropertyValue>` | `writeAsBytes(PropertyValue value, ByteBuffer buffer)` Write the given property value of this type to the given byte stream.

    - ### Methods inherited from class tv.amwa.maj.meta.impl.SingletonTypeDefinitionImpl

      `setPropertyValue`

    - ### Methods inherited from class tv.amwa.maj.meta.impl.TypeDefinitionImpl

      `getNamespace, getPrefix, getPropertyValue, initalizeTypeNameMap, resolveReferences, writeAsStructuredStorageBytes`

    - ### Methods inherited from class tv.amwa.maj.meta.impl.MetaDefinitionImpl

      `aafNameToName, appendXMLChildren, deepEquals, equals, getAAFNamesInUse, getAliases, getAUID, getComment, getDescription, getIdentification, getName, getSymbol, getWeakTargetReference, hashCode, initializeMetaDefinitionIdentification, initializeMetaDefinitionName, setAAFNamesInUse, setAliases, setDescription, setIdentification, setName, setNamespace, setPrefix, setSymbol, toString`

    - ### Methods inherited from class java.lang.Object

      `getClass, notify, notifyAll, wait, wait, wait`

    - ### Methods inherited from interface tv.amwa.maj.meta.TypeDefinition

      `getPropertyValue, resolveReferences, setPropertyValue, writeAsStructuredStorageBytes`

    - ### Methods inherited from interface tv.amwa.maj.meta.MetaDefinition

      `deepEquals, equals, getAAFNamesInUse, getAliases, getAUID, getDescription, getName, getNamespace, getPrefix, getSymbol, hashCode, setAAFNamesInUse, setDescription, setName, setNamespace, setPrefix, setSymbol, toString`

    - ### Methods inherited from interface tv.amwa.maj.industry.WeakReferenceTarget

      `getWeakTargetReference`

- - ### Constructor Detail

    - #### TypeDefinitionFixedArrayImpl

          public TypeDefinitionFixedArrayImpl(AUID identification,
                                              @AAFString
                                              String typeName,
                                              TypeDefinition elementType,
                                              @UInt32
                                              int numberElements)
                                       throws NullPointerException,
                                              IllegalArgumentException

      Creates and initializes a new fixed array type definition, which defines a property type that has a fixed number of values of the underlying type. The order of the values is meaningful.

      The following types are allowed as the underlying type for fixed array type definitions:

      - `TypeDefinitionInteger`
      - `TypeDefinitionRecord`
      - `TypeDefinitionEnumeration`
      - `TypeDefinitionExtendibleEnumeration`
      - `TypeDefinitionFixedArray`

      If the element type is not one of the above kinds, an `IllegalArgumentException` is thrown.

      Creating new and unregistered type definitions is not recommended as this may cause interoperability issues with other systems. The official registry of type definitions is available from SMPTE at SMPTE Metadata Registries And Related Items. The full range of data types documented in the AAF 1.1 object specification can be accessed by name and identification using either `Warehouse.lookForType(String)` or `Warehouse.lookForType(tv.amwa.maj.record.AUID)` respectively.

      Parameters:
        `identification` - AUID to be used to identify this type.
        `elementType` - Type of each element to be contained in an array defined by the fixed array type definition.
        `numberElements` - Number of elements of this kind of array.
        `typeName` - Friendly name of the fixed array type definition.
      Throws:
        `NullPointerException` - One or more of the arguments is null.
        `IllegalArgumentException` - The given underlying type is not compatible with the types supported by fixed size arrays.

  - ### Method Detail

    - #### createValueFromValues

          public PropertyValue createValueFromValues(PropertyValue[] elementValues)
                                              throws NullPointerException,
                                                     BadParameterException,
                                                     BadTypeException

      Description copied from interface: `TypeDefinitionFixedArray`

      Creates and returns a fixed array property value from the given array of property values.

      Specified by:
        `createValueFromValues` in interface `TypeDefinitionFixedArray`
      Parameters:
        `elementValues` - Property value array to use to initialize the new fixed array property value.
      Returns:
        Newly created fixed array property value with values copied from the given property value array.
      Throws:
        `NullPointerException` - The given array of element values is `null` or one or more of its elements is `null`.
        `BadParameterException` - The given array of property values is of a different size to that required by the fixed array type definition, as returned by `TypeDefinitionFixedArray.getCount()`.
        `BadTypeException` - One or more of the elements of the given property value array cannot be converted to values of the underlying type of the fixed type array definition, as returned by `TypeDefinitionFixedArray.getType()`.

    - #### getCount

          @MediaProperty(uuid1=50397699,
                         uuid2=768,
                         uuid3=0,
                         uuid4={6,14,43,52,1,1,1,2},
                         definedName="ElementCount",
                         typeName="UInt32",
                         optional=false,
                         uniqueIdentifier=false,
                         pid=24,
                         symbol="ElementCount")
          public int getCount()

      Description copied from interface: `TypeDefinitionFixedArray`

      Returns the number of elements of an array defined by this fixed array type definition.

      Specified by:
        `getCount` in interface `TypeDefinitionFixedArray`
      Returns:
        Number of elements of an array defined by this fixed array type definition.

    - #### setElementCount

          @MediaPropertySetter(value="ElementCount")
          public void setElementCount(int elementCount)
                                                                          throws IllegalArgumentException

      Set the element count of this fixed array type definition.

      Parameters:
        `elementCount` - Element count of this fixed array type definition.
      Throws:
        `IllegalArgumentException` - Cannot set the element count of a fixed array type definition to a negative value.

    - #### initializeElementCount

          public static final int initializeElementCount()

    - #### getElementValue

          public PropertyValue getElementValue(PropertyValue arrayProperty,
                                               int index)
                                        throws NullPointerException,
                                               IndexOutOfBoundsException,
                                               IllegalPropertyValueException

      Description copied from interface: `TypeDefinitionFixedArray`

      Returns the member property value at the given index through the given fixed array property value.

      Specified by:
        `getElementValue` in interface `TypeDefinitionFixedArray`
      Parameters:
        `arrayProperty` - Fixed array property value to retrieve a a member property value from.
        `index` - 0-based index into the given fixed array property value to use to locate the required member property value.
      Returns:
        Member property value at the given index in the given fixed array property value.
      Throws:
        `NullPointerException` - The given fixed array property value is `null`.
        `IndexOutOfBoundsException` - The given index is outside the acceptable range for an array defined by this fixed array type definition.
        `IllegalPropertyValueException` - The fixed array property value is not defined by this fixed array type definition.

    - #### getElements

          public List<PropertyValue> getElements(PropertyValue arrayProperty)
                                          throws NullPointerException,
                                                 IllegalPropertyValueException

      Description copied from interface: `TypeDefinitionFixedArray`

      Returns a list over all the property values of the given fixed array property value.

      Specified by:
        `getElements` in interface `TypeDefinitionFixedArray`
      Parameters:
        `arrayProperty` - Fixed array property value to create a list from.
      Returns:
        List of the member elements of the given fixed array property value.
      Throws:
        `NullPointerException` - The given fixed array property value is `null`.
        `IllegalPropertyValueException` - The given property value is not defined by this fixed array type definition.
      See Also:
        `TypeDefinitionFixedArray.getArray(PropertyValue)`, `TypeDefinitionFixedArray.getElementValue(PropertyValue, int)`

    - #### getArray

          public Object[] getArray(PropertyValue arrayProperty)
                            throws NullPointerException,
                                   IllegalPropertyValueException

      Description copied from interface: `TypeDefinitionFixedArray`

      Returns a Java array created from the elements of the given fixed array property value. The array is created with a call to `PropertyValue.getValue()` on each of the members of the given array.

      Specified by:
        `getArray` in interface `TypeDefinitionFixedArray`
      Parameters:
        `arrayProperty` - Fixed array property value to create a fixed array property value from.
      Returns:
        Java array containing elements with values matching the values of the elements of the given fixed array property value.
      Throws:
        `NullPointerException` - Argument is null.
        `IllegalPropertyValueException` - The fixed array property value is not defined by the fixed array type definition.
      See Also:
        `TypeDefinitionFixedArray.createValueFromArray(Object[])`, `TypeDefinitionFixedArray.getElements(PropertyValue)`

    - #### getType

          @MediaProperty(uuid1=100729095,
                         uuid2=3072,
                         uuid3=0,
                         uuid4={6,14,43,52,1,1,1,2},
                         definedName="FixedArrayElementType",
                         aliases="ElementType",
                         typeName="TypeDefinitionWeakReference",
                         optional=false,
                         uniqueIdentifier=false,
                         pid=23,
                         symbol="FixedArrayElementType")
          public TypeDefinition getType()

      Description copied from interface: `TypeDefinitionFixedArray`

      Returns the underlying type of that defines the type of each element of the array defined by this fixed array type definition.

      Specified by:
        `getType` in interface `TypeDefinitionFixedArray`
      Returns:
        Element type property of this fixed array type definition.

    - #### setElementType

          @MediaPropertySetter(value="FixedArrayElementType")
          public void setElementType(TypeDefinition elementType)
                                                                                  throws NullPointerException,
                                                                                         IllegalArgumentException

      Sets the element type for all elements of the array defined by this fixed array type definition.

      The element type of a fixed array type definition must be one of the following kinds:

      - `TypeDefinitionInteger`
      - `TypeDefinitionRecord`
      - `TypeDefinitionEnumeration`
      - `TypeDefinitionExtendibleEnumeration`
      - `TypeDefinitionFixedArray`

      If the element type is not one of the above kinds, an `IllegalArgumentException` is thrown.

      Parameters:
        `elementType` - Element type for this fixed array type definition.
      Throws:
        `NullPointerException` - Argument is null.
        `IllegalArgumentException` - The given element type is not acceptable for a fixed array type definition.

    - #### initializeFixedArrayElementType

          public static final TypeDefinition initializeFixedArrayElementType()

    - #### setElementValue

          public void setElementValue(PropertyValue arrayProperty,
                                      int index,
                                      PropertyValue memberProperty)
                               throws NullPointerException,
                                      IllegalPropertyValueException,
                                      IndexOutOfBoundsException,
                                      BadTypeException

      Description copied from interface: `TypeDefinitionFixedArray`

      Sets the value of a member of the given fixed array property value at the given index using the given value.

      Specified by:
        `setElementValue` in interface `TypeDefinitionFixedArray`
      Parameters:
        `arrayProperty` - Fixed array property value for which a member is to be set.
        `index` - 0-based index of the member value to change.
        `memberProperty` - Replacement value for the member of the given array at the given index.
      Throws:
        `NullPointerException` - One or both of the array and/or member property values is/are `null`.
        `IllegalPropertyValueException` - The fixed array property value is not defined by this fixed array type definition.
        `IndexOutOfBoundsException` - The index is outside the acceptable range for arrays of this fixed array type definition.
        `BadTypeException` - The given member property definition is not compatible with the underlying type of the fixed array type definition, as returned by `TypeDefinitionFixedArray.getType()`.
      See Also:
        `TypeDefinitionFixedArray.getElements(PropertyValue)`

    - #### setArray

          public void setArray(PropertyValue arrayProperty,
                               Object[] data)
                        throws NullPointerException,
                               IllegalPropertyValueException,
                               BadParameterException,
                               BadTypeException,
                               ClassCastException

      Description copied from interface: `TypeDefinitionFixedArray`

      Sets the value of the given fixed array property value using the given Java array, setting the elements of the fixed array to be values given by the elements of the Java array. Both arrays must the same length and it must be possible to convert the values of the Java array to the underlying type of the fixed array type definition, as returned by `TypeDefinitionFixedArray.getType()` and using `TypeDefinition.createValue(Object)`.

      Specified by:
        `setArray` in interface `TypeDefinitionFixedArray`
      Parameters:
        `arrayProperty` - Fixed array property value to have the value of all of its elements set.
        `data` - Java array containing elements to be used to set the values of the elements of the given fixed array property value.
      Throws:
        `NullPointerException` - One or more of the arguments is null, or one or more of the elements of the given Java array is null.
        `IllegalPropertyValueException` - The fixed array property value is not defined by the fixed array type definition.
        `BadParameterException` - The given Java array is a different size to that defined by the fixed array type definition, as returned by `TypeDefinitionFixedArray.getCount()`.
        `BadTypeException` - The Java array contains one or more objects that cannot be converted to elements of the underlying type of this fixed array type definition, as returned by `TypeDefinitionFixedArray.getType()`.
        `ClassCastException`
      See Also:
        `TypeDefinitionFixedArray.createValueFromArray(Object[])`, `TypeDefinition.createValue(Object)`

    - #### createValueFromArray

          public PropertyValue createValueFromArray(Object[] initData)
                                             throws NullPointerException,
                                                    BadParameterException,
                                                    BadTypeException

      Description copied from interface: `TypeDefinitionFixedArray`

      Creates and returns a new fixed array property value from the given Java array. The elements of the Java array are converted to property values of the underlying type of the fixed array type definition, as returned by `TypeDefinitionFixedArray.getType()` and using a call to `TypeDefinition.createValue(Object)`.

      Specified by:
        `createValueFromArray` in interface `TypeDefinitionFixedArray`
      Parameters:
        `initData` - Java array of data to use to initialize the new fixed array property value.
      Returns:
        Newly created fixed array property value with values converted from the given Java array.
      Throws:
        `NullPointerException` - The argument is `null`, or one or more of the elements of the given Java array are `null`.
        `BadParameterException` - The given Java array is of a different size to that required by the fixed array type definition, as returned by `TypeDefinitionFixedArray.getCount()`.
        `BadTypeException` - One or more of the elements of the given Java array cannot be converted to values of the underlying type of the fixed type array definition, as returned by `TypeDefinitionFixedArray.getType()`.
      See Also:
        `TypeDefinition.createValue(Object)`, `TypeDefinitionFixedArray.getArray(PropertyValue)`, `TypeDefinitionFixedArray.setArray(PropertyValue, Object[])`

    - #### getTypeCategory

          public TypeCategory getTypeCategory()

      Description copied from interface: `TypeDefinition`

      Returns the type category to which this type definition belongs, which corresponds to its sub interface. For example, TypeCategory.Int is returned for a `TypeDefinitionInteger`.

      Specified by:
        `getTypeCategory` in interface `TypeDefinition`
      Specified by:
        `getTypeCategory` in class `TypeDefinitionImpl`
      Returns:
        Type category to which the type definition belongs.
      See Also:
        `TypeCategory`

    - #### createValue

          public PropertyValue createValue(Object javaValue)
                                    throws ClassCastException

      Description copied from class: `TypeDefinitionImpl`

      Create a property value from the given Java object. If the type of the object is not compatible with this type definition, a `ClassCastException` is thrown.

      Specified by:
        `createValue` in interface `TypeDefinition`
      Specified by:
        `createValue` in class `TypeDefinitionImpl`
      Parameters:
        `javaValue` - Java object to use to create a property value of this type.
      Returns:
        Property value representing the given value.
      Throws:
        `ClassCastException` - The given object cannot be cast to a property value with this type definition.

    - #### createFromBytes

          public PropertyValue createFromBytes(ByteBuffer buffer)
                                        throws NullPointerException,
                                               EndOfDataException

      Description copied from interface: `TypeDefinition`

      Create a value of this type by reading the bytes in the given byte buffer. The buffer is assumed to have exactly the number of bytes that represent the value. For example, the length of a string value will be determined by the length (remaining bytes) in the buffer and not by reading a length value from the buffer.

      This method is able to read values written by the `TypeDefinition.writeAsBytes(PropertyValue, ByteBuffer)` method.

      Specified by:
        `createFromBytes` in interface `TypeDefinition`
      Overrides:
        `createFromBytes` in class `TypeDefinitionImpl`
      Parameters:
        `buffer` - Buffer to create a value from.
      Returns:
        Value of this type created from the given byte array.
      Throws:
        `NullPointerException` - Cannot read values from a `null` buffer.
        `EndOfDataException` - Insufficient bytes remaining in the given buffer to create a value of this type.
      See Also:
        `TypeDefinition.writeAsBytes(PropertyValue, ByteBuffer)`, `TypeDefinition.lengthAsBytes(PropertyValue)`

    - #### writeAsBytes

          public List<PropertyValue> writeAsBytes(PropertyValue value,
                                                  ByteBuffer buffer)
                                           throws NullPointerException,
                                                  IllegalPropertyValueException,
                                                  InsufficientSpaceException

      Description copied from interface: `TypeDefinition`

      Write the given property value of this type to the given byte stream. This version is most appropriate for writing KLV streams (MXF files).

      The format used to serialize the value with be compatible with the `TypeDefinition.createFromBytes(ByteBuffer)` method. The number of bytes written to the byte buffer will be the same as returned by `TypeDefinition.lengthAsBytes(PropertyValue)`.

      Specified by:
        `writeAsBytes` in interface `TypeDefinition`
      Overrides:
        `writeAsBytes` in class `TypeDefinitionImpl`
      Parameters:
        `value` - Value to write to the given buffer.
        `buffer` - Buffer to write the value to.
      Returns:
        List of any strongly referenced property values referenced from the new structure of bytes. Elements of this list will require separate serialization to the stream if the reference if to be resolved.
      Throws:
        `NullPointerException` - Cannot write from a `null` property value and/or to a `null` value.
        `IllegalPropertyValueException` - The given property value is not of this type.
        `InsufficientSpaceException` - Insufficient space to write the given value into the given buffer.
      See Also:
        `TypeDefinition.writeAsStructuredStorageBytes(PropertyValue, ByteBuffer)`, `TypeDefinition.createFromBytes(ByteBuffer)`, `TypeDefinition.lengthAsBytes(PropertyValue)`

    - #### lengthAsBytes

          public long lengthAsBytes(PropertyValue value)
                             throws NullPointerException,
                                    IllegalPropertyValueException

      Description copied from interface: `TypeDefinition`

      Returns the number of bytes that the given value of this type is serialized as a sequence of bytes.

      The number returned by this method is the same as the number of bytes written to a byte buffer by the `TypeDefinition.writeAsBytes(PropertyValue, ByteBuffer)` method.

      Specified by:
        `lengthAsBytes` in interface `TypeDefinition`
      Overrides:
        `lengthAsBytes` in class `TypeDefinitionImpl`
      Parameters:
        `value` - Value to find the length of when serialized to bytes.
      Returns:
        Number of bytes used to represent the given value when serialized.
      Throws:
        `NullPointerException` - Cannot compute the serialized length of a `null` value.
        `IllegalPropertyValueException` - The given property value is not of this type.
      See Also:
        `TypeDefinition.writeAsBytes(PropertyValue, ByteBuffer)`, `TypeDefinition.createFromBytes(ByteBuffer)`

    - #### nameToAAFName

          public String nameToAAFName(String name)

      Overrides:
        `nameToAAFName` in class `TypeDefinitionImpl`

    - #### appendMetadictXML

          public void appendMetadictXML(Node metadict,
                                        String namespace,
                                        String prefix)

      Description copied from interface: `MetaDefinition`

      Append an XML representation of this meta definition to the given XML node.

      Specified by:
        `appendMetadictXML` in interface `MetaDefinition`
      Overrides:
        `appendMetadictXML` in class `MetaDefinitionImpl`
      Parameters:
        `metadict` - Meta dictionary node to append a description of this node to.
      See Also:
        `CommonConstants.AAF_METADICT_NAMESPACE`

    - #### clone

          public TypeDefinitionFixedArray clone()

      Description copied from interface: `MetaDefinition`

      Create a cloned copy of this meta definition.

      Specified by:
        `clone` in interface `MetaDefinition`
      Specified by:
        `clone` in interface `TypeDefinition`
      Specified by:
        `clone` in interface `TypeDefinitionFixedArray`
      Overrides:
        `clone` in class `TypeDefinitionImpl`
      Returns:
        Cloned copy of this meta definition.

(c)2007-2016 Richard Cartwright, all rights reserved. Licensed under Apache 2 license and subject to the AMWA IPR policy.