private Attributes extract(Attributes emf, int frame, String cuid) {
   Attributes sfgs = emf.getNestedDataset(Tag.SharedFunctionalGroupsSequence);
   if (sfgs == null)
     throw new IllegalArgumentException("Missing (5200,9229) Shared Functional Groups Sequence");
   Attributes fgs = emf.getNestedDataset(Tag.PerFrameFunctionalGroupsSequence, frame);
   if (fgs == null)
     throw new IllegalArgumentException(
         "Missing (5200,9230) Per-frame Functional Groups Sequence Item for frame #"
             + (frame + 1));
   Attributes dest = new Attributes(emf.size() * 2);
   dest.addNotSelected(emf, EXCLUDE_TAGS);
   addFunctionGroups(dest, sfgs);
   addFunctionGroups(dest, fgs);
   addPixelData(dest, emf, frame);
   dest.setString(Tag.SOPClassUID, VR.UI, cuid);
   dest.setString(
       Tag.SOPInstanceUID,
       VR.UI,
       uidMapper.get(dest.getString(Tag.SOPInstanceUID)) + '.' + (frame + 1));
   dest.setString(
       Tag.InstanceNumber,
       VR.IS,
       createInstanceNumber(dest.getString(Tag.InstanceNumber, ""), frame));
   dest.setString(Tag.ImageType, VR.CS, dest.getStrings(Tag.FrameType));
   dest.remove(Tag.FrameType);
   if (!preserveSeriesInstanceUID)
     dest.setString(
         Tag.SeriesInstanceUID, VR.UI, uidMapper.get(dest.getString(Tag.SeriesInstanceUID)));
   adjustReferencedImages(dest, Tag.ReferencedImageSequence);
   adjustReferencedImages(dest, Tag.SourceImageSequence);
   return dest;
 }
  private void adjustReferencedImages(Attributes attrs, int sqtag) {
    Sequence sq = attrs.getSequence(sqtag);
    if (sq == null) return;

    ArrayList<Attributes> newRefs = new ArrayList<Attributes>();
    for (Iterator<Attributes> itr = sq.iterator(); itr.hasNext(); ) {
      Attributes ref = (Attributes) itr.next();
      String cuid = legacySOPClassUID(ref.getString(Tag.ReferencedSOPClassUID));
      if (cuid == null) continue;

      itr.remove();
      String iuid = uidMapper.get(ref.getString(Tag.ReferencedSOPInstanceUID));
      int[] frames = ref.getInts(Tag.ReferencedFrameNumber);
      int n = frames == null ? nofAccessor.getNumberOfFrames(iuid) : frames.length;
      ref.remove(Tag.ReferencedFrameNumber);
      ref.setString(Tag.ReferencedSOPClassUID, VR.UI, cuid);
      for (int i = 0; i < n; i++) {
        Attributes newRef = new Attributes(ref);
        newRef.setString(
            Tag.ReferencedSOPInstanceUID,
            VR.UI,
            iuid + '.' + (frames != null ? frames[i] : (i + 1)));
        newRefs.add(newRef);
      }
    }
    for (Attributes ref : newRefs) sq.add(ref);
  }