[med-svn] [vtk-dicom] 01/03: New upstream version 0.7.10

Gert Wollny gert-guest at moszumanska.debian.org
Sat Oct 1 19:51:42 UTC 2016


This is an automated email from the git hooks/post-receive script.

gert-guest pushed a commit to branch master
in repository vtk-dicom.

commit 204548e748dac8f52185027dfc0e1c2bacbbe8dc
Author: Gert Wollny <gw.fossdev at gmail.com>
Date:   Sat Oct 1 20:50:47 2016 +0200

    New upstream version 0.7.10
---
 CMake/DICOMConfig.cmake.in           |    5 +-
 CMake/pkgIndex.tcl.in                |   13 +
 CMake/vtkDICOMConfig.h.in            |   14 +-
 CMake/vtkWrapHierarchy.cmake         |   97 +-
 CMakeLists.txt                       |   65 +-
 Copyright.txt                        |    2 +-
 DicomCli/CMakeLists.txt              |    9 +-
 DicomCli/mainmacro.cxx               |  481 +-
 DicomCli/mainmacro.h                 |   74 +-
 DicomCli/progress.cxx                |   34 +-
 DicomCli/readquery.cxx               |  358 +-
 DicomCli/readquery.h                 |    9 +
 DicomCli/vtkConsoleOutputWindow.cxx  |   53 +
 DicomCli/vtkConsoleOutputWindow.h    |   45 +
 Examples/CMakeLists.txt              |    3 -
 Examples/TestDICOMCompiler.cxx       |   52 +-
 Examples/TestDICOMDirectory.cxx      |   26 +-
 Examples/TestDICOMDisplay.cxx        |   76 +-
 Examples/TestDICOMFileSorter.cxx     |   12 +-
 Examples/TestDICOMParser.cxx         |    4 +-
 Examples/TestDICOMReader.cxx         |   10 +-
 Examples/TestDICOMRealWorldValue.cxx |   26 +-
 Examples/TestDICOMWriter.cxx         |   10 +-
 Examples/TestNIFTIDisplay.cxx        |   48 +-
 Examples/TestScancoCTDisplay.cxx     |   48 +-
 Programs/CMakeLists.txt              |    3 -
 Programs/dicomdump.cxx               |  292 +-
 Programs/dicomfind.cxx               |  449 +-
 Programs/dicompull.cxx               |  322 +-
 Programs/dicomtocsv.cxx              |  539 +-
 Programs/dicomtodicom.cxx            |  329 +-
 Programs/dicomtonifti.cxx            |  573 +--
 Programs/nifticenter.cxx             |   10 +-
 Programs/niftidump.cxx               |  286 +-
 Programs/niftitodicom.cxx            |  413 +-
 Programs/scancodump.cxx              |  117 +-
 Programs/scancotodicom.cxx           |  341 +-
 Readme.txt                           |    4 +-
 Source/CMakeLists.txt                |   99 +-
 Source/vtkDICOMAlgorithm.cxx         |   28 +-
 Source/vtkDICOMAlgorithm.h           |   60 +-
 Source/vtkDICOMApplyPalette.cxx      |   66 +-
 Source/vtkDICOMApplyPalette.h        |   35 +-
 Source/vtkDICOMApplyRescale.cxx      |  108 +-
 Source/vtkDICOMApplyRescale.h        |   38 +-
 Source/vtkDICOMCTGenerator.cxx       |   16 +-
 Source/vtkDICOMCTGenerator.h         |    4 +-
 Source/vtkDICOMCTRectifier.cxx       |   72 +-
 Source/vtkDICOMCTRectifier.h         |   96 +-
 Source/vtkDICOMCharacterSet.cxx      | 1037 ++--
 Source/vtkDICOMCharacterSet.h        |   30 +-
 Source/vtkDICOMCompiler.cxx          |  544 +-
 Source/vtkDICOMCompiler.h            |   46 +-
 Source/vtkDICOMDataElement.h         |   19 +-
 Source/vtkDICOMDictEntry.cxx         |    8 +-
 Source/vtkDICOMDictHash.cxx          | 6128 +++++++++++-----------
 Source/vtkDICOMDictHash.h            |  158 +-
 Source/vtkDICOMDictPrivate.cxx       | 9448 +++++++++++++++++++---------------
 Source/vtkDICOMDictionary.cxx        |  112 +-
 Source/vtkDICOMDictionary.h          |   15 +-
 Source/vtkDICOMDirectory.cxx         | 1066 ++--
 Source/vtkDICOMDirectory.h           |   62 +-
 Source/vtkDICOMFile.cxx              |  430 +-
 Source/vtkDICOMFile.h                |   38 +-
 Source/vtkDICOMFileDirectory.cxx     |  414 ++
 Source/vtkDICOMFileDirectory.h       |  109 +
 Source/vtkDICOMFilePath.cxx          |  851 +++
 Source/vtkDICOMFilePath.h            |  184 +
 Source/vtkDICOMFileSorter.cxx        |  324 +-
 Source/vtkDICOMFileSorter.h          |   18 +-
 Source/vtkDICOMGenerator.cxx         |  611 ++-
 Source/vtkDICOMGenerator.h           |   86 +-
 Source/vtkDICOMImageCodec.cxx        |  136 +-
 Source/vtkDICOMImageCodec.h          |   10 +-
 Source/vtkDICOMItem.cxx              |  222 +-
 Source/vtkDICOMItem.h                |   22 +
 Source/vtkDICOMLookupTable.cxx       |  154 +-
 Source/vtkDICOMLookupTable.h         |   44 +-
 Source/vtkDICOMMRGenerator.cxx       |   48 +-
 Source/vtkDICOMMRGenerator.h         |    4 +-
 Source/vtkDICOMMetaData.cxx          |  512 +-
 Source/vtkDICOMMetaData.h            |   46 +-
 Source/vtkDICOMMetaDataAdapter.cxx   |  192 +-
 Source/vtkDICOMMetaDataAdapter.h     |   32 +
 Source/vtkDICOMParser.cxx            |  780 ++-
 Source/vtkDICOMParser.h              |   23 +-
 Source/vtkDICOMReader.cxx            |  760 +--
 Source/vtkDICOMReader.h              |  366 +-
 Source/vtkDICOMSCGenerator.cxx       |   66 +-
 Source/vtkDICOMSCGenerator.h         |    4 +-
 Source/vtkDICOMSequence.cxx          |   54 +-
 Source/vtkDICOMSequence.h            |   37 +-
 Source/vtkDICOMSliceSorter.cxx       |  452 +-
 Source/vtkDICOMSliceSorter.h         |  127 +-
 Source/vtkDICOMSorter.h              |    8 +-
 Source/vtkDICOMTag.cxx               |    8 +-
 Source/vtkDICOMTag.h                 |    8 +
 Source/vtkDICOMTagPath.cxx           |   55 +-
 Source/vtkDICOMTagPath.h             |   13 +
 Source/vtkDICOMToRAS.cxx             |  208 +-
 Source/vtkDICOMToRAS.h               |  147 +-
 Source/vtkDICOMUIDGenerator.cxx      |  523 ++
 Source/vtkDICOMUIDGenerator.h        |  131 +
 Source/vtkDICOMUtilities.cxx         |  598 +--
 Source/vtkDICOMUtilities.h           |   22 +-
 Source/vtkDICOMUtilitiesUIDTable.cxx |  573 ++-
 Source/vtkDICOMVM.cxx                |   14 +-
 Source/vtkDICOMVM.h                  |    6 +
 Source/vtkDICOMVR.h                  |    8 +
 Source/vtkDICOMValue.cxx             | 1139 ++--
 Source/vtkDICOMValue.h               |   33 +
 Source/vtkDICOMWriter.cxx            |  260 +-
 Source/vtkDICOMWriter.h              |  283 +-
 Source/vtkNIFTIHeader.cxx            |  124 +-
 Source/vtkNIFTIHeader.h              |  250 +-
 Source/vtkNIFTIReader.cxx            |  523 +-
 Source/vtkNIFTIReader.h              |  253 +-
 Source/vtkNIFTIWriter.cxx            |  388 +-
 Source/vtkNIFTIWriter.h              |  220 +-
 Source/vtkScancoCTReader.cxx         |  430 +-
 Source/vtkScancoCTReader.h           |  206 +-
 Testing/CMakeLists.txt               |   29 +-
 Testing/TestDICOMCharacterSet.cxx    |   25 +-
 Testing/TestDICOMFilePath.cxx        |  205 +
 Testing/TestDICOMMetaData.cxx        |   68 +-
 Testing/TestDICOMSequence.cxx        |   38 +-
 Testing/TestDICOMTcl.tcl             |   13 +
 Testing/TestDICOMUtilities.cxx       |    8 +-
 Testing/TestDICOMVR.cxx              |    4 +-
 Testing/TestDICOMValue.cxx           |    2 +-
 Utilities/makedict.py                |    5 +-
 Utilities/nemadict.txt               |  786 ++-
 Utilities/nemauids.txt               |  325 +-
 Utilities/parseuid.py                |   12 +-
 134 files changed, 23300 insertions(+), 16354 deletions(-)

diff --git a/CMake/DICOMConfig.cmake.in b/CMake/DICOMConfig.cmake.in
index 27ed25c..1113707 100644
--- a/CMake/DICOMConfig.cmake.in
+++ b/CMake/DICOMConfig.cmake.in
@@ -12,7 +12,10 @@ set(DICOM_REQUIRED_CXX_FLAGS "@DICOM_REQUIRED_CXX_FLAGS@")
 # The version number
 set(DICOM_MAJOR_VERSION "@DICOM_MAJOR_VERSION@")
 set(DICOM_MINOR_VERSION "@DICOM_MINOR_VERSION@")
-set(DICOM_BUILD_VERSION "@DICOM_BUILD_VERSION@")
+set(DICOM_PATCH_VERSION "@DICOM_PATCH_VERSION@")
+
+# Legacy (for backwards compatibility)
+set(DICOM_BUILD_VERSION "${DICOM_PATCH_VERSION}")
 
 # Configured settings
 set(DICOM_BUILD_SHARED_LIBS "@BUILD_SHARED_LIBS@")
diff --git a/CMake/pkgIndex.tcl.in b/CMake/pkgIndex.tcl.in
new file mode 100644
index 0000000..2403ad3
--- /dev/null
+++ b/CMake/pkgIndex.tcl.in
@@ -0,0 +1,13 @@
+package ifneeded @MODULE_TCL_NAME@ @VTK_VERSION_MAJOR at .@VTK_VERSION_MINOR@ {
+  set libPrefix ""
+  if {$tcl_platform(platform) == "unix"} {
+    set libPrefix "lib"
+  }
+  set libExt [info sharedlibextension]
+  set libPath {@MODULE_TCL_PATH@}
+  set libFile [file join ${libPath} ${libPrefix}@LIB_TCL_OUTPUT_NAME@${libExt}]
+  if { [file exists ${libFile}] } {
+    load ${libFile}
+    package provide @MODULE_TCL_NAME@ @VTK_VERSION_MAJOR at .@VTK_VERSION_MINOR@
+  }
+}
diff --git a/CMake/vtkDICOMConfig.h.in b/CMake/vtkDICOMConfig.h.in
index 6482281..cdca281 100644
--- a/CMake/vtkDICOMConfig.h.in
+++ b/CMake/vtkDICOMConfig.h.in
@@ -25,8 +25,20 @@
 /* Version number. */
 #define DICOM_MAJOR_VERSION @DICOM_MAJOR_VERSION@
 #define DICOM_MINOR_VERSION @DICOM_MINOR_VERSION@
-#define DICOM_BUILD_VERSION @DICOM_BUILD_VERSION@
+#define DICOM_PATCH_VERSION @DICOM_PATCH_VERSION@
 #define DICOM_SHORT_VERSION "@DICOM_SHORT_VERSION@"
 #define DICOM_VERSION "@DICOM_VERSION@"
 
+/* Legacy (for backwards compatibility) */
+#define DICOM_BUILD_VERSION DICOM_PATCH_VERSION
+
+/* For compatibility with VTK 7.1 */
+#ifndef VTK_DELETE_FUNCTION
+#if (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1800)
+#define VTK_DELETE_FUNCTION =delete
+#else
+#define VTK_DELETE_FUNCTION
+#endif
+#endif
+
 #endif
diff --git a/CMake/vtkWrapHierarchy.cmake b/CMake/vtkWrapHierarchy.cmake
index 03d2e83..0cb5c18 100644
--- a/CMake/vtkWrapHierarchy.cmake
+++ b/CMake/vtkWrapHierarchy.cmake
@@ -1,7 +1,7 @@
 #
 # a cmake macro to generate a text file with the class hierarchy
 #
-macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
+macro(VTK_WRAP_HIERARCHY module_name OUTPUT_DIR SOURCES)
   if(NOT VTK_WRAP_HIERARCHY_EXE)
     if(TARGET vtkWrapHierarchy)
       set(VTK_WRAP_HIERARCHY_EXE vtkWrapHierarchy)
@@ -10,28 +10,43 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
     endif()
   endif()
 
-  # all the include directories
-  if(VTK_WRAP_INCLUDE_DIRS)
-    set(TMP_INCLUDE_DIRS ${VTK_WRAP_INCLUDE_DIRS})
+  # collect the common wrapper-tool arguments
+  if(NOT CMAKE_VERSION VERSION_LESS 3.1 AND
+     NOT VTK_VERSION VERSION_LESS 7.1)
+    # write wrapper-tool arguments to a file
+    set(_args_file ${module_name}Hierarchy.$<CONFIGURATION>.args)
+    file(GENERATE OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_args_file} CONTENT "
+$<$<BOOL:$<TARGET_PROPERTY:${module_name},COMPILE_DEFINITIONS>>:
+-D\"$<JOIN:$<TARGET_PROPERTY:${module_name},COMPILE_DEFINITIONS>,\"
+-D\">\">
+$<$<BOOL:$<TARGET_PROPERTY:${module_name},INCLUDE_DIRECTORIES>>:
+-I\"$<JOIN:$<TARGET_PROPERTY:${module_name},INCLUDE_DIRECTORIES>,\"
+-I\">\">
+")
   else()
-    set(TMP_INCLUDE_DIRS ${VTK_INCLUDE_DIRS})
+    set(_common_args)
+    get_directory_property(_def_list DEFINITION COMPILE_DEFINITIONS)
+    foreach(TMP_DEF ${_def_list})
+      set(_common_args "${_common_args}-D${TMP_DEF}\n")
+    endforeach()
+
+    # all the include directories
+    if(VTK_WRAP_INCLUDE_DIRS)
+      set(TMP_INCLUDE_DIRS ${VTK_WRAP_INCLUDE_DIRS})
+    else()
+      set(TMP_INCLUDE_DIRS ${VTK_INCLUDE_DIRS})
+    endif()
+    foreach(INCLUDE_DIR ${TMP_INCLUDE_DIRS})
+      set(_common_args "${_common_args}-I\"${INCLUDE_DIR}\"\n")
+    endforeach()
+
+    # write wrapper-tool arguments to a file
+    set(_args_file ${module_name}Hierarchy.args)
+    string(STRIP "${_common_args}" CMAKE_CONFIGURABLE_FILE_CONTENT)
+    configure_file(${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in
+      ${_args_file} @ONLY)
   endif()
 
-  # collect the common wrapper-tool arguments
-  set(_common_args)
-  get_directory_property(_def_list DEFINITION COMPILE_DEFINITIONS)
-  foreach(TMP_DEF ${_def_list})
-    set(_common_args "${_common_args}-D${TMP_DEF}\n")
-  endforeach()
-  foreach(INCLUDE_DIR ${TMP_INCLUDE_DIRS})
-    set(_common_args "${_common_args}-I\"${INCLUDE_DIR}\"\n")
-  endforeach()
-
-  # write wrapper-tool arguments to a file
-  string(STRIP "${_common_args}" CMAKE_CONFIGURABLE_FILE_CONTENT)
-  configure_file(${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in
-                 ${vtk-module}Hierarchy.args @ONLY)
-
   # list of all files to wrap
   set(VTK_WRAPPER_INIT_DATA)
   # list of used files
@@ -42,8 +57,9 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
 
     # file properties to include in the hierarchy file
     get_property(TMP_WRAP_EXCLUDE SOURCE ${FILE} PROPERTY WRAP_EXCLUDE)
-    get_source_file_property(TMP_WRAP_SPECIAL ${FILE} WRAP_SPECIAL)
     get_source_file_property(TMP_ABSTRACT ${FILE} ABSTRACT)
+    get_source_file_property(TMP_EXCLUDE_PYTHON ${FILE} WRAP_EXCLUDE_PYTHON)
+    get_source_file_property(TMP_WRAP_SPECIAL ${FILE} WRAP_SPECIAL)
 
     # what is the filename without the extension
     get_filename_component(TMP_FILENAME ${FILE} NAME_WE)
@@ -57,11 +73,15 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
     # assume header file is in the same directory
     set(TMP_INPUT ${TMP_FILEPATH}/${TMP_FILENAME}.h)
 
-    # default to including all available headers in the hierarchy files
+    # include all non-private headers in the hierarchy files
     set(TMP_EXCLUDE_FROM_HIERARCHY OFF)
+    get_source_file_property(TMP_SKIP ${FILE} SKIP_HEADER_INSTALL)
+    if(TMP_SKIP)
+      set(TMP_EXCLUDE_FROM_HIERARCHY ON)
+    endif()
 
     # ensure that header exists (assume it exists if it is marked as wrapped)
-    if(TMP_WRAP_EXCLUDE AND NOT TMP_WRAP_SPECIAL)
+    if(TMP_WRAP_EXCLUDE)
       if(NOT EXISTS ${TMP_INPUT})
         set(TMP_EXCLUDE_FROM_HIERARCHY ON)
       endif()
@@ -78,7 +98,7 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
 
       # add the info to the init file
       set(VTK_WRAPPER_INIT_DATA
-        "${VTK_WRAPPER_INIT_DATA}${TMP_INPUT};${vtk-module}")
+        "${VTK_WRAPPER_INIT_DATA}${TMP_INPUT};${module_name}")
 
       if(TMP_ABSTRACT)
         set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};ABSTRACT")
@@ -88,6 +108,10 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
         set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};WRAP_EXCLUDE")
       endif()
 
+      if(TMP_EXCLUDE_PYTHON)
+        set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};WRAP_EXCLUDE_PYTHON")
+      endif()
+
       if(TMP_WRAP_SPECIAL)
         set(VTK_WRAPPER_INIT_DATA "${VTK_WRAPPER_INIT_DATA};WRAP_SPECIAL")
       endif()
@@ -100,17 +124,18 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
   # finish the data file for the init file
   configure_file(
     ${VTK_CMAKE_DIR}/vtkWrapperInit.data.in
-    ${vtk-module}Hierarchy.data
+    ${module_name}Hierarchy.data
+    @ONLY
     )
 
   # search through the deps to find modules we depend on
   set(OTHER_HIERARCHY_FILES)
-  # Don't use ${vtk-module}_DEPENDS. That list also includes COMPILE_DEPENDS,
+  # Don't use ${module_name}_DEPENDS. That list also includes COMPILE_DEPENDS,
   # which aren't library dependencies, merely dependencies for generators and
   # such. The dependecies specified under "DEPENDS" in the vtk_module(..) macro
   # call are located under _LINK_DEPENDS.
-  foreach(dep ${${vtk-module}_LINK_DEPENDS})
-    if(NOT "${vtk-module}" STREQUAL "${dep}")
+  foreach(dep ${${module_name}_LINK_DEPENDS})
+    if(NOT "${module_name}" STREQUAL "${dep}")
       if(NOT ${dep}_EXCLUDE_FROM_WRAPPING)
         list(APPEND OTHER_HIERARCHY_FILES "${${dep}_WRAP_HIERARCHY_FILE}")
       endif()
@@ -118,17 +143,17 @@ macro(VTK_WRAP_HIERARCHY TARGET OUTPUT_DIR SOURCES)
   endforeach()
 
   add_custom_command(
-    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Hierarchy.stamp
-           ${OUTPUT_DIR}/${vtk-module}Hierarchy.txt
+    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.stamp.txt
+           ${OUTPUT_DIR}/${module_name}Hierarchy.txt
     COMMAND ${VTK_WRAP_HIERARCHY_EXE}
-            @${vtk-module}Hierarchy.args -o ${OUTPUT_DIR}/${vtk-module}Hierarchy.txt
-            ${vtk-module}Hierarchy.data
+            @${_args_file} -o ${OUTPUT_DIR}/${module_name}Hierarchy.txt
+            ${module_name}Hierarchy.data
             ${OTHER_HIERARCHY_FILES}
-    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Hierarchy.stamp
-    COMMENT "For ${vtk-module} - updating ${vtk-module}Hierarchy.txt"
+    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.stamp.txt
+    COMMENT "For ${module_name} - updating ${module_name}Hierarchy.txt"
     DEPENDS ${VTK_WRAP_HIERARCHY_EXE}
-            ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Hierarchy.args
-            ${CMAKE_CURRENT_BINARY_DIR}/${vtk-module}Hierarchy.data
+            ${CMAKE_CURRENT_BINARY_DIR}/${_args_file}
+            ${CMAKE_CURRENT_BINARY_DIR}/${module_name}Hierarchy.data
             ${OTHER_HIERARCHY_FILES}
             ${INPUT_FILES}
     VERBATIM
diff --git a/CMakeLists.txt b/CMakeLists.txt
index dd04bd5..5f60ee0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,20 +1,17 @@
+# for CMake 3, add VERSION X.Y.Z to set the version here
 project(DICOM)
 
 # CMake version requirements
 cmake_minimum_required(VERSION 2.8.7)
 
-# Use LINK_INTERFACE_LIBRARIES instead of INTERFACE_LINK_LIBRARIES
-#if(POLICY CMP0022)
-#  cmake_policy(SET CMP0022 OLD)
-#endif()
-
 # When CMake 3.0.0 is required, remove this block (see CMP0042).
 if(NOT DEFINED CMAKE_MACOSX_RPATH)
   set(CMAKE_MACOSX_RPATH 0)
 endif()
 
 # Allow custom cmake overrides
-set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMake" ${CMAKE_MODULE_PATH})
+set(DICOM_CMAKE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/CMake)
+set(CMAKE_MODULE_PATH ${DICOM_CMAKE_DIR} ${CMAKE_MODULE_PATH})
 
 # Use ctest for dashboard submissions
 include(CTest)
@@ -22,9 +19,15 @@ include(CTest)
 # Project version
 set(DICOM_MAJOR_VERSION 0)
 set(DICOM_MINOR_VERSION 7)
-set(DICOM_BUILD_VERSION 1)
+set(DICOM_PATCH_VERSION 10)
 set(DICOM_SHORT_VERSION "${DICOM_MAJOR_VERSION}.${DICOM_MINOR_VERSION}")
-set(DICOM_VERSION "${DICOM_SHORT_VERSION}.${DICOM_BUILD_VERSION}")
+set(DICOM_VERSION "${DICOM_SHORT_VERSION}.${DICOM_PATCH_VERSION}")
+
+# Generic project version variables (forwards compatibility with CMake 3)
+set(PROJECT_MAJOR_VERSION ${DICOM_MAJOR_VERSION})
+set(PROJECT_MINOR_VERSION ${DICOM_MINOR_VERSION})
+set(PROJECT_PATCH_VERSION ${DICOM_PATCH_VERSION})
+set(PROJECT_VERSION ${DICOM_VERSION})
 
 # Include directories
 set(DICOM_INCLUDE_DIRS
@@ -44,11 +47,6 @@ if(Module_vtkDICOM) # We are being built as a VTK remote module
   # To set DICOM_USE_VTKZLIB in vtkDICOMConfig.h
   set(DICOM_USE_VTKZLIB ON)
 
-  # Wrapping will be done by VTK's modular build, so turn off
-  # these flags that enable our own wrapping CMake code
-  set(BUILD_PYTHON_WRAPPERS OFF)
-  set(BUILD_JAVA_WRAPPERS OFF)
-
   option(BUILD_DICOM_PROGRAMS "Build the vtkDICOM tools" ON)
   set(BUILD_PROGRAMS ${BUILD_DICOM_PROGRAMS})
 
@@ -57,9 +55,9 @@ else() # We are being built as a stand-alone package
   option(BUILD_SHARED_LIBS "Build shared libraries." OFF)
 
   # Which parts of the package to build
-  option(BUILD_TESTING "Build the tests" ON)
+  option(BUILD_TESTING "Build the tests" OFF)
   option(BUILD_PROGRAMS "Build some useful DICOM tools" ON)
-  option(BUILD_EXAMPLES "Build the examples" ON)
+  option(BUILD_EXAMPLES "Build the examples" OFF)
 
   find_package(VTK REQUIRED)
   message(STATUS "vtkDICOM: Building vtkDICOM stand-alone")
@@ -75,6 +73,13 @@ else() # We are being built as a stand-alone package
     unset(BUILD_PYTHON_WRAPPERS CACHE)
   endif()
 
+  # Wrap Tcl option
+  if(VTK_WRAP_TCL)
+    option(BUILD_TCL_WRAPPERS "Build tcl wrappers" ON)
+  else()
+    unset(BUILD_TCL_WRAPPERS CACHE)
+  endif()
+
   # Wrap Java option
   if(VTK_WRAP_JAVA)
     option(BUILD_JAVA_WRAPPERS "Build java wrappers" OFF)
@@ -152,7 +157,10 @@ if(USE_DCMTK)
   if(NOT DCMTK_FOUND)
     message(FATAL_ERROR "DCMTK not found or incomplete.")
   endif()
-  set(DCMTK_LIBS ${DCMTK_LIBRARIES})
+  set(DCMTK_LIBS ${DCMTK_LIBRARIES} ${DCMTK_charls_LIBRARY})
+  if(APPLE)
+    list(APPEND DCMTK_LIBS iconv)
+  endif()
   include_directories(${DCMTK_INCLUDE_DIRS})
 endif()
 
@@ -207,14 +215,17 @@ endif()
 if(NOT DICOM_INC_DIR)
   set(DICOM_INC_DIR "include") # for header files
 endif()
+if(NOT DICOM_TCL_DIR)
+  set(DICOM_TCL_DIR "lib/tcltk/dicom-${DICOM_SHORT_VERSION}")
+endif()
 if(NOT DICOM_JAVA_DIR)
   set(DICOM_JAVA_DIR "share/java")
 endif()
 if(NOT DICOM_DATA_DIR)
   set(DICOM_DATA_DIR "share/dicom-${DICOM_SHORT_VERSION}")
 endif()
-if(NOT DICOM_CMAKE_DIR)
-  set(DICOM_CMAKE_DIR "${DICOM_LIB_DIR}/dicom-${DICOM_SHORT_VERSION}/cmake")
+if(NOT DICOM_PGK_DIR)
+  set(DICOM_PGK_DIR "${DICOM_LIB_DIR}/dicom-${DICOM_SHORT_VERSION}/cmake")
 endif()
 
 # Set the full paths to the install tree
@@ -222,9 +233,10 @@ set(DICOM_RUNTIME_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_BIN_DIR})
 set(DICOM_LIBRARY_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_LIB_DIR})
 set(DICOM_ARCHIVE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_ARC_DIR})
 set(DICOM_INCLUDE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_INC_DIR})
+set(DICOM_TCL_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_TCL_DIR})
 set(DICOM_JAVA_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_JAVA_DIR})
 set(DICOM_DATA_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_DATA_DIR})
-set(DICOM_CMAKE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_CMAKE_DIR})
+set(DICOM_CMAKE_INSTALL_DEST ${CMAKE_INSTALL_PREFIX}/${DICOM_PGK_DIR})
 
 if(NOT Module_vtkDICOM)
   # Libraries
@@ -238,6 +250,11 @@ if(NOT Module_vtkDICOM)
     if(TMP_INDEX GREATER -1)
       set(VTK_LIBS ${VTK_LIBS} vtkIOMPIImage)
     endif()
+    # If vtkIOMySQL is present, it has factories for vtkIOSQL
+    list(FIND VTK_LIBRARIES vtkIOMySQL TMP_INDEX)
+    if(TMP_INDEX GREATER -1)
+      set(VTK_LIBS ${VTK_LIBS} vtkIOMySQL)
+    endif()
   else()
     set(VTK_LIBS vtkCommon vtkFiltering vtkImaging vtkIO vtkInfovis) # VTK 5.x
   endif()
@@ -251,6 +268,12 @@ if(NOT Module_vtkDICOM)
     set(DICOM_PYTHON_LIBRARIES vtkDICOMPythonD)
   endif()
 
+  # For the tcl wrappers
+  if(BUILD_TCL_WRAPPERS)
+    find_package(TCL REQUIRED)
+    set(DICOM_TCL_LIBRARIES vtkDICOMTCL)
+  endif()
+
   # For the java wrappers
   if(BUILD_JAVA_WRAPPERS)
     find_package(Java REQUIRED)
@@ -332,10 +355,10 @@ if(NOT Module_vtkDICOM)
   # ... for the install tree
   file(RELATIVE_PATH REL_INCLUDE_DIR "${DICOM_CMAKE_INSTALL_DEST}"
     "${DICOM_INCLUDE_INSTALL_DEST}")
-  set(INCLUDE_DIRS_CONFIG "\${DICOM_CMAKE_DIR}/${REL_INCLUDE_DIR}")
+  set(INCLUDE_DIRS_CONFIG "\${DICOM_PGK_DIR}/${REL_INCLUDE_DIR}")
   file(RELATIVE_PATH REL_LIBRARY_DIR "${DICOM_CMAKE_INSTALL_DEST}"
     "${DICOM_LIBRARY_INSTALL_DEST}")
-  set(LIBRARY_DIRS_CONFIG "\${DICOM_CMAKE_DIR}/${REL_LIBRARY_DIR}")
+  set(LIBRARY_DIRS_CONFIG "\${DICOM_PGK_DIR}/${REL_LIBRARY_DIR}")
   configure_file(CMake/DICOMConfig.cmake.in
     "${DICOM_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/DICOMConfig.cmake" @ONLY)
 
diff --git a/Copyright.txt b/Copyright.txt
index cbe90e8..885119f 100644
--- a/Copyright.txt
+++ b/Copyright.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2012-2015 David Gobbi
+Copyright (c) 2012-2016 David Gobbi
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/DicomCli/CMakeLists.txt b/DicomCli/CMakeLists.txt
index 8d2ae41..35cc393 100644
--- a/DicomCli/CMakeLists.txt
+++ b/DicomCli/CMakeLists.txt
@@ -2,10 +2,17 @@ include_directories(${DICOM_INCLUDE_DIRS})
 
 set(LIB_NAME dicomcli)
 
+if(WIN32)
+  set(MAINMACRO_SRC mainmacro.cxx)
+else()
+  set(MAINMACRO_SRC)
+endif()
+
 set(LIB_SRCS
-  mainmacro.cxx
+  ${MAINMACRO_SRC}
   readquery.cxx
   progress.cxx
+  vtkConsoleOutputWindow.cxx
 )
 
 add_library(${LIB_NAME} STATIC ${LIB_SRCS})
diff --git a/DicomCli/mainmacro.cxx b/DicomCli/mainmacro.cxx
index d130f46..b55ca75 100644
--- a/DicomCli/mainmacro.cxx
+++ b/DicomCli/mainmacro.cxx
@@ -1,25 +1,43 @@
 /*=========================================================================
 
-  Program: DICOM for VTK
-
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2015,2016 David Gobbi
   All rights reserved.
-  See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notice for more information.
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+  * Neither the name of David Gobbi nor the names of any contributors
+    may be used to endorse or promote products derived from this software
+    without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 =========================================================================*/
 
 #include "mainmacro.h"
 
-#include <string.h>
 #include <stddef.h>
 
 #ifdef _WIN32
 #include <windows.h>
-#include <io.h>
 #endif
 
 // A struct to arguments converted from UTF-16 to UTF-8.
@@ -29,187 +47,394 @@ namespace {
 class Arguments
 {
 public:
-  // Construct with an empty argument list.
-  Arguments() : m_Argc(0), m_Argv(0) {}
-
-  // Destruct by freeing the memory.
-  ~Arguments() {
-    if (m_Argv) {
-      delete [] *m_Argv;
-      delete [] m_Argv;
-    }
-  }
+  // Construct with an empty argument list, set console code page to UTF-8.
+  Arguments();
 
-  // Allocate space for the next arg (of size n, including null).
-  char *Next(int n);
+  // Destruct by freeing the memory and restoring the origin code page.
+  ~Arguments();
 
-  // Add the next arg.
+  // Add the next arg (this is called by ExpandArgs).
   void Push(wchar_t *arg);
 
+  // Expand args, result can be retrieved with GetArgc, GetArgv.
+  bool ExpandArgs(int argc, wchar_t *argv[], const char *passthrough);
+
   // Get the argc and argv for the args.
   int GetArgc() { return m_Argc; }
   char **GetArgv() { return m_Argv; }
 
 private:
+  // Check if the given string matches the given wildcard pattern.
+  static bool MatchesSpec(
+    const wchar_t *val, size_t vl,
+    const wchar_t *spec, size_t pl);
+
   // Get the power of two equal or greater than n.
-  static int NearestPowerOfTwo(int n) {
-    unsigned int m = ((n > 0) ? n - 1 : 0);
+  static size_t NearestPowerOfTwo(size_t n) {
+    size_t m = ((n > 0) ? n - 1 : 0);
     m |= m >> 1;
     m |= m >> 2;
     m |= m >> 4;
     m |= m >> 8;
     m |= m >> 16;
-    return static_cast<int>(m + 1);
+#ifdef _WIN64
+    m |= m >> 32;
+#endif
+    return m + 1;
   }
 
   // Check if n is a power of two.
-  static bool IsPowerOfTwo(int n) {
-    return ((n & (n - 1)) == 0);
+  static bool IsPowerOfTwo(size_t n) {
+    return (n > 0 && (n & (n - 1)) == 0);
+  }
+
+  // Create a string of length n and add it to the given array.
+  template<class T>
+  static T *NewString(size_t n, int *count, T ***strings) {
+    T **array = *strings;
+    (*count)++;
+    if (array == 0) {
+      size_t m = NearestPowerOfTwo(n);
+      array = new T *[2];
+      array[0] = new T[m];
+      *strings = array;
+    }
+    else {
+      if (IsPowerOfTwo(*count)) {
+        T **newarray = new T *[*count * 2];
+        for (int i = 0; i < *count; i++) {
+          newarray[i] = array[i];
+        }
+        delete [] array;
+        array = newarray;
+        *strings = array;
+      }
+      size_t m = array[*count - 1] - array[0];
+      if (m + n > NearestPowerOfTwo(m)) {
+        T *cp = new T[NearestPowerOfTwo(m + n)];
+        T *oldcp = array[0];
+        for (size_t j = 0; j < m; j++) {
+          cp[j] = oldcp[j];
+        }
+        for (int i = 0; i < *count; i++) {
+          array[i] = cp + (array[i] - oldcp);
+        }
+        delete [] oldcp;
+      }
+    }
+
+    array[*count] = array[*count - 1] + n;
+    return array[*count - 1];
+  }
+
+  // Delete the array of strings.
+  template<class T>
+    static void FreeStrings(int *count, T ***strings) {
+    if (*strings) {
+      delete [] **strings;
+      delete [] *strings;
+    }
+    *count = 0;
+    *strings = 0;
   }
 
   int m_Argc;
   char **m_Argv;
+  UINT m_CodePage;
 };
 
-char *Arguments::Next(int n)
+Arguments::Arguments() : m_Argc(0), m_Argv(0)
 {
-  m_Argc++;
-  if (m_Argv == 0)
-    {
-    int m = NearestPowerOfTwo(n);
-    m_Argv = new char *[2];
-    m_Argv[0] = new char[m];
+  // Save the current code page, then set code page to UTF-8
+  m_CodePage = GetConsoleOutputCP();
+  SetConsoleOutputCP(65001);
+}
+
+Arguments::~Arguments()
+{
+  FreeStrings(&m_Argc, &m_Argv);
+  // Restore the old code page
+  SetConsoleOutputCP(m_CodePage);
+}
+
+bool Arguments::MatchesSpec(
+  const wchar_t *val, size_t vl,
+  const wchar_t *spec, size_t sl)
+{
+  // convert to lower case for case insensitivity
+  wchar_t val_lower[MAX_PATH];
+  wchar_t spec_lower[MAX_PATH];
+
+  if (vl < MAX_PATH && sl < MAX_PATH) {
+    for (size_t i = 0; i < vl; i++) {
+      val_lower[i] = val[i];
     }
-  else
-    {
-    if (IsPowerOfTwo(m_Argc))
-      {
-      char **argv = new char *[m_Argc*2];
-      for (int i = 0; i < m_Argc; i++)
-        {
-        argv[i] = m_Argv[i];
+    for (size_t i = 0; i < sl; i++) {
+      spec_lower[i] = spec[i];
+    }
+
+    if (CharLowerBuffW(val_lower, static_cast<unsigned int>(vl)) == vl &&
+        CharLowerBuffW(spec_lower, static_cast<unsigned int>(sl)) == sl) {
+      // if successful, use the lower-case strings
+      spec = spec_lower;
+      val = val_lower;
+    }
+  }
+
+  // get pointers to the end of the strings
+  const wchar_t *cp = spec;
+  const wchar_t *ep = spec + sl;
+  const wchar_t *dp = val;
+  const wchar_t *fp = val + vl;
+
+  while (cp != ep && dp != fp) {
+    if (*cp == '*') {
+      cp++;
+      // if '*' is the final character, it matches the remainder of val
+      if (cp == ep) {
+        dp = fp;
+      }
+      else {
+        while (dp != fp) {
+          if (*cp == '?' || *dp == *cp) {
+            // check if the remainder of val matches remainder of spec
+            if (MatchesSpec(dp, fp-dp, cp, ep-cp)) {
+              break;
+            }
+          }
+          // else let the "*" eat one more codepoint of "val"
+          if ((*dp++ & 0xFC00) == 0xD800) {
+            if (dp != fp && (*dp & 0xFC00) == 0xDC00) {
+              dp++;
+            }
+          }
         }
-      delete [] m_Argv;
-      m_Argv = argv;
       }
-    int m = static_cast<int>(m_Argv[m_Argc-1] - m_Argv[0]);
-    if (m + n > NearestPowerOfTwo(m))
-      {
-      char *cp = new char[NearestPowerOfTwo(m + n)];
-      char *oldcp = m_Argv[0];
-      memcpy(cp, oldcp, m);
-      for (int i = 0; i < m_Argc; i++)
-        {
-        m_Argv[i] = cp + (m_Argv[i] - oldcp);
+    }
+    else if (*cp == '?') {
+      // the '?' matches a whole codepoint, not just one wchar
+      cp++;
+      if ((*dp++ & 0xFC00) == 0xD800) {
+        if (dp != fp && (*dp & 0xFC00) == 0xDC00) {
+          dp++;
         }
-      delete [] oldcp;
       }
     }
+    else if (*cp == *dp) {
+      // make sure the entire codepoint matches
+      cp++;
+      if ((*dp++ & 0xFC00) == 0xD800) {
+        if (cp != ep && dp != fp &&
+            ((*cp & 0xFC00) == 0xDC00 || (*dp & 0xFC00) == 0xDC00)) {
+          if (*dp != *cp) {
+            return false;
+          }
+          cp++;
+          dp++;
+        }
+      }
+    }
+    else {
+      return false;
+    }
+  }
+
+  // skip over any remaining '*' wildcards
+  while (cp != ep && *cp == '*') {
+    cp++;
+  }
 
-  m_Argv[m_Argc] = m_Argv[m_Argc-1] + n;
-  return m_Argv[m_Argc-1];
+  // make sure we've reached the end of both the spec and the value
+  return (cp == ep && dp == fp);
 }
 
 void Arguments::Push(wchar_t *arg)
 {
   int n = WideCharToMultiByte(
     CP_UTF8, 0, arg, -1, NULL, 0, NULL, NULL);
-  char *cp = this->Next(n);
+  char *cp = NewString(n, &m_Argc, &m_Argv);
   WideCharToMultiByte(
     CP_UTF8, 0, arg, -1, cp, n, NULL, NULL);
 }
 
-} // namespace
-
-// A static variable to hold the arguments (will destruct on exit).
-static Arguments dicomcli_arguments;
-#endif /* _WIN32 */
-
-// The function, with special definition for Windows.
-#ifdef _WIN32
-bool dicomcli_expandargs(
-  int argc, wchar_t *argv[],
-  int *argc_p, char ***argv_p)
+bool Arguments::ExpandArgs(int argc, wchar_t *argv[], const char *passthrough)
 {
-  struct _wfinddata64_t data;
+  WIN32_FIND_DATAW data;
+  wchar_t *temp = 0;
+  size_t tempsize = 0;
+  bool expand_wildcards = true;
 
   for (int i = 0; i < argc; i++)
-    {
+  {
+    // for storing segments of the path that have wildcards
+    int dirstart = 0;
+    int dircount = 0;
+    wchar_t **directories = 0;
+
     // check for wildcards
     bool has_wildcard = false;
-    wchar_t *cp = argv[i];
-    wchar_t *dp = cp;
-    while (*cp != 0)
-      {
-      if (*cp == '\?' || *cp == '*')
-        {
+    bool segment_has_wildcard = false;
+    bool wildcard_expanded = false;
+    bool path_is_complete = false;
+    wchar_t *dp = argv[i];
+    for (wchar_t *cp = dp; !path_is_complete; cp++) {
+      if (expand_wildcards && (*cp == '\?' || *cp == '*')) {
         has_wildcard = true;
-        }
-      if (*cp == '\\' || *cp == '/')
-        {
-        dp = cp + 1;
-        has_wildcard = false;
-        }
-      cp++;
+        segment_has_wildcard = true;
       }
-
-    if (has_wildcard)
-      {
-      wchar_t *temp = 0;
-      size_t tempsize = 0;
-      intptr_t hFile = _wfindfirst64(argv[i], &data);
-      if (hFile != static_cast<intptr_t>(-1))
-        {
-        do
-          {
-          if (dp == argv[i])
-            {
-            // Path does not contain a directory.
-            dicomcli_arguments.Push(data.name);
+      else if (*cp == '\\' || *cp == '/' || *cp == 0) {
+        path_is_complete = (*cp == 0);
+        // If path has a wildcard push all matching dirs onto a list.
+        if (has_wildcard) {
+          // Check if directory list is empty.
+          if (dircount == 0) {
+            // Push path segment (argv[i]..dp) onto the directory list.
+            size_t l = dp - argv[i];
+            wchar_t *ep = NewString(l, &dircount, &directories);
+            for (size_t j = 0; j < l; j++) {
+              ep[j] = argv[i][j];
             }
-          else
-            {
-            // Append wildcard result to the directory.
-            cp = argv[i];
-            size_t l = dp - cp;
-            size_t k = 0;
-            wchar_t *ep = data.name;
-            while (ep[k] != 0) { k++; }
-            if (l + k + 1 > tempsize)
-              {
-              tempsize = l + k + 9;
+          }
+          // Get the length of the path segment.
+          size_t m = cp - dp;
+          int prevcount = dircount;
+          for (int k = dirstart; k < prevcount; k++) {
+            // Length of the directory (including the "/").
+            size_t l = directories[k + 1] - directories[k];
+            if (l+m+1 > tempsize) {
+              tempsize = l+m+9;
               delete [] temp;
               temp = new wchar_t[tempsize];
+            }
+            for (size_t j = 0; j < l; j++) {
+              temp[j] = directories[k][j];
+            }
+            for (size_t j = 0; j < m; j++) {
+              temp[l+j] = dp[j];
+            }
+            temp[l+m] = 0;
+            // Find all existing directories.
+            HANDLE hFile = FindFirstFileW(temp, &data);
+            if (hFile != INVALID_HANDLE_VALUE) {
+              do {
+                if (!path_is_complete &&
+                    (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) {
+                  // A directory was expected
+                  continue;
+                }
+                if (data.cFileName[0] == '.' &&
+                    (data.cFileName[1] == 0 ||
+                     (data.cFileName[1] == '.' && data.cFileName[2] == 0))) {
+                  // The found file was '.' or '..'
+                  continue;
+                }
+                if (data.cFileName[0] == '.' && dp[0] != '.') {
+                  // The found file began with '.' but the filespec did not.
+                  continue;
+                }
+                // Append wildcard result to the directory.
+                wchar_t *result;
+                size_t n = 0;
+                while (data.cFileName[n] != 0 && n < MAX_PATH) {
+                  n++;
+                }
+                // Ensure that the true filename matches the wildcards.
+                // (FindFirstFile, FindNextFile also match short filename)
+                if (!MatchesSpec(data.cFileName, n, dp, cp-dp)) {
+                  continue;
+                }
+                if (path_is_complete) {
+                  // Expand into temporary string if path is complete.
+                  if (l+n+1 > tempsize) {
+                    tempsize = l+n+9;
+                    delete [] temp;
+                    temp = new wchar_t[tempsize];
+                  }
+                  result = temp;
+                }
+                else {
+                  // Add result to directory list if path is not complete yet.
+                  result = NewString(l+n+1, &dircount, &directories);
+                }
+                for (size_t j = 0; j < l; j++) {
+                  result[j] = directories[k][j];
+                }
+                for (size_t j = 0; j < n; j++) {
+                  result[l+j] = data.cFileName[j];
+                }
+                result[l+n] = *cp;
+                // Push result onto the args if path is complete.
+                if (path_is_complete) {
+                  Push(result);
+                  wildcard_expanded = true;
+                }
               }
-            for (size_t j = 0; j < l; j++) { temp[j] = cp[j]; }
-            for (size_t j = 0; j < k; j++) { temp[l+j] = ep[j]; }
-            temp[l + k] = 0;
-            dicomcli_arguments.Push(temp);
+              while (FindNextFileW(hFile, &data));
+              FindClose(hFile);
             }
           }
-        while (_wfindnext64(hFile, &data) != -1);
-        _findclose(hFile);
-        }
-      else
-        {
-        dicomcli_arguments.Push(argv[i]);
+          dirstart = prevcount;
         }
-      delete [] temp;
+        dp = cp + 1;
       }
-    else
-      {
-      dicomcli_arguments.Push(argv[i]);
+    }
+    // If no expansion could be done, push the argument as-is.
+    if (!wildcard_expanded) {
+      Push(argv[i]);
+      if (passthrough) {
+        expand_wildcards = true;
+        // Check the arg against the expansion exclusion list.
+        const char *arg = m_Argv[m_Argc-1];
+        const char *ex = passthrough;
+        while (*ex == ' ' || *ex == '\t') {
+          ex++;
+        }
+        while (*ex != '\0') {
+          const char *ee = ex;
+          while (*ee != '\0' && *ee != ' ' && *ee != '\t') {
+            ee++;
+          }
+          while (*arg != '\0' && ex != ee && *ex == *arg) {
+            ex++;
+            arg++;
+          }
+          if (*arg == '\0' && ex == ee) {
+            // Do not expand wildcards in the next arg.
+            expand_wildcards = false;
+            break;
+          }
+          ex = ee;
+          while (*ex == ' ' || *ex == '\t') {
+            ex++;
+          }
+        }
       }
     }
-
-  *argc_p = dicomcli_arguments.GetArgc();
-  *argv_p = dicomcli_arguments.GetArgv();
+    FreeStrings(&dircount, &directories);
+  }
+  delete [] temp;
 
   return true;
 }
-#else
-bool dicomcli_expandargs(int *, char ***)
+
+} // namespace
+
+// A static variable to hold the arguments (will destruct on exit).
+static Arguments mainmacro_arguments;
+#endif /* _WIN32 */
+
+// The function, with special definition for Windows.
+#ifdef _WIN32
+bool mainmacro_expandargs(
+  int argc, wchar_t *argv[],
+  int *argc_p, char ***argv_p,
+  const char *passthrough)
 {
-  return true;
+  if (mainmacro_arguments.ExpandArgs(argc, argv, passthrough)) {
+    *argc_p = mainmacro_arguments.GetArgc();
+    *argv_p = mainmacro_arguments.GetArgv();
+    return true;
+  }
+  return false;
 }
 #endif
diff --git a/DicomCli/mainmacro.h b/DicomCli/mainmacro.h
index c6fab6e..49140ef 100644
--- a/DicomCli/mainmacro.h
+++ b/DicomCli/mainmacro.h
@@ -1,14 +1,34 @@
 /*=========================================================================
 
-  Program: DICOM for VTK
-
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2015,2016 David Gobbi
   All rights reserved.
-  See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
-     This software is distributed WITHOUT ANY WARRANTY; without even
-     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-     PURPOSE.  See the above copyright notice for more information.
+  Redistribution and use in source and binary forms, with or without
+  modification, are permitted provided that the following conditions
+  are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in the
+    documentation and/or other materials provided with the distribution.
+
+  * Neither the name of David Gobbi nor the names of any contributors
+    may be used to endorse or promote products derived from this software
+    without specific prior written permission.
+
+  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 =========================================================================*/
 #ifndef mainmacro_h
@@ -16,29 +36,47 @@
 
 //! Expand command line arguments for Windows command line.
 /*!
- *  This will expand any wildcards in the arguments, and should usually
- *  only be applied on Windows because most UNIX shells will handle the
- *  wildcard expansion automatically.
+ *  This will expand any wildcards in the arguments, and is only applied
+ *  on Windows because UNIX shells do wildcard expansion by themselves.
  */
-bool dicomcli_expandargs(
+#ifdef _WIN32
+bool mainmacro_expandargs(
   int wargc, wchar_t *wargv[],
-  int *argc_p, char ***argv_p);
+  int *argc_p, char ***argv_p,
+  const char *passthrough);
+#endif
+
+//! Supply a list of options for which wildcards should be passed through.
+/*!
+ *  The command-line argument that follows any of the options that are
+ *  passed to this macro will not be expanded if they include wildcards.
+ *  Instead, the wildcards will be passed through to main().
+ */
+//! This is the macro for specifying the passthrough options, if any.
+#ifdef _WIN32
+#define MAINMACRO_PASSTHROUGH(opts) \
+  inline const char *mainmacro_passthrough(int) { return #opts; }
+inline const char *mainmacro_passthrough(float) { return 0; }
+#else
+  #define MAINMACRO_PASSTHROUGH(opts)
+#endif
 
 //! A macro to use wmain on Windows.
 #ifdef _WIN32
-#define MAINMACRO(argc, argv) \
-int main_with_utf8_args(int argc, char *argv[]); \
+#define MAINMACRO(a, b) \
+main_with_utf8_args(a, b); \
 int wmain(int wargc, wchar_t *wargv[]) \
 { \
   int argc = 0; \
   char **argv = 0; \
-  dicomcli_expandargs(wargc, wargv, &argc, &argv); \
+  mainmacro_expandargs(wargc, wargv, &argc, &argv, \
+                       mainmacro_passthrough(1)); \
   return main_with_utf8_args(argc, argv); \
 } \
-int main_with_utf8_args(int argc, char *argv[])
+int main_with_utf8_args(a, b)
 #else
-#define MAINMACRO(argc, argv) \
-int main(int argc, char *argv[])
+#define MAINMACRO(a, b) \
+main(a, b)
 #endif
 
 #endif /* mainmacro_h */
diff --git a/DicomCli/progress.cxx b/DicomCli/progress.cxx
index 2d61db6..d21ed9f 100644
--- a/DicomCli/progress.cxx
+++ b/DicomCli/progress.cxx
@@ -14,60 +14,60 @@
 
 #include "progress.h"
 
-#include <vtkTimerLog.h>
+#include <vtkDICOMUtilities.h>
 
 void ProgressObserver::Execute(vtkObject *, unsigned long e, void *vp)
 {
   const double initial = 2.0; // time until first report
   const double delta = 0.1; // time between reports
-  double t = vtkTimerLog::GetUniversalTime();
+  double t = 1e-6*vtkDICOMUtilities::GetUTC(NULL);
 
   if (e == vtkCommand::StartEvent)
-    {
+  {
     this->LastTime = t;
     this->Stage = 0;
     this->Anim = 0;
-    }
+  }
   else if (e == vtkCommand::ProgressEvent)
-    {
+  {
     double *dp = static_cast<double *>(vp);
     int progress = static_cast<int>((*dp)*100.0 + 0.5);
 
     if (this->Stage == 0)
-      {
+    {
       if (t - this->LastTime > initial)
-        {
+      {
         std::cout << "\r                                   ";
         this->Stage = 1;
-        }
       }
+    }
     if (t - this->LastTime > delta)
-      {
+    {
       if (this->Stage == 1)
-        {
+      {
         if (progress == 0)
-          {
+        {
           const char *dots[] = { ".  ", ".. ", "..." };
           this->Anim = (this->Anim + 1) % 3;
           std::cout << "\r" << this->Text << dots[this->Anim];
           std::cout.flush();
           this->LastTime = t;
-          }
+        }
         else
-          {
+        {
           std::cout << "\r" << this->Text << " " << progress << "%";
           std::cout.flush();
           this->LastTime = t;
-          }
         }
       }
     }
+  }
   else if (e == vtkCommand::EndEvent)
-    {
+  {
     if (this->Stage > 0)
-      {
+    {
       std::cout << "\r" << this->Text << " 100%";
       std::cout << std::endl;
-      }
     }
+  }
 }
diff --git a/DicomCli/readquery.cxx b/DicomCli/readquery.cxx
index 037cd86..b908e52 100644
--- a/DicomCli/readquery.cxx
+++ b/DicomCli/readquery.cxx
@@ -21,8 +21,13 @@
 #include <string.h>
 #include <stdlib.h>
 
+#include <algorithm>
 #include <iostream>
 
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
 typedef vtkDICOMVR VR;
 
 // Prototype for function that reads one query key
@@ -35,19 +40,19 @@ vtkDICOMTagPath path_append(const vtkDICOMTagPath& tpath, vtkDICOMTag tag)
   vtkDICOMTagPath result(tag);
 
   if (tpath.GetHead() != vtkDICOMTag())
-    {
+  {
     if (tpath.HasTail())
-      {
+    {
       result = vtkDICOMTagPath(
         tpath.GetHead(), tpath.GetIndex(),
         tpath.GetTail().GetHead(), 0, tag);
-      }
+    }
     else
-      {
+    {
       result = vtkDICOMTagPath(
         tpath.GetHead(), 0, tag);
-      }
     }
+  }
 
   return result;
 }
@@ -56,11 +61,19 @@ vtkDICOMTagPath path_append(const vtkDICOMTagPath& tpath, vtkDICOMTag tag)
 bool dicomcli_readquery(
   const char *fname, vtkDICOMItem *query, QueryTagList *ql)
 {
+#ifdef _WIN32
+  int cn = MultiByteToWideChar(CP_UTF8, 0, fname, -1, NULL, 0);
+  wchar_t *wfname = new wchar_t[cn];
+  MultiByteToWideChar(CP_UTF8, 0, fname, -1, wfname, cn);
+  ifstream f(wfname);
+  delete [] wfname;
+#else
   ifstream f(fname);
+#endif
   if (!f.good())
-    {
+  {
     return false;
-    }
+  }
 
   // Each query line is either:
   // # a comment
@@ -72,7 +85,7 @@ bool dicomcli_readquery(
 
   int lineNumber = 0;
   while (f.good())
-    {
+  {
     std::string line;
     std::getline(f, line);
     const char *cp = line.c_str();
@@ -82,22 +95,22 @@ bool dicomcli_readquery(
     // strip leading whitespace
     size_t s = 0;
     while (s < n && isspace(cp[s]))
-      {
+    {
       s++;
-      }
+    }
 
     // skip line if it is a comment
     if (s == n || cp[s] == '#')
-      {
+    {
       continue;
-      }
+    }
 
     if (!dicomcli_readkey_query(cp, query, ql, true))
-      {
+    {
       fprintf(stderr, "Error %s line %d:\n", fname, lineNumber);
       return false;
-      }
     }
+  }
 
   return true;
 }
@@ -114,27 +127,27 @@ bool dicomcli_readkey_query(
   size_t n = strlen(cp);
   bool tagError = false;
   while (!tagError && tagDepth < 3)
-    {
+  {
     // check for private creator in square brackets
     size_t creatorStart = s;
     size_t creatorEnd = s;
     if (cp[s] == '[')
-      {
+    {
       s++;
       creatorStart = s;
       while (s < n && cp[s] != ']')
-        {
+      {
         s++;
-        }
+      }
       if (s == n)
-        {
+      {
         fprintf(stderr, "Error: Block is missing the final \"]\".\n");
         tagError = true;
         continue;
-        }
+      }
       creatorEnd = s;
       s++;
-      }
+    }
 
     std::string creator(&cp[creatorStart], creatorEnd - creatorStart);
 
@@ -145,90 +158,90 @@ bool dicomcli_readkey_query(
     bool hasComma = false;
     size_t commaPos = 0;
     while (s < n && (isalnum(cp[s]) || (cp[s] == ',' && !hasComma)))
-      {
+    {
       if (cp[s] == ',')
-        {
+      {
         hasComma = true;
         commaPos = s - tagStart;
-        }
+      }
       else if (!isxdigit(cp[s]))
-        {
+      {
         isHex = false;
-        }
-      s++;
       }
+      s++;
+    }
     size_t tagEnd = s;
     if (hasComma)
-      {
+    {
       if (isHex)
-        {
+      {
         unsigned int group = strtoul(&cp[tagStart], NULL, 16);
         unsigned int element = strtoul(&cp[tagStart+commaPos+1], NULL, 16);
         if (group < 0xFFFF && element < 0xFFFF)
-          {
+        {
           tag = vtkDICOMTag(group, element);
-          }
         }
       }
+    }
     else
-      {
+    {
       std::string key(&cp[tagStart], tagEnd - tagStart);
       vtkDICOMDictEntry de = vtkDICOMDictionary::FindDictEntry(
         key.c_str(), creator.c_str());
       if (de.IsValid())
-        {
+      {
         tag = de.GetTag();
-        }
+      }
       else
-        {
+      {
         fprintf(stderr, "Error: Unrecognized key %s\n", key.c_str());
         tagError = true;
         continue;
-        }
       }
+    }
 
     // if creator, then resolve the tag now
     if (creator.length() > 0)
-      {
+    {
       if (tagDepth == 0)
-        {
+      {
         tag = query->ResolvePrivateTagForWriting(tag, creator);
-        }
+      }
       else
-        {
+      {
         vtkDICOMSequence seq = query->GetAttributeValue(tagPath);
         vtkDICOMItem item = seq.GetItem(0);
         tag = item.ResolvePrivateTagForWriting(tag, creator);
         vtkDICOMTag ctag(tag.GetGroup(), tag.GetElement() >> 8);
         vtkDICOMTagPath ctagPath = path_append(tagPath, ctag);
         query->SetAttributeValue(ctagPath, creator);
-        }
       }
+    }
 
     // build the tag path
     tagPath = path_append(tagPath, tag);
 
     if (s < n && (cp[s] == '/' || cp[s] == '\\'))
-      {
+    {
       // create an item for the next level of depth
       if (!query->GetAttributeValue(tagPath).IsValid())
-        {
+      {
         query->SetAttributeValue(tagPath, vtkDICOMSequence(1));
-        }
+      }
       s++;
       tagDepth++;
-      }
+    }
     else
-      {
+    {
       break;
-      }
     }
+  }
 
   // if an error occurred while reading tag, skip to next line
   if (tagError || tagDepth > 2)
-    {
+  {
     return false;
-    }
+  }
 
   // read the DICOM vr
   vtkDICOMVR vr;
@@ -236,164 +249,173 @@ bool dicomcli_readkey_query(
   size_t vrStart = s;
   size_t vrEnd = s;
   if (s < n && cp[s] == ':')
-    {
+  {
     s++;
     vrStart = s;
     vrEnd = s;
     if (n - s >= 2)
-      {
+    {
       s += 2;
       vrEnd = s;
       vr = vtkDICOMVR(&cp[vrStart]);
       if (!vr.IsValid() || vr == VR::OX || vr == VR::XS || vr == VR::UN)
-        {
+      {
         int m = static_cast<int>(vrEnd - lineStart);
         m = (m > 40 ? 40 : m);
         fprintf(stderr, "Error: Unrecognized DICOM VR \"%*.*s\"\n",
            m, m, &cp[lineStart]);
         return false;
-        }
       }
     }
+  }
 
   // dig down into the tag path
   const vtkDICOMItem *pitem = query;
   vtkDICOMTag tag = tagPath.GetHead();
   vtkDICOMTagPath tmpPath = tagPath;
   while (tmpPath.HasTail())
-    {
+  {
     pitem = pitem->GetAttributeValue(tag).GetSequenceData();
     tmpPath = tmpPath.GetTail();
     tag = tmpPath.GetHead();
-    }
+  }
 
   // validate the tag and the vr against the dictionary
   vtkDICOMVR dictvr = pitem->FindDictVR(tag);
   // the above method returns UN for OX and XS if it cannot resolve them
   if (dictvr == VR::UN)
-    {
+  {
     // try again, taking a more direct approach
     vtkDICOMDictEntry e = pitem->FindDictEntry(tag);
     if (e.IsValid())
-      {
+    {
       dictvr = e.GetVR();
-      }
     }
+  }
   if (!vr.IsValid())
-    {
+  {
     vr = dictvr;
-    }
+  }
   else if (dictvr.IsValid() && dictvr != VR::UN)
-    {
+  {
     if (vr != dictvr &&
         !(((dictvr == VR::OX && (vr == VR::OW || vr == VR::OB))) ||
           ((dictvr == VR::XS && (vr == VR::SS || vr == VR::US)))))
-      {
+    {
       int m = static_cast<int>(vrEnd - lineStart);
       m = (m > 40 ? 40 : m);
       fprintf(stderr, "Error: VR of \"%*.*s\" doesn't match dict VR of %s\n",
          m, m, &cp[lineStart], dictvr.GetText());
-      }
     }
+  }
 
   if (!vr.IsValid() || vr == VR::UN)
-    {
+  {
     int m = static_cast<int>(s - lineStart);
     m = (m > 40 ? 40 : m);
     fprintf(stderr, "Error: Unrecognized DICOM tag \"%*.*s\"\n",
             m, m, &cp[lineStart]);
     return false;
-    }
+  }
 
   // check for a value or pattern following "="
   size_t valueStart = s;
   size_t valueEnd = s;
   bool valueContainsQuotes = false;
+  bool keyHasAssignment = false;
   if (s < n && cp[s] == '=')
-    {
+  {
+    keyHasAssignment = true;
     s++;
     valueStart = s;
     valueEnd = s;
     if (s < n && qfile && cp[s] == '\"')
-      {
+    {
       char delim = cp[s++];
       valueStart = s;
       while (s < n)
-        {
+      {
         if (cp[s] == delim)
-          {
+        {
           // a repeated quote becomes a literal quote
           if (s+1 < n && cp[s+1] == delim)
-            {
+          {
             valueContainsQuotes = true;
             s++;
-            }
+          }
           else
-            {
+          {
             break;
-            }
           }
-        s++;
         }
+        s++;
+      }
       valueEnd = s;
       if (s < n)
-        {
+      {
         s++;
-        }
       }
+    }
     else
-      {
+    {
       while (s < n && (!qfile || !isspace(cp[s])))
-        {
+      {
         s++;
-        }
-      valueEnd = s;
       }
+      valueEnd = s;
     }
+  }
   else if (s < n && (!qfile || !isspace(cp[s])))
-    {
+  {
     if (isgraph(cp[s]))
-      {
+    {
       fprintf(stderr, "Error: Illegal character \"%c\" after tag.\n", cp[s]);
-      }
+    }
     else
-      {
+    {
       fprintf(stderr, "Error: Illegal character after tag.\n");
-      }
-    return false;
     }
+    return false;
+  }
 
   // add the tag and value to the query data set
   if (valueStart == valueEnd)
+  {
+    // only overwrite previous value if '=' was explicitly used
+    if (keyHasAssignment || !query->GetAttributeValue(tagPath).IsValid())
     {
-    // empty value (always matches, always retrieved)
-    query->SetAttributeValue(tagPath, vtkDICOMValue(vr));
+      // empty value (always matches, always retrieved)
+      query->SetAttributeValue(tagPath, vtkDICOMValue(vr));
     }
+  }
   else if (valueContainsQuotes)
-    {
+  {
     // convert "" to ", which is the rule for csv files
     std::string sval;
     for (size_t t = valueStart; t < valueEnd; t++)
-      {
+    {
       sval.push_back(cp[t]);
       if (cp[t] == '\"' && t+1 < valueEnd && cp[t+1] == '\"')
-        {
+      {
         t++;
-        }
       }
-    query->SetAttributeValue(tagPath, vtkDICOMValue(vr, sval));
     }
+    query->SetAttributeValue(tagPath, vtkDICOMValue(vr, sval));
+  }
   else
-    {
+  {
     query->SetAttributeValue(tagPath,
       vtkDICOMValue(vr, &cp[valueStart], valueEnd - valueStart));
-    }
+  }
 
-  // add the tag path to the list
+  // add the tag path to the list, if it isn't already there
   if (ql)
+  {
+    if (std::find(ql->begin(), ql->end(), tagPath) == ql->end())
     {
-    ql->push_back(tagPath);
+      ql->push_back(tagPath);
     }
+  }
 
   return !tagError;
 }
@@ -411,70 +433,164 @@ bool dicomcli_looks_like_key(const char *cp)
 
   // Look for private dictionary specifier in square brackets
   if (*cp == '[')
-    {
+  {
     while (cp[l] != ']' && cp[l] != '\0')
-      {
+    {
       l++;
-      }
+    }
     if (cp[l] == ']')
-      {
+    {
       l++;
       s = l;
-      }
+    }
     else
-      {
+    {
       return false;
-      }
     }
+  }
 
   // Look for hexadecimal tag
   bool istag = true;
   size_t commas = 0;
   size_t digitrun = 0;
   while (cp[l] != '\0' && cp[l] != ':' && cp[l] != '=')
-    {
+  {
     if (cp[l] == ',')
-      {
+    {
       commas++;
       if (digitrun > 4)
-        {
+      {
         istag = false;
-        }
-      digitrun = 0;
       }
+      digitrun = 0;
+    }
     else if (isxdigit(cp[l]))
-      {
+    {
       digitrun++;
-      }
+    }
     else
-      {
+    {
       istag = false;
-      }
-    l++;
     }
+    l++;
+  }
   if (istag && digitrun > 0 &&
       ((commas == 0 && digitrun <= 8) ||
        (commas == 1 && digitrun <= 4)))
-    {
+  {
     return true;
-    }
+  }
 
   // Look for dictionary key
   if (l != s)
-    {
+  {
     std::string key(&cp[s], l - s);
     std::string creator;
     if (s > 0)
-      {
+    {
       creator = std::string(&cp[1], s-2);
-      }
+    }
     vtkDICOMDictEntry de =
       vtkDICOMDictionary::FindDictEntry(key.c_str(), creator.c_str());
     if (de.IsValid())
-      {
+    {
       return true;
-      }
     }
+  }
 
   return false;
 }
+
+bool dicomcli_readuids(
+  const char *fname, vtkDICOMItem *query, QueryTagList *ql)
+{
+#ifdef _WIN32
+  int cn = MultiByteToWideChar(CP_UTF8, 0, fname, -1, NULL, 0);
+  wchar_t *wfname = new wchar_t[cn];
+  MultiByteToWideChar(CP_UTF8, 0, fname, -1, wfname, cn);
+  ifstream f(wfname);
+  delete [] wfname;
+#else
+  ifstream f(fname);
+#endif
+  if (!f.good())
+  {
+    return false;
+  }
+
+  // Basic file structure:
+  // # one or more comments
+  // GGGG,EEEE   # a tag or key (only one)
+  // 1.185.234   # a UID, followed by more UIDs
+
+  QueryTagList ql2;
+  std::string val;
+  int lineNumber = 0;
+  while (f.good())
+  {
+    std::string line;
+    std::getline(f, line);
+    const char *cp = line.c_str();
+    size_t n = line.size();
+    lineNumber++;
+
+    // strip leading whitespace
+    size_t s = 0;
+    while (s < n && isspace(cp[s]))
+    {
+      s++;
+    }
+
+    // skip trailing whitespace
+    if (n > s && isspace(cp[n-1]))
+    {
+      --n;
+    }
+
+    // skip line if it is a comment
+    if (s == n || cp[s] == '#')
+    {
+      continue;
+    }
+
+    if (ql2.size() == 0)
+    {
+      // get the tag line, if not gotten yet
+      if (!dicomcli_readkey_query(cp, query, &ql2, true))
+      {
+        fprintf(stderr, "Error %s line %d: ", fname, lineNumber);
+        fprintf(stderr, "Need Valid DICOM tag at top of file.\n");
+        return false;
+      }
+    }
+    else
+    {
+      // read and append a value
+      if (val.length() > 0)
+      {
+        val.append("\\", 1);
+      }
+      val.append(&cp[s], n-s);
+      if (val.length() >= 65535)
+      {
+        fprintf(stderr, "Error %s line %d: ", fname, lineNumber);
+        fprintf(stderr, "Too many values (there is a 65535 byte limit)\n");
+        return false;
+      }
+    }
+  }
+
+  if (ql2.size() > 0)
+  {
+    // add the key and value to the query
+    vtkDICOMTagPath tagPath = ql2[0];
+    query->SetAttributeValue(tagPath, val);
+
+    if (ql && std::find(ql->begin(), ql->end(), tagPath) == ql->end())
+    {
+      ql->push_back(tagPath);
+    }
+  }
+
+  return true;
+}
diff --git a/DicomCli/readquery.h b/DicomCli/readquery.h
index b8e6d70..7ad2419 100644
--- a/DicomCli/readquery.h
+++ b/DicomCli/readquery.h
@@ -39,4 +39,13 @@ bool dicomcli_readkey(
 //! Check if text looks like a query key (for error checking).
 bool dicomcli_looks_like_key(const char *key);
 
+//! Read a UID file, return 'true' on success.
+/*!
+ *  The first line of the file must contain a valid key, for example
+ *  SeriesInstanceUID, and the remainder of the file should contain
+ *  values, one value per line, without quotes.
+ */
+bool dicomcli_readuids(
+  const char *fname, vtkDICOMItem *query, QueryTagList *ql=0);
+
 #endif /* readquery_h */
diff --git a/DicomCli/vtkConsoleOutputWindow.cxx b/DicomCli/vtkConsoleOutputWindow.cxx
new file mode 100644
index 0000000..f74351c
--- /dev/null
+++ b/DicomCli/vtkConsoleOutputWindow.cxx
@@ -0,0 +1,53 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    vtkConsoleOutputWindow.cxx
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtkConsoleOutputWindow.h"
+
+vtkConsoleOutputWindow *vtkConsoleOutputWindow::New()
+{
+  return new vtkConsoleOutputWindow;
+}
+
+vtkConsoleOutputWindow::vtkConsoleOutputWindow()
+{
+}
+
+vtkConsoleOutputWindow::~vtkConsoleOutputWindow()
+{
+}
+
+void vtkConsoleOutputWindow::Initialize()
+{
+}
+
+void vtkConsoleOutputWindow::Install()
+{
+  vtkConsoleOutputWindow *win = vtkConsoleOutputWindow::New();
+  vtkOutputWindow::SetInstance(win);
+  win->Delete();
+}
+
+void vtkConsoleOutputWindow::DisplayText(const char* text)
+{
+  if (text)
+  {
+    fwrite(text, 1, strlen(text), stderr);
+    fputc('\n', stderr);
+  }
+}
+
+void vtkConsoleOutputWindow::PrintSelf(ostream& os, vtkIndent indent)
+{
+  this->Superclass::PrintSelf(os, indent);
+}
diff --git a/DicomCli/vtkConsoleOutputWindow.h b/DicomCli/vtkConsoleOutputWindow.h
new file mode 100644
index 0000000..2259284
--- /dev/null
+++ b/DicomCli/vtkConsoleOutputWindow.h
@@ -0,0 +1,45 @@
+/*=========================================================================
+
+  Program:   Visualization Toolkit
+  Module:    vtkConsoleOutputWindow.h
+
+  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
+  All rights reserved.
+  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+// .NAME vtkConsoleOutputWindow - Output errors to the console.
+// .SECTION Description
+// Writes debug/warning/error output to the console, even on Windows.
+// To use this class, instantiate it and then call SetInstance(this).
+//
+
+#ifndef vtkConsoleOutputWindow_h
+#define vtkConsoleOutputWindow_h
+
+#include "vtkOutputWindow.h"
+
+class vtkConsoleOutputWindow : public vtkOutputWindow
+{
+public:
+  vtkTypeMacro(vtkConsoleOutputWindow, vtkOutputWindow);
+  static vtkConsoleOutputWindow* New();
+  virtual void PrintSelf(ostream& os, vtkIndent indent);
+  virtual void DisplayText(const char*);
+  static void Install();
+
+protected:
+  vtkConsoleOutputWindow();
+  virtual ~vtkConsoleOutputWindow();
+  void Initialize();
+
+private:
+  vtkConsoleOutputWindow(const vtkConsoleOutputWindow&);  // Not implemented.
+  void operator=(const vtkConsoleOutputWindow&);  // Not implemented.
+};
+
+#endif
diff --git a/Examples/CMakeLists.txt b/Examples/CMakeLists.txt
index 9f62647..f4a0ab8 100644
--- a/Examples/CMakeLists.txt
+++ b/Examples/CMakeLists.txt
@@ -16,9 +16,6 @@ else()
 endif()
 
 set(BASE_LIBS vtkDICOM ${VTK_LIBS})
-if(USE_DCMTK AND DCMTK_charls_LIBRARY)
- set(BASE_LIBS ${BASE_LIBS} ${DCMTK_charls_LIBRARY})
-endif()
 
 add_executable(TestDICOMCompiler TestDICOMCompiler.cxx)
 target_link_libraries(TestDICOMCompiler ${BASE_LIBS} ${KWSYS_LIBS})
diff --git a/Examples/TestDICOMCompiler.cxx b/Examples/TestDICOMCompiler.cxx
index 2554efd..1c24ed4 100644
--- a/Examples/TestDICOMCompiler.cxx
+++ b/Examples/TestDICOMCompiler.cxx
@@ -27,6 +27,12 @@
 #include <string.h>
 #include <stdlib.h>
 
+// For compatibility with new VTK generic data arrays
+#ifdef vtkGenericDataArray_h
+#define SetTupleValue SetTypedTuple
+#define GetTupleValue GetTypedTuple
+#endif
+
 // remove path portion of filename
 const char *fileBasename(const char *filename)
 {
@@ -42,18 +48,18 @@ int main(int argc, char *argv[])
   int rval = 0;
 
   if (argc < 2)
-    {
+  {
     printf("usage: %s file1.dcm [file2.dcm ...]\n", fileBasename(argv[0]));
     return rval;
-    }
+  }
 
   vtkSmartPointer<vtkStringArray> files =
     vtkSmartPointer<vtkStringArray>::New();
 
   for (int argi = 1; argi < argc; argi++)
-    {
+  {
     files->InsertNextValue(argv[argi]);
-    }
+  }
 
   const char *outfile = "/tmp/%s";
 
@@ -78,11 +84,11 @@ int main(int argc, char *argv[])
 
   int m = sorter->GetNumberOfStudies();
   for (int j = 0; j < m; j++)
-    {
+  {
     int k = sorter->GetFirstSeriesForStudy(j);
     int kl = sorter->GetLastSeriesForStudy(j);
     for (; k <= kl; k++)
-      {
+    {
       vtkStringArray *a = sorter->GetFileNamesForSeries(k);
       int l = static_cast<int>(a->GetNumberOfValues());
       std::string fname = a->GetValue(0);
@@ -96,7 +102,7 @@ int main(int argc, char *argv[])
       offsetArray->SetNumberOfTuples(l);
 
       for (int i = 0; i < l; i++)
-        {
+      {
         // read the DICOM series with the parser
         fname = a->GetValue(i);
         parser->SetIndex(i);
@@ -107,10 +113,10 @@ int main(int argc, char *argv[])
         tp[0] = parser->GetFileOffset();
         tp[1] = parser->GetFileSize();
         offsetArray->SetTupleValue(i, tp);
-        }
+      }
 
       for (int i = 0; i < l; i++)
-        {
+      {
         // write the DICOM series with the compiler
         fname = a->GetValue(i);
         char outpath[128];
@@ -119,10 +125,10 @@ int main(int argc, char *argv[])
         const char *instanceUID = data->GetAttributeValue(
           i, DC::SOPInstanceUID).GetCharData();
         if (instanceUID == 0)
-          {
+        {
           instanceUID = data->GetAttributeValue(
             i, DC::MediaStorageSOPInstanceUID).GetCharData();
-          }
+        }
         compiler->SetSOPInstanceUID(instanceUID);
         compiler->SetTransferSyntaxUID(data->GetAttributeValue(
           i, DC::TransferSyntaxUID).GetCharData());
@@ -138,7 +144,7 @@ int main(int argc, char *argv[])
         compiler->WriteHeader();
 
         if (parser->GetPixelDataFound())
-          {
+        {
           vtkTypeInt64 tp[2];
           offsetArray->GetTupleValue(i, tp);
 
@@ -154,50 +160,50 @@ int main(int argc, char *argv[])
           compiler->WritePixelData(
             reinterpret_cast<unsigned char *>(buffer), size - offset);
           delete [] buffer;
-          }
+        }
 
         compiler->Close();
 
         // compare the md5 hash
         char hash[2][40];
         for (int jj = 0; jj < 2; jj++)
-          {
+        {
           const char *fileToHash = outpath;
           if (jj == 0)
-            {
+          {
             fileToHash = fname.c_str();
-            }
+          }
           vtksysMD5* hasher = vtksysMD5_New();
           vtksysMD5_Initialize(hasher);
 
           char hashbuf[8192];
           std::ifstream f(fileToHash, ios::in | ios::binary);
           while (f.good())
-            {
+          {
             f.read(hashbuf, static_cast<std::streamsize>(sizeof(hashbuf)));
             std::streamsize c = f.gcount();
             vtksysMD5_Append(
               hasher, reinterpret_cast<unsigned char *>(hashbuf), c);
-            }
+          }
 
           vtksysMD5_FinalizeHex(hasher, hash[jj]);
           hash[jj][32] = '\0';
           vtksysMD5_Delete(hasher);
-          }
+        }
 
         if (strncmp(hash[0], hash[1], 32) != 0)
-          {
+        {
           std::cerr << "Hash mismatch!\n";
           std::cerr << hash[0] << " " << fname.c_str() << "\n";
           std::cerr << hash[1] << " " << outpath << "\n";
-          }
+        }
         else
-          {
+        {
           std::cerr << "Matched for " << fname.c_str() << "\n";
-          }
         }
       }
     }
+  }
 
   return rval;
 }
diff --git a/Examples/TestDICOMDirectory.cxx b/Examples/TestDICOMDirectory.cxx
index f4c3293..d2ced52 100644
--- a/Examples/TestDICOMDirectory.cxx
+++ b/Examples/TestDICOMDirectory.cxx
@@ -36,18 +36,18 @@ int main(int argc, char *argv[])
     vtkSmartPointer<vtkDICOMDirectory>::New();
 
   if (argc < 2 || argc > 3)
-    {
+  {
     cout << "usage: " << exename << " <directory_name> [depth]" << endl;
     exit(0);
-    }
+  }
 
   const char *dirname = argv[1];
 
   int depth = 1;
   if (argc > 2)
-    {
+  {
     depth = static_cast<int>(atol(argv[2]));
-    }
+  }
 
   ddir->SetDirectoryName(dirname);
   ddir->SetScanDepth(depth);
@@ -55,18 +55,18 @@ int main(int argc, char *argv[])
 
   int n = ddir->GetNumberOfPatients();
   for (int i = 0; i < n; i++)
-    {
+  {
     const vtkDICOMItem& patientItem = ddir->GetPatientRecord(i);
     cout << "Patient " << i << ": "
          << patientItem.GetAttributeValue(DC::PatientID).AsString() << "\n";
     vtkIntArray *studies = ddir->GetStudiesForPatient(i);
     vtkIdType m = studies->GetMaxId() + 1;
     if (i == n-1 && m > 0)
-      {
+    {
       TestAssert(studies->GetValue(m-1) == ddir->GetNumberOfStudies() - 1);
-      }
+    }
     for (vtkIdType jj = 0; jj < m; jj++)
-      {
+    {
       int j = studies->GetValue(jj);
       const vtkDICOMItem& studyItem = ddir->GetStudyRecord(j);
       const vtkDICOMItem& studyPItem = ddir->GetPatientRecordForStudy(j);
@@ -79,11 +79,11 @@ int main(int argc, char *argv[])
       int k0 = ddir->GetFirstSeriesForStudy(j);
       int k1 = ddir->GetLastSeriesForStudy(j);
       if (i == n-1 && jj == m-1)
-        {
+      {
         TestAssert(k1 == ddir->GetNumberOfSeries() - 1);
-        }
+      }
       for (int k = k0; k <= k1; k++)
-        {
+      {
         const vtkDICOMItem& seriesItem = ddir->GetSeriesRecord(k);
         cout << "  Series " << k << ": \""
              << seriesItem.GetAttributeValue(DC::SeriesDescription).AsString()
@@ -93,12 +93,12 @@ int main(int argc, char *argv[])
              << seriesItem.GetAttributeValue(DC::Modality).AsString() << "\n";
         vtkStringArray *a = ddir->GetFileNamesForSeries(k);
         for (vtkIdType kk = 0; kk < a->GetNumberOfValues(); kk++)
-          {
+        {
           cout << "   " << a->GetValue(kk) << "\n";
-          }
         }
       }
     }
+  }
 
   return rval;
 }
diff --git a/Examples/TestDICOMDisplay.cxx b/Examples/TestDICOMDisplay.cxx
index 3cb1a72..cbc58ec 100644
--- a/Examples/TestDICOMDisplay.cxx
+++ b/Examples/TestDICOMDisplay.cxx
@@ -42,19 +42,19 @@ int main(int argc, char *argv[])
   const char *stackID = 0;
 
   for (int i = 1; i < argc; i++)
-    {
+  {
     if (strcmp(argv[i], "--stack") == 0)
-      {
+    {
       if (i+1 < argc)
-        {
+      {
         stackID = argv[++i];
-        }
       }
+    }
     else
-      {
+    {
       files->InsertNextValue(argv[i]);
-      }
     }
+  }
 
   // find all DICOM files supplied by the user
   vtkSmartPointer<vtkDICOMDirectory> sorter =
@@ -69,19 +69,19 @@ int main(int argc, char *argv[])
   int seriesIdx = 0;
   int kmax = 0;
   for (int i = 0; i < m; i++)
-    {
+  {
     int fj = sorter->GetFirstSeriesForStudy(i);
     int lj = sorter->GetLastSeriesForStudy(i);
     for (int j = fj; j <= lj; j++)
-      {
+    {
       int k = sorter->GetFileNamesForSeries(j)->GetNumberOfValues();
       if (k > kmax)
-        {
+      {
         kmax = k;
         seriesIdx = j;
-        }
       }
     }
+  }
 
   // display the longest series
   vtkStringArray *a = sorter->GetFileNamesForSeries(seriesIdx);
@@ -93,9 +93,9 @@ int main(int argc, char *argv[])
   //reader->TimeAsVectorOn();
   //reader->SetDesiredTimeIndex(5);
   if (stackID)
-    {
+  {
     reader->SetDesiredStackID(stackID);
-    }
+  }
   reader->SetFileNames(a);
 
   double range[2];
@@ -103,9 +103,9 @@ int main(int argc, char *argv[])
   reader->Update();
 
   if (reader->GetErrorCode() != vtkErrorCode::NoError)
-    {
+  {
     return 1;
-    }
+  }
 
   reader->GetOutput()->GetScalarRange(range);
   reader->GetOutput()->GetExtent(extent);
@@ -137,13 +137,13 @@ int main(int argc, char *argv[])
   bool imageIs3D = (extent[5] > extent[4]);
 
   for (int i = 2*(imageIs3D == 0); i < 3; i++)
-    {
+  {
     vtkSmartPointer<vtkImageResliceMapper> imageMapper =
       vtkSmartPointer<vtkImageResliceMapper>::New();
     if (i < 3)
-      {
+    {
       imageMapper->SetInputConnection(portToDisplay);
-      }
+    }
     imageMapper->SliceFacesCameraOn();
     imageMapper->SliceAtFocalPointOn();
     imageMapper->ResampleToScreenPixelsOn();
@@ -161,9 +161,9 @@ int main(int argc, char *argv[])
     renderer->AddViewProp(image);
     renderer->SetBackground(0.0, 0.0, 0.0);
     if (imageIs3D)
-      {
+    {
       renderer->SetViewport(viewport[i]);
-      }
+    }
 
     renWin->AddRenderer(renderer);
 
@@ -175,58 +175,58 @@ int main(int argc, char *argv[])
     point[2] = 0.5*(bounds[4] + bounds[5]);
     double maxdim = 0.0;
     for (int j = 0; j < 3; j++)
-      {
+    {
       double s = 0.5*(bounds[2*j+1] - bounds[2*j]);
       maxdim = (s > maxdim ? s : maxdim);
-      }
+    }
 
     vtkCamera *camera = renderer->GetActiveCamera();
     camera->SetFocalPoint(point);
     point[i % 3] -= 500.0;
     camera->SetPosition(point);
     if ((i % 3) == 2)
-      {
+    {
       camera->SetViewUp(0.0, -1.0, 0.0);
-      }
+    }
     else
-      {
+    {
       camera->SetViewUp(0.0, 0.0, +1.0);
-      }
+    }
     camera->ParallelProjectionOn();
     camera->SetParallelScale(maxdim);
-    }
+  }
 
   if (imageIs3D)
-    {
+  {
     renWin->SetSize(600, 400);
-    }
+  }
   else
-    {
+  {
     renWin->SetSize(400, 400);
-    }
+  }
 
   renWin->Render();
 
   vtkStringArray *sarray = reader->GetStackIDs();
   if (sarray->GetNumberOfValues())
-    {
+  {
     cout << "StackIDs (choose one with --stack):";
     for (vtkIdType ii = 0; ii < sarray->GetNumberOfValues(); ii++)
-      {
+    {
       cout << " \"" << sarray->GetValue(ii) << "\"";
-      }
-    cout << "\n";
     }
+    cout << "\n";
+  }
   if (reader->GetTimeDimension() > 1)
-    {
+  {
     cout << "TimeDimension: " << reader->GetTimeDimension() << "\n";
     cout << "TimeSpacing: " << reader->GetTimeSpacing() << "\n";
-    }
+  }
   if (reader->GetFileIndexArray()->GetNumberOfComponents() > 1)
-    {
+  {
     cout << "VectorDimension: "
          << reader->GetFileIndexArray()->GetNumberOfComponents() << "\n";
-    }
+  }
 
   iren->Start();
 
diff --git a/Examples/TestDICOMFileSorter.cxx b/Examples/TestDICOMFileSorter.cxx
index e290872..9d4cd8b 100644
--- a/Examples/TestDICOMFileSorter.cxx
+++ b/Examples/TestDICOMFileSorter.cxx
@@ -36,29 +36,29 @@ int main(int argc, char *argv[])
     vtkSmartPointer<vtkStringArray>::New();
 
   for (int i = 1; i < argc; i++)
-    {
+  {
     files->InsertNextValue(argv[i]);
-    }
+  }
 
   sorter->SetInputFileNames(files);
   sorter->Update();
 
   int m = sorter->GetNumberOfStudies();
   for (int j = 0; j < m; j++)
-    {
+  {
     cout << "Study " << j << ":\n";
     int k = sorter->GetFirstSeriesForStudy(j);
     int kl = sorter->GetLastSeriesForStudy(j);
     for (; k <= kl; k++)
-      {
+    {
       cout << "  Series " << k << ":\n";
       vtkStringArray *a = sorter->GetFileNamesForSeries(k);
       for (vtkIdType kk = 0; kk < a->GetNumberOfValues(); kk++)
-        {
+      {
         cout << "    " << a->GetValue(kk) << "\n";
-        }
       }
     }
+  }
 
   return rval;
 }
diff --git a/Examples/TestDICOMParser.cxx b/Examples/TestDICOMParser.cxx
index 1bcc00c..8561993 100644
--- a/Examples/TestDICOMParser.cxx
+++ b/Examples/TestDICOMParser.cxx
@@ -31,7 +31,7 @@ int main(int argc, char *argv[])
     vtkSmartPointer<vtkDICOMParser>::New();
 
   for (int i = 1; i < argc; i++)
-    {
+  {
     cout << "=========== " << argv[i] << " =========\n";
 
     vtkSmartPointer<vtkDICOMMetaData> data =
@@ -41,7 +41,7 @@ int main(int argc, char *argv[])
     parser->SetMetaData(data);
 
     parser->Update();
-    }
+  }
 
   return rval;
 }
diff --git a/Examples/TestDICOMReader.cxx b/Examples/TestDICOMReader.cxx
index bcff48e..589beae 100644
--- a/Examples/TestDICOMReader.cxx
+++ b/Examples/TestDICOMReader.cxx
@@ -37,29 +37,29 @@ int main(int argc, char *argv[])
     vtkSmartPointer<vtkStringArray>::New();
 
   for (int i = 1; i < argc; i++)
-    {
+  {
     files->InsertNextValue(argv[i]);
-    }
+  }
 
   sorter->SetInputFileNames(files);
   sorter->Update();
 
   int m = sorter->GetNumberOfStudies();
   for (int j = 0; j < m; j++)
-    {
+  {
     cout << "Study" << j << ":\n";
     int k = sorter->GetFirstSeriesForStudy(j);
     int kl = sorter->GetLastSeriesForStudy(j);
     for (; k <= kl; k++)
-      {
+    {
       cout << "  Series " << k << ":\n";
       vtkStringArray *a = sorter->GetFileNamesForSeries(k);
       vtkDICOMReader *reader = vtkDICOMReader::New();
       reader->SetFileNames(a);
       reader->Update();
       reader->Delete();
-      }
     }
+  }
 
   return rval;
 }
diff --git a/Examples/TestDICOMRealWorldValue.cxx b/Examples/TestDICOMRealWorldValue.cxx
index 7fceca3..e8ca39c 100644
--- a/Examples/TestDICOMRealWorldValue.cxx
+++ b/Examples/TestDICOMRealWorldValue.cxx
@@ -41,9 +41,9 @@ int main(int argc, char *argv[])
     vtkSmartPointer<vtkStringArray>::New();
 
   for (int i = 1; i < argc; i++)
-    {
+  {
     files->InsertNextValue(argv[i]);
-    }
+  }
 
   sorter->SetInputFileNames(files);
   sorter->Update();
@@ -52,7 +52,7 @@ int main(int argc, char *argv[])
     vtkSmartPointer<vtkDICOMMetaData>::New();
 
   if (sorter->GetNumberOfSeries() > 0)
-    {
+  {
     // read the meta data from the supplied image
     vtkStringArray *a = sorter->GetFileNamesForSeries(0);
 
@@ -62,9 +62,9 @@ int main(int argc, char *argv[])
     reader->UpdateInformation();
 
     meta = reader->GetMetaData();
-    }
+  }
   else if (argc == 1)
-    {
+  {
     // create a real world value mapping sequence by hand
     // 1) use Unified Code for Units of Measure (UCUM), version 1.9
     // 2) the CodeMeaning should be a copy of CodeValue unless:
@@ -91,14 +91,14 @@ int main(int argc, char *argv[])
 
     meta->SetAttributeValue(DC::RealWorldValueMappingSequence,
       vtkDICOMValue(vtkDICOMVR::SQ, mappingItem));
-    }
+  }
   else
-    {
+  {
     cout << "The provided file is not DICOM!" << endl;
-    }
+  }
 
   if (meta->HasAttribute(DC::RealWorldValueMappingSequence))
-    {
+  {
     const vtkDICOMItem& mappingItem =
       meta->GetAttributeValue(DC::RealWorldValueMappingSequence).GetItem(0);
 
@@ -125,19 +125,19 @@ int main(int argc, char *argv[])
     cout << "and display the result with color table " << lutName << endl;
 
     if (argc == 1)
-      {
+    {
       TestAssert(range[0] == 0);
       TestAssert(range[1] == 4095);
       TestAssert(fabs(slope - 0.438) < 1e-16);
       TestAssert(fabs(inter - 0.234) < 1e-16);
       TestAssert(units == "m2/s");
       TestAssert(lutName == "HOT_METAL");
-      }
     }
+  }
   else
-    {
+  {
     cout << "Image has no real world value mapping!" << endl;
-    }
+  }
 
   return rval;
 }
diff --git a/Examples/TestDICOMWriter.cxx b/Examples/TestDICOMWriter.cxx
index 827e963..727b131 100644
--- a/Examples/TestDICOMWriter.cxx
+++ b/Examples/TestDICOMWriter.cxx
@@ -43,21 +43,21 @@ int main(int argc, char *argv[])
     vtkSmartPointer<vtkStringArray>::New();
 
   for (int i = 1; i < argc; i++)
-    {
+  {
     files->InsertNextValue(argv[i]);
-    }
+  }
 
   sorter->SetInputFileNames(files);
   sorter->Update();
 
   int m = sorter->GetNumberOfStudies();
   for (int j = 0; j < m; j++)
-    {
+  {
     cout << "Study" << j << ":\n";
     int k = sorter->GetFirstSeriesForStudy(j);
     int kl = sorter->GetLastSeriesForStudy(j);
     for (; k <= kl; k++)
-      {
+    {
       cout << "  Series " << k << ":\n";
       vtkStringArray *a = sorter->GetFileNamesForSeries(k);
 
@@ -81,8 +81,8 @@ int main(int argc, char *argv[])
       writer->SetFilePrefix("/tmp");
       writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");
       writer->Write();
-      }
     }
+  }
 
   return rval;
 }
diff --git a/Examples/TestNIFTIDisplay.cxx b/Examples/TestNIFTIDisplay.cxx
index bdc049d..92730f0 100644
--- a/Examples/TestNIFTIDisplay.cxx
+++ b/Examples/TestNIFTIDisplay.cxx
@@ -32,9 +32,9 @@ int main(int argc, char *argv[])
 
   const char *filename = 0;
   if (argc > 1)
-    {
+  {
     filename = argv[1];
-    }
+  }
 
   vtkSmartPointer<vtkNIFTIReader> reader =
     vtkSmartPointer<vtkNIFTIReader>::New();
@@ -42,22 +42,22 @@ int main(int argc, char *argv[])
   reader->Update();
 
   if (reader->GetErrorCode() != vtkErrorCode::NoError)
-    {
+  {
     return 1;
-    }
+  }
 
   vtkSmartPointer<vtkMatrix4x4> matrix =
     vtkSmartPointer<vtkMatrix4x4>::New();
   if (reader->GetQFormMatrix())
-    {
+  {
     matrix->DeepCopy(reader->GetQFormMatrix());
     matrix->Invert();
-    }
+  }
   else if (reader->GetSFormMatrix())
-    {
+  {
     matrix->DeepCopy(reader->GetSFormMatrix());
     matrix->Invert();
-    }
+  }
 
   vtkSmartPointer<vtkImageReslice> reslice =
     vtkSmartPointer<vtkImageReslice>::New();
@@ -81,13 +81,13 @@ int main(int argc, char *argv[])
   bool imageIs3D = (extent[5] > extent[4]);
 
   for (int i = 2*(imageIs3D == 0); i < 3; i++)
-    {
+  {
     vtkSmartPointer<vtkImageSliceMapper> imageMapper =
       vtkSmartPointer<vtkImageSliceMapper>::New();
     if (i < 3)
-      {
+    {
       imageMapper->SetInputConnection(reslice->GetOutputPort());
-      }
+    }
     imageMapper->SetOrientation(i % 3);
     imageMapper->SliceAtFocalPointOn();
 
@@ -104,9 +104,9 @@ int main(int argc, char *argv[])
     renderer->AddViewProp(image);
     renderer->SetBackground(0.0, 0.0, 0.0);
     if (imageIs3D)
-      {
+    {
       renderer->SetViewport(viewport[i]);
-      }
+    }
 
     renWin->AddRenderer(renderer);
 
@@ -118,36 +118,36 @@ int main(int argc, char *argv[])
     point[2] = 0.5*(bounds[4] + bounds[5]);
     double maxdim = 0.0;
     for (int j = 0; j < 3; j++)
-      {
+    {
       double s = 0.5*(bounds[2*j+1] - bounds[2*j]);
       maxdim = (s > maxdim ? s : maxdim);
-      }
+    }
 
     vtkCamera *camera = renderer->GetActiveCamera();
     camera->SetFocalPoint(point);
     if (imageMapper->GetOrientation() == 2)
-      {
+    {
       point[imageMapper->GetOrientation()] -= 500.0;
       camera->SetViewUp(0.0, +1.0, 0.0);
-      }
+    }
     else
-      {
+    {
       point[imageMapper->GetOrientation()] += 500.0;
       camera->SetViewUp(0.0, 0.0, +1.0);
-      }
+    }
     camera->SetPosition(point);
     camera->ParallelProjectionOn();
     camera->SetParallelScale(maxdim);
-    }
+  }
 
   if (imageIs3D)
-    {
+  {
     renWin->SetSize(600, 400);
-    }
+  }
   else
-    {
+  {
     renWin->SetSize(400, 400);
-    }
+  }
 
   renWin->Render();
   iren->Start();
diff --git a/Examples/TestScancoCTDisplay.cxx b/Examples/TestScancoCTDisplay.cxx
index 13b1e98..66c953a 100644
--- a/Examples/TestScancoCTDisplay.cxx
+++ b/Examples/TestScancoCTDisplay.cxx
@@ -31,9 +31,9 @@ int main(int argc, char *argv[])
 
   const char *filename = 0;
   if (argc > 1)
-    {
+  {
     filename = argv[1];
-    }
+  }
 
   vtkSmartPointer<vtkScancoCTReader> reader =
     vtkSmartPointer<vtkScancoCTReader>::New();
@@ -41,9 +41,9 @@ int main(int argc, char *argv[])
   reader->Update();
 
   if (reader->GetErrorCode() != vtkErrorCode::NoError)
-    {
+  {
     return 1;
-    }
+  }
 
   double range[2];
   int extent[6];
@@ -60,13 +60,13 @@ int main(int argc, char *argv[])
   bool imageIs3D = (extent[5] > extent[4]);
 
   for (int i = 2*(imageIs3D == 0); i < 3; i++)
-    {
+  {
     vtkSmartPointer<vtkImageSliceMapper> imageMapper =
       vtkSmartPointer<vtkImageSliceMapper>::New();
     if (i < 3)
-      {
+    {
       imageMapper->SetInputConnection(reader->GetOutputPort());
-      }
+    }
     imageMapper->SetOrientation(i % 3);
     imageMapper->SliceAtFocalPointOn();
 
@@ -83,9 +83,9 @@ int main(int argc, char *argv[])
     renderer->AddViewProp(image);
     renderer->SetBackground(0.0, 0.0, 0.0);
     if (imageIs3D)
-      {
+    {
       renderer->SetViewport(viewport[i]);
-      }
+    }
 
     renWin->AddRenderer(renderer);
 
@@ -97,42 +97,42 @@ int main(int argc, char *argv[])
     point[2] = 0.5*(bounds[4] + bounds[5]);
     double maxdim = 0.0;
     for (int j = 0; j < 3; j++)
-      {
+    {
       double s = 0.5*(bounds[2*j+1] - bounds[2*j]);
       maxdim = (s > maxdim ? s : maxdim);
-      }
+    }
 
     vtkCamera *camera = renderer->GetActiveCamera();
     camera->SetFocalPoint(point);
     if ((i % 3) == 0)
-      {
+    {
       point[i % 3] -= 500.0;
-      }
+    }
     else
-      {
+    {
       point[i % 3] += 500.0;
-      }
+    }
     camera->SetPosition(point);
     if ((i % 3) == 2)
-      {
+    {
       camera->SetViewUp(0.0, +1.0, 0.0);
-      }
+    }
     else
-      {
+    {
       camera->SetViewUp(0.0, 0.0, -1.0);
-      }
+    }
     camera->ParallelProjectionOn();
     camera->SetParallelScale(maxdim);
-    }
+  }
 
   if (imageIs3D)
-    {
+  {
     renWin->SetSize(600, 400);
-    }
+  }
   else
-    {
+  {
     renWin->SetSize(400, 400);
-    }
+  }
 
   renWin->Render();
   iren->Start();
diff --git a/Programs/CMakeLists.txt b/Programs/CMakeLists.txt
index 02eed08..a364f6e 100644
--- a/Programs/CMakeLists.txt
+++ b/Programs/CMakeLists.txt
@@ -24,9 +24,6 @@ else()
 endif()
 
 set(BASE_LIBS vtkDICOM ${VTK_LIBS})
-if(USE_DCMTK AND DCMTK_charls_LIBRARY)
- set(BASE_LIBS ${BASE_LIBS} ${DCMTK_charls_LIBRARY})
-endif()
 
 set(CLI_LIBS dicomcli)
 
diff --git a/Programs/dicomdump.cxx b/Programs/dicomdump.cxx
index 0c648c9..0ceb3a6 100644
--- a/Programs/dicomdump.cxx
+++ b/Programs/dicomdump.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -21,6 +21,7 @@
 #include "vtkDICOMUtilities.h"
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 #include "readquery.h"
 
@@ -32,10 +33,6 @@
 #include <string.h>
 #include <stdlib.h>
 
-#if defined(_WIN32)
-#include <windows.h>
-#endif
-
 #define MAX_INDENT 24
 #define INDENT_SIZE 2
 #define MAX_LENGTH 120
@@ -45,7 +42,7 @@ void printVersion(FILE *file, const char *cp)
 {
   fprintf(file, "%s %s\n", cp, DICOM_VERSION);
   fprintf(file, "\n"
-    "Copyright (c) 2012-2015, David Gobbi.\n\n"
+    "Copyright (c) 2012-2016, David Gobbi.\n\n"
     "This software is distributed under an open-source license.  See the\n"
     "Copyright.txt file that comes with the vtk-dicom source distribution.\n");
 }
@@ -99,158 +96,159 @@ void printElement(
   const char *name = "";
   vtkDICOMDictEntry d;
   if (item)
-    {
+  {
     d = item->FindDictEntry(tag);
-    }
+  }
   else if (meta)
-    {
+  {
     d = meta->FindDictEntry(tag);
-    }
+  }
   if (d.IsValid())
-    {
+  {
     name = d.GetName();
     if (d.GetVR() != vr &&
         !(d.GetVR() == vtkDICOMVR::XS &&
           (vr == vtkDICOMVR::SS || vr == vtkDICOMVR::US)) &&
         !(d.GetVR() == vtkDICOMVR::OX &&
           (vr == vtkDICOMVR::OB || vr == vtkDICOMVR::OW)))
-      {
+    {
       printf("VR mismatch! %s != %s %s\n",
              vr.GetText(), d.GetVR().GetText(), name);
-      }
     }
+  }
   else if ((tag.GetGroup() & 0xFFFE) != 0 && tag.GetElement() == 0)
-    {
+  {
     // group is even, element is zero
     name = "GroupLength";
-    }
+  }
   else if ((tag.GetGroup() & 0x0001) != 0 &&
            (tag.GetElement() & 0xFF00) == 0)
-    {
+  {
     // group is odd, element is a creator element
     name = "PrivateCreator";
-    }
+  }
   // allow multiple values (i.e. for each image in series)
   vtkDICOMValue v = iter->GetValue();
-  unsigned int vn = v.GetNumberOfValues();
+  size_t vn = v.GetNumberOfValues();
   const vtkDICOMValue *vp = v.GetMultiplexData();
   if (vp == 0)
-    {
+  {
     vp = &v;
     vn = 1;
-    }
+  }
 
   // make an indentation string
   if (INDENT_SIZE*depth > MAX_INDENT)
-    {
+  {
     depth = MAX_INDENT/INDENT_SIZE;
-    }
+  }
   static const char spaces[MAX_INDENT+1] = "                        ";
   const char *indent = spaces + (MAX_INDENT - INDENT_SIZE*depth);
 
-  for (unsigned int vi = 0; vi < vn; vi++)
-    {
+  for (size_t vi = 0; vi < vn; vi++)
+  {
     v = vp[vi];
     unsigned int vl = v.GetVL();
     if (tag == DC::PixelData ||
         tag == DC::FloatPixelData ||
         tag == DC::DoubleFloatPixelData)
-      {
+    {
       vl = (depth == 0 && vl == 0 ? pixelDataVL : v.GetVL());
-      }
+    }
     std::string s;
     if (vr == vtkDICOMVR::UN ||
         vr == vtkDICOMVR::SQ)
-      {
+    {
       // sequences are printed later
       s = (vl > 0 ? "..." : "");
-      }
+    }
     else if (vr == vtkDICOMVR::LT ||
              vr == vtkDICOMVR::ST ||
              vr == vtkDICOMVR::UT)
-      {
+    {
       // replace breaks with "\\", cap length to MAX_LENGTH
       size_t l = (vl > MAX_LENGTH ? MAX_LENGTH-4 : vl);
       const char *cp = v.GetCharData();
       std::string utf8;
       if (v.GetCharacterSet() != vtkDICOMCharacterSet::ISO_IR_6)
-        {
+      {
         utf8 = v.GetCharacterSet().ConvertToUTF8(cp, l);
         l = utf8.length();
         cp = utf8.data();
-        }
+      }
       size_t j = 0;
       while (j < l && cp[j] != '\0')
-        {
+      {
         size_t k = j;
         size_t m = j;
         for (; j < l && cp[j] != '\0'; j++)
-          {
+        {
           m = j;
           if (cp[j] == '\r' || cp[j] == '\n' || cp[j] == '\f')
-            {
+          {
             do { j++; }
             while (j < l && (cp[j] == '\r' || cp[j] == '\n' || cp[j] == '\f'));
             break;
-            }
-          m++;
           }
+          m++;
+        }
         if (j == l)
-          {
+        {
           while (m > 0 && cp[m-1] == ' ') { m--; }
-          }
+        }
         if (k != 0)
-          {
+        {
           s.append("\\\\");
-          }
+        }
         s.append(&cp[k], m-k);
         if (vl > MAX_LENGTH)
-          {
+        {
           s.append("...");
           break;
-          }
         }
       }
+    }
     else
-      {
+    {
       // print any other VR via conversion to string
-      unsigned int n = v.GetNumberOfValues();
+      size_t n = v.GetNumberOfValues();
       size_t pos = 0;
-      for (unsigned int i = 0; i < n; i++)
-        {
+      for (size_t i = 0; i < n; i++)
+      {
         v.AppendValueToUTF8String(s, i);
         if (i < n - 1)
-          {
+        {
           s.append("\\");
-          }
+        }
         if (s.size() > MAX_LENGTH-4)
-          {
+        {
           s.resize(pos);
           s.append("...");
           break;
-          }
-        pos = s.size();
         }
+        pos = s.size();
       }
+    }
 
     if (meta && vi == 0)
-      {
+    {
       printf("%s(%04X,%04X) %s \"%s\" :", indent, g, e, vr.GetText(), name);
-      }
+    }
     if (meta && vn > 1)
-      {
+    {
       printf("%s%s  %4.4u",
-        (vi == 0 ? " (multiple values)\n" : ""), indent, vi + 1);
-      }
+        (vi == 0 ? " (multiple values)\n" : ""), indent,
+        static_cast<unsigned int>(vi + 1));
+    }
     if (vr == vtkDICOMVR::SQ)
-      {
+    {
       size_t m = v.GetNumberOfValues();
       const vtkDICOMItem *items = v.GetSequenceData();
       printf(" (%u %s%s)\n",
         static_cast<unsigned int>(m), (m == 1 ? "item" : "items"),
         (vl == 0xffffffffu ? ", delimited" : ""));
       for (size_t j = 0; j < m; j++)
-        {
+      {
         printf("%s%s---- SQ Item %04u at offset %u ----\n",
           indent, spaces+(MAX_INDENT - INDENT_SIZE),
           static_cast<unsigned int>(j+1),
@@ -259,48 +257,48 @@ void printElement(
         vtkDICOMDataElementIterator siterEnd = items[j].End();
 
         for (; siter != siterEnd; ++siter)
-          {
+        {
           printElement(meta, &items[j], siter, depth+1, pixelDataVL);
-          }
         }
       }
+    }
     else if (vl == 0xffffffffu)
-      {
+    {
       if (tag == DC::PixelData ||
           tag == DC::FloatPixelData ||
           tag == DC::DoubleFloatPixelData)
-        {
+      {
         printf(" [...] (compressed)\n");
-        }
+      }
       else
-        {
+      {
         printf(" [...] (delimited)\n");
-        }
       }
+    }
     else
-      {
+    {
       const char *uidName = "";
       if (vr == vtkDICOMVR::UI)
-        {
+      {
         uidName = vtkDICOMUtilities::GetUIDName(s.c_str());
-        }
+      }
       if (uidName[0] != '\0')
-        {
+      {
         printf(" [%s] {%s} (%u bytes)\n", s.c_str(), uidName, vl);
-        }
+      }
       else if (vr == vtkDICOMVR::OB ||
                vr == vtkDICOMVR::OW ||
                vr == vtkDICOMVR::OF ||
                vr == vtkDICOMVR::OD)
-        {
+      {
         printf(" [%s] (%u bytes)\n", (vl == 0 ? "" : "..."), vl);
-        }
+      }
       else
-        {
+      {
         printf(" [%s] (%u bytes)\n", s.c_str(), vl);
-        }
       }
     }
+  }
 }
 
 void printElementFromTagPathRecurse(
@@ -311,32 +309,32 @@ void printElementFromTagPathRecurse(
 
   vtkDICOMDataElementIterator iter = item->Begin();
   while (iter != item->End() && iter->GetTag() != tag)
-    {
+  {
     ++iter;
-    }
+  }
 
   if (iter != item->End())
-    {
+  {
     if (tagPath.HasTail())
-      {
+    {
       const vtkDICOMItem *items = iter->GetValue().GetSequenceData();
       if (items)
-        {
+      {
         size_t n = iter->GetValue().GetNumberOfValues();
         for (size_t i = 0; i < n; i++)
-          {
+        {
           printElementFromTagPathRecurse(
             &items[i], tagPath.GetTail(), fullPath, count);
-          }
         }
       }
+    }
     else
-      {
+    {
       ++(*count);
       fprintf(stdout, "  %04d", *count);
       printElement(0, item, iter, 0, 0);
-      }
     }
+  }
 }
 
 void printElementFromTagPath(
@@ -347,19 +345,19 @@ void printElementFromTagPath(
   vtkDICOMTag tag = tagPath.GetHead();
   vtkDICOMDataElementIterator iter = data->Find(tag);
   if (iter != data->End())
-    {
+  {
     if (tagPath.HasTail())
-      {
+    {
       for (vtkDICOMTagPath p = tagPath; ; p = p.GetTail())
-        {
+      {
         int g = p.GetHead().GetGroup();
         int e = p.GetHead().GetElement();
         if (p.HasTail())
-          {
+        {
           printf("(%04X,%04X)\\", g, e);
-          }
+        }
         else
-          {
+        {
           vtkDICOMDictEntry entry =
             vtkDICOMDictionary::FindDictEntry(p.GetHead());
           vtkDICOMVR vr = entry.GetVR();
@@ -368,48 +366,51 @@ void printElementFromTagPath(
           printf("(%04X,%04X) %s \"%s\" : (nested)\n",
             g, e, vr.GetText(), name);
           break;
-          }
         }
+      }
       if (iter->IsPerInstance())
-        {
+      {
         for (int j = 0; j < iter->GetNumberOfInstances(); j++)
-          {
+        {
           const vtkDICOMItem *items = iter->GetValue(j).GetSequenceData();
           if (items)
-            {
+          {
             size_t n = iter->GetValue().GetNumberOfValues();
             for (size_t i = 0; i < n; i++)
-              {
+            {
               printElementFromTagPathRecurse(
                 &items[i], tagPath.GetTail(), tagPath, &count);
-              }
             }
           }
         }
+      }
       else
-        {
+      {
         const vtkDICOMItem *items = iter->GetValue().GetSequenceData();
         if (items)
-          {
+        {
           size_t n = iter->GetValue().GetNumberOfValues();
           for (size_t i = 0; i < n; i++)
-            {
+          {
             printElementFromTagPathRecurse(
               &items[i], tagPath.GetTail(), tagPath, &count);
-            }
           }
         }
       }
+    }
     else
-      {
+    {
       printElement(data, 0, iter, 0, pixelDataVL);
-      }
     }
+  }
 }
 
 // This program will dump all the metadata in the given file
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   int rval = 0;
 
   // for the optional query file
@@ -417,77 +418,77 @@ MAINMACRO(argc, argv)
   vtkDICOMItem query;
 
   if (argc < 2)
-    {
+  {
     printUsage(stdout, fileBasename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--help") == 0)
-    {
+  {
     printHelp(stdout, fileBasename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--version") == 0)
-    {
+  {
     printVersion(stdout, fileBasename(argv[0]));
     return rval;
-    }
+  }
 
   vtkSmartPointer<vtkStringArray> files =
     vtkSmartPointer<vtkStringArray>::New();
 
   for (int argi = 1; argi < argc; argi++)
-    {
+  {
     const char *arg = argv[argi];
     if (strcmp(arg, "-q") == 0 || strcmp(arg, "-o") == 0)
-      {
+    {
       if (argi + 1 == argc || argv[argi+1][0] == '-')
-        {
+      {
         fprintf(stderr, "%s must be followed by a file.\n\n", arg);
         printUsage(stderr, fileBasename(argv[0]));
         return 1;
-        }
+      }
 
       if (arg[1] == 'q')
-        {
+      {
         const char *qfile = argv[++argi];
         if (!dicomcli_readquery(qfile, &query, &qtlist))
-          {
+        {
           fprintf(stderr, "Can't read query file %s\n\n", qfile);
           return 1;
-          }
         }
+      }
       else if (arg[1] == 'o')
-        {
+      {
         fprintf(stderr, "unrecognized option %s.\n\n", arg);
         return 1;
-        }
       }
+    }
     else if (strcmp(arg, "-k") == 0)
-      {
+    {
       vtkDICOMTag tag;
       ++argi;
       if (argi == argc)
-        {
+      {
         fprintf(stderr, "%s must be followed by gggg,eeee=value "
                         "where gggg,eeee is a DICOM tag.\n\n", arg);
         return 1;
-        }
+      }
       if (!dicomcli_readkey(argv[argi], &query, &qtlist))
-        {
+      {
         return 1;
-        }
       }
+    }
     else if (arg[0] == '-')
-      {
+    {
       fprintf(stderr, "unrecognized option %s.\n\n", arg);
       printUsage(stderr, fileBasename(argv[0]));
       return 1;
-      }
+    }
     else
-      {
+    {
       files->InsertNextValue(arg);
-      }
     }
+  }
 
   // sort the files by study and series
   vtkSmartPointer<vtkDICOMDirectory> sorter =
@@ -505,28 +506,22 @@ MAINMACRO(argc, argv)
     vtkSmartPointer<vtkDICOMMetaData>::New();
   parser->SetMetaData(data);
 
-#if defined(_WIN32)
-  // Temporarily switch the console to utf-8
-  UINT codePage = GetConsoleOutputCP();
-  SetConsoleOutputCP(65001);
-#endif
-
   int m = sorter->GetNumberOfStudies();
   for (int j = 0; j < m; j++)
-    {
+  {
     int k = sorter->GetFirstSeriesForStudy(j);
     int kl = sorter->GetLastSeriesForStudy(j);
     for (; k <= kl; k++)
-      {
+    {
       vtkStringArray *a = sorter->GetFileNamesForSeries(k);
       vtkIdType l = a->GetNumberOfValues();
       std::string fname = a->GetValue(0);
       if (l == 1)
-        {
+      {
         printf("==== %s ====\n", fname.c_str());
-        }
+      }
       else
-        {
+      {
         // print the first and last filenames (sorted)
         vtkSmartPointer<vtkSortFileNames> fsort =
           vtkSmartPointer<vtkSortFileNames>::New();
@@ -539,45 +534,40 @@ MAINMACRO(argc, argv)
           fsort->GetFileNames()->GetValue(0).c_str(),
           fileBasename(fsort->GetFileNames()->GetValue(l-1).c_str()),
           static_cast<int>(l));
-        }
+      }
 
       data->Clear();
       data->SetNumberOfInstances(static_cast<int>(l));
 
       unsigned int pixelDataVL = 0;
       for (vtkIdType i = 0; i < l; i++)
-        {
+      {
         fname = a->GetValue(i);
         parser->SetIndex(i);
         parser->SetFileName(fname.c_str());
         parser->Update();
         pixelDataVL = parser->GetPixelDataVL();
-        }
+      }
 
       if (query.GetNumberOfDataElements() > 0)
-        {
+      {
         for (size_t i = 0; i < qtlist.size(); i++)
-          {
+        {
           printElementFromTagPath(data, qtlist[i], pixelDataVL);
-          }
         }
+      }
       else
-        {
+      {
         vtkDICOMDataElementIterator iter = data->Begin();
         vtkDICOMDataElementIterator iterEnd = data->End();
 
         for (; iter != iterEnd; ++iter)
-          {
+        {
           printElement(data, 0, iter, 0, pixelDataVL);
-          }
         }
       }
     }
-
-#if defined(_WIN32)
-  // Restore the console code page
-  SetConsoleOutputCP(codePage);
-#endif
+  }
 
   return rval;
 }
diff --git a/Programs/dicomfind.cxx b/Programs/dicomfind.cxx
index 9ac430f..5ad2ceb 100644
--- a/Programs/dicomfind.cxx
+++ b/Programs/dicomfind.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -20,6 +20,7 @@
 #include "vtkDICOMMetaData.h"
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 #include "readquery.h"
 
@@ -33,6 +34,7 @@
 #include <errno.h>
 #else
 // includes for spawn
+#include <windows.h>
 #include <process.h>
 #include <errno.h>
 // include for getcwd
@@ -44,14 +46,13 @@
 #include <stdlib.h>
 
 #include <limits>
-#include <iostream>
 
 // print the version
 void dicomfind_version(FILE *file, const char *cp)
 {
   fprintf(file, "%s %s\n", cp, DICOM_VERSION);
   fprintf(file, "\n"
-    "Copyright (c) 2012-2015, David Gobbi.\n\n"
+    "Copyright (c) 2012-2016, David Gobbi.\n\n"
     "This software is distributed under an open-source license.  See the\n"
     "Copyright.txt file that comes with the vtk-dicom source distribution.\n");
 }
@@ -66,6 +67,7 @@ void dicomfind_usage(FILE *file, const char *cp)
     "  -P              Do not follow symbolic links.\n"
     "  -k tag=value    Provide an attribute to be queried and matched.\n"
     "  -q <query.txt>  Provide a file to describe the find query.\n"
+    "  -u <uids.txt>   Provide a file that contains a list of UIDs.\n"
     "  -maxdepth n     Set the maximum directory depth.\n"
     "  -name pattern   Set a pattern to match (with \"*\" or \"?\").\n"
     "  -image          Restrict the search to files with PixelData.\n"
@@ -127,10 +129,10 @@ std::string dicomfind_dirname(const char *filename)
 {
   const char *cp = filename + strlen(filename);
   while (cp != filename)
-    {
+  {
     --cp;
     if (cp[0] == '\\' || cp[0] == '/') { break; }
-    }
+  }
   return std::string(filename, cp - filename);
 }
 
@@ -147,105 +149,130 @@ bool execute_command(const char *command, char *argv[])
   // fork a new process
   pid_t command_pid = fork();
   if (command_pid == -1)
-    {
+  {
     fprintf(stderr, "Unable to create subprocess: %s\n", argv[0]);
-    }
+  }
 
   // if fork() returned a pid, then this is the original process
   if (command_pid != 0)
-    {
+  {
     int command_status;
     while (waitpid(command_pid, &command_status, 0) == static_cast<pid_t>(-1))
-      {
+    {
       if (errno != EINTR)
-        {
+      {
         fprintf(stderr, "Unknown error with subprocess: %s\n", argv[0]);
         return false;
-        }
       }
+    }
     if (WIFEXITED(command_status))
-      {
+    {
       if (WEXITSTATUS(command_status) != 0)
-        {
+      {
         fprintf(stderr, "Subprocess returned negative result: %s\n", argv[0]);
-        }
-      return true;
       }
+      return true;
+    }
     else
-      {
+    {
       fprintf(stderr, "Abnormal subprocess termination: %s\n", argv[0]);
-      }
     }
+  }
   else if (execvp(command, argv) == -1)
-    {
+  {
     if (errno == ENOENT)
-      {
+    {
       fprintf(stderr, "Executable not found: %s\n", argv[0]);
-      }
+    }
     else if (errno == ENOEXEC)
-      {
+    {
       fprintf(stderr, "File is not executable: %s\n", argv[0]);
-      }
+    }
     else if (errno == EACCES)
-      {
+    {
       fprintf(stderr, "Access (permission) error: %s\n", argv[0]);
-      }
+    }
     else if (errno == E2BIG)
-      {
+    {
       fprintf(stderr, "Command line to long for command: %s\n", argv[0]);
-      }
+    }
     else if (errno == ENOMEM)
-      {
+    {
       fprintf(stderr, "Out of memory while running command: %s\n", argv[0]);
-      }
+    }
     else if (errno == EMFILE)
-      {
+    {
       fprintf(stderr, "No more available file handles: %s\n", argv[0]);
-      }
+    }
     else
-      {
+    {
       fprintf(stderr, "Unknown error while running command: %s\n", argv[0]);
-      }
+    }
 
     return false;
-    }
+  }
 
   return true;
 }
 #else
-bool execute_command(const char *command, char *argv[])
+bool execute_command(const char *, char *argv[])
 {
+  bool rval = true;
+
   // flush the output
   fflush(stdout);
   fflush(stderr);
 
-  if (_spawnvp(_P_WAIT, command, argv) != 0)
-    {
+  int m = 0;
+  while (argv[m] != 0)
+  {
+    m++;
+  }
+
+  wchar_t **wargv = new wchar_t *[m + 1];
+
+  for (int i = 0; i < m; i++)
+  {
+    int n = MultiByteToWideChar(CP_UTF8, 0, argv[i], -1, NULL, 0);
+    wargv[i] = new wchar_t[n];
+    MultiByteToWideChar(CP_UTF8, 0, argv[i], -1, wargv[i], n);
+  }
+
+  wargv[m] = 0;
+
+  if (_wspawnvp(_P_WAIT, wargv[0], wargv) != 0)
+  {
     if (errno == ENOENT)
-      {
+    {
       fprintf(stderr, "Executable not found: %s\n", argv[0]);
-      }
+    }
     else if (errno == ENOEXEC)
-      {
+    {
       fprintf(stderr, "File is not executable: %s\n", argv[0]);
-      }
+    }
     else if (errno == E2BIG)
-      {
+    {
       fprintf(stderr, "Command line to long for command: %s\n", argv[0]);
-      }
+    }
     else if (errno == ENOMEM)
-      {
+    {
       fprintf(stderr, "Out of memory while running command: %s\n", argv[0]);
-      }
+    }
     else
-      {
+    {
       fprintf(stderr, "Unknown error while running command: %s\n", argv[0]);
-      }
-
-    return false;
     }
 
-  return true;
+    rval = false;
+  }
+
+  for (int i = 0; i < m; i++)
+  {
+    delete [] wargv[i];
+  }
+  delete [] wargv;
+
+  return rval;
 }
 #endif
 
@@ -258,7 +285,12 @@ int dicomfind_chdir(const char *dirname)
 int dicomfind_chdir(const char *dirname)
 {
   // use _wchdir to allow paths longer than the 260 char limit
-  return _chdir(dirname);
+  int n = MultiByteToWideChar(CP_UTF8, 0, dirname, -1, NULL, 0);
+  wchar_t *wp = new wchar_t[n];
+  MultiByteToWideChar(CP_UTF8, 0, dirname, -1, wp, n);
+  int rval = _wchdir(wp);
+  delete [] wp;
+  return rval;
 }
 #endif
 
@@ -271,8 +303,16 @@ std::string dicomfind_getcwd()
 #else
 std::string dicomfind_getcwd()
 {
-  char buffer[2048];
-  return _getcwd(buffer, sizeof(buffer));
+  wchar_t wbuffer[2048];
+  wchar_t *wp = _wgetcwd(wbuffer, sizeof(wbuffer)/sizeof(wchar_t));
+  int n = WideCharToMultiByte(
+    CP_UTF8, 0, wp, -1, NULL, 0, NULL, NULL);
+  char *cp = new char[n];
+  WideCharToMultiByte(
+    CP_UTF8, 0, wp, -1, cp, n, NULL, NULL);
+  std::string s = cp;
+  delete [] cp;
+  return s;
 }
 #endif
 
@@ -293,89 +333,99 @@ void dicomfind_operations(
   for (std::vector<Operation>::iterator op = operationList.begin();
        op != operationList.end();
        ++op)
-    {
+  {
     if (op->Type == "-print" || op->Type == "-print0")
-      {
+    {
       char endchar = (op->Type == "-print0" ? '\0' : '\n');
       for (int kk = 0; kk < sa->GetNumberOfValues(); kk++)
-        {
-        std::cout << sa->GetValue(kk);
-        std::cout.put(endchar);
-        }
-      std::cout.flush();
+      {
+        fprintf(stdout, "%s", sa->GetValue(kk).c_str());
+        fputc(endchar, stdout);
       }
+      fflush(stdout);
+    }
     else if (op->Type == "-exec" || op->Type == "-execdir")
-      {
+    {
       bool execdir = (op->Type == "-execdir");
 
       // Count the number of times {} appears in exec args
       size_t subcount = 0;
       for (size_t jj = 0; jj < op->Args.size(); jj++)
-        {
-        subcount += (op->Args[jj] == "{}");
-        }
+      {
+        subcount += (op->Args[jj].find("{}") != std::string::npos);
+      }
 
       // remember the current subdirectory
       std::string currentSubdir;
 
       if (op->Args.back() == ";")
-        {
+      {
         // call program for each file
         for (int kk = 0; kk < sa->GetNumberOfValues(); kk++)
-          {
+        {
           size_t sub_argc = op->Args.size() + subcount - 1;
           char **sub_argv = new char *[sub_argc+1];
+          std::vector<std::string> temp_args(subcount);
+          size_t subc = 0;
 
           size_t ii = 0;
           size_t nn = op->Args.size()-1;
           for (size_t jj = 0; jj < nn; jj++)
+          {
+            const std::string& arg = op->Args[jj];
+            size_t pos = arg.find("{}");
+            if (pos != std::string::npos)
             {
-            if (op->Args[jj] == "{}")
-              {
+              const char *sub = sa->GetValue(kk).c_str();
               if (execdir)
-                {
-                sub_argv[ii++] = const_cast<char *>(
-                  dicomfind_basename(sa->GetValue(kk).c_str()));
-                }
-              else
-                {
-                sub_argv[ii++] = const_cast<char *>(
-                  sa->GetValue(kk).c_str());
-                }
+              {
+                sub = dicomfind_basename(sub);
               }
-            else
+
+              std::string& temp_arg = temp_args[subc++];
+              temp_arg = arg;
+              do
               {
-              sub_argv[ii++] = const_cast<char *>(op->Args[jj].c_str());
+                temp_arg.replace(pos, 2, sub);
+                pos = temp_arg.find("{}", pos + strlen(sub));
               }
+              while (pos != std::string::npos);
+
+              sub_argv[ii++] = const_cast<char *>(temp_arg.c_str());
             }
+            else
+            {
+              sub_argv[ii++] = const_cast<char *>(arg.c_str());
+            }
+          }
           sub_argv[ii] = 0;
 
           if (execdir)
-            {
+          {
             std::string dirname =
               dicomfind_dirname(sa->GetValue(kk).c_str());
             if (dirname != currentSubdir)
-              {
+            {
               dicomfind_chdir(originalDir.c_str());
               dicomfind_chdir(dirname.c_str());
-              }
             }
+          }
 
           if (!execute_command(sub_argv[0], sub_argv))
-            {
+          {
             fprintf(stderr, "failure!");
-            }
+          }
 
           delete [] sub_argv;
-          }
+        }
 
         if (execdir && currentSubdir != "")
-          {
+        {
           dicomfind_chdir(originalDir.c_str());
-          }
         }
+      }
       else
-        {
+      {
         // call program for each series
         // for execdir, what if series is split across directories?
         // need to call executable once per directory, using only
@@ -383,117 +433,132 @@ void dicomfind_operations(
         size_t sub_argc = op->Args.size() +
           subcount*sa->GetNumberOfTuples() - 1;
         char **sub_argv = new char *[sub_argc+1];
+        std::vector<std::string> temp_args(subcount*sa->GetNumberOfValues());
+        size_t subc = 0;
 
         // for execdir, keep a list of directories that are done
         std::vector<std::string> done_dirs;
         std::string doing_dir;
-        
+
         bool notdone = true;
 
         while (notdone)
-          {
+        {
           notdone = false;
           if (execdir)
-            {
+          {
             bool foundDirToProcess = false;
             for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++)
-              {
+            {
               std::string dirname =
                 dicomfind_dirname(sa->GetValue(kk).c_str());
               if (!foundDirToProcess)
-                {
+              {
                 bool dirIsDone = false;
                 for (size_t ll = 0; ll < done_dirs.size(); ll++)
-                  {
+                {
                   if (dirname == done_dirs[ll])
-                    {
+                  {
                     dirIsDone = true;
                     break;
-                    }
                   }
+                }
                 if (!dirIsDone)
-                  {
+                {
                   foundDirToProcess = true;
                   doing_dir = dirname;
                   done_dirs.push_back(dirname);
                   break;
-                  }
                 }
               }
+            }
             if (foundDirToProcess)
-              {
+            {
               notdone = true;
-              }
+            }
             else
-              {
+            {
               break;
-              }
             }
+          }
 
           size_t ii = 0;
           size_t nn = op->Args.size()-1;
           for (size_t jj = 0; jj < nn; jj++)
+          {
+            const std::string& arg = op->Args[jj];
+            size_t pos = arg.find("{}");
+            if (pos != std::string::npos)
             {
-            if (op->Args[jj] == "{}")
+              for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++)
               {
-              if (execdir)
+                const char *sub = sa->GetValue(kk).c_str();
+
+                if (execdir)
                 {
-                for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++)
+                  std::string dirname = dicomfind_dirname(sub);
+                  if (dirname != doing_dir)
                   {
-                  std::string dirname =
-                    dicomfind_dirname(sa->GetValue(kk).c_str());
-                  if (dirname == doing_dir)
-                    {
-                    sub_argv[ii++] = const_cast<char *>(
-                      dicomfind_basename(sa->GetValue(kk).c_str()));
-                    }
+                    continue;
                   }
+                  sub = dicomfind_basename(sub);
                 }
-              else
+
+                std::string& temp_arg = temp_args[subc++];
+                temp_arg = arg;
+                pos = temp_arg.find("{}");
+                do
                 {
-                for (vtkIdType kk = 0; kk < sa->GetNumberOfValues(); kk++)
-                  {
-                  sub_argv[ii++] = const_cast<char *>(
-                    sa->GetValue(kk).c_str());
-                  }
+                  temp_arg.replace(pos, 2, sub);
+                  pos = temp_arg.find("{}", pos + strlen(sub));
                 }
+                while (pos != std::string::npos);
+
+                sub_argv[ii++] = const_cast<char *>(temp_arg.c_str());
               }
+            }
             else
-              {
-              sub_argv[ii++] = const_cast<char *>(op->Args[jj].c_str());
-              }
+            {
+              sub_argv[ii++] = const_cast<char *>(arg.c_str());
             }
+          }
           sub_argv[ii] = 0;
 
           if (execdir)
-            {
+          {
             if (doing_dir != currentSubdir)
-              {
+            {
               dicomfind_chdir(originalDir.c_str());
               dicomfind_chdir(doing_dir.c_str());
-              }
             }
+          }
 
           if (!execute_command(sub_argv[0], sub_argv))
-            {
+          {
             fprintf(stderr, "failure!");
-            }
           }
+        }
 
         if (execdir && currentSubdir != "")
-          {
+        {
           dicomfind_chdir(originalDir.c_str());
-          }
+        }
 
         delete [] sub_argv;
-        }
       }
     }
+  }
 }
 
+// Delay wildcard expansion for -name option
+MAINMACRO_PASSTHROUGH(-name);
+
 // This program will dump all the metadata in the given file
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   std::vector<Operation> operationList;
 
   int rval = 0;
@@ -507,6 +572,9 @@ MAINMACRO(argc, argv)
 
   vtkSmartPointer<vtkStringArray> a = vtkSmartPointer<vtkStringArray>::New();
 
+  // always query SpecificCharacterSet
+  query.SetAttributeValue(DC::SpecificCharacterSet, vtkDICOMValue(VR::CS));
+
   // always query the functional sequences for advanced files
   query.SetAttributeValue(
     DC::SharedFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
@@ -514,145 +582,160 @@ MAINMACRO(argc, argv)
     DC::PerFrameFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
 
   if (argc < 2)
-    {
+  {
     dicomfind_usage(stdout, dicomfind_basename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--help") == 0)
-    {
+  {
     dicomfind_help(stdout, dicomfind_basename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--version") == 0)
-    {
+  {
     dicomfind_version(stdout, dicomfind_basename(argv[0]));
     return rval;
-    }
+  }
 
   for (int argi = 1; argi < argc; argi++)
-    {
+  {
     const char *arg = argv[argi];
     if (strcmp(arg, "-P") == 0)
-      {
+    {
       followSymlinks = false;
-      }
+    }
     else if (strcmp(arg, "-L") == 0)
-      {
+    {
       followSymlinks = true;
-      }
+    }
     else if (strcmp(arg, "-q") == 0)
-      {
+    {
       if (argi + 1 == argc || argv[argi+1][0] == '-')
-        {
+      {
         fprintf(stderr, "%s must be followed by a file.\n\n", arg);
         dicomfind_usage(stderr, dicomfind_basename(argv[0]));
         return 1;
-        }
+      }
       const char *qfile = argv[++argi];
       if (!dicomcli_readquery(qfile, &query, &qtlist))
-        {
+      {
         fprintf(stderr, "Can't read query file %s\n\n", qfile);
         return 1;
-        }
       }
-    else if (strcmp(arg, "-k") == 0)
+    }
+    else if (strcmp(arg, "-u") == 0)
+    {
+      if (argi + 1 == argc || argv[argi+1][0] == '-')
+      {
+        fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
+        dicomfind_usage(stderr, dicomfind_basename(argv[0]));
+        return 1;
+      }
+      const char *qfile = argv[++argi];
+      if (!dicomcli_readuids(qfile, &query, &qtlist))
       {
+        fprintf(stderr, "Error: Can't read uid file %s\n\n", qfile);
+        return 1;
+      }
+    }
+    else if (strcmp(arg, "-k") == 0)
+    {
       vtkDICOMTag tag;
       ++argi;
       if (argi == argc)
-        {
+      {
         fprintf(stderr, "%s must be followed by gggg,eeee=value "
                         "where gggg,eeee is a DICOM tag.\n\n", arg);
         return 1;
-        }
+      }
       if (!dicomcli_readkey(argv[argi], &query, &qtlist))
-        {
+      {
         return 1;
-        }
       }
+    }
     else if (strcmp(arg, "-maxdepth") == 0)
-      {
+    {
       ++argi;
       if (argi == argc)
-        {
+      {
         fprintf(stderr, "%s must be followed by an argument.\n\n", arg);
         return 1;
-        }
-      scandepth = static_cast<int>(atol(argv[argi]));
       }
+      scandepth = static_cast<int>(atol(argv[argi]));
+    }
     else if (strcmp(arg, "-name") == 0)
-      {
+    {
       ++argi;
       if (argi == argc)
-        {
+      {
         fprintf(stderr, "%s must be followed by an argument.\n\n", arg);
         return 1;
-        }
-      pattern = argv[argi];
       }
+      pattern = argv[argi];
+    }
     else if (strcmp(arg, "-image") == 0)
-      {
+    {
       requirePixelData = true;
-      }
+    }
     else if (strcmp(arg, "-series") == 0)
-      {
+    {
       findSeries = true;
-      }
+    }
     else if (strcmp(arg, "-print") == 0 ||
              strcmp(arg, "-print0") == 0)
-      {
+    {
       operationList.push_back(arg);
-      }
+    }
     else if (strcmp(arg, "-exec") == 0 ||
              strcmp(arg, "-execdir") == 0)
-      {
+    {
       operationList.push_back(arg);
       int argj = ++argi;
       for (; argj < argc; argj++)
-        {
+      {
         if (strcmp(argv[argj], ";") == 0 ||
             strcmp(argv[argj], "+") == 0)
-          {
+        {
           break;
-          }
         }
+      }
       if (argj == argc)
-        {
+      {
         fprintf(stderr, "%s must be terminated with + or \\; "
                 "(plus or semicolon).\n\n",
                 arg);
         return 1;
-        }
+      }
       for (; argi <= argj; argi++)
-        {
+      {
         operationList.back().Args.push_back(argv[argi]);
-        }
-      argi = argj;
       }
+      argi = argj;
+    }
     else if (arg[0] == '-')
-      {
+    {
       fprintf(stderr, "unrecognized option %s.\n\n", arg);
       dicomfind_usage(stderr, dicomfind_basename(argv[0]));
       return 1;
-      }
+    }
     else
-      {
+    {
       a->InsertNextValue(arg);
-      }
     }
+  }
 
   // if no operations were specified, default to "print"
   if (operationList.empty())
-    {
+  {
     operationList.push_back("-print");
-    }
+  }
 
   // Remember the current directory
   std::string originalDir = dicomfind_getcwd();
 
   // Write data for every input directory
   if (a->GetNumberOfTuples() > 0)
-    {
+  {
     vtkSmartPointer<vtkDICOMDirectory> finder =
       vtkSmartPointer<vtkDICOMDirectory>::New();
     finder->SetInputFileNames(a);
@@ -666,17 +749,17 @@ MAINMACRO(argc, argv)
     finder->Update();
 
     for (int j = 0; j < finder->GetNumberOfStudies(); j++)
-      {
+    {
       int k0 = finder->GetFirstSeriesForStudy(j);
       int k1 = finder->GetLastSeriesForStudy(j);
 
       for (int k = k0; k <= k1; k++)
-        {
+      {
         vtkStringArray *sa = finder->GetFileNamesForSeries(k);
         dicomfind_operations(operationList, sa, originalDir);
-        }
       }
     }
+  }
 
   return rval;
 }
diff --git a/Programs/dicompull.cxx b/Programs/dicompull.cxx
index 7189bc5..6bd294a 100644
--- a/Programs/dicompull.cxx
+++ b/Programs/dicompull.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -20,8 +20,11 @@
 #include "vtkDICOMMetaData.h"
 #include "vtkDICOMDictionary.h"
 #include "vtkDICOMFile.h"
+#include "vtkDICOMFilePath.h"
+#include "vtkDICOMFileDirectory.h"
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 #include "readquery.h"
 #include "progress.h"
@@ -29,15 +32,12 @@
 #include <vtkStringArray.h>
 #include <vtkSmartPointer.h>
 
-#include <vtksys/SystemTools.hxx>
-
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 #include <ctype.h>
 
 #include <limits>
-#include <iostream>
 #include <map>
 #include <utility>
 
@@ -46,7 +46,7 @@ void dicompull_version(FILE *file, const char *cp)
 {
   fprintf(file, "%s %s\n", cp, DICOM_VERSION);
   fprintf(file, "\n"
-    "Copyright (c) 2012-2015, David Gobbi.\n\n"
+    "Copyright (c) 2012-2016, David Gobbi.\n\n"
     "This software is distributed under an open-source license.  See the\n"
     "Copyright.txt file that comes with the vtk-dicom source distribution.\n");
 }
@@ -61,6 +61,7 @@ void dicompull_usage(FILE *file, const char *cp)
     "  -P              Do not follow symbolic links.\n"
     "  -k tag=value    Provide an attribute to be queried and matched.\n"
     "  -q <query.txt>  Provide a file to describe the find query.\n"
+    "  -u <uids.txt>   Provide a file that contains a list of UIDs.\n"
     "  -o <directory>  Directory to place the files into.\n"
     "  -maxdepth n     Set the maximum directory depth.\n"
     "  -name pattern   Set file names to match (with \"*\" or \"?\").\n"
@@ -100,6 +101,10 @@ void dicompull_help(FILE *file, const char *cp)
     "The values used for \"-k key=value\" can use the wildcards * and ?, and\n"
     "can also use date ranges of the form \"19990103-19990105\".\n"
     "\n"
+    "The \"-u\" option can be used to provide a list of UIDs.  Provide a file\n"
+    "where the first line of the file is the key (e.g. SeriesInstanceUID) and\n"
+    "the rest of the file is the UIDs to match, one UID per line.\n"
+    "\n"
   );
 }
 
@@ -116,10 +121,10 @@ std::string dicompull_dirname(const char *filename)
 {
   const char *cp = filename + strlen(filename);
   while (cp != filename)
-    {
+  {
     --cp;
     if (cp[0] == '\\' || cp[0] == '/') { break; }
-    }
+  }
   return std::string(filename, cp - filename);
 }
 
@@ -131,25 +136,25 @@ std::string dicompull_cleanup(const std::string& input)
   std::string::const_iterator b = a;
   std::string s;
   while (a != input.end())
-    {
+  {
     while (a != input.end() &&
            ((*a & 0x80) == 0) && isgraph(*a) && !ispunct(*a))
-      {
+    {
       ++a;
-      }
+    }
     s.append(b, a);
     b = a;
     while (a != input.end() &&
            (((*a & 0x80) != 0) || !isgraph(*a) || ispunct(*a)))
-      {
+    {
       ++a;
-      }
+    }
     if (b != a && b != input.begin() && a != input.end())
-      {
+    {
       s.append("_");
-      }
-    b = a;
     }
+    b = a;
+  }
 
   return s;
 }
@@ -166,24 +171,24 @@ std::string dicompull_makedirname(
   const char *dp = cp;
   const char *bp = 0;
   while (*cp != '\0')
-    {
+  {
     while (*cp != '{' && *cp != '}' && *cp != '\0') { cp++; }
     if (*cp == '}')
-      {
+    {
       fprintf(stderr, "Error: Missing \'{\': %s\n", outdir);
       exit(1);
-      }
+    }
     if (*cp == '{')
-      {
+    {
       bp = cp;
       while (*cp != '}' && *cp != '\0') { cp++; }
       if (*cp != '}')
-        {
+      {
         fprintf(stderr, "Error: Unmatched \'{\': %s\n", outdir);
         exit(1);
-        }
+      }
       else
-        {
+      {
         s.append(dp, bp);
         bp++;
         key.assign(bp, cp);
@@ -192,59 +197,65 @@ std::string dicompull_makedirname(
         v.Clear();
         vtkDICOMTag tag;
         if (key.length() > 0)
-          {
+        {
           vtkDICOMDictEntry de = vtkDICOMDictionary::FindDictEntry(key.c_str());
           if (de.IsValid())
-            {
+          {
             tag = de.GetTag();
-            }
+          }
           else
-            {
+          {
             fprintf(stderr, "Error: Unrecognized key %s\n", key.c_str());
             exit(1);
-            }
           }
+        }
         if (finder)
-          {
+        {
           if (!v.IsValid())
-            {
+          {
             v = finder->GetStudyRecord(study).GetAttributeValue(tag);
-            }
+          }
           if (!v.IsValid())
-            {
+          {
             v = finder->GetPatientRecordForStudy(study).GetAttributeValue(tag);
-            }
+          }
           if (!v.IsValid())
-            {
+          {
             v = finder->GetSeriesRecord(series).GetAttributeValue(tag);
-            }
           }
+        }
         if (v.IsValid())
-          {
+        {
           val.assign(dicompull_cleanup(v.AsUTF8String()));
-          }
+        }
         else if (finder)
-          {
+        {
           fprintf(stderr, "Error: Key %s not allowed in output directory.\n",
                   key.c_str());
           exit(1);
-          }
+        }
         if (val.empty())
-          {
+        {
           val = "Empty";
-          }
-        s.append(val);
         }
+        s.append(val);
       }
     }
+  }
   s.append(dp, cp);
 
   return s;
 }
 
+// Delay wildcard expansion for -name option
+MAINMACRO_PASSTHROUGH(-name);
+
 // This program will find and copy dicom files
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   int rval = 0;
   int scandepth = std::numeric_limits<int>::max();
   bool followSymlinks = true;
@@ -258,6 +269,9 @@ MAINMACRO(argc, argv)
 
   vtkSmartPointer<vtkStringArray> a = vtkSmartPointer<vtkStringArray>::New();
 
+  // always query SpecificCharacterSet
+  query.SetAttributeValue(DC::SpecificCharacterSet, vtkDICOMValue(VR::CS));
+
   // always query the functional sequences for advanced files
   query.SetAttributeValue(
     DC::SharedFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
@@ -265,160 +279,166 @@ MAINMACRO(argc, argv)
     DC::PerFrameFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
 
   if (argc < 2)
-    {
+  {
     dicompull_usage(stdout, dicompull_basename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--help") == 0)
-    {
+  {
     dicompull_help(stdout, dicompull_basename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--version") == 0)
-    {
+  {
     dicompull_version(stdout, dicompull_basename(argv[0]));
     return rval;
-    }
+  }
 
   for (int argi = 1; argi < argc; argi++)
-    {
+  {
     const char *arg = argv[argi];
     if (strcmp(arg, "-P") == 0)
-      {
+    {
       followSymlinks = false;
-      }
+    }
     else if (strcmp(arg, "-L") == 0)
-      {
+    {
       followSymlinks = true;
-      }
+    }
     else if (strcmp(arg, "-q") == 0)
-      {
+    {
       if (argi + 1 == argc || argv[argi+1][0] == '-')
-        {
+      {
         fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
         dicompull_usage(stderr, dicompull_basename(argv[0]));
         return 1;
-        }
+      }
       const char *qfile = argv[++argi];
       if (!dicomcli_readquery(qfile, &query, &qtlist))
-        {
+      {
         fprintf(stderr, "Error: Can't read query file %s\n\n", qfile);
         return 1;
-        }
       }
-    else if (strcmp(arg, "-k") == 0)
+    }
+    else if (strcmp(arg, "-u") == 0)
+    {
+      if (argi + 1 == argc || argv[argi+1][0] == '-')
+      {
+        fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
+        dicompull_usage(stderr, dicompull_basename(argv[0]));
+        return 1;
+      }
+      const char *qfile = argv[++argi];
+      if (!dicomcli_readuids(qfile, &query, &qtlist))
       {
+        fprintf(stderr, "Error: Can't read uid file %s\n\n", qfile);
+        return 1;
+      }
+    }
+    else if (strcmp(arg, "-k") == 0)
+    {
       vtkDICOMTag tag;
       ++argi;
       if (argi == argc)
-        {
+      {
         fprintf(stderr, "Error: %s must be followed by gggg,eeee=value "
                         "where gggg,eeee is a DICOM tag.\n\n", arg);
         return 1;
-        }
+      }
       if (!dicomcli_readkey(argv[argi], &query, &qtlist))
-        {
+      {
         return 1;
-        }
       }
+    }
     else if (strcmp(arg, "-o") == 0)
-      {
+    {
       vtkDICOMTag tag;
       ++argi;
       if (argi == argc || argv[argi][0] == '-')
-        {
+      {
         fprintf(stderr, "Error: %s must be followed by output directory.\n\n",
                 arg);
         return 1;
-        }
-      outdir = argv[argi];
       }
+      outdir = argv[argi];
+    }
     else if (strcmp(arg, "-maxdepth") == 0)
-      {
+    {
       ++argi;
       if (argi == argc)
-        {
+      {
         fprintf(stderr, "Error: %s must be followed by an argument.\n\n", arg);
         return 1;
-        }
-      scandepth = static_cast<int>(atol(argv[argi]));
       }
+      scandepth = static_cast<int>(atol(argv[argi]));
+    }
     else if (strcmp(arg, "-name") == 0)
-      {
+    {
       ++argi;
       if (argi == argc)
-        {
+      {
         fprintf(stderr, "Error: %s must be followed by an argument.\n\n", arg);
         return 1;
-        }
-      pattern = argv[argi];
       }
+      pattern = argv[argi];
+    }
     else if (strcmp(arg, "-image") == 0)
-      {
+    {
       requirePixelData = true;
-      }
+    }
     else if (strcmp(arg, "-series") == 0)
-      {
+    {
       findSeries = true;
-      }
+    }
     else if (strcmp(arg, "--silent") == 0)
-      {
+    {
       silent = true;
-      }
+    }
     else if (arg[0] == '-')
-      {
+    {
       fprintf(stderr, "Error: Unrecognized option %s.\n\n", arg);
       dicompull_usage(stderr, dicompull_basename(argv[0]));
       return 1;
-      }
+    }
     else
+    {
+      int code = vtkDICOMFile::Access(arg, vtkDICOMFile::In);
+      if (code == vtkDICOMFile::Good ||
+          code == vtkDICOMFile::FileIsDirectory)
       {
-      if (vtksys::SystemTools::FileExists(arg))
-        {
         a->InsertNextValue(arg);
-        }
+      }
       else if (dicomcli_looks_like_key(arg))
-        {
+      {
         fprintf(stderr, "Error: Missing -k before %s.\n\n", arg);
         return 1;
-        }
+      }
       else
-        {
+      {
         fprintf(stderr, "Error: File not found: %s.\n\n", arg);
         return 1;
-        }
       }
     }
+  }
 
   // output directory is mandatory
   if (outdir.empty())
-    {
+  {
     fprintf(stderr,
       "\nError: No output directory was specified (-o <directory>).\n\n");
     exit(1);
-    }
+  }
 
   // do a dry run to make sure outdir string is valid
   dicompull_makedirname(NULL, 0, 0, outdir.c_str());
 
-  // Separator between directory and file
-  const char *sep = (outdir.empty() ? "" : "//");
-#ifdef _WIN32
-  for (std::string::const_iterator si = outdir.begin();
-       si != outdir.end(); ++si)
-    {
-    if (*si == '/') { sep = "/"; }
-    else if (*si == '\\') { sep = "\\"; }
-    }
-#endif
-
   // Create a map of all directories written to.  The count is the
   // number of series that have been written to the directory.
   std::map<std::string, int> dircount;
 
   // Write data for every input directory
   if (a->GetNumberOfTuples() > 0)
-    {
+  {
     const size_t bufsize = 8192;
     unsigned char *buffer = new unsigned char [bufsize];
 
@@ -436,33 +456,33 @@ MAINMACRO(argc, argv)
     vtkSmartPointer<ProgressObserver> p =
       vtkSmartPointer<ProgressObserver>::New();
     if (!silent)
-      {
+    {
       p->SetText("Scanning");
       finder->AddObserver(vtkCommand::ProgressEvent, p);
       finder->AddObserver(vtkCommand::StartEvent, p);
       finder->AddObserver(vtkCommand::EndEvent, p);
-      }
+    }
     finder->Update();
 
     vtkIdType count = 0;
     vtkIdType total = 0;
     if (!silent)
-      {
+    {
       p->SetText("Copying");
       p->Execute(NULL, vtkCommand::StartEvent, NULL);
       for (int k = 0; k < finder->GetNumberOfSeries(); k++)
-        {
+      {
         total += finder->GetFileNamesForSeries(k)->GetNumberOfValues();
-        }
       }
+    }
 
     for (int j = 0; j < finder->GetNumberOfStudies(); j++)
-      {
+    {
       int k0 = finder->GetFirstSeriesForStudy(j);
       int k1 = finder->GetLastSeriesForStudy(j);
 
       for (int k = k0; k <= k1; k++)
-        {
+      {
         vtkStringArray *sa = finder->GetFileNamesForSeries(k);
         // create the directory name
         std::string dirname =
@@ -470,117 +490,117 @@ MAINMACRO(argc, argv)
         std::map<std::string,int>::iterator mi = dircount.find(dirname);
         int si = 1;
         if (mi != dircount.end())
-          {
+        {
           si = mi->second + 1;
           mi->second = si;
-          }
+        }
         else
-          {
+        {
           dircount[dirname] = si;
-          if (!vtksys::SystemTools::MakeDirectory(dirname.c_str()))
-            {
+          int code = vtkDICOMFileDirectory::Create(dirname.c_str());
+          if (code != vtkDICOMFileDirectory::Good)
+          {
             fprintf(stderr, "Error: Cannot create directory: %s\n",
                     dirname.c_str());
             delete [] buffer;
             exit(1);
-            }
           }
+        }
+        vtkDICOMFilePath outpath(dirname);
         for (vtkIdType i = 0; i < sa->GetNumberOfValues(); i++)
-          {
+        {
           // copy the file
           char fname[32];
-          sprintf(fname, "%sIM-%04d-%04d.dcm",
-                  sep, si, static_cast<int>(i+1));
+          sprintf(fname, "IM-%04d-%04d.dcm", si, static_cast<int>(i+1));
           const std::string& srcname = sa->GetValue(i);
-          std::string fullname = dirname + fname;
-          if (!vtksys::SystemTools::SameFile(srcname.c_str(), fullname.c_str()))
-            {
+          std::string fullname = outpath.Join(fname);
+          if (!vtkDICOMFile::SameFile(srcname.c_str(), fullname.c_str()))
+          {
             vtkDICOMFile infile(srcname.c_str(), vtkDICOMFile::In);
             if (infile.GetError())
-              {
+            {
               const char *message = "Cannot copy file";
               switch (infile.GetError())
-                {
+              {
                 case vtkDICOMFile::AccessDenied:
                   message = "Access denied for file";
                   break;
-                case vtkDICOMFile::IsDirectory:
+                case vtkDICOMFile::FileIsDirectory:
                   message = "This file is a directory";
                   break;
-                case vtkDICOMFile::FileNotFound:
-                case vtkDICOMFile::DirectoryNotFound:
-                  message = "File does not exist";
+                case vtkDICOMFile::ImpossiblePath:
+                  message = "Bad file path";
                   break;
-                }
-              fprintf(stderr, "Error: %s: %s\n", message, srcname.c_str());
               }
+              fprintf(stderr, "Error: %s: %s\n", message, srcname.c_str());
+            }
             else if (infile.GetSize() == 0)
-              {
+            {
               fprintf(stderr, "Error: File size is zero: %s\n",
                       srcname.c_str());
-              }
+            }
             else
-              {
+            {
               vtkDICOMFile outfile(fullname.c_str(), vtkDICOMFile::Out);
               if (outfile.GetError())
-                {
+              {
                 const char *message = "Cannot write file";
                 switch (outfile.GetError())
-                  {
+                {
                   case vtkDICOMFile::AccessDenied:
                     message = "Access denied for output file";
                     break;
-                  case vtkDICOMFile::IsDirectory:
+                  case vtkDICOMFile::FileIsDirectory:
                     message = "This output is a directory";
                     break;
-                  case vtkDICOMFile::DirectoryNotFound:
-                    message = "Directory does not exist";
+                  case vtkDICOMFile::ImpossiblePath:
+                    message = "Bad file path";
                     break;
-                  }
-                fprintf(stderr, "Error: %s: %s\n", message, fullname.c_str());
                 }
+                fprintf(stderr, "Error: %s: %s\n", message, fullname.c_str());
+              }
               else
-                {
+              {
                 // copy the file
                 while (!infile.EndOfFile())
-                  {
+                {
                   size_t bytecount = infile.Read(buffer, bufsize);
                   if (bytecount == 0 && infile.GetError())
-                    {
+                  {
                     fprintf(stderr, "Error, incomplete read: %s\n",
                             srcname.c_str());
                     vtkDICOMFile::Remove(fullname.c_str());
                     break;
-                    }
+                  }
                   if (bytecount > 0 &&
                       outfile.Write(buffer, bytecount) != bytecount)
-                    {
+                  {
                     fprintf(stderr, "Error: Incomplete write: %s\n",
                             fullname.c_str());
                     vtkDICOMFile::Remove(fullname.c_str());
                     break;
-                    }
                   }
                 }
               }
             }
+          }
 
           if (!silent)
-            {
+          {
             count++;
             double progress = (static_cast<double>(count)/
                                static_cast<double>(total));
             p->Execute(NULL, vtkCommand::ProgressEvent, &progress);
-            }
           }
         }
       }
+    }
     delete [] buffer;
     if (!silent)
-      {
+    {
       p->Execute(NULL, vtkCommand::EndEvent, NULL);
-      }
     }
+  }
 
   return rval;
 }
diff --git a/Programs/dicomtocsv.cxx b/Programs/dicomtocsv.cxx
index 4b1209d..666aa4a 100644
--- a/Programs/dicomtocsv.cxx
+++ b/Programs/dicomtocsv.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -20,8 +20,10 @@
 #include "vtkDICOMParser.h"
 #include "vtkDICOMMetaData.h"
 #include "vtkDICOMMetaDataAdapter.h"
+#include "vtkDICOMFile.h"
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 #include "readquery.h"
 #include "progress.h"
@@ -31,14 +33,15 @@
 #include <vtkStringArray.h>
 #include <vtkSmartPointer.h>
 
-#include <vtksys/SystemTools.hxx>
-
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
 #include <limits>
-#include <iostream>
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
 
 namespace {
 
@@ -47,7 +50,7 @@ void dicomtocsv_version(FILE *file, const char *cp)
 {
   fprintf(file, "%s %s\n", cp, DICOM_VERSION);
   fprintf(file, "\n"
-    "Copyright (c) 2012-2015, David Gobbi.\n\n"
+    "Copyright (c) 2012-2016, David Gobbi.\n\n"
     "This software is distributed under an open-source license.  See the\n"
     "Copyright.txt file that comes with the vtk-dicom source distribution.\n");
 }
@@ -60,6 +63,7 @@ void dicomtocsv_usage(FILE *file, const char *cp)
   fprintf(file, "options:\n"
     "  -k tag=value     Provide a key to be queried and matched.\n"
     "  -q <query.txt>   Provide a file to describe the find query.\n"
+    "  -u <uids.txt>    Provide a file that contains a list of UIDs.\n"
     "  -o <data.csv>    Provide a file for the query results.\n"
     "  --first-nonzero  Search series for first nonzero value of each key.\n"
     "  --directory-only Use directory scan only, do not re-scan files.\n"
@@ -85,7 +89,17 @@ void dicomtocsv_help(FILE *file, const char *cp)
     "Attributes nested within sequences can be specified by giving a tag\n"
     "path e.g. \"-k Tag1/Tag2/Tag3\".  Either a forward slash or a backslash\n"
     "can be used to separate the components of the path.  Private tags\n"
-    "should be preceded by the private dictionary name in square brackets.\n\n");
+    "should be preceded by the private dictionary name in square brackets.\n"
+    "\n"
+    "If the same tag is given more than once with \"-k\" (or if the tag is\n"
+    "listed multiple times in the query file, or appears in both the query\n"
+    "file and as a \"-k\" option), then its first appearance will set the\n"
+    "column number that it appears in.  Also, with regards to the search,\n"
+    "the value specified in the final appearance of the tag as an option\n"
+    "will be the value used for the search.\n"
+    "\n"
+    "If no attributes are specified with either \"-k\" or \"-q\", then a\n"
+    "default set of query attributes will be used.\n\n");
 }
 
 // remove path portion of filename
@@ -98,55 +112,169 @@ const char *dicomtocsv_basename(const char *filename)
 
 typedef vtkDICOMVR VR;
 
+// Create a default query for --image
+void dicomtocsv_image_default(vtkDICOMItem *query, QueryTagList *ql)
+{
+  // these are the attributes that must be part of the query
+  static const DC::EnumType defaultElements[] = {
+    // patient-level information
+    DC::PatientName,          // 2
+    DC::PatientID,            // 1
+    DC::PatientBirthDate,     // 3
+    DC::PatientSex,           // 3
+    // study-level information
+    DC::StudyDate,            // 1
+    DC::StudyTime,            // 1
+    DC::StudyID,              // 1
+    DC::AccessionNumber,      // 2
+    DC::StudyDescription,     // 2
+    DC::StudyInstanceUID,     // 1
+    // series-level information
+    DC::Modality,             // 1
+    DC::SeriesNumber,         // 1
+    DC::SeriesDescription,    // 3
+    DC::SeriesInstanceUID,    // 1
+    DC::Rows,                 // 3
+    DC::Columns,              // 3
+    // image-level information
+    DC::InstanceNumber,       // 1
+    DC::SOPClassUID,          // 1
+    DC::SOPInstanceUID,       // 1
+    DC::ReferencedFileID,     // special
+    // delimiter to mark end of list
+    DC::ItemDelimitationItem
+  };
+
+  for (const DC::EnumType *tagPtr = defaultElements;
+       *tagPtr != DC::ItemDelimitationItem;
+       ++tagPtr)
+  {
+    VR vr = query->FindDictVR(*tagPtr);
+    query->SetAttributeValue(*tagPtr, vtkDICOMValue(vr));
+    ql->push_back(vtkDICOMTagPath(*tagPtr));
+  }
+}
+
+// Create a default query for --series
+void dicomtocsv_series_default(vtkDICOMItem *query, QueryTagList *ql)
+{
+  // these are the attributes that must be part of the query
+  static const DC::EnumType defaultElements[] = {
+    // patient-level information
+    DC::PatientName,          // 2
+    DC::PatientID,            // 1
+    DC::PatientBirthDate,     // 3
+    DC::PatientSex,           // 3
+    // study-level information
+    DC::StudyDate,            // 1
+    DC::StudyTime,            // 1
+    DC::StudyID,              // 1
+    DC::AccessionNumber,      // 2
+    DC::StudyDescription,     // 2
+    DC::StudyInstanceUID,     // 1
+    // series-level information
+    DC::Modality,             // 1
+    DC::SeriesNumber,         // 1
+    DC::SeriesDescription,    // 3
+    DC::SeriesInstanceUID,    // 1
+    DC::Rows,                 // 3
+    DC::Columns,              // 3
+    DC::NumberOfReferences,   // special
+    // delimiter to mark end of list
+    DC::ItemDelimitationItem
+  };
+
+  for (const DC::EnumType *tagPtr = defaultElements;
+       *tagPtr != DC::ItemDelimitationItem;
+       ++tagPtr)
+  {
+    VR vr = query->FindDictVR(*tagPtr);
+    query->SetAttributeValue(*tagPtr, vtkDICOMValue(vr));
+    ql->push_back(vtkDICOMTagPath(*tagPtr));
+  }
+}
+
+// Create a default query for --study
+void dicomtocsv_study_default(vtkDICOMItem *query, QueryTagList *ql)
+{
+  // these are the attributes that must be part of the query
+  static const DC::EnumType defaultElements[] = {
+    // patient-level information
+    DC::PatientName,          // 2
+    DC::PatientID,            // 1
+    DC::PatientBirthDate,     // 3
+    DC::PatientSex,           // 3
+    // study-level information
+    DC::StudyDate,            // 1
+    DC::StudyTime,            // 1
+    DC::StudyID,              // 1
+    DC::AccessionNumber,      // 2
+    DC::StudyDescription,     // 2
+    DC::StudyInstanceUID,     // 1
+    DC::NumberOfReferences,   // special
+    // delimiter to mark end of list
+    DC::ItemDelimitationItem
+  };
+
+  for (const DC::EnumType *tagPtr = defaultElements;
+       *tagPtr != DC::ItemDelimitationItem;
+       ++tagPtr)
+  {
+    VR vr = query->FindDictVR(*tagPtr);
+    query->SetAttributeValue(*tagPtr, vtkDICOMValue(vr));
+    ql->push_back(vtkDICOMTagPath(*tagPtr));
+  }
+}
+
 // Write the header for a csv file
 void dicomtocsv_writeheader(
-  const vtkDICOMItem& query, const QueryTagList *ql, std::ostream& os)
+  const vtkDICOMItem& query, const QueryTagList *ql, FILE *fp)
 {
   // print human-readable names for each tag
   for (size_t i = 0; i < ql->size(); i++)
-    {
+  {
     if (i != 0)
-      {
-      os << ",";
-      }
+    {
+      fprintf(fp, "%s", ",");
+    }
     const vtkDICOMItem *pitem = &query;
     vtkDICOMTagPath tagPath = ql->at(i);
     for (;;)
-      {
+    {
       vtkDICOMTag tag = tagPath.GetHead();
       vtkDICOMDictEntry e = pitem->FindDictEntry(tag);
       if (e.IsValid())
-        {
-        os << e.GetName();
-        }
+      {
+        fprintf(fp, "%s", e.GetName());
+      }
       if (!tagPath.HasTail())
-        {
+      {
         break;
-        }
+      }
       pitem = pitem->GetAttributeValue(tag).GetSequenceData();
       tagPath = tagPath.GetTail();
-      os << "\\";
-      }
+      fprintf(fp, "%s", "\\");
     }
-  os << "\r\n";
+  }
+  fprintf(fp, "%s", "\r\n");
 }
 
 // Convert date to format YYYY-MM-DD HH:MM:SS
 std::string dicomtocsv_date(const std::string& dt, vtkDICOMVR vr)
 {
   if (vr == VR::TM && dt.length() >= 6)
-    {
+  {
     return dt.substr(0,2) + ":" + dt.substr(2,2) + ":" + dt.substr(4,2);
-    }
+  }
   else if (vr == VR::DA && dt.length() >= 8)
-    {
+  {
     return dt.substr(0,4) + "-" + dt.substr(4,2) + "-" + dt.substr(6,2);
-    }
+  }
   else if (vr == VR::DT && dt.length() >= 14)
-    {
+  {
     return dt.substr(0,4) + "-" + dt.substr(4,2) + "-" + dt.substr(6,2) + " " +
            dt.substr(8,2) + ":" + dt.substr(10,2) + ":" + dt.substr(12,2);
-    }
+  }
 
   return "";
 }
@@ -159,86 +287,86 @@ std::string dicomtocsv_quote(const std::string& s)
   std::string r;
 
   for (;;)
-    {
+  {
     size_t j = s.find('\"', i);
     if (j < s.length())
-      {
+    {
       r += s.substr(i, j-i+1);
       r += "\"";
       i = j+1;
-      }
+    }
     else
-      {
+    {
       r += s.substr(i);
       break;
-      }
     }
+  }
 
   return r;
 }
 
 // Write out the results in csv format
 void dicomtocsv_write(vtkDICOMDirectory *finder,
-  const vtkDICOMItem& query, const QueryTagList *ql, std::ostream& os,
+  const vtkDICOMItem& query, const QueryTagList *ql, FILE *fp,
   int level, bool firstNonZero, bool useDirectoryRecords, vtkCommand *p)
 {
   // for keeping track of progress
   vtkIdType count = 0.0;
   vtkIdType total = 0.0;
   if (p)
-    {
+  {
     for (int k = 0; k < finder->GetNumberOfSeries(); k++)
-      {
+    {
       total += finder->GetFileNamesForSeries(k)->GetNumberOfValues();
-      }
-    p->Execute(NULL, vtkCommand::StartEvent, NULL);
     }
+    p->Execute(NULL, vtkCommand::StartEvent, NULL);
+  }
 
   for (int j = 0; j < finder->GetNumberOfStudies(); j++)
-    {
+  {
     int k0 = finder->GetFirstSeriesForStudy(j);
     int k1 = finder->GetLastSeriesForStudy(j);
     int numberOfFiles = 1;
 
     if (level < 3 && k1 > k0)
-      {
+    {
       // if level is "study", only look at one series
       numberOfFiles = 0;
       for (int k = k0; k <= k1; k++)
-        {
+      {
         vtkStringArray *a = finder->GetFileNamesForSeries(k);
         numberOfFiles += a->GetNumberOfValues();
-        }
-      k1 = k0;
       }
+      k1 = k0;
+    }
 
     for (int k = k0; k <= k1; k++)
-      {
+    {
       vtkStringArray *a = finder->GetFileNamesForSeries(k);
       if (a->GetNumberOfValues() == 0)
-        {
+      {
         continue;
-        }
+      }
 
       if (level == 3)
-        {
+      {
         // at series level, this is the number of files
         numberOfFiles = a->GetNumberOfValues();
-        }
+      }
 
       vtkSmartPointer<vtkDICOMMetaData> meta;
       if (useDirectoryRecords)
-        {
+      {
         meta = finder->GetMetaDataForSeries(k);
-        }
+      }
       else
-        {
+      {
         meta = vtkSmartPointer<vtkDICOMMetaData>::New();
         if (level >= 4 || firstNonZero)
-          {
+        {
           // need to parse all files
           meta->SetNumberOfInstances(a->GetNumberOfValues());
-          }
+        }
 
         // need to go to the files for the meta data
         vtkSmartPointer<vtkDICOMParser> parser =
@@ -248,27 +376,24 @@ void dicomtocsv_write(vtkDICOMDirectory *finder,
         parser->SetMetaData(meta);
 
         for (int ii = 0; ii < meta->GetNumberOfInstances(); ii++)
-          {
+        {
           parser->SetIndex(ii);
           parser->SetFileName(a->GetValue(ii));
           parser->Update();
-          }
         }
-
-      // create an adapter, in case of enhanced IOD
-      vtkDICOMMetaDataAdapter adapter(meta);
+      }
 
       // this loop is only for the "image" level
       int m = (level >= 4 ? meta->GetNumberOfInstances() : 1);
       for (int jj = 0; jj < m; jj++)
-        {
+      {
         // print the value of each tag
         for (size_t i = 0; i < ql->size(); i++)
-          {
+        {
           if (i != 0)
-            {
-            os << ",";
-            }
+          {
+            fprintf(fp, "%s", ",");
+          }
 
           const vtkDICOMItem *qitem = &query;
           const vtkDICOMItem *mitem = 0;
@@ -279,62 +404,76 @@ void dicomtocsv_write(vtkDICOMDirectory *finder,
           int n = (firstNonZero ? meta->GetNumberOfInstances() : 1);
           n = (level >= 4 ? jj+1 : n);
           for (int ii = jj; ii < n; ii++)
-            {
+          {
+            // Create an adapter, which helps with extracting attributes from
+            // the PerFrameFunctionalSequence of enhanced IODs.
+            vtkDICOMMetaDataAdapter adapter(meta, ii);
+
             for (;;)
-              {
+            {
               vtkDICOMTag tag = tagPath.GetHead();
               std::string creator;
               if ((tag.GetGroup() & 0x0001) == 1)
-                {
+              {
                 vtkDICOMTag ctag(tag.GetGroup(), tag.GetElement() >> 8);
                 creator = qitem->GetAttributeValue(ctag).AsString();
                 if (mitem)
-                  {
+                {
                   tag = mitem->ResolvePrivateTag(tag, creator);
-                  }
+                }
                 else
-                  {
+                {
                   tag = adapter->ResolvePrivateTag(tag, creator);
-                  }
                 }
+              }
               if (mitem)
-                {
+              {
                 vp = &mitem->GetAttributeValue(tag);
-                }
+              }
+              else if (tag != DC::NumberOfFrames)
+              {
+                // vtkDICOMMetaDataAdapter hides NumberOfFrames, so it
+                // will never be found if we check the adapter
+                vp = &adapter->GetAttributeValue(tag);
+              }
               else
-                {
-                vp = &adapter->GetAttributeValue(ii, tag);
-                }
+              {
+                vp = &meta->GetAttributeValue(ii, tag);
+              }
               if (vp && !vp->IsValid())
-                {
+              {
                 vp = 0;
-                }
+              }
+              // break if we have reached the end of a tag path
               if (vp == 0 || !tagPath.HasTail())
-                {
+              {
                 break;
-                }
+              }
+              // go one level deeper into the query
               qitem = qitem->GetAttributeValue(
                 tagPath.GetHead()).GetSequenceData();
+              // go one level deeper along the tag path
               tagPath = tagPath.GetTail();
+              // go one level deeper into the meta data
               mitem = vp->GetSequenceData();
               if (mitem == 0 || vp->GetNumberOfValues() == 0)
-                {
+              {
                 break;
-                }
               }
+            }
             // If numerical value is zero, keep going until non-zero because
             // the zero value is of little interest
             if (vp != 0)
-              {
+            {
               if (!vp->GetVR().HasNumericValue() || vp->AsDouble() != 0.0)
-                {
+              {
                 break;
-                }
               }
             }
+          }
 
           if (vp != 0)
-            {
+          {
             const vtkDICOMValue& v = *vp;
             if (v.GetNumberOfValues() == 1 &&
                 (v.GetVR() == VR::SS ||
@@ -343,67 +482,74 @@ void dicomtocsv_write(vtkDICOMDirectory *finder,
                  v.GetVR() == VR::UL ||
                  v.GetVR() == VR::FL ||
                  v.GetVR() == VR::FD))
-              {
-              os << v;
-              }
+            {
+              std::string s = v.AsString();
+              fprintf(fp, "%s", s.c_str());
+            }
             else if (v.GetVR() == VR::DA ||
                      v.GetVR() == VR::TM ||
                      v.GetVR() == VR::DT)
-              {
-              os << "\"" << dicomtocsv_date(v.AsString(), v.GetVR()) << "\"";
-              }
+            {
+              std::string s = dicomtocsv_date(v.AsString(), v.GetVR());
+              fprintf(fp, "\"%s\"", s.c_str());
+            }
             else if (v.GetVR() == VR::SQ)
-              {
+            {
               // how should a sequence be printed out to the csv file?
-              }
+            }
             else if (v.GetVL() != 0 && v.GetVL() != 0xFFFFFFFF)
-              {
-              os << "\"" << dicomtocsv_quote(v.AsUTF8String()) << "\"";
-              }
+            {
+              std::string s = dicomtocsv_quote(v.AsUTF8String());
+              fprintf(fp, "\"%s\"", s.c_str());
             }
+          }
           else if (tagPath.GetHead() == DC::ReferencedFileID &&
                    !tagPath.HasTail())
-            {
+          {
             // ReferencedFileID (0004,1500) is meant to be used in DICOMDIR,
             // but we hijack it to report the first file in the series.
-            os << "\"" << dicomtocsv_quote(a->GetValue(jj)) << "\"";
-            }
+            std::string s = dicomtocsv_quote(a->GetValue(jj));
+            fprintf(fp, "\"%s\"", s.c_str());
+          }
           else if (tagPath.GetHead() == DC::NumberOfReferences &&
                    !tagPath.HasTail())
-            {
+          {
             // NumberOfReferences (0004,1600) is a retired attribute meant
             // to count the number of references to a file, but we hijack
             // it and use it to report the number of files found for the
             // series.
-            os << "\"" << numberOfFiles << "\"";
-            }
+            fprintf(fp, "\"%d\"", numberOfFiles);
           }
+        }
 
-        os << "\r\n";
+        fprintf(fp, "%s", "\r\n");
 
         // report progress
         if (p)
-          {
+        {
           count += numberOfFiles;
           double progress = (static_cast<double>(count)/
                              static_cast<double>(total));
           p->Execute(NULL, vtkCommand::ProgressEvent, &progress);
-          }
         }
       }
     }
+  }
 
   if (p)
-    {
+  {
     p->Execute(NULL, vtkCommand::EndEvent, NULL);
-    }
+  }
 }
 
 } // end anonymous namespace
 
 // This program will dump all the metadata in the given file
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   int rval = 0;
   int scandepth = std::numeric_limits<int>::max();
   QueryTagList qtlist;
@@ -417,6 +563,9 @@ MAINMACRO(argc, argv)
   vtkSmartPointer<vtkStringArray> a = vtkSmartPointer<vtkStringArray>::New();
   const char *ofile = 0;
 
+  // always query SpecificCharacterSet
+  query.SetAttributeValue(DC::SpecificCharacterSet, vtkDICOMValue(VR::CS));
+
   // always query the functional sequences for advanced files
   query.SetAttributeValue(
     DC::SharedFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
@@ -424,178 +573,222 @@ MAINMACRO(argc, argv)
     DC::PerFrameFunctionalGroupsSequence, vtkDICOMValue(VR::SQ));
 
   if (argc < 2)
-    {
+  {
     dicomtocsv_usage(stdout, dicomtocsv_basename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--help") == 0)
-    {
+  {
     dicomtocsv_help(stdout, dicomtocsv_basename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--version") == 0)
-    {
+  {
     dicomtocsv_version(stdout, dicomtocsv_basename(argv[0]));
     return rval;
-    }
+  }
 
   for (int argi = 1; argi < argc; argi++)
-    {
+  {
     const char *arg = argv[argi];
     if (strcmp(arg, "-q") == 0 || strcmp(arg, "-o") == 0)
-      {
+    {
       if (argi + 1 == argc || argv[argi+1][0] == '-')
-        {
+      {
         fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
         dicomtocsv_usage(stderr, dicomtocsv_basename(argv[0]));
         return 1;
-        }
+      }
 
       if (arg[1] == 'q')
-        {
+      {
         const char *qfile = argv[++argi];
         if (!dicomcli_readquery(qfile, &query, &qtlist))
-          {
+        {
           fprintf(stderr, "Error: Can't read query file %s\n\n", qfile);
           return 1;
-          }
         }
+      }
       else if (arg[1] == 'o')
-        {
+      {
         ofile = argv[++argi];
-        }
       }
-    else if (strcmp(arg, "-k") == 0)
+    }
+    else if (strcmp(arg, "-u") == 0)
+    {
+      if (argi + 1 == argc || argv[argi+1][0] == '-')
+      {
+        fprintf(stderr, "Error: %s must be followed by a file.\n\n", arg);
+        dicomtocsv_usage(stderr, dicomtocsv_basename(argv[0]));
+        return 1;
+      }
+      const char *qfile = argv[++argi];
+      if (!dicomcli_readuids(qfile, &query, &qtlist))
       {
+        fprintf(stderr, "Error: Can't read uid file %s\n\n", qfile);
+        return 1;
+      }
+    }
+    else if (strcmp(arg, "-k") == 0)
+    {
       vtkDICOMTag tag;
       ++argi;
       if (argi == argc)
-        {
+      {
         fprintf(stderr, "Error: %s must be followed by gggg,eeee=value "
                         "where gggg,eeee is a DICOM tag.\n\n", arg);
         return 1;
-        }
+      }
       if (!dicomcli_readkey(argv[argi], &query, &qtlist))
-        {
+      {
         return 1;
-        }
       }
+    }
     else if (strcmp(arg, "--first-nonzero") == 0)
-      {
+    {
       firstNonZero = true;
-      }
+    }
     else if (strcmp(arg, "--directory-only") == 0)
-      {
+    {
       useDirectoryRecords = true;
-      }
+    }
     else if (strcmp(arg, "--study") == 0)
-      {
+    {
       level = 2;
-      }
+    }
     else if (strcmp(arg, "--series") == 0)
-      {
+    {
       level = 3;
-      }
+    }
     else if (strcmp(arg, "--image") == 0)
-      {
+    {
       level = 4;
-      }
+    }
     else if (strcmp(arg, "--silent") == 0)
-      {
+    {
       silent = true;
-      }
+    }
     else if (arg[0] == '-')
-      {
+    {
       fprintf(stderr, "Error: Unrecognized option %s.\n\n", arg);
       dicomtocsv_usage(stderr, dicomtocsv_basename(argv[0]));
       return 1;
-      }
+    }
     else
+    {
+      int code = vtkDICOMFile::Access(arg, vtkDICOMFile::In);
+      if (code == vtkDICOMFile::Good || code == vtkDICOMFile::FileIsDirectory)
       {
-      if (vtksys::SystemTools::FileExists(arg))
-        {
         a->InsertNextValue(arg);
-        }
+      }
       else if (dicomcli_looks_like_key(arg))
-        {
+      {
         fprintf(stderr, "Error: Missing -k before %s.\n\n", arg);
         return 1;
-        }
+      }
       else if (strlen(arg) > 4 &&
                strcmp(&arg[strlen(arg) - 4], ".csv") == 0)
-        {
+      {
         fprintf(stderr, "Error: Missing -o before %s.\n\n", arg);
         return 1;
-        }
+      }
       else
-        {
+      {
         fprintf(stderr, "Error: File not found: %s.\n\n", arg);
         return 1;
-        }
       }
     }
+  }
 
-  std::ostream *osp = &std::cout;
-  std::ofstream ofs;
+  FILE *fp = stdout;
+  FILE *fp1 = NULL;
 
   if (ofile)
+  {
+#ifndef _WIN32
+    fp1 = fopen(ofile, "wb");
+#else
+    // use wide chars to avoid narrowing to local character set
+    int n = MultiByteToWideChar(CP_UTF8, 0, ofile, -1, NULL, 0);
+    wchar_t *wofile = new wchar_t[n];
+    MultiByteToWideChar(CP_UTF8, 0, ofile, -1, wofile, n);
+    fp1 = _wfopen(wofile, L"wb");
+    delete [] wofile;
+#endif
+
+    if (!fp1)
     {
-    ofs.open(ofile,
-             std::ofstream::out |
-             std::ofstream::binary |
-             std::ofstream::trunc);
-
-    if (ofs.fail())
-      {
       fprintf(stderr, "Error: Unable to open output file %s.\n", ofile);
       return 1;
-      }
-    osp = &ofs;
     }
+    fp = fp1;
+  }
   else
-    {
+  {
     // if output to stdout, then silence progress reporting
     silent = true;
+  }
+
+  // If no query specified, then use a default one
+  if (qtlist.size() == 0)
+  {
+    if (level == 2)
+    {
+      dicomtocsv_study_default(&query, &qtlist);
+    }
+    else if (level == 3)
+    {
+      dicomtocsv_series_default(&query, &qtlist);
     }
+    else if (level == 4)
+    {
+      dicomtocsv_image_default(&query, &qtlist);
+    }
+  }
 
   // Write the header
-  dicomtocsv_writeheader(query, &qtlist, *osp);
-  osp->flush();
+  dicomtocsv_writeheader(query, &qtlist, fp);
+  fflush(fp);
 
   // Write data for every input directory
   if (a->GetNumberOfTuples() > 0)
-    {
+  {
     vtkSmartPointer<ProgressObserver> p;
 
     vtkSmartPointer<vtkDICOMDirectory> finder =
       vtkSmartPointer<vtkDICOMDirectory>::New();
     if (level < 4)
-      {
+    {
       finder->SetFindLevelToSeries();
-      }
+    }
     if (!silent)
-      {
+    {
       p = vtkSmartPointer<ProgressObserver>::New();
       p->SetText("Scanning");
       finder->AddObserver(vtkCommand::ProgressEvent, p);
       finder->AddObserver(vtkCommand::StartEvent, p);
       finder->AddObserver(vtkCommand::EndEvent, p);
-      }
+    }
     finder->SetInputFileNames(a);
     finder->SetScanDepth(scandepth);
     finder->SetFindQuery(query);
     finder->Update();
 
     if (!silent)
-      {
+    {
       p->SetText("Writing");
-      }
+    }
     dicomtocsv_write(
-      finder, query, &qtlist, *osp, level,
+      finder, query, &qtlist, fp, level,
       firstNonZero, useDirectoryRecords, p);
 
-    osp->flush();
-    }
+    fflush(fp);
+  }
+
+  if (fp1)
+  {
+    fclose(fp1);
+  }
 
   return rval;
 }
diff --git a/Programs/dicomtodicom.cxx b/Programs/dicomtodicom.cxx
index 6735741..5e09a9d 100644
--- a/Programs/dicomtodicom.cxx
+++ b/Programs/dicomtodicom.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -24,6 +24,8 @@
 #include "vtkDICOMToRAS.h"
 #include "vtkDICOMCTRectifier.h"
 #include "vtkDICOMUtilities.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
 
 #include <vtkImageData.h>
 #include <vtkMatrix4x4.h>
@@ -34,10 +36,6 @@
 #include <vtkSortFileNames.h>
 #include <vtkSmartPointer.h>
 
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-#include <vtksys/Glob.hxx>
-
 #include <string>
 #include <vector>
 #include <set>
@@ -48,6 +46,7 @@
 #include <ctype.h>
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 
 // Kinds of reformats
@@ -83,19 +82,19 @@ void dicomtodicom_version(FILE *file, const char *command_name, bool verbose)
   while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
 
   if (!verbose)
-    {
+  {
     fprintf(file, "%s %s\n", cp, DICOM_VERSION);
     fprintf(file, "\n"
-      "Copyright (c) 2012-2015, David Gobbi.\n\n"
+      "Copyright (c) 2012-2016, David Gobbi.\n\n"
       "This software is distributed under an open-source license.  See the\n"
       "Copyright.txt file that comes with the vtk-dicom source distribution.\n");
-    }
+  }
   else
-    {
+  {
     fprintf(file,
       "Head %8.8s, Built %s, %s\n",
       DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME);
-    }
+  }
 }
 
 
@@ -173,32 +172,32 @@ void dicomtodicom_check_error(vtkObject *o)
   const char *filename = 0;
   unsigned long errorcode = 0;
   if (writer)
-    {
+  {
     filename = writer->GetFileName();
     errorcode = writer->GetErrorCode();
-    }
+  }
   else if (reader)
-    {
+  {
     filename = reader->GetInternalFileName();
     errorcode = reader->GetErrorCode();
-    }
+  }
   else if (sorter)
-    {
+  {
     filename = sorter->GetInternalFileName();
     errorcode = sorter->GetErrorCode();
-    }
+  }
   else if (parser)
-    {
+  {
     filename = parser->GetFileName();
     errorcode = parser->GetErrorCode();
-    }
+  }
   if (!filename)
-    {
+  {
     filename = "";
-    }
+  }
 
   switch(errorcode)
-    {
+  {
     case vtkErrorCode::NoError:
       return;
     case vtkErrorCode::FileNotFoundError:
@@ -225,65 +224,11 @@ void dicomtodicom_check_error(vtkObject *o)
     default:
       fprintf(stderr, "An unknown error occurred.\n");
       break;
-    }
+  }
 
   exit(1);
 }
 
-// Add a dicom file to the list, expand if wildcard
-void dicomtodicom_add_file(vtkStringArray *files, const char *filepath)
-{
-#ifdef _WIN32
-  bool ispattern = false;
-  bool hasbackslash = false;
-  size_t n = strlen(filepath);
-  for (size_t i = 0; i < n; i++)
-    {
-    if (filepath[i] == '*' || filepath[i] == '?' || filepath[i] == '[')
-      {
-      ispattern = true;
-      }
-    if (filepath[i] == '\\')
-      {
-      hasbackslash = true;
-      }
-    }
-
-  std::string newpath = filepath;
-  if (hasbackslash)
-    {
-    // backslashes interfere with vtksys::Glob
-    vtksys::SystemTools::ConvertToUnixSlashes(newpath);
-    }
-  filepath = newpath.c_str();
-
-  if (ispattern)
-    {
-    vtksys::Glob glob;
-    if (glob.FindFiles(filepath))
-      {
-      const std::vector<std::string> &globfiles = glob.GetFiles();
-      size_t m = globfiles.size();
-      for (size_t j = 0; j < m; j++)
-        {
-        files->InsertNextValue(globfiles[j]);
-        }
-      }
-    else
-      {
-      fprintf(stderr, "Could not match pattern: %s\n", filepath);
-      exit(1);
-      }
-    }
-  else
-    {
-    files->InsertNextValue(filepath);
-    }
-#else
-  files->InsertNextValue(filepath);
-#endif
-}
-
 // Read the options
 void dicomtodicom_read_options(
   int argc, char *argv[],
@@ -301,135 +246,135 @@ void dicomtodicom_read_options(
   // read the options from the command line
   int argi = 1;
   while (argi < argc)
-    {
+  {
     const char *arg = argv[argi++];
     if (arg[0] == '-')
-      {
+    {
       if (strcmp(arg, "--") == 0)
-        {
+      {
         // stop processing switches
         break;
-        }
+      }
       else if (strcmp(arg, "--modality") == 0 ||
                strcmp(arg, "--series-description") == 0 ||
                strcmp(arg, "--series-number") == 0 ||
                strcmp(arg, "--uid-prefix") == 0)
-        {
+      {
         if (argi >= argc ||
             argv[argi][0] == '-')
-          {
+        {
           fprintf(stderr, "\nA value must follow the \'%s\' flag\n\n", arg);
           exit(1);
-          }
+        }
         if (strcmp(arg, "--modality") == 0)
-          {
+        {
           options->modality = argv[argi];
-          }
+        }
         else if (strcmp(arg, "--series-description") == 0)
-          {
+        {
           options->series_description = argv[argi];
-          }
+        }
         else if (strcmp(arg, "--series-number") == 0)
-          {
+        {
           options->series_number= argv[argi];
-          }
+        }
         else if (strcmp(arg, "--uid-prefix") == 0)
-          {
+        {
           options->uid_prefix = argv[argi];
-          }
-        argi++;
         }
+        argi++;
+      }
       else if (strcmp(arg, "--axial") == 0)
-        {
+      {
         options->mpr = MPRAxial;
-        }
+      }
       else if (strcmp(arg, "--coronal") == 0)
-        {
+      {
         options->mpr = MPRCoronal;
-        }
+      }
       else if (strcmp(arg, "--sagittal") == 0)
-        {
+      {
         options->mpr = MPRSagittal;
-        }
+      }
       else if (strcmp(arg, "--silent") == 0)
-        {
+      {
         options->silent = true;
-        }
+      }
       else if (strcmp(arg, "--verbose") == 0)
-        {
+      {
         options->verbose = true;
-        }
+      }
       else if (strcmp(arg, "--version") == 0)
-        {
+      {
         dicomtodicom_version(stdout, argv[0], false);
         exit(0);
-        }
+      }
       else if (strcmp(arg, "--build-version") == 0)
-        {
+      {
         dicomtodicom_version(stdout, argv[0], true);
         exit(0);
-        }
+      }
       else if (strcmp(arg, "--help") == 0)
-        {
+      {
         dicomtodicom_help(stdout, argv[0]);
         exit(0);
-        }
+      }
       else if (arg[0] == '-' && arg[1] == '-')
-        {
+      {
         fprintf(stderr, "\nUnrecognized option %s\n\n", arg);
         dicomtodicom_usage(stderr, argv[0]);
         exit(1);
-        }
+      }
       else if (arg[0] == '-' && arg[1] != '-')
-        {
+      {
         for (int argj = 1; arg[argj] != '\0'; argj++)
-          {
+        {
           if (arg[argj] == 's')
-            {
+          {
             options->silent = true;
-            }
+          }
           else if (arg[argj] == 'v')
-            {
+          {
             options->verbose = true;
-            }
+          }
           else if (arg[argj] == 'o')
-            {
+          {
             if (arg[argj+1] != '\0')
-              {
+            {
               arg += argj+1;
-              }
+            }
             else
-              {
+            {
               if (argi >= argc)
-                {
+              {
                 fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n");
                 dicomtodicom_usage(stderr, argv[0]);
                 exit(1);
-                }
-              arg = argv[argi++];
               }
+              arg = argv[argi++];
+            }
             options->output = arg;
             break;
-            }
+          }
           else
-            {
+          {
             fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg);
             dicomtodicom_usage(stderr, argv[0]);
             exit(1);
-            }
           }
         }
       }
+    }
     else
-      {
-      dicomtodicom_add_file(files, arg);
-      }
+    {
+      files->InsertNextValue(arg);
     }
+  }
 
   while (argi < argc)
-    {
-    dicomtodicom_add_file(files, argv[argi++]);
-    }
+  {
+    files->InsertNextValue(argv[argi++]);
+  }
 }
 
 // Convert one DICOM series into another DICOM series
@@ -461,28 +406,28 @@ void dicomtodicom_convert_one(
     (meta->GetAttributeValue(DC::SeriesDescription).AsString() +
      dicomtodicom_description[options->mpr]);
   if (seriesDescription.size() < 64)
-    {
+  {
     meta->SetAttributeValue(DC::SeriesDescription, seriesDescription);
-    }
+  }
 
   // set the metadata supplied on the command line
   if (options->series_description)
-    {
+  {
     meta->SetAttributeValue(DC::SeriesDescription, options->series_description);
-    }
+  }
   if (options->series_number)
-    {
+  {
     meta->SetAttributeValue(DC::SeriesNumber, options->series_number);
-    }
+  }
 
   // get the matrix from the DICOM series
   vtkMatrix4x4 *inputMatrix = reader->GetPatientMatrix();
   vtkSmartPointer<vtkMatrix4x4> matrix =
     vtkSmartPointer<vtkMatrix4x4>::New();
   if (inputMatrix)
-    {
+  {
     matrix->DeepCopy(inputMatrix);
-    }
+  }
 
   // mpr reformat if requested
   vtkSmartPointer<vtkImageReslice> reformat =
@@ -494,17 +439,17 @@ void dicomtodicom_convert_one(
   int permutation[3] = { 0, 1, 2 };
 
   if (options->mpr)
-    {
+  {
     // check for CT acquired with a tilted gantry
     if (fabs(vtkDICOMCTRectifier::GetGantryDetectorTilt(matrix)) > 1e-2)
-      {
+    {
       // tilt is significant, so regrid as a rectangular volume
       rectify->SetInputConnection(lastOutput);
       rectify->SetVolumeMatrix(matrix);
       rectify->Update();
       lastOutput = rectify->GetOutputPort();
       matrix = rectify->GetRectifiedMatrix();
-      }
+    }
 
     // create a permutation matrix to make the slices axial
     axes->DeepCopy(matrix);
@@ -514,50 +459,50 @@ void dicomtodicom_convert_one(
     int prevmaxj = -1;
     int prevmaxi = -1;
     for (int kdim = 0; kdim < 2; kdim++)
-      {
+    {
       int maxj = 0;
       int maxi = 0;
       double maxv = -0.0;
       for (int jdim = 0; jdim < 3; jdim++)
-        {
+      {
         if (jdim == prevmaxj) { continue; }
         for (int idim = 0; idim < 3; idim++)
-          {
+        {
           if (idim == prevmaxi) { continue; }
           double v = axes->GetElement(jdim, idim);
           if (v*v >= maxv)
-            {
+          {
             maxi = idim;
             maxj = jdim;
             maxv = v*v;
-            }
           }
         }
+      }
       maxidx[maxj] = maxi;
       value[maxj] = (axes->GetElement(maxj, maxi) < 0 ? -1.0 : 1.0);
       prevmaxj = maxj;
       prevmaxi = maxi;
-      }
+    }
 
     axes->Zero();
     axes->SetElement(3, 3, 1.0);
     for (int jdim = 0; jdim < 3; jdim++)
-      {
+    {
       int idim = maxidx[jdim];
       if (idim < 0)
-        {
+      {
         idim = 3 - maxidx[(jdim+1)%3] - maxidx[(jdim+2)%3];
         maxidx[jdim] = idim;
         double perm = (((3 + maxidx[2] - maxidx[0])%3) == 2 ? 1.0 : -1.0);
         value[jdim] = value[(jdim+1)%3]*value[(jdim+2)%3]*perm;
-        }
+      }
       permutation[jdim] = idim;
       axes->SetElement(jdim, idim, value[jdim]);
-      }
+    }
 
     // change the permutation to the desired mpr
     if (options->mpr == MPRCoronal)
-      {
+    {
       double cmatrix[16] = {
         1.0, 0.0, 0.0, 0.0,
         0.0, 0.0, 1.0, 0.0,
@@ -568,9 +513,9 @@ void dicomtodicom_convert_one(
       permutation[0] = tperm[0];
       permutation[1] = tperm[2];
       permutation[2] = tperm[1];
-      }
+    }
     else if (options->mpr == MPRSagittal)
-      {
+    {
       double smatrix[16] = {
         0.0, 0.0,-1.0, 0.0,
         1.0, 0.0, 0.0, 0.0,
@@ -581,7 +526,7 @@ void dicomtodicom_convert_one(
       permutation[0] = tperm[1];
       permutation[1] = tperm[2];
       permutation[2] = tperm[0];
-      }
+    }
 
     // reformat with the permuted axes
     reformat->SetResliceAxes(axes);
@@ -590,7 +535,7 @@ void dicomtodicom_convert_one(
 
     // factor out the permuted axes
     vtkMatrix4x4::Multiply4x4(matrix, axes, matrix);
-    }
+  }
 
   // make the generator
   vtkSmartPointer<vtkDICOMMRGenerator> mrgenerator =
@@ -605,52 +550,52 @@ void dicomtodicom_convert_one(
   if (SOPClass == "1.2.840.10008.5.1.4.1.1.2" ||
       SOPClass == "1.2.840.10008.5.1.4.1.1.2.1" ||
       SOPClass == "1.2.840.10008.5.1.4.1.1.2.2")
-    {
+  {
     generator = ctgenerator;
-    }
+  }
   else if (SOPClass == "1.2.840.10008.5.1.4.1.1.4" ||
            SOPClass == "1.2.840.10008.5.1.4.1.1.4.1" ||
            SOPClass == "1.2.840.10008.5.1.4.1.1.4.4")
-    {
+  {
     generator = mrgenerator;
-    }
+  }
 
   // allow the user to override the generator
   if (options->modality)
-    {
+  {
     if (strcmp(options->modality, "CT") == 0)
-      {
+    {
       generator = ctgenerator;
-      }
+    }
     else if (strcmp(options->modality, "MR") == 0 ||
              strcmp(options->modality, "MRI") == 0)
-      {
+    {
       generator = mrgenerator;
-      }
     }
+  }
 
   // prepare the writer to write the image
   vtkSmartPointer<vtkDICOMWriter> writer =
     vtkSmartPointer<vtkDICOMWriter>::New();
   if (generator)
-    {
+  {
     writer->SetGenerator(generator);
-    }
+  }
   writer->SetMetaData(meta);
   writer->SetFilePrefix(outfile);
   writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");
   writer->TimeAsVectorOn();
   if (reader->GetTimeDimension() > 1)
-    {
+  {
     writer->SetTimeDimension(reader->GetTimeDimension());
     writer->SetTimeSpacing(reader->GetTimeSpacing());
-    }
+  }
   writer->SetPatientMatrix(matrix);
   if (reader->GetRescaleSlope() > 0)
-    {
+  {
     writer->SetRescaleSlope(reader->GetRescaleSlope());
     writer->SetRescaleIntercept(reader->GetRescaleIntercept());
-    }
+  }
   writer->SetInputConnection(lastOutput);
   writer->SetMemoryRowOrderToFileNative();
   writer->Write();
@@ -682,8 +627,11 @@ void dicomtodicom_convert_files(
 }
 
 // This program will convert DICOM to DICOM
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   // for the list of input DICOM files
   vtkSmartPointer<vtkStringArray> files =
     vtkSmartPointer<vtkStringArray>::New();
@@ -696,41 +644,40 @@ MAINMACRO(argc, argv)
 
   // set the UID prefix
   if (options.uid_prefix)
-    {
+  {
     vtkDICOMUtilities::SetUIDPrefix(options.uid_prefix);
-    }
+  }
 
   // make sure that input files were provided
   if (files->GetNumberOfValues() == 0)
-    {
+  {
     fprintf(stderr, "\nNo input files were specified.\n\n");
     dicomtodicom_usage(stderr, argv[0]);
     exit(1);
-    }
+  }
 
   // the output
   const char *outpath = options.output;
   if (!outpath)
-    {
+  {
     fprintf(stderr,
       "\nNo output directory was specified (\'-o\' <directory>).\n\n");
     dicomtodicom_usage(stderr, argv[0]);
     exit(1);
-    }
+  }
 
-  if (vtksys::SystemTools::FileExists(outpath))
-    {
-    if (!vtksys::SystemTools::FileIsDirectory(outpath))
-      {
-      fprintf(stderr, "option -o must give a directory, not a file.\n");
-      exit(1);
-      }
-    }
-  else if (!vtksys::SystemTools::MakeDirectory(outpath))
-    {
+  int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In);
+  if (code != vtkDICOMFile::FileIsDirectory)
+  {
+    fprintf(stderr, "option -o must give a directory, not a file.\n");
+    exit(1);
+  }
+  code = vtkDICOMFileDirectory::Create(outpath);
+  if (code != vtkDICOMFileDirectory::Good)
+  {
     fprintf(stderr, "Cannot create directory: %s\n", outpath);
     exit(1);
-    }
+  }
 
   dicomtodicom_convert_files(&options, files, outpath);
 
diff --git a/Programs/dicomtonifti.cxx b/Programs/dicomtonifti.cxx
index bf4db1f..ebd181c 100644
--- a/Programs/dicomtonifti.cxx
+++ b/Programs/dicomtonifti.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -21,6 +21,9 @@
 #include "vtkDICOMFileSorter.h"
 #include "vtkDICOMToRAS.h"
 #include "vtkDICOMCTRectifier.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
+#include "vtkDICOMFilePath.h"
 #include "vtkNIFTIHeader.h"
 #include "vtkNIFTIWriter.h"
 
@@ -40,10 +43,6 @@
 #include <vtkImageHistogramStatistics.h>
 #endif
 
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-#include <vtksys/Glob.hxx>
-
 #include <string>
 #include <vector>
 #include <set>
@@ -54,6 +53,7 @@
 #include <ctype.h>
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 
 // Simple structure for command-line options
@@ -84,19 +84,19 @@ void dicomtonifti_version(FILE *file, const char *command_name, bool verbose)
   while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
 
   if (!verbose)
-    {
+  {
     fprintf(file, "%s %s\n", cp, DICOM_VERSION);
     fprintf(file, "\n"
-      "Copyright (c) 2012-2015, David Gobbi.\n\n"
+      "Copyright (c) 2012-2016, David Gobbi.\n\n"
       "This software is distributed under an open-source license.  See the\n"
       "Copyright.txt file that comes with the vtk-dicom source distribution.\n");
-    }
+  }
   else
-    {
+  {
     fprintf(file,
       "Head %8.8s, Built %s, %s\n",
       DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME);
-    }
+  }
 }
 
 // Print the options
@@ -204,32 +204,32 @@ void dicomtonifti_check_error(vtkObject *o)
   const char *filename = 0;
   unsigned long errorcode = 0;
   if (writer)
-    {
+  {
     filename = writer->GetFileName();
     errorcode = writer->GetErrorCode();
-    }
+  }
   else if (reader)
-    {
+  {
     filename = reader->GetInternalFileName();
     errorcode = reader->GetErrorCode();
-    }
+  }
   else if (sorter)
-    {
+  {
     filename = sorter->GetInternalFileName();
     errorcode = sorter->GetErrorCode();
-    }
+  }
   else if (parser)
-    {
+  {
     filename = parser->GetFileName();
     errorcode = parser->GetErrorCode();
-    }
+  }
   if (!filename)
-    {
+  {
     filename = "";
-    }
+  }
 
   switch(errorcode)
-    {
+  {
     case vtkErrorCode::NoError:
       return;
     case vtkErrorCode::FileNotFoundError:
@@ -256,65 +256,11 @@ void dicomtonifti_check_error(vtkObject *o)
     default:
       fprintf(stderr, "An unknown error occurred.\n");
       break;
-    }
+  }
 
   exit(1);
 }
 
-// Add a dicom file to the list, expand if wildcard
-void dicomtonifti_add_file(vtkStringArray *files, const char *filepath)
-{
-#ifdef _WIN32
-  bool ispattern = false;
-  bool hasbackslash = false;
-  size_t n = strlen(filepath);
-  for (size_t i = 0; i < n; i++)
-    {
-    if (filepath[i] == '*' || filepath[i] == '?' || filepath[i] == '[')
-      {
-      ispattern = true;
-      }
-    if (filepath[i] == '\\')
-      {
-      hasbackslash = true;
-      }
-    }
-
-  std::string newpath = filepath;
-  if (hasbackslash)
-    {
-    // backslashes interfere with vtksys::Glob
-    vtksys::SystemTools::ConvertToUnixSlashes(newpath);
-    }
-  filepath = newpath.c_str();
-
-  if (ispattern)
-    {
-    vtksys::Glob glob;
-    if (glob.FindFiles(filepath))
-      {
-      const std::vector<std::string> &globfiles = glob.GetFiles();
-      size_t m = globfiles.size();
-      for (size_t j = 0; j < m; j++)
-        {
-        files->InsertNextValue(globfiles[j]);
-        }
-      }
-    else
-      {
-      fprintf(stderr, "Could not match pattern: %s\n", filepath);
-      exit(1);
-      }
-    }
-  else
-    {
-    files->InsertNextValue(filepath);
-    }
-#else
-  files->InsertNextValue(filepath);
-#endif
-}
-
 // Read the options
 void dicomtonifti_read_options(
   int argc, char *argv[],
@@ -339,171 +285,171 @@ void dicomtonifti_read_options(
   // read the options from the command line
   int argi = 1;
   while (argi < argc)
-    {
+  {
     const char *arg = argv[argi++];
     if (arg[0] == '-')
-      {
+    {
       if (strcmp(arg, "--") == 0)
-        {
+      {
         // stop processing switches
         break;
-        }
+      }
       else if (strcmp(arg, "--recurse") == 0)
-        {
+      {
         options->recurse = true;
-        }
+      }
       else if (strcmp(arg, "--compress") == 0)
-        {
+      {
         options->compress = true;
-        }
+      }
       else if (strcmp(arg, "--follow-symlinks") == 0)
-        {
+      {
         options->follow_symlinks = true;
-        }
+      }
       else if (strcmp(arg, "--fsl") == 0)
-        {
+      {
         options->fsl = true;
-        }
+      }
       else if (strcmp(arg, "--reformat-to-axial") == 0)
-        {
+      {
         options->reformat_to_axial = true;
-        }
+      }
       else if (strcmp(arg, "--no-slice-reordering") == 0)
-        {
+      {
         options->no_slice_reordering = true;
-        }
+      }
       else if (strcmp(arg, "--no-row-reordering") == 0)
-        {
+      {
         options->no_row_reordering = true;
-        }
+      }
       else if (strcmp(arg, "--no-column-reordering") == 0)
-        {
+      {
         options->no_column_reordering = true;
-        }
+      }
       else if (strcmp(arg, "--no-reordering") == 0)
-        {
+      {
         options->no_slice_reordering = true;
         options->no_row_reordering = true;
         options->no_column_reordering = true;
-        }
+      }
       else if (strcmp(arg, "--no-qform") == 0)
-        {
+      {
         options->no_qform = true;
-        }
+      }
       else if (strcmp(arg, "--no-sform") == 0)
-        {
+      {
         options->no_sform = true;
-        }
+      }
       else if (strcmp(arg, "--batch") == 0)
-        {
+      {
         options->batch = true;
-        }
+      }
       else if (strcmp(arg, "--silent") == 0)
-        {
+      {
         options->silent = true;
-        }
+      }
       else if (strcmp(arg, "--verbose") == 0)
-        {
+      {
         options->verbose = true;
-        }
+      }
       else if (strcmp(arg, "--volume") == 0)
-        {
+      {
         if (argi >= argc || argv[argi][0] == '-')
-          {
+        {
           fprintf(stderr, "\nA number must follow \'--volume\'\n\n");
           dicomtonifti_usage(stderr, argv[0]);
           exit(1);
-          }
+        }
         arg = argv[argi++];
         options->volume = atoi(arg);
-        }
+      }
       else if (strcmp(arg, "--version") == 0)
-        {
+      {
         dicomtonifti_version(stdout, argv[0], false);
         exit(0);
-        }
+      }
       else if (strcmp(arg, "--build-version") == 0)
-        {
+      {
         dicomtonifti_version(stdout, argv[0], true);
         exit(0);
-        }
+      }
       else if (strcmp(arg, "--help") == 0)
-        {
+      {
         dicomtonifti_help(stdout, argv[0]);
         exit(0);
-        }
+      }
       else if (arg[0] == '-' && arg[1] == '-')
-        {
+      {
         fprintf(stderr, "\nUnrecognized option %s\n\n", arg);
         dicomtonifti_usage(stderr, argv[0]);
         exit(1);
-        }
+      }
       else if (arg[0] == '-' && arg[1] != '-')
-        {
+      {
         for (int argj = 1; arg[argj] != '\0'; argj++)
-          {
+        {
           if (arg[argj] == 'z')
-            {
+          {
             options->compress = true;
-            }
+          }
           else if (arg[argj] == 'r')
-            {
+          {
             options->recurse = true;
-            }
+          }
           else if (arg[argj] == 'b')
-            {
+          {
             options->batch = true;
-            }
+          }
           else if (arg[argj] == 's')
-            {
+          {
             options->silent = true;
-            }
+          }
           else if (arg[argj] == 'v')
-            {
+          {
             options->verbose = true;
-            }
+          }
           else if (arg[argj] == 'L')
-            {
+          {
             options->follow_symlinks = true;
-            }
+          }
           else if (arg[argj] == 'o')
-            {
+          {
             if (arg[argj+1] != '\0')
-              {
+            {
               arg += argj+1;
-              }
+            }
             else
-              {
+            {
               if (argi >= argc)
-                {
+              {
                 fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n");
                 dicomtonifti_usage(stderr, argv[0]);
                 exit(1);
-                }
-              arg = argv[argi++];
               }
+              arg = argv[argi++];
+            }
             options->output = arg;
             break;
-            }
+          }
           else
-            {
+          {
             fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg);
             dicomtonifti_usage(stderr, argv[0]);
             exit(1);
-            }
           }
         }
       }
+    }
     else
-      {
-      dicomtonifti_add_file(files, arg);
-      }
+    {
+      files->InsertNextValue(arg);
     }
+  }
 
   while (argi < argc)
-    {
-    dicomtonifti_add_file(files, argv[argi++]);
-    }
+  {
+    files->InsertNextValue(argv[argi++]);
+  }
 }
 
 // Remove all characters but A-Za-z0-9_ from a string
@@ -513,25 +459,25 @@ std::string dicomtonifti_safe_string(const std::string& input)
   std::string::const_iterator b = a;
   std::string s;
   while (a != input.end())
-    {
+  {
     while (a != input.end() &&
            ((*a & 0x80) == 0) && isgraph(*a) && !ispunct(*a))
-      {
+    {
       ++a;
-      }
+    }
     s.append(b, a);
     b = a;
     while (a != input.end() &&
            (((*a & 0x80) != 0) || !isgraph(*a) || ispunct(*a)))
-      {
+    {
       ++a;
-      }
+    }
     if (b != a && b != input.begin() && a != input.end())
-      {
+    {
       s.append("_");
-      }
-    b = a;
     }
+    b = a;
+  }
 
   return s;
 }
@@ -549,24 +495,24 @@ std::string dicomtonifti_make_filename(
   const char *dp = cp;
   const char *bp = 0;
   while (*cp != '\0')
-    {
+  {
     while (*cp != '{' && *cp != '}' && *cp != '\0') { cp++; }
     if (*cp == '}')
-      {
+    {
       fprintf(stderr, "Missing \'{\': %s\n", outfile);
       exit(1);
-      }
+    }
     if (*cp == '{')
-      {
+    {
       bp = cp;
       while (*cp != '}' && *cp != '\0') { cp++; }
       if (*cp != '}')
-        {
+      {
         fprintf(stderr, "Unmatched \'{\': %s\n", outfile);
         exit(1);
-        }
+      }
       else
-        {
+      {
         s.append(dp, bp);
         bp++;
         key.assign(bp, cp);
@@ -575,40 +521,40 @@ std::string dicomtonifti_make_filename(
         v.Clear();
         vtkDICOMTag tag;
         if (key.length() > 0)
-          {
+        {
           vtkDICOMDictEntry de = vtkDICOMDictionary::FindDictEntry(key.c_str());
           if (de.IsValid())
-            {
+          {
             tag = de.GetTag();
-            }
+          }
           else
-            {
+          {
             fprintf(stderr, "Unrecognized key %s\n", key.c_str());
             exit(1);
-            }
           }
+        }
         if (meta)
-          {
+        {
           v = meta->GetAttributeValue(tag);
-          }
+        }
         if (v.IsValid())
-          {
+        {
           val.assign(dicomtonifti_safe_string(v.AsUTF8String()));
-          }
+        }
         else if (meta)
-          {
+        {
           fprintf(stderr, "Sorry, key %s not found.\n",
                   key.c_str());
           exit(1);
-          }
+        }
         if (val.empty())
-          {
+        {
           val = "Empty";
-          }
-        s.append(val);
         }
+        s.append(val);
       }
     }
+  }
   s.append(dp, cp);
 
   return s;
@@ -637,18 +583,18 @@ void dicomtonifti_convert_one(
     vtkSmartPointer<vtkImageExtractComponents>::New();
   extract->SetInputConnection(lastOutput);
   if (options->volume >= 0)
-    {
+  {
     if (reader->GetOutput()->GetNumberOfScalarComponents() <= options->volume)
-      {
+    {
       fprintf(stderr, "Only %d volumes, but --volume %d used.\n",
               reader->GetOutput()->GetNumberOfScalarComponents(),
               options->volume);
       exit(1);
-      }
+    }
     extract->SetComponents(options->volume);
     extract->Update();
     lastOutput = extract->GetOutputPort();
-    }
+  }
 
   // check if slices were reordered by the reader
   vtkIntArray *fileIndices = reader->GetFileIndexArray();
@@ -664,14 +610,14 @@ void dicomtonifti_convert_one(
   vtkSmartPointer<vtkDICOMCTRectifier> rectifier =
     vtkSmartPointer<vtkDICOMCTRectifier>::New();
   if (fabs(vtkDICOMCTRectifier::GetGantryDetectorTilt(patientMatrix)) > 1e-2)
-    {
+  {
     // tilt is significant, so regrid as a rectangular volume
     rectifier->SetInputConnection(lastOutput);
     rectifier->SetVolumeMatrix(patientMatrix);
     rectifier->Update();
     lastOutput = rectifier->GetOutputPort();
     patientMatrix = rectifier->GetRectifiedMatrix();
-    }
+  }
 
   // convert to NIFTI coordinate system
   vtkSmartPointer<vtkDICOMToRAS> converter =
@@ -688,10 +634,10 @@ void dicomtonifti_convert_one(
   checkMatrix->DeepCopy(patientMatrix);
   // undo the DICOM to NIFTI x = -x, y = -y conversion in check matrix
   for (int j = 0; j < 4; j++)
-    {
+  {
     checkMatrix->Element[0][j] = -checkMatrix->Element[0][j];
     checkMatrix->Element[1][j] = -checkMatrix->Element[1][j];
-    }
+  }
   checkMatrix->Invert();
   // checkMatrix = PatientMatrix^(-1) * RASMatrix
   vtkMatrix4x4::Multiply4x4(
@@ -713,7 +659,7 @@ void dicomtonifti_convert_one(
   int permutation[3] = { 0, 1, 2 };
 
   if (options->reformat_to_axial || options->fsl)
-    {
+  {
     // this becomes meaningless after reformatting
     slicesReordered = false;
 
@@ -725,50 +671,50 @@ void dicomtonifti_convert_one(
     int prevmaxj = -1;
     int prevmaxi = -1;
     for (int kdim = 0; kdim < 2; kdim++)
-      {
+    {
       int maxj = 0;
       int maxi = 0;
       double maxv = -0.0;
       for (int jdim = 0; jdim < 3; jdim++)
-        {
+      {
         if (jdim == prevmaxj) { continue; }
         for (int idim = 0; idim < 3; idim++)
-          {
+        {
           if (idim == prevmaxi) { continue; }
           double v = axes->GetElement(jdim, idim);
           if (v*v >= maxv)
-            {
+          {
             maxi = idim;
             maxj = jdim;
             maxv = v*v;
-            }
           }
         }
+      }
       maxidx[maxj] = maxi;
       value[maxj] = (axes->GetElement(maxj, maxi) < 0 ? -1.0 : 1.0);
       prevmaxj = maxj;
       prevmaxi = maxi;
-      }
+    }
 
     axes->Zero();
     axes->SetElement(3, 3, 1.0);
     for (int jdim = 0; jdim < 3; jdim++)
-      {
+    {
       int idim = maxidx[jdim];
       if (idim < 0)
-        {
+      {
         idim = 3 - maxidx[(jdim+1)%3] - maxidx[(jdim+2)%3];
         maxidx[jdim] = idim;
         double perm = (((3 + maxidx[2] - maxidx[0])%3) == 2 ? 1.0 : -1.0);
         value[jdim] = value[(jdim+1)%3]*value[(jdim+2)%3]*perm;
-        }
+      }
       permutation[jdim] = idim;
       axes->SetElement(jdim, idim, value[jdim]);
-      }
+    }
 
     // if fsl, use the fsl orientation
     if (options->fsl)
-      {
+    {
       double fslmat[16] = {
         -1.0,  0.0,  0.0,  0.0,
          0.0,  1.0,  0.0,  0.0,
@@ -776,7 +722,7 @@ void dicomtonifti_convert_one(
          0.0,  0.0,  0.0,  1.0 };
 
       vtkMatrix4x4::Multiply4x4(*axes->Element, fslmat, *axes->Element);
-      }
+    }
     // reformat with the permutated axes
     reformat->SetResliceAxes(axes);
     reformat->SetInputConnection(lastOutput);
@@ -784,7 +730,7 @@ void dicomtonifti_convert_one(
 
     // factor out the permuted axes
     vtkMatrix4x4::Multiply4x4(matrix, axes, matrix);
-    }
+  }
 
   // convert to signed short if fsl
   int scalarType = reader->GetOutput()->GetScalarType();
@@ -792,40 +738,40 @@ void dicomtonifti_convert_one(
     vtkSmartPointer<vtkImageCast>::New();
   if (options->fsl && scalarType != VTK_UNSIGNED_CHAR &&
       scalarType != VTK_SHORT && scalarType != VTK_FLOAT)
-    {
+  {
     double outputType = scalarType;
 
     if (scalarType == VTK_UNSIGNED_SHORT ||
         scalarType == VTK_CHAR ||
         scalarType == VTK_SIGNED_CHAR)
-      {
+    {
       outputType = VTK_SHORT;
       if (scalarType == VTK_UNSIGNED_SHORT)
-        {
+      {
         // change to float if values greater than 32767 exist
         const unsigned short *sptr = static_cast<const unsigned short *>(
           reader->GetOutput()->GetScalarPointer());
         vtkIdType n = reader->GetOutput()->GetNumberOfPoints();
         n *= reader->GetOutput()->GetNumberOfScalarComponents();
         for (vtkIdType i = 0; i < n; i++)
-          {
+        {
           if (*sptr++ > 32767)
-            {
+          {
             outputType = VTK_FLOAT;
             break;
-            }
           }
         }
       }
+    }
     else
-      {
+    {
       outputType = VTK_FLOAT;
-      }
+    }
 
     caster->SetInputConnection(lastOutput);
     caster->SetOutputScalarType(outputType);
     lastOutput = caster->GetOutputPort();
-    }
+  }
 
   // prepare the NIFTI header information
   vtkSmartPointer<vtkNIFTIHeader> hdr =
@@ -835,13 +781,13 @@ void dicomtonifti_convert_one(
   // the descrip is the date followed by the series description and ID
   std::string date = meta->GetAttributeValue(DC::SeriesDate).AsString();
   if (date.length() >= 8)
-    {
+  {
     const char *months[13] = { "/   /", "/Jan/", "/Feb/", "/Mar/", "/Apr/",
       "/May/", "/Jun/", "/Jul/", "/Aug/", "/Sep/", "/Oct/", "/Nov/", "/Dec/" };
     unsigned int month = (date[4] - '0')*10 + (date[5] - '0');
     month = (month > 12 ? 0 : month);
     date = date.substr(6, 2) + months[month] + date.substr(0, 4);
-    }
+  }
   std::string descrip = date + " " +
     meta->GetAttributeValue(DC::SeriesDescription).AsString() + " " +
     meta->GetAttributeValue(DC::StudyID).AsString();
@@ -854,35 +800,35 @@ void dicomtonifti_convert_one(
   std::string phase = meta->GetAttributeValue(
     firstFile, firstFrame, vtkDICOMTag(0x0018,0x1312)).AsString();
   if (phase == "COLUMN")
-    {
+  {
     hdr->SetDimInfo((permutation[2] << 4) +
                     (permutation[0] << 2) +
                     (permutation[1]));
-    }
+  }
   else if (phase == "ROW")
-    {
+  {
     hdr->SetDimInfo((permutation[2] << 4) +
                     (permutation[1] << 2) +
                     (permutation[0]));
-    }
+  }
   else if (phase == "OTHER")
-    {
+  {
     hdr->SetDimInfo(permutation[2] << 4);
-    }
+  }
 
   // get the scale information, if same for all slices
   if (meta->GetAttributeValue(
        firstFile, firstFrame, DC::RescaleSlope).IsValid())
-    {
+  {
     hdr->SetSclSlope(reader->GetRescaleSlope());
     hdr->SetSclInter(reader->GetRescaleIntercept());
-    }
+  }
 
   // compute a cal_min, cal_max
   bool useWindowLevel = false;
   if (meta->GetAttributeValue(
        firstFile, firstFrame, DC::WindowWidth).IsValid())
-    {
+  {
     useWindowLevel = true;
     double w = meta->GetAttributeValue(
       firstFile, firstFrame, DC::WindowWidth).GetDouble(0);
@@ -890,37 +836,37 @@ void dicomtonifti_convert_one(
       firstFile, firstFrame, DC::WindowCenter).GetDouble(0);
     int n = fileIndices->GetNumberOfTuples();
     for (int i = 1; i < n; i++)
-      {
+    {
       int j = fileIndices->GetComponent(i, 0);
       int k = frameIndices->GetComponent(i, 0);
       double tw = meta->GetAttributeValue(j, k, DC::WindowWidth).GetDouble(0);
       double tl = meta->GetAttributeValue(j, k, DC::WindowCenter).GetDouble(0);
       if (tl != l || tw != w)
-        {
+      {
         useWindowLevel = false;
         break;
-        }
       }
+    }
     if (useWindowLevel)
-      {
+    {
       double m = hdr->GetSclSlope();
       double b = hdr->GetSclInter();
       if (m == 0)
-        {
+      {
         m = 1.0;
         b = 0.0;
-        }
+      }
       hdr->SetCalMin((l - 0.5*w)*m + b);
       hdr->SetCalMax((l + 0.5*w)*m + b);
-      }
     }
+  }
 #if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9)
   if (!useWindowLevel)
-    {
+  {
     std::string photometric =
       meta->GetAttributeValue(DC::PhotometricInterpretation).AsString();
     if (photometric == "MONOCHROME1" || photometric == "MONOCHROME2")
-      {
+    {
       // compute range rather than using DICOM window/level setting
       vtkSmartPointer<vtkImageHistogramStatistics> histo =
         vtkSmartPointer<vtkImageHistogramStatistics>::New();
@@ -929,12 +875,12 @@ void dicomtonifti_convert_one(
       double hrange[2];
       histo->GetAutoRange(hrange);
       if (hrange[0] < hrange[1])
-        {
+      {
         hdr->SetCalMin(hrange[0]);
         hdr->SetCalMax(hrange[1]);
-        }
       }
     }
+  }
 #endif
 
   // prepare the writer to write the image
@@ -945,24 +891,24 @@ void dicomtonifti_convert_one(
   writer->SetFileName(outfile);
   if (reader->GetTimeDimension() > 1 &&
       options->volume < 0)
-    {
+  {
     writer->SetTimeDimension(reader->GetTimeDimension());
     writer->SetTimeSpacing(reader->GetTimeSpacing());
-    }
+  }
   if ((options->no_slice_reordering && slicesReordered) ||
       options->fsl)
-    {
+  {
     // force NIFTI file to store images in original DICOM order
     writer->SetQFac(-1.0);
-    }
+  }
   if (!options->no_qform)
-    {
+  {
     writer->SetQFormMatrix(matrix);
-    }
+  }
   if (!options->no_sform)
-    {
+  {
     writer->SetSFormMatrix(matrix);
-    }
+  }
   writer->SetInputConnection(lastOutput);
   writer->Write();
   dicomtonifti_check_error(writer);
@@ -989,24 +935,23 @@ void dicomtonifti_convert_files(
   dicomtonifti_check_error(sorter);
 
   if (!options->batch)
-    {
+  {
     std::string outfile = outpath;
     if (options->compress)
-      {
+    {
       size_t os = strlen(outpath);
-      if (os > 2 &&
-          (outpath[os-3] != '.' ||
-           tolower(outpath[os-2]) != 'g' ||
-           tolower(outpath[os-1]) != 'z'))
-        {
+      if (os < 3 || outpath[os-3] != '.' ||
+          tolower(outpath[os-2]) != 'g' ||
+          tolower(outpath[os-1]) != 'z')
+      {
         outfile.append(".gz");
-        }
       }
+    }
     dicomtonifti_convert_one(
       options, sorter->GetOutputFileNames(), outfile.c_str());
-    }
+  }
   else
-    {
+  {
     vtkSmartPointer<vtkDICOMParser> parser =
       vtkSmartPointer<vtkDICOMParser>::New();
     vtkSmartPointer<vtkDICOMMetaData> meta =
@@ -1015,11 +960,11 @@ void dicomtonifti_convert_files(
 
     int m = sorter->GetNumberOfStudies();
     for (int j = 0; j < m; j++)
-      {
+    {
       int k = sorter->GetFirstSeriesForStudy(j);
       int kl = sorter->GetLastSeriesForStudy(j);
       for (; k <= kl; k++)
-        {
+      {
         // get metadata of first file
         vtkStringArray *a = sorter->GetFileNamesForSeries(k);
         std::string fname = a->GetValue(0);
@@ -1032,34 +977,40 @@ void dicomtonifti_convert_files(
         std::string outfile =
           dicomtonifti_make_filename(outpath, meta);
 
-        if (options->compress)
-          {
+        size_t os = outfile.length();
+        if (options->compress &&
+            (os < 3 || outfile[os-3] != '.' ||
+             tolower(outfile[os-2]) != 'g' ||
+             tolower(outfile[os-1]) != 'z'))
+        {
           outfile.append(".gz");
-          }
+        }
 
         // make the directory for the file
         if (k == sorter->GetFirstSeriesForStudy(j))
+        {
+          vtkDICOMFilePath path(outfile);
+          path.PopBack();
+          std::string dirname = path.AsString();
+          int code = vtkDICOMFileDirectory::Create(dirname.c_str());
+          if (code != vtkDICOMFileDirectory::Good)
           {
-          std::string dirname = vtksys::SystemTools::GetParentDirectory(
-            outfile.c_str());
-          if (!vtksys::SystemTools::MakeDirectory(dirname.c_str()))
-            {
             fprintf(stderr, "Cannot create directory: %s\n",
                     dirname.c_str());
             exit(1);
-            }
           }
+        }
 
         if (!options->silent)
-          {
+        {
           printf("%s\n", outfile.c_str());
-          }
+        }
 
         // convert the file
         dicomtonifti_convert_one(options, a, outfile.c_str());
-        }
       }
     }
+  }
 }
 
 // Process a list of files and directories
@@ -1074,71 +1025,74 @@ void dicomtonifti_files_and_dirs(
     vtkSmartPointer<vtkStringArray>::New();
   vtkIdType n = files->GetNumberOfValues();
   for (vtkIdType i = 0; i < n; i++)
-    {
+  {
     std::string fname = files->GetValue(i);
+    vtkDICOMFilePath path(fname);
     size_t m = fname.size();
     if ((m > 1 && (fname[m-1] == '/' || fname[m-1] == '\\')) ||
-        vtksys::SystemTools::FileIsDirectory(fname.c_str()))
-      {
+        path.IsDirectory())
+    {
       if (pastdirs->size() == 0 ||
           (options->recurse &&
-           (options->follow_symlinks ||
-            !vtksys::SystemTools::FileIsSymlink(fname.c_str()))))
-        {
+           (options->follow_symlinks || !path.IsSymlink())))
+      {
         directories->InsertNextValue(fname.c_str());
-        }
       }
+    }
     else
-      {
+    {
       newfiles->InsertNextValue(fname.c_str());
-      }
     }
+  }
 
   if (newfiles->GetNumberOfValues() > 0)
-    {
+  {
     dicomtonifti_convert_files(options, newfiles, outpath);
-    }
+  }
 
   n = directories->GetNumberOfValues();
-  vtksys::Directory directory;
-  std::vector<std::string> pathparts;
   for (vtkIdType i = 0; i < n; i++)
-    {
+  {
     std::string dirname = directories->GetValue(i);
+    vtkDICOMFilePath path(dirname);
 
     // avoid infinite recursion
-    std::string realpath = vtksys::SystemTools::GetRealPath(dirname.c_str());
+    std::string realpath = path.GetRealPath();
     if (pastdirs->count(realpath)) { continue; }
     pastdirs->insert(pastdirs->end(), realpath);
 
-    if (!directory.Load(dirname.c_str()))
-      {
+    vtkDICOMFileDirectory directory(dirname.c_str());
+    int code = directory.GetError();
+    if (code != vtkDICOMFileDirectory::Good)
+    {
       fprintf(stderr, "Could not open directory %s\n", dirname.c_str());
-      }
+    }
     else
-      {
+    {
       files->Initialize();
-      vtksys::SystemTools::SplitPath(directory.GetPath(), pathparts);
       unsigned long nf = directory.GetNumberOfFiles();
       for (unsigned long j = 0; j < nf; j++)
-        {
+      {
         const char *dirfile = directory.GetFile(j);
-        if (dirfile[0] != '.')
-          {
-          pathparts.push_back(dirfile);
-          std::string fullpath = vtksys::SystemTools::JoinPath(pathparts);
-          files->InsertNextValue(fullpath);
-          pathparts.pop_back();
-          }
+        if (dirfile[0] != '.' || (dirfile[1] != '\0' &&
+            (dirfile[1] != '.' || dirfile[2] != '\0')))
+        {
+          path.PushBack(dirfile);
+          files->InsertNextValue(path.AsString());
+          path.PopBack();
         }
-      dicomtonifti_files_and_dirs(options, files, outpath, pastdirs);
       }
+      dicomtonifti_files_and_dirs(options, files, outpath, pastdirs);
     }
+  }
 }
 
 // This program will convert DICOM to NIFTI
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   // for the list of input DICOM files
   vtkSmartPointer<vtkStringArray> files =
     vtkSmartPointer<vtkStringArray>::New();
@@ -1152,41 +1106,36 @@ MAINMACRO(argc, argv)
   // the output (NIFTI file or directory)
   const char *outpath = options.output;
   if (!outpath)
-    {
+  {
     fprintf(stderr,
       "\nNo output file was specified (\'-o\' <filename>).\n\n");
     dicomtonifti_usage(stderr, argv[0]);
     exit(1);
-    }
+  }
 
-  bool isDirectory = vtksys::SystemTools::FileIsDirectory(outpath);
+  int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In);
   size_t l = strlen(outpath);
-  std::string tmp;
-  if (options.batch && isDirectory)
-    {
-    std::vector<std::string> sv;
-    vtksys::SystemTools::SplitPath(outpath, sv);
-
-    sv.push_back(
+  vtkDICOMFilePath tmp(outpath);
+  if (options.batch && code == vtkDICOMFile::FileIsDirectory)
+  {
+    tmp.PushBack(
       "{PatientID}-{StudyDate}-{SeriesDescription}-{SeriesNumber}.nii");
-
-    tmp = vtksys::SystemTools::JoinPath(sv);
-    outpath = tmp.c_str();
-    }
-  else if (!options.batch && (isDirectory ||
+    outpath = tmp.AsString().c_str();
+  }
+  else if (!options.batch && (code == vtkDICOMFile::FileIsDirectory ||
            (l > 0 && (outpath[l-1] == '/' || outpath[l-1] == '\\'))))
-    {
+  {
     fprintf(stderr, "The -o option must give a file, not a directory.\n");
     exit(1);
-    }
+  }
 
   // make sure that input files were provided
   if (files->GetNumberOfValues() == 0)
-    {
+  {
     fprintf(stderr, "\nNo input files were specified.\n\n");
     dicomtonifti_usage(stderr, argv[0]);
     exit(1);
-    }
+  }
 
   std::set<std::string> pastdirs;
   dicomtonifti_files_and_dirs(&options, files, outpath, &pastdirs);
diff --git a/Programs/nifticenter.cxx b/Programs/nifticenter.cxx
index 40cfca6..e435912 100644
--- a/Programs/nifticenter.cxx
+++ b/Programs/nifticenter.cxx
@@ -25,6 +25,7 @@
 #include <stdlib.h>
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 
 // remove path portion of filename
@@ -36,15 +37,18 @@ const char *basename(const char *filename)
 }
 
 // This program will convert
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   int rval = 0;
 
   if (argc < 2)
-    {
+  {
     printf("usage: %s input.nii output.nii\n", basename(argv[0]));
     return rval;
-    }
+  }
 
   vtkSmartPointer<vtkNIFTIReader> reader =
     vtkSmartPointer<vtkNIFTIReader>::New();
diff --git a/Programs/niftidump.cxx b/Programs/niftidump.cxx
index edcb419..b3e81ab 100644
--- a/Programs/niftidump.cxx
+++ b/Programs/niftidump.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -16,16 +16,18 @@
 #include "vtkNIFTIReader.h"
 #include "vtkNIFTIHeader.h"
 #include "vtkNIFTIPrivate.h"
-#include "vtkMatrix4x4.h"
-#include "vtkStringArray.h"
 
+#include <vtkMatrix4x4.h>
+#include <vtkStringArray.h>
 #include <vtkSmartPointer.h>
 
 #include <stdio.h>
+#include <ctype.h>
 #include <string.h>
 #include <stdlib.h>
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 
 // print the version
@@ -33,7 +35,7 @@ void printVersion(FILE *file, const char *cp)
 {
   fprintf(file, "%s %s\n", cp, DICOM_VERSION);
   fprintf(file, "\n"
-    "Copyright (c) 2012-2015, David Gobbi.\n\n"
+    "Copyright (c) 2012-2016, David Gobbi.\n\n"
     "This software is distributed under an open-source license.  See the\n"
     "Copyright.txt file that comes with the vtk-dicom source distribution.\n");
 }
@@ -56,6 +58,34 @@ void printHelp(FILE *file, const char *cp)
     "Dump the header from a NIfTI file.\n");
 }
 
+// sanitize a string (remove unprintable characters)
+#define SANITIZE_BUFSIZE 82
+const char *stringSanitize(
+  char op[SANITIZE_BUFSIZE], const char *cp, size_t l)
+{
+  if (l >= SANITIZE_BUFSIZE)
+  {
+    l = SANITIZE_BUFSIZE - 1;
+  }
+
+  size_t i;
+  for (i = 0; i < l && cp[i] != '\0'; i++)
+  {
+    if (isprint(cp[i]))
+    {
+      op[i] = cp[i];
+    }
+    else
+    {
+      op[i] = '?';
+    }
+  }
+
+  op[i] = '\0';
+
+  return op;
+}
+
 // remove path portion of filename
 const char *fileBasename(const char *filename)
 {
@@ -65,25 +95,28 @@ const char *fileBasename(const char *filename)
 }
 
 // This program will convert
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   int rval = 0;
 
   if (argc < 2)
-    {
+  {
     printUsage(stdout, fileBasename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--help") == 0)
-    {
+  {
     printHelp(stdout, fileBasename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--version") == 0)
-    {
+  {
     printVersion(stdout, fileBasename(argv[0]));
     return rval;
-    }
+  }
 
   vtkSmartPointer<vtkNIFTIReader> reader =
     vtkSmartPointer<vtkNIFTIReader>::New();
@@ -94,13 +127,13 @@ MAINMACRO(argc, argv)
   reader->GetNIFTIHeader()->GetHeader(&hdr);
   int version = 0;
   if (hdr.magic[2] >= '0' && hdr.magic[2] <= '9')
-    {
+  {
     version = hdr.magic[2] - '0';
-    }
+  }
 
   const char *datatypeName = "";
   switch (hdr.datatype)
-    {
+  {
     case NIFTI_TYPE_UINT8:
       datatypeName = "uint8";
       break;
@@ -149,7 +182,7 @@ MAINMACRO(argc, argv)
     case NIFTI_TYPE_RGBA32:
       datatypeName = "rgba32";
       break;
-    }
+  }
 
   static const char *intentCodes[25] = {
     "none", "unknown", "correl", "ttest",
@@ -170,21 +203,21 @@ MAINMACRO(argc, argv)
   short ic = hdr.intent_code;
   const char *intentCode = "unknown";
   if (ic >= 0 && ic <= 25)
-    {
+  {
     intentCode = intentCodes[ic];
-    }
+  }
   else if (ic >= 1000 && ic <= 1011)
-    {
+  {
     intentCode = intentCodes1000[ic-1000];
-    }
+  }
   else if (ic >= 2000 && ic <= 2005)
-    {
+  {
     intentCode = intentCodes2000[ic-2000];
-    }
+  }
 
   const char *spaceUnits = "unknown";
   switch (hdr.xyzt_units & 0x7)
-    {
+  {
     case 1:
       spaceUnits = "meters";
       break;
@@ -194,11 +227,11 @@ MAINMACRO(argc, argv)
     case 3:
       spaceUnits = "microns";
       break;
-    }
+  }
 
   const char *timeUnits = "unknown";
   switch (hdr.xyzt_units & 0x38)
-    {
+  {
     case 8:
       timeUnits = "seconds";
       break;
@@ -217,11 +250,11 @@ MAINMACRO(argc, argv)
     case 48:
       timeUnits = "radians";
       break;
-    }
+  }
 
   const char *sliceCode = "unknown";
   switch (hdr.slice_code)
-    {
+  {
     case 1:
       sliceCode = "seq_inc";
       break;
@@ -240,16 +273,16 @@ MAINMACRO(argc, argv)
     case 6:
       sliceCode = "alt_dec2";
       break;
-    }
+  }
 
   const char *xformCode[2] = { "unknown", "unknown" };
   short xc[2];
   xc[0] = hdr.qform_code;
   xc[1] = hdr.sform_code;
   for (int i = 0; i < 2; i++)
-    {
+  {
     switch (xc[i])
-      {
+    {
       case 1:
         xformCode[i] = "scanner_anat";
         break;
@@ -262,128 +295,107 @@ MAINMACRO(argc, argv)
       case 4:
         xformCode[i] = "mni_152";
         break;
-      }
     }
+  }
 
-  cout << "sizeof_hdr: " << (version >= 2 ?
-                             vtkNIFTIHeader::Nifti2HeaderSize :
-                             vtkNIFTIHeader::Nifti1HeaderSize) << "\n";
-  cout << "vox_offset: " << hdr.vox_offset << "\n";
-  //cout << "data_type: " << hdr.data_type << "\n";
-  //cout << "db_name: " << hdr.db_name << "\n";
-  //cout << "extents: " << hdr.extents << "\n";
-  //cout << "session_error: " << hdr.session_error << "\n";
-  //cout << "regular: " << static_cast<int>(hdr.regular) << "\n";
-  cout.setf(std::ios::hex, std::ios::basefield);
-  cout << "dim_info: 0x" << static_cast<int>(hdr.dim_info);
+  // temporary space
+  char buf[SANITIZE_BUFSIZE];
+
+  printf("sizeof_hdr: %d\n", (version >= 2 ?
+                              vtkNIFTIHeader::Nifti2HeaderSize :
+                              vtkNIFTIHeader::Nifti1HeaderSize));
+  printf("vox_offset: %lld\n", hdr.vox_offset);
+  //printf("data_type: %.10s\n", hdr.data_type);
+  //printf("db_name: %.18s\n", hdr.db_name);
+  //printf("extents: %d\n", hdr.extents);
+  //printf("session_error: %d\n", hdr.session_error);
+  //printf("regular: %d\n", hdr.regular);
+  printf("dim_info: 0x%x", hdr.dim_info);
   if (hdr.dim_info == 0)
-    {
-    cout << " (unknown)\n";
-    }
+  {
+    printf(" (unknown)\n");
+  }
   else
-    {
-    cout << " (freq_dim=" << (hdr.dim_info & 0x3)
-         << ", phase_dim=" << ((hdr.dim_info >> 2) & 0x3)
-         << ", slice_dim=" << ((hdr.dim_info >> 4) & 0x3) << ")\n";
-    }
-  cout.unsetf(std::ios::hex);
-  cout << "dim:";
+  {
+    printf(" (freq_dim=%d, phase_dim=%d, slice_dim=%d\n",
+           (hdr.dim_info & 0x3),
+           ((hdr.dim_info >> 2) & 0x3),
+           ((hdr.dim_info >> 4) & 0x3));
+  }
+  printf("dim:");
   for (int i = 0; i < 8; i++)
-    {
-    cout << " " << hdr.dim[i];
-    }
-  cout << "\n";
-  cout << "pixdim:";
+  {
+    printf(" %lld", hdr.dim[i]);
+  }
+  printf("\n");
+  printf("pixdim:");
   for (int i = 0; i < 8; i++)
-    {
-    cout << " " << hdr.pixdim[i];
-    }
-  cout << "\n";
-  cout.setf(std::ios::hex, std::ios::basefield);
-  cout << "xyzt_units: 0x" << static_cast<int>(hdr.xyzt_units)
-       << " (" << spaceUnits << ", " << timeUnits << ")\n";
-  cout.unsetf(std::ios::hex);
+  {
+    printf(" %g", hdr.pixdim[i]);
+  }
+  printf("\n");
+  printf("xyzt_units: 0x%x (%s, %s)\n",
+         hdr.xyzt_units, spaceUnits, timeUnits);
   if (version > 0)
-    {
-    cout << "intent_code: " << hdr.intent_code
-         << " (" << intentCode << ")\n";
-    cout << "intent_name: \"";
-    for (size_t j = 0;
-         j < sizeof(hdr.intent_name) && hdr.intent_name[j] != '\0';
-         j++)
-      {
-      cout << (isprint(hdr.intent_name[j]) ? hdr.intent_name[j] : '?');
-      }
-    cout << "\"\n";
-    cout << "intent_p1: " << hdr.intent_p1 << "\n";
-    cout << "intent_p2: " << hdr.intent_p2 << "\n";
-    cout << "intent_p3: " << hdr.intent_p3 << "\n";
-    }
-  cout << "datatype: " << hdr.datatype
-     << " (" << datatypeName << ")\n";
-  cout << "bitpix: " << hdr.bitpix << "\n";
+  {
+    printf("intent_code: %d (%s)\n",
+           hdr.intent_code, intentCode);
+    printf("intent_name: \"%s\"\n",
+           stringSanitize(buf, hdr.intent_name, sizeof(hdr.intent_name)));
+    printf("intent_p1: %g\n", hdr.intent_p1);
+    printf("intent_p2: %g\n", hdr.intent_p2);
+    printf("intent_p3: %g\n", hdr.intent_p3);
+  }
+  printf("datatype: %d (%s)\n", hdr.datatype, datatypeName);
+  printf("bitpix: %d\n", hdr.bitpix);
   if (version > 0)
+  {
+    printf("scl_slope: %g\n", hdr.scl_slope);
+    printf("scl_inter: %g\n", hdr.scl_inter);
+    printf("cal_max: %g\n", hdr.cal_max);
+    printf("cal_min: %g\n", hdr.cal_min);
+    printf("slice_code: %d (%s)\n", hdr.slice_code, sliceCode);
+    printf("slice_start: %lld\n", hdr.slice_start);
+    printf("slice_end: %lld\n", hdr.slice_end);
+    printf("slice_duration: %g\n", hdr.slice_duration);
+    printf("toffset: %g\n", hdr.toffset);
+  }
+  printf("descrip: \"%s\"\n",
+         stringSanitize(buf, hdr.descrip, sizeof(hdr.descrip)));
+  printf("aux_file: \"%s\"\n",
+         stringSanitize(buf, hdr.aux_file, sizeof(hdr.aux_file)));
+  if (version > 0)
+  {
+    printf("qform_code: %d (%s)\n", hdr.qform_code, xformCode[0]);
+    printf("sform_code: %d (%s)\n", hdr.sform_code, xformCode[1]);
+    printf("quatern_b: %g\n", hdr.quatern_b);
+    printf("quatern_c: %g\n", hdr.quatern_c);
+    printf("quatern_d: %g\n", hdr.quatern_d);
+    printf("qoffset_x: %g\n", hdr.qoffset_x);
+    printf("qoffset_y: %g\n", hdr.qoffset_y);
+    printf("qoffset_z: %g\n", hdr.qoffset_z);
+    printf("srow_x:");
+    for (int i = 0; i < 4; i++)
     {
-    cout << "scl_slope: " << hdr.scl_slope << "\n";
-    cout << "scl_inter: " << hdr.scl_inter << "\n";
-    cout << "cal_max: " << hdr.cal_max << "\n";
-    cout << "cal_min: " << hdr.cal_min << "\n";
-    cout << "slice_code: " << static_cast<int>(hdr.slice_code)
-         << " (" << sliceCode << ")\n";
-    cout << "slice_start: " << hdr.slice_start << "\n";
-    cout << "slice_end: " << hdr.slice_end << "\n";
-    cout << "slice_duration: " << hdr.slice_duration << "\n";
-    cout << "toffset: " << hdr.toffset << "\n";
-    }
-  cout << "descrip: \"";
-  for (size_t j = 0; j < sizeof(hdr.descrip) && hdr.descrip[j] != '\0'; j++)
-    {
-    cout << (isprint(hdr.descrip[j]) ? hdr.descrip[j] : '?');
+      printf(" %g", hdr.srow_x[i]);
     }
-  cout << "\"\n";
-  cout << "aux_file: \"";
-  for (size_t j = 0; j < sizeof(hdr.aux_file) && hdr.aux_file[j] != '\0'; j++)
+    printf("\n");
+    printf("srow_y:");
+    for (int i = 0; i < 4; i++)
     {
-    cout << (isprint(hdr.aux_file[j]) ? hdr.aux_file[j] : '?');
+      printf(" %g", hdr.srow_y[i]);
     }
-  cout << "\"\n";
-  if (version > 0)
-    {
-    cout << "qform_code: " << hdr.qform_code
-         << " (" << xformCode[0] << ")\n";
-    cout << "sform_code: " << hdr.sform_code
-         << " (" << xformCode[1] << ")\n";
-    cout << "quatern_b: " << hdr.quatern_b << "\n";
-    cout << "quatern_c: " << hdr.quatern_c << "\n";
-    cout << "quatern_d: " << hdr.quatern_d << "\n";
-    cout << "qoffset_x: " << hdr.qoffset_x << "\n";
-    cout << "qoffset_y: " << hdr.qoffset_y << "\n";
-    cout << "qoffset_z: " << hdr.qoffset_z << "\n";
-    cout << "srow_x:";
+    printf("\n");
+    printf("srow_z:");
     for (int i = 0; i < 4; i++)
-      {
-      cout << " " << hdr.srow_x[i];
-      }
-    cout << "\n";
-    cout << "srow_y:";
-    for (int i = 0; i < 4; i++)
-      {
-      cout << " " << hdr.srow_y[i];
-      }
-    cout << "\n";
-    cout << "srow_z:";
-    for (int i = 0; i < 4; i++)
-      {
-      cout << " " << hdr.srow_z[i];
-      }
-    cout << "\n";
-    cout << "magic: \"";
-    for (size_t j = 0; j < sizeof(hdr.magic) && hdr.magic[j] != '\0'; j++)
-      {
-      cout << (isprint(hdr.magic[j]) ? hdr.magic[j] : '?');
-      }
-    cout << "\"" << endl;
+    {
+      printf(" %g", hdr.srow_z[i]);
     }
+    printf("\n");
+    printf("magic: \"%s\"\n",
+           stringSanitize(buf, hdr.magic, sizeof(hdr.magic)));
+    fflush(stdout);
+  }
 
   return rval;
 }
diff --git a/Programs/niftitodicom.cxx b/Programs/niftitodicom.cxx
index a9aa9b0..e414f22 100644
--- a/Programs/niftitodicom.cxx
+++ b/Programs/niftitodicom.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -24,6 +24,8 @@
 #include "vtkDICOMToRAS.h"
 #include "vtkDICOMCTRectifier.h"
 #include "vtkDICOMUtilities.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
 #include "vtkNIFTIHeader.h"
 #include "vtkNIFTIReader.h"
 
@@ -42,10 +44,6 @@
 #include <vtkImageHistogramStatistics.h>
 #endif
 
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-#include <vtksys/Glob.hxx>
-
 #include <string>
 #include <vector>
 #include <set>
@@ -56,6 +54,7 @@
 #include <ctype.h>
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 
 // Kinds of reformats
@@ -89,19 +88,19 @@ void niftitodicom_version(FILE *file, const char *command_name, bool verbose)
   while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
 
   if (!verbose)
-    {
+  {
     fprintf(file, "%s %s\n", cp, DICOM_VERSION);
     fprintf(file, "\n"
-      "Copyright (c) 2012-2015, David Gobbi.\n\n"
+      "Copyright (c) 2012-2016, David Gobbi.\n\n"
       "This software is distributed under an open-source license.  See the\n"
       "Copyright.txt file that comes with the vtk-dicom source distribution.\n");
-    }
+  }
   else
-    {
+  {
     fprintf(file,
       "Head %8.8s, Built %s, %s\n",
       DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME);
-    }
+  }
 }
 
 
@@ -176,32 +175,32 @@ void niftitodicom_check_error(vtkObject *o)
   const char *filename = 0;
   unsigned long errorcode = 0;
   if (writer)
-    {
+  {
     filename = writer->GetFileName();
     errorcode = writer->GetErrorCode();
-    }
+  }
   else if (reader)
-    {
+  {
     filename = reader->GetInternalFileName();
     errorcode = reader->GetErrorCode();
-    }
+  }
   else if (sorter)
-    {
+  {
     filename = sorter->GetInternalFileName();
     errorcode = sorter->GetErrorCode();
-    }
+  }
   else if (parser)
-    {
+  {
     filename = parser->GetFileName();
     errorcode = parser->GetErrorCode();
-    }
+  }
   if (!filename)
-    {
+  {
     filename = "";
-    }
+  }
 
   switch(errorcode)
-    {
+  {
     case vtkErrorCode::NoError:
       return;
     case vtkErrorCode::FileNotFoundError:
@@ -228,65 +227,11 @@ void niftitodicom_check_error(vtkObject *o)
     default:
       fprintf(stderr, "An unknown error occurred.\n");
       break;
-    }
+  }
 
   exit(1);
 }
 
-// Add a dicom file to the list, expand if wildcard
-void niftitodicom_add_file(vtkStringArray *files, const char *filepath)
-{
-#ifdef _WIN32
-  bool ispattern = false;
-  bool hasbackslash = false;
-  size_t n = strlen(filepath);
-  for (size_t i = 0; i < n; i++)
-    {
-    if (filepath[i] == '*' || filepath[i] == '?' || filepath[i] == '[')
-      {
-      ispattern = true;
-      }
-    if (filepath[i] == '\\')
-      {
-      hasbackslash = true;
-      }
-    }
-
-  std::string newpath = filepath;
-  if (hasbackslash)
-    {
-    // backslashes interfere with vtksys::Glob
-    vtksys::SystemTools::ConvertToUnixSlashes(newpath);
-    }
-  filepath = newpath.c_str();
-
-  if (ispattern)
-    {
-    vtksys::Glob glob;
-    if (glob.FindFiles(filepath))
-      {
-      const std::vector<std::string> &globfiles = glob.GetFiles();
-      size_t m = globfiles.size();
-      for (size_t j = 0; j < m; j++)
-        {
-        files->InsertNextValue(globfiles[j]);
-        }
-      }
-    else
-      {
-      fprintf(stderr, "Could not match pattern: %s\n", filepath);
-      exit(1);
-      }
-    }
-  else
-    {
-    files->InsertNextValue(filepath);
-    }
-#else
-  files->InsertNextValue(filepath);
-#endif
-}
-
 // Check that a file has a NIFTI name
 bool isNIFTIFileName(const char *f)
 {
@@ -296,13 +241,13 @@ bool isNIFTIFileName(const char *f)
 
   size_t n = strlen(f);
   for (const char **s = suffixes; *s != 0; s++)
-    {
+  {
     size_t m = strlen(*s);
     if (n > m && strcmp(f + n - m, *s) == 0)
-      {
+    {
       return true;
-      }
     }
+  }
 
   return false;
 }
@@ -326,177 +271,177 @@ void niftitodicom_read_options(
   // read the options from the command line
   int argi = 1;
   while (argi < argc)
-    {
+  {
     const char *arg = argv[argi++];
     if (arg[0] == '-')
-      {
+    {
       if (strcmp(arg, "--") == 0)
-        {
+      {
         // stop processing switches
         break;
-        }
+      }
       else if (strcmp(arg, "--modality") == 0 ||
                strcmp(arg, "--series-description") == 0 ||
                strcmp(arg, "--series-number") == 0 ||
                strcmp(arg, "--uid-prefix") == 0)
-        {
+      {
         if (argi >= argc ||
             argv[argi][0] == '-')
-          {
+        {
           fprintf(stderr, "\nA value must follow the \'%s\' flag\n\n", arg);
           exit(1);
-          }
+        }
         if (strcmp(arg, "--modality") == 0)
-          {
+        {
           options->modality = argv[argi];
-          }
+        }
         else if (strcmp(arg, "--series-description") == 0)
-          {
+        {
           options->series_description = argv[argi];
-          }
+        }
         else if (strcmp(arg, "--series-number") == 0)
-          {
+        {
           options->series_number= argv[argi];
-          }
+        }
         else if (strcmp(arg, "--uid-prefix") == 0)
-          {
+        {
           options->uid_prefix = argv[argi];
-          }
-        argi++;
         }
+        argi++;
+      }
       else if (strcmp(arg, "--axial") == 0)
-        {
+      {
         options->mpr = MPRAxial;
-        }
+      }
       else if (strcmp(arg, "--coronal") == 0)
-        {
+      {
         options->mpr = MPRCoronal;
-        }
+      }
       else if (strcmp(arg, "--sagittal") == 0)
-        {
+      {
         options->mpr = MPRSagittal;
-        }
+      }
       else if (strcmp(arg, "--no-reordering") == 0)
-        {
+      {
         options->no_reordering = true;
-        }
+      }
       else if (strcmp(arg, "--silent") == 0)
-        {
+      {
         options->silent = true;
-        }
+      }
       else if (strcmp(arg, "--verbose") == 0)
-        {
+      {
         options->verbose = true;
-        }
+      }
       else if (strcmp(arg, "--version") == 0)
-        {
+      {
         niftitodicom_version(stdout, argv[0], false);
         exit(0);
-        }
+      }
       else if (strcmp(arg, "--build-version") == 0)
-        {
+      {
         niftitodicom_version(stdout, argv[0], true);
         exit(0);
-        }
+      }
       else if (strcmp(arg, "--help") == 0)
-        {
+      {
         niftitodicom_help(stdout, argv[0]);
         exit(0);
-        }
+      }
       else if (arg[0] == '-' && arg[1] == '-')
-        {
+      {
         fprintf(stderr, "\nUnrecognized option %s\n\n", arg);
         niftitodicom_usage(stderr, argv[0]);
         exit(1);
-        }
+      }
       else if (arg[0] == '-' && arg[1] != '-')
-        {
+      {
         for (int argj = 1; arg[argj] != '\0'; argj++)
-          {
+        {
           if (arg[argj] == 's')
-            {
+          {
             options->silent = true;
-            }
+          }
           else if (arg[argj] == 'v')
-            {
+          {
             options->verbose = true;
-            }
+          }
           else if (arg[argj] == 'o')
-            {
+          {
             if (arg[argj+1] != '\0')
-              {
+            {
               arg += argj+1;
-              }
+            }
             else
-              {
+            {
               if (argi >= argc)
-                {
+              {
                 fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n");
                 niftitodicom_usage(stderr, argv[0]);
                 exit(1);
-                }
-              arg = argv[argi++];
               }
+              arg = argv[argi++];
+            }
             options->output = arg;
             break;
-            }
+          }
           else
-            {
+          {
             fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg);
             niftitodicom_usage(stderr, argv[0]);
             exit(1);
-            }
           }
         }
       }
+    }
     else
-      {
-      niftitodicom_add_file(files, arg);
+    {
+      files->InsertNextValue(arg);
       vtkIdType m = files->GetMaxId();
       if (m >= 0)
-        {
+      {
         const char *f = files->GetValue(m);
         if (isNIFTIFileName(f))
-          {
+        {
           if (options->input == 0)
-            {
+          {
             options->input = arg;
             files->SetNumberOfValues(m);
-            }
+          }
           else
-            {
+          {
             fprintf(stderr, "\nAt most one NIFTI file can be specified.\n");
             niftitodicom_usage(stderr, argv[0]);
             exit(1);
-            }
           }
         }
       }
     }
+  }
 
   while (argi < argc)
-    {
-    niftitodicom_add_file(files, argv[argi++]);
+  {
+    files->InsertNextValue(argv[argi++]);
     vtkIdType m = files->GetMaxId();
     if (m >= 0)
-      {
+    {
       const char *f = files->GetValue(m);
       if (isNIFTIFileName(f))
-        {
+      {
         if (options->input == 0)
-          {
+        {
           options->input = argv[argi-1];
           files->SetNumberOfValues(m);
-          }
+        }
         else
-          {
+        {
           fprintf(stderr, "\nAt most one NIFTI file can be specified.\n");
           niftitodicom_usage(stderr, argv[0]);
           exit(1);
-          }
         }
       }
     }
+  }
 }
 
 // Convert one NIFTI file into a DICOM series
@@ -518,21 +463,21 @@ void niftitodicom_convert_one(
   dicomReader->SetMemoryRowOrderToFileNative();
   vtkMatrix4x4 *readerMatrix = 0;
   if (a->GetNumberOfValues() > 0)
-    {
+  {
     dicomReader->UpdateInformation();
     meta->DeepCopy(dicomReader->GetMetaData());
     readerMatrix = dicomReader->GetPatientMatrix();
-    }
+  }
 
   // set the metadata supplied on the command line
   if (options->series_description)
-    {
+  {
     meta->SetAttributeValue(DC::SeriesDescription, options->series_description);
-    }
+  }
   if (options->series_number)
-    {
+  {
     meta->SetAttributeValue(DC::SeriesNumber, options->series_number);
-    }
+  }
 
   // read the NIFTI file
   vtkSmartPointer<vtkNIFTIReader> reader =
@@ -553,15 +498,15 @@ void niftitodicom_convert_one(
   vtkMatrix4x4 *inputMatrix = 0;
   int xformCode = 0;
   if (reader->GetQFormMatrix())
-    {
+  {
     inputMatrix = reader->GetQFormMatrix();
     xformCode = hdr->GetQFormCode();
-    }
+  }
   else if (reader->GetSFormMatrix())
-    {
+  {
     inputMatrix = reader->GetSFormMatrix();
     xformCode = hdr->GetSFormCode();
-    }
+  }
 
   // convert to NIFTI coordinate system
   vtkSmartPointer<vtkDICOMToRAS> converter =
@@ -578,15 +523,15 @@ void niftitodicom_convert_one(
   vtkSmartPointer<vtkMatrix4x4> checkMatrix =
     vtkSmartPointer<vtkMatrix4x4>::New();
   if (inputMatrix)
-    {
+  {
     checkMatrix->DeepCopy(inputMatrix);
-    }
+  }
   // undo the NIFTI to DICOM x = -x, y = -y conversion in check matrix
   for (int j = 0; j < 4; j++)
-    {
+  {
     checkMatrix->Element[0][j] = -checkMatrix->Element[0][j];
     checkMatrix->Element[1][j] = -checkMatrix->Element[1][j];
-    }
+  }
   checkMatrix->Invert();
   // checkMatrix = PatientMatrix^(-1) * RASMatrix
   vtkMatrix4x4::Multiply4x4(
@@ -607,7 +552,7 @@ void niftitodicom_convert_one(
   int permutation[3] = { 0, 1, 2 };
 
   if (options->mpr)
-    {
+  {
     // this becomes meaningless after reformatting
     slicesReordered = false;
 
@@ -619,50 +564,50 @@ void niftitodicom_convert_one(
     int prevmaxj = -1;
     int prevmaxi = -1;
     for (int kdim = 0; kdim < 2; kdim++)
-      {
+    {
       int maxj = 0;
       int maxi = 0;
       double maxv = -0.0;
       for (int jdim = 0; jdim < 3; jdim++)
-        {
+      {
         if (jdim == prevmaxj) { continue; }
         for (int idim = 0; idim < 3; idim++)
-          {
+        {
           if (idim == prevmaxi) { continue; }
           double v = axes->GetElement(jdim, idim);
           if (v*v >= maxv)
-            {
+          {
             maxi = idim;
             maxj = jdim;
             maxv = v*v;
-            }
           }
         }
+      }
       maxidx[maxj] = maxi;
       value[maxj] = (axes->GetElement(maxj, maxi) < 0 ? -1.0 : 1.0);
       prevmaxj = maxj;
       prevmaxi = maxi;
-      }
+    }
 
     axes->Zero();
     axes->SetElement(3, 3, 1.0);
     for (int jdim = 0; jdim < 3; jdim++)
-      {
+    {
       int idim = maxidx[jdim];
       if (idim < 0)
-        {
+      {
         idim = 3 - maxidx[(jdim+1)%3] - maxidx[(jdim+2)%3];
         maxidx[jdim] = idim;
         double perm = (((3 + maxidx[2] - maxidx[0])%3) == 2 ? 1.0 : -1.0);
         value[jdim] = value[(jdim+1)%3]*value[(jdim+2)%3]*perm;
-        }
+      }
       permutation[jdim] = idim;
       axes->SetElement(jdim, idim, value[jdim]);
-      }
+    }
 
     // change the permutation to the desired mpr
     if (options->mpr == MPRCoronal)
-      {
+    {
       double cmatrix[16] = {
         1.0, 0.0, 0.0, 0.0,
         0.0, 0.0, 1.0, 0.0,
@@ -673,9 +618,9 @@ void niftitodicom_convert_one(
       permutation[0] = tperm[0];
       permutation[1] = tperm[2];
       permutation[2] = tperm[1];
-      }
+    }
     else if (options->mpr == MPRSagittal)
-      {
+    {
       double smatrix[16] = {
         0.0, 0.0,-1.0, 0.0,
         1.0, 0.0, 0.0, 0.0,
@@ -686,7 +631,7 @@ void niftitodicom_convert_one(
       permutation[0] = tperm[1];
       permutation[1] = tperm[2];
       permutation[2] = tperm[0];
-      }
+    }
 
     // reformat with the permuted axes
     reformat->SetResliceAxes(axes);
@@ -695,7 +640,7 @@ void niftitodicom_convert_one(
 
     // factor out the permuted axes
     vtkMatrix4x4::Multiply4x4(matrix, axes, matrix);
-    }
+  }
 
   // convert to signed short if not short
   int scalarType = reader->GetOutput()->GetScalarType();
@@ -705,16 +650,16 @@ void niftitodicom_convert_one(
   // whether to allow 8-bit DICOM
   bool allowUnsignedChar = false;
   if (options->modality && strcmp(options->modality, "SC") == 0)
-    {
+  {
     allowUnsignedChar = true;
-    }
+  }
 
   if (scalarType != VTK_SHORT && scalarType != VTK_UNSIGNED_SHORT &&
       (scalarType != VTK_UNSIGNED_CHAR || !allowUnsignedChar))
-    {
+  {
 #if (VTK_MAJOR_VERSION > 5) || (VTK_MINOR_VERSION > 9)
     if (scalarType == VTK_FLOAT || scalarType == VTK_DOUBLE)
-      {
+    {
       // compute range
       vtkSmartPointer<vtkImageHistogramStatistics> histo =
         vtkSmartPointer<vtkImageHistogramStatistics>::New();
@@ -726,33 +671,33 @@ void niftitodicom_convert_one(
       histo->GetAutoRange(autoRange);
 
       if (minVal > 32768.0 || maxVal > 32767.0)
-        {
+      {
         // scale down if out-of-range
         double v = (maxVal > minVal ? maxVal : minVal);
         caster->SetScale(32767.0/v);
-        }
+      }
       else if (minVal < 2.047 && maxVal < 2.047)
-        {
+      {
         // scale up by 1000 if values are very small
         caster->SetScale(1000.0);
-        }
+      }
       else if (minVal < 20.47 && maxVal < 20.47)
-        {
+      {
         // scale up by 100 if values are small
         caster->SetScale(100.0);
-        }
+      }
       else if (minVal < 204.7 && maxVal < 204.7)
-        {
+      {
         // scale up by 10
         caster->SetScale(10.0);
-        }
       }
+    }
 #endif
 
     caster->SetInputConnection(lastOutput);
     caster->SetOutputScalarType(VTK_SHORT);
     lastOutput = caster->GetOutputPort();
-    }
+  }
 
   // check if requested to write as a CT tilted-gantry series via the
   // series of files that were sent to the reader
@@ -760,7 +705,7 @@ void niftitodicom_convert_one(
     vtkSmartPointer<vtkDICOMCTRectifier>::New();
   if (readerMatrix &&
       fabs(vtkDICOMCTRectifier::GetGantryDetectorTilt(readerMatrix)) > 0.01)
-    {
+  {
     rectifier->SetInputConnection(lastOutput);
     rectifier->SetVolumeMatrix(readerMatrix);
     rectifier->ReverseOn();
@@ -772,35 +717,35 @@ void niftitodicom_convert_one(
     vtkMatrix4x4::Multiply4x4(testMatrix, matrix, testMatrix);
     bool isIdentity = true;
     for (int ii = 0; ii < 4; ii++)
-      {
+    {
       for (int jj = 0; jj < 4; jj++)
-        {
+      {
         double dd = testMatrix->GetElement(ii,jj) - (ii == jj);
         isIdentity &= (fabs(dd) < 1e-3);
-        }
       }
+    }
     if (isIdentity)
-      {
+    {
       // exactly the same orientation, so write like the reader's series
       rectifier->Update();
       lastOutput = rectifier->GetOutputPort();
       matrix = readerMatrix;
-      }
     }
+  }
 
   // mix in the NIFTI header information
   if (xformCode == vtkNIFTIHeader::XFormTalairach)
-    {
+  {
     meta->SetAttributeValue(DC::FrameOfReferenceUID, "1.2.840.10008.1.4.1.1");
-    }
+  }
   else if (xformCode == vtkNIFTIHeader::XFormMNI152)
-    {
+  {
     meta->SetAttributeValue(DC::FrameOfReferenceUID, "1.2.840.10008.1.4.1.15");
-    }
+  }
   else if (xformCode != vtkNIFTIHeader::XFormScannerAnat)
-    {
+  {
     meta->RemoveAttribute(DC::FrameOfReferenceUID);
-    }
+  }
 
   // make the generator
   vtkSmartPointer<vtkDICOMMRGenerator> mrgenerator =
@@ -809,44 +754,44 @@ void niftitodicom_convert_one(
     vtkSmartPointer<vtkDICOMCTGenerator>::New();
   vtkDICOMGenerator *generator = mrgenerator;
   if (options->modality)
-    {
+  {
     if (strcmp(options->modality, "CT") == 0)
-      {
+    {
       generator = ctgenerator;
-      }
+    }
     else if (strcmp(options->modality, "MR") == 0 ||
              strcmp(options->modality, "MRI") == 0)
-      {
+    {
       generator = mrgenerator;
-      }
+    }
     else
-      {
+    {
       generator = 0;
-      }
     }
+  }
 
   // prepare the writer to write the image
   vtkSmartPointer<vtkDICOMWriter> writer =
     vtkSmartPointer<vtkDICOMWriter>::New();
   if (generator)
-    {
+  {
     writer->SetGenerator(generator);
-    }
+  }
   writer->SetMetaData(meta);
   writer->SetFilePrefix(outfile);
   writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");
   writer->TimeAsVectorOn();
   if (reader->GetTimeDimension() > 1)
-    {
+  {
     writer->SetTimeDimension(reader->GetTimeDimension());
     writer->SetTimeSpacing(reader->GetTimeSpacing());
-    }
+  }
   writer->SetPatientMatrix(matrix);
   if (reader->GetRescaleSlope() > 0)
-    {
+  {
     writer->SetRescaleSlope(reader->GetRescaleSlope());
     writer->SetRescaleIntercept(reader->GetRescaleIntercept());
-    }
+  }
   writer->SetInputConnection(lastOutput);
   writer->SetMemoryRowOrderToFileNative();
   writer->Write();
@@ -880,8 +825,11 @@ void niftitodicom_convert_files(
 }
 
 // This program will convert NIFTI to DICOM
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   // for the list of input DICOM files
   vtkSmartPointer<vtkStringArray> files =
     vtkSmartPointer<vtkStringArray>::New();
@@ -894,40 +842,39 @@ MAINMACRO(argc, argv)
 
   // set the UID prefix
   if (options.uid_prefix)
-    {
+  {
     vtkDICOMUtilities::SetUIDPrefix(options.uid_prefix);
-    }
+  }
 
   // the output (NIFTI file or directory)
   const char *outpath = options.output;
   if (!outpath)
-    {
+  {
     fprintf(stderr,
       "\nNo output directory was specified (\'-o\' <directory>).\n\n");
     niftitodicom_usage(stderr, argv[0]);
     exit(1);
-    }
+  }
   if (!options.input)
-    {
+  {
     fprintf(stderr,
       "\nNo input file was specified (.nii or .nii.gz).\n\n");
     niftitodicom_usage(stderr, argv[0]);
     exit(1);
-    }
+  }
 
-  if (vtksys::SystemTools::FileExists(outpath))
-    {
-    if (!vtksys::SystemTools::FileIsDirectory(outpath))
-      {
-      fprintf(stderr, "option -o must give a directory, not a file.\n");
-      exit(1);
-      }
-    }
-  else if (!vtksys::SystemTools::MakeDirectory(outpath))
-    {
+  int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In);
+  if (code != vtkDICOMFile::FileIsDirectory)
+  {
+    fprintf(stderr, "option -o must give a directory, not a file.\n");
+    exit(1);
+  }
+  code = vtkDICOMFileDirectory::Create(outpath);
+  if (code != vtkDICOMFileDirectory::Good)
+  {
     fprintf(stderr, "Cannot create directory: %s\n", outpath);
     exit(1);
-    }
+  }
 
   niftitodicom_convert_files(&options, files, outpath);
 
diff --git a/Programs/scancodump.cxx b/Programs/scancodump.cxx
index 5ec448e..630e023 100644
--- a/Programs/scancodump.cxx
+++ b/Programs/scancodump.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -21,6 +21,7 @@
 #include <stdlib.h>
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 
 // print the version
@@ -28,7 +29,7 @@ void printVersion(FILE *file, const char *cp)
 {
   fprintf(file, "%s %s\n", cp, DICOM_VERSION);
   fprintf(file, "\n"
-    "Copyright (c) 2012-2015, David Gobbi.\n\n"
+    "Copyright (c) 2012-2016, David Gobbi.\n\n"
     "This software is distributed under an open-source license.  See the\n"
     "Copyright.txt file that comes with the vtk-dicom source distribution.\n"
     "\n");
@@ -60,25 +61,28 @@ const char *fileBasename(const char *filename)
 }
 
 // This program will convert
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   int rval = 0;
 
   if (argc < 2)
-    {
+  {
     printUsage(stdout, fileBasename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--help") == 0)
-    {
+  {
     printHelp(stdout, fileBasename(argv[0]));
     return rval;
-    }
+  }
   else if (argc == 2 && strcmp(argv[1], "--version") == 0)
-    {
+  {
     printVersion(stdout, fileBasename(argv[0]));
     return rval;
-    }
+  }
 
   vtkSmartPointer<vtkScancoCTReader> reader =
     vtkSmartPointer<vtkScancoCTReader>::New();
@@ -92,57 +96,58 @@ MAINMACRO(argc, argv)
   reader->GetDataSpacing(spacing);
   reader->GetDataExtent(extent);
 
-  cout << "Version: " << reader->GetVersion() << "\n";
-  cout << "CreationDate: " << reader->GetCreationDate() << "\n";
+  printf("Version: %s\n", reader->GetVersion());
+  printf("CreationDate: %s\n", reader->GetCreationDate());
   if (strncmp(reader->GetVersion(), "AIMDATA", 7) == 0)
-    {
-    cout << "ModificationDate: " << reader->GetModificationDate() << "\n";
-    cout << "Position: "
-         << static_cast<int>(origin[0]/spacing[0] + 0.5) << " "
-         << static_cast<int>(origin[1]/spacing[1] + 0.5) << " "
-         << static_cast<int>(origin[2]/spacing[2] + 0.5) << "\n";
-    cout << "Dimensions: "
-         << (extent[1] - extent[0] + 1) << " "
-         << (extent[3] - extent[2] + 1) << " "
-         << (extent[5] - extent[4] + 1) << "\n";
-    cout << "ElementSize: "
-         << spacing[0] << " " << spacing[1] << " " << spacing[2] << " [mm]\n";
-    cout << "DataType: "
-         << (reader->GetDataScalarType() == VTK_SHORT ? "short\n" : "byte\n");
-    }
+  {
+    printf("ModificationDate: %s\n", reader->GetModificationDate());
+    printf("Position: %d %d %d\n",
+           static_cast<int>(origin[0]/spacing[0] + 0.5),
+           static_cast<int>(origin[1]/spacing[1] + 0.5),
+           static_cast<int>(origin[2]/spacing[2] + 0.5));
+    printf("Dimensions: %d %d %d\n",
+           (extent[1] - extent[0] + 1),
+           (extent[3] - extent[2] + 1),
+           (extent[5] - extent[4] + 1));
+    printf("ElementSize: %g %g %g [mm]\n",
+           spacing[0], spacing[1], spacing[2]);
+    printf("DataType: %s\n",
+           (reader->GetDataScalarType() == VTK_SHORT ? "short" : "byte"));
+  }
   reader->GetScanDimensionsPixels(ivec);
-  cout << "ScanDimensionsPixels: "
-       << ivec[0] << " " << ivec[1] << " " << ivec[2] << "\n";
+  printf("ScanDimensionsPixels: %d %d %d\n",
+         ivec[0], ivec[1], ivec[2]);
   reader->GetScanDimensionsPhysical(dvec);
-  cout << "ScanDimensionsPhysical: "
-       << dvec[0] << " " << dvec[1] << " " << dvec[2] << " [mm]\n";
-  cout << "PatientName: " << reader->GetPatientName() << "\n";
-  cout << "PatientIndex: " << reader->GetPatientIndex() << "\n";
-  cout << "MeasurementIndex: " << reader->GetMeasurementIndex() << "\n";
-  cout << "Site: " << reader->GetSite() << "\n";
-  cout << "ScannerID: " << reader->GetScannerID() << "\n";
-  cout << "ScannerType: " << reader->GetScannerType() << "\n";
-  cout << "PositionSlice1: " << reader->GetStartPosition() << " [mm]\n";
-  cout << "ReferenceLine: " << reader->GetReferenceLine() << " [mm]\n";
-  cout << "NumberOfSamples: " << reader->GetNumberOfSamples() << "\n";
-  cout << "NumberOfProjections: " << reader->GetNumberOfProjections() << "\n";
-  cout << "ScanDistance: " << reader->GetScanDistance() << " [mm]\n";
-  cout << "SampleTime: " << reader->GetSampleTime() << " [ms]\n";
-  cout << "SliceThickness: " << reader->GetSliceThickness() << " [mm]\n";
-  cout << "SliceIncrement: " << reader->GetSliceIncrement() << " [mm]\n";
-  cout << "ReconstructionAlg: " << reader->GetReconstructionAlg() << "\n";
-  cout << "Energy: " << reader->GetEnergy() << " [kV]\n";
-  cout << "Intensity: " << reader->GetIntensity() << " [mA]\n";
-  cout << "MuScaling: " << reader->GetMuScaling() << " [cm]\n";
+  printf("ScanDimensionsPhysical: %g %g %g [mm]\n",
+         dvec[0], dvec[1], dvec[2]);
+  printf("PatientName: %s\n", reader->GetPatientName());
+  printf("PatientIndex: %d\n", reader->GetPatientIndex());
+  printf("MeasurementIndex: %d\n", reader->GetMeasurementIndex());
+  printf("Site: %d\n", reader->GetSite());
+  printf("ScannerID: %d\n", reader->GetScannerID());
+  printf("ScannerType: %d\n", reader->GetScannerType());
+  printf("PositionSlice1: %g [mm]\n", reader->GetStartPosition());
+  printf("ReferenceLine: %g [mm]\n", reader->GetReferenceLine());
+  printf("NumberOfSamples: %d\n", reader->GetNumberOfSamples());
+  printf("NumberOfProjections: %d\n", reader->GetNumberOfProjections());
+  printf("ScanDistance: %g [mm]\n", reader->GetScanDistance());
+  printf("SampleTime: %g [ms]\n", reader->GetSampleTime());
+  printf("SliceThickness: %g [mm]\n", reader->GetSliceThickness());
+  printf("SliceIncrement: %g [mm]\n", reader->GetSliceIncrement());
+  printf("ReconstructionAlg: %d\n", reader->GetReconstructionAlg());
+  printf("Energy: %g [kV]\n", reader->GetEnergy());
+  printf("Intensity: %g [mA]\n", reader->GetIntensity());
+  printf("MuScaling: %g [cm]\n", reader->GetMuScaling());
   reader->GetDataRange(dvec);
-  cout << "DataRange: " << dvec[0] << " " << dvec[1] << "\n";
-  cout << "CalibrationData: " << reader->GetCalibrationData() << "\n";
-  cout << "RescaleType: " << reader->GetRescaleType() << "\n";
-  cout << "RescaleUnits: " << reader->GetRescaleUnits() << "\n";
-  cout << "RescaleSlope: " << reader->GetRescaleSlope() << "\n";
-  cout << "RescaleIntercept: " << reader->GetRescaleIntercept() << "\n";
-  cout << "MuWater: " << reader->GetMuWater() << " [cm^-1]\n";
-  cout << "HeaderSize: " << reader->GetHeaderSize() << "\n";
+  printf("DataRange: %g %g\n", dvec[0], dvec[1]);
+  printf("CalibrationData: %s\n", reader->GetCalibrationData());
+  printf("RescaleType: %d\n", reader->GetRescaleType());
+  printf("RescaleUnits: %s\n", reader->GetRescaleUnits());
+  printf("RescaleSlope: %g\n", reader->GetRescaleSlope());
+  printf("RescaleIntercept: %g\n", reader->GetRescaleIntercept());
+  printf("MuWater: %g [cm^-1]\n", reader->GetMuWater());
+  printf("HeaderSize: %d\n", static_cast<int>(reader->GetHeaderSize()));
+  fflush(stdout);
 
   return 0;
 }
diff --git a/Programs/scancotodicom.cxx b/Programs/scancotodicom.cxx
index 0d2974e..91b7cd1 100644
--- a/Programs/scancotodicom.cxx
+++ b/Programs/scancotodicom.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -20,6 +20,8 @@
 #include "vtkDICOMWriter.h"
 #include "vtkDICOMCTGenerator.h"
 #include "vtkDICOMUtilities.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
 #include "vtkScancoCTReader.h"
 
 #include <vtkImageData.h>
@@ -30,10 +32,6 @@
 #include <vtkErrorCode.h>
 #include <vtkSmartPointer.h>
 
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-#include <vtksys/Glob.hxx>
-
 #include <string>
 #include <vector>
 #include <set>
@@ -45,6 +43,7 @@
 #include <limits.h>
 
 // from dicomcli
+#include "vtkConsoleOutputWindow.h"
 #include "mainmacro.h"
 
 // The file types
@@ -76,19 +75,19 @@ void scancotodicom_version(FILE *file, const char *command_name, bool verbose)
   while (cp != command_name && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
 
   if (!verbose)
-    {
+  {
     fprintf(file, "%s %s\n", cp, DICOM_VERSION);
     fprintf(file, "\n"
-      "Copyright (c) 2012-2015, David Gobbi.\n\n"
+      "Copyright (c) 2012-2016, David Gobbi.\n\n"
       "This software is distributed under an open-source license.  See the\n"
       "Copyright.txt file that comes with the vtk-dicom source distribution.\n");
-    }
+  }
   else
-    {
+  {
     fprintf(file,
       "Head %8.8s, Built %s, %s\n",
       DICOM_SOURCE_VERSION, DICOM_BUILD_DATE, DICOM_BUILD_TIME);
-    }
+  }
 }
 
 
@@ -145,27 +144,27 @@ void scancotodicom_check_error(vtkObject *o)
   const char *filename = 0;
   unsigned long errorcode = 0;
   if (writer)
-    {
+  {
     filename = writer->GetFileName();
     errorcode = writer->GetErrorCode();
-    }
+  }
   else if (reader)
-    {
+  {
     filename = reader->GetInternalFileName();
     errorcode = reader->GetErrorCode();
-    }
+  }
   else if (parser)
-    {
+  {
     filename = parser->GetFileName();
     errorcode = parser->GetErrorCode();
-    }
+  }
   if (!filename)
-    {
+  {
     filename = "";
-    }
+  }
 
   switch(errorcode)
-    {
+  {
     case vtkErrorCode::NoError:
       return;
     case vtkErrorCode::FileNotFoundError:
@@ -192,7 +191,7 @@ void scancotodicom_check_error(vtkObject *o)
     default:
       fprintf(stderr, "An unknown error occurred.\n");
       break;
-    }
+  }
 
   exit(1);
 }
@@ -211,40 +210,40 @@ void scancotodicom_convert_date(char date[32])
   char *cp = date;
   unsigned int parts[7];
   for (int i = 0; i < 7; i++)
-    {
+  {
     while (*cp == ' ') { cp++; }
     int lead = 0;
     while (cp[0] == '0' && isdigit(cp[1]))
-      {
+    {
       lead++;
       cp++;
-      }
+    }
     parts[i] = strtoul(cp, &cp, 10);
     if (i == 1 && isalpha(*cp))
-      {
+    {
       for (int j = 0; j < 12; j++)
-        {
+      {
         const char *month = months[j];
         if (toupper(cp[0]) == month[0] &&
             toupper(cp[1]) == month[1] &&
             toupper(cp[2]) == month[2])
-           {
+        {
            parts[i] = j+1;
            break;
-           }
         }
-      while (isalpha(*cp)) { cp++; }
       }
+      while (isalpha(*cp)) { cp++; }
+    }
     if (i == 6)
-      {
+    {
       unsigned int denom = 10;
       while (denom <= parts[i]) { denom *= 10; }
       while (lead > 0) { lead--; denom *= 10; }
       if (denom > 1000000) { parts[i] /= (denom/1000000); }
       else { parts[i] *= (1000000/denom); }
-      }
-    if (*cp != '\0') { cp++; }
     }
+    if (*cp != '\0') { cp++; }
+  }
 
   sprintf(date, "%04d%02d%02d%02d%02d%02d.%06d",
           parts[2] % 10000, parts[1] % 100, parts[0] % 100,
@@ -252,60 +251,6 @@ void scancotodicom_convert_date(char date[32])
           parts[6] % 1000000);
 }
 
-// Add a dicom file to the list, expand if wildcard
-void scancotodicom_add_file(vtkStringArray *files, const char *filepath)
-{
-#ifdef _WIN32
-  bool ispattern = false;
-  bool hasbackslash = false;
-  size_t n = strlen(filepath);
-  for (size_t i = 0; i < n; i++)
-    {
-    if (filepath[i] == '*' || filepath[i] == '?' || filepath[i] == '[')
-      {
-      ispattern = true;
-      }
-    if (filepath[i] == '\\')
-      {
-      hasbackslash = true;
-      }
-    }
-
-  std::string newpath = filepath;
-  if (hasbackslash)
-    {
-    // backslashes interfere with vtksys::Glob
-    vtksys::SystemTools::ConvertToUnixSlashes(newpath);
-    }
-  filepath = newpath.c_str();
-
-  if (ispattern)
-    {
-    vtksys::Glob glob;
-    if (glob.FindFiles(filepath))
-      {
-      const std::vector<std::string> &globfiles = glob.GetFiles();
-      size_t m = globfiles.size();
-      for (size_t j = 0; j < m; j++)
-        {
-        files->InsertNextValue(globfiles[j]);
-        }
-      }
-    else
-      {
-      fprintf(stderr, "Could not match pattern: %s\n", filepath);
-      exit(1);
-      }
-    }
-  else
-    {
-    files->InsertNextValue(filepath);
-    }
-#else
-  files->InsertNextValue(filepath);
-#endif
-}
-
 // Check that a file has a valid extension
 bool isScancoCTFileName(const char *f)
 {
@@ -315,13 +260,13 @@ bool isScancoCTFileName(const char *f)
 
   size_t n = strlen(f);
   for (const char **s = suffixes; *s != 0; s++)
-    {
+  {
     size_t m = strlen(*s);
     if (n > m && strcmp(f + n - m, *s) == 0)
-      {
+    {
       return true;
-      }
     }
+  }
 
   return false;
 }
@@ -343,156 +288,156 @@ void scancotodicom_read_options(
   // read the options from the command line
   int argi = 1;
   while (argi < argc)
-    {
+  {
     const char *arg = argv[argi++];
     if (arg[0] == '-')
-      {
+    {
       if (strcmp(arg, "--") == 0)
-        {
+      {
         // stop processing switches
         break;
-        }
+      }
       else if (strcmp(arg, "--series-description") == 0 ||
                strcmp(arg, "--series-number") == 0 ||
                strcmp(arg, "--uid-prefix") == 0)
-        {
+      {
         if (argi >= argc ||
             argv[argi][0] == '-')
-          {
+        {
           fprintf(stderr, "\nA value must follow the \'%s\' flag\n\n", arg);
           exit(1);
-          }
+        }
         if (strcmp(arg, "--series-description") == 0)
-          {
+        {
           options->series_description = argv[argi];
-          }
+        }
         else if (strcmp(arg, "--series-number") == 0)
-          {
+        {
           options->series_number= argv[argi];
-          }
+        }
         else if (strcmp(arg, "--uid-prefix") == 0)
-          {
+        {
           options->uid_prefix = argv[argi];
-          }
-        argi++;
         }
+        argi++;
+      }
       else if (strcmp(arg, "--silent") == 0)
-        {
+      {
         options->silent = true;
-        }
+      }
       else if (strcmp(arg, "--verbose") == 0)
-        {
+      {
         options->verbose = true;
-        }
+      }
       else if (strcmp(arg, "--version") == 0)
-        {
+      {
         scancotodicom_version(stdout, argv[0], false);
         exit(0);
-        }
+      }
       else if (strcmp(arg, "--build-version") == 0)
-        {
+      {
         scancotodicom_version(stdout, argv[0], true);
         exit(0);
-        }
+      }
       else if (strcmp(arg, "--help") == 0)
-        {
+      {
         scancotodicom_help(stdout, argv[0]);
         exit(0);
-        }
+      }
       else if (arg[0] == '-' && arg[1] == '-')
-        {
+      {
         fprintf(stderr, "\nUnrecognized option %s\n\n", arg);
         scancotodicom_usage(stderr, argv[0]);
         exit(1);
-        }
+      }
       else if (arg[0] == '-' && arg[1] != '-')
-        {
+      {
         for (int argj = 1; arg[argj] != '\0'; argj++)
-          {
+        {
           if (arg[argj] == 's')
-            {
+          {
             options->silent = true;
-            }
+          }
           else if (arg[argj] == 'v')
-            {
+          {
             options->verbose = true;
-            }
+          }
           else if (arg[argj] == 'o')
-            {
+          {
             if (arg[argj+1] != '\0')
-              {
+            {
               arg += argj+1;
-              }
+            }
             else
-              {
+            {
               if (argi >= argc)
-                {
+              {
                 fprintf(stderr, "\nA file must follow the \'-o\' flag\n\n");
                 scancotodicom_usage(stderr, argv[0]);
                 exit(1);
-                }
-              arg = argv[argi++];
               }
+              arg = argv[argi++];
+            }
             options->output = arg;
             break;
-            }
+          }
           else
-            {
+          {
             fprintf(stderr, "\nUnrecognized \'%c\' in option %s\n\n", arg[argj], arg);
             scancotodicom_usage(stderr, argv[0]);
             exit(1);
-            }
           }
         }
       }
+    }
     else
-      {
-      scancotodicom_add_file(files, arg);
+    {
+      files->InsertNextValue(arg);
       vtkIdType m = files->GetMaxId();
       if (m >= 0)
-        {
+      {
         const char *f = files->GetValue(m);
         if (isScancoCTFileName(f))
-          {
+        {
           if (options->input == 0)
-            {
+          {
             options->input = arg;
             files->SetNumberOfValues(m);
-            }
+          }
           else
-            {
+          {
             fprintf(stderr, "\nAt most one uCT file can be specified.\n");
             scancotodicom_usage(stderr, argv[0]);
             exit(1);
-            }
           }
         }
       }
     }
+  }
 
   while (argi < argc)
-    {
-    scancotodicom_add_file(files, argv[argi++]);
+  {
+    files->InsertNextValue(argv[argi++]);
     vtkIdType m = files->GetMaxId();
     if (m >= 0)
-      {
+    {
       const char *f = files->GetValue(m);
       if (isScancoCTFileName(f))
-        {
+      {
         if (options->input == 0)
-          {
+        {
           options->input = argv[argi-1];
           files->SetNumberOfValues(m);
-          }
+        }
         else
-          {
+        {
           fprintf(stderr, "\nAt most one uCT file can be specified.\n");
           scancotodicom_usage(stderr, argv[0]);
           exit(1);
-          }
         }
       }
     }
+  }
 }
 
 // Convert one uCT file into a DICOM series
@@ -521,21 +466,21 @@ void scancotodicom_convert_one(
   const char *modality = "CT";
   const char *version = reader->GetVersion();
   if (strncmp(version, "AIM", 3) == 0)
-    {
+  {
     fileType = SCANCO_AIM;
     imageType = "ORIGINAL\\SECONDARY\\AXIAL";
     if (reader->GetDataScalarType() != VTK_SHORT)
-      {
+    {
       modality = "SEG";
       fileType = SCANCO_AIM_SEG;
       imageType = "DERIVED\\PRIMARY";
-      }
     }
+  }
   else if (physdim[2] == 0)
-    {
+  {
     fileType = SCANCO_RAD;
     imageType = "ORIGINAL\\PRIMARY\\LOCALIZER";
-    }
+  }
 
   // The meta data object
   vtkSmartPointer<vtkDICOMMetaData> meta =
@@ -543,21 +488,21 @@ void scancotodicom_convert_one(
 
   // read meta data from the sample DICOM file, if provided
   if (a->GetNumberOfValues() > 0)
-    {
+  {
     vtkSmartPointer<vtkDICOMReader> dicomReader =
       vtkSmartPointer<vtkDICOMReader>::New();
     dicomReader->SetFileNames(a);
     if (fileType == SCANCO_RAD)
-      {
+    {
       dicomReader->SetMemoryRowOrderToFileNative();
-      }
+    }
     else
-      {
+    {
       dicomReader->SetMemoryRowOrderToBottomUp();
-      }
+    }
     dicomReader->UpdateInformation();
     meta->DeepCopy(dicomReader->GetMetaData());
-    }
+  }
 
   // set metadata from the file header
   meta->SetAttributeValue(DC::Modality, modality);
@@ -569,29 +514,29 @@ void scancotodicom_convert_one(
   double rescaleSlope = 1.0;
   double rescaleIntercept = 0.0;
   if (reader->GetMuScaling() != 0 && reader->GetMuWater() != 0)
-    {
+  {
     // conversion to Hounsfield units
     rescaleIntercept = -1000.0;
     rescaleSlope = 1000.0/(reader->GetMuScaling()*reader->GetMuWater());
     meta->SetAttributeValue(DC::RescaleIntercept, rescaleIntercept);
     meta->SetAttributeValue(DC::RescaleSlope, rescaleSlope);
     meta->SetAttributeValue(DC::RescaleType, "HU");
-    }
+  }
   meta->SetAttributeValue(DC::KVP, reader->GetEnergy());
   meta->SetAttributeValue(DC::AcquisitionNumber, reader->GetMeasurementIndex());
   meta->SetAttributeValue(DC::ExposureTime, reader->GetSampleTime());
   meta->SetAttributeValue(DC::XRayTubeCurrentInuA, 1000*reader->GetIntensity());
   if (fileType != SCANCO_RAD)
-    {
+  {
     meta->SetAttributeValue(DC::SliceThickness, reader->GetSliceThickness());
     meta->SetAttributeValue(DC::DataCollectionDiameter, physdim[0]);
     meta->SetAttributeValue(DC::ReconstructionDiameter, physdim[0]);
-    }
+  }
 
   // date
   char date[32];
   if (!meta->HasAttribute(DC::StudyDate))
-    {
+  {
     strncpy(date, reader->GetCreationDate(), 32);
     scancotodicom_convert_date(date);
     meta->SetAttributeValue(DC::StudyTime, &date[8]);
@@ -599,16 +544,16 @@ void scancotodicom_convert_one(
     date[8] = '\0';
     meta->SetAttributeValue(DC::StudyDate, date);
     meta->SetAttributeValue(DC::SeriesDate, date);
-    }
+  }
 
   if (fileType == SCANCO_AIM_SEG)
-    {
+  {
     strncpy(date, reader->GetModificationDate(), 32);
     scancotodicom_convert_date(date);
     meta->SetAttributeValue(DC::CreationTime, &date[8]);
     date[8] = '\0';
     meta->SetAttributeValue(DC::CreationDate, date);
-    }
+  }
 
   // patient
   const char *patient = reader->GetPatientName();
@@ -616,13 +561,13 @@ void scancotodicom_convert_one(
 
   // set the metadata supplied on the command line
   if (options->series_description)
-    {
+  {
     meta->SetAttributeValue(DC::SeriesDescription, options->series_description);
-    }
+  }
   if (options->series_number)
-    {
+  {
     meta->SetAttributeValue(DC::SeriesNumber, options->series_number);
-    }
+  }
 
   // The DICOM orientation matrix
   vtkSmartPointer<vtkMatrix4x4> matrix =
@@ -633,7 +578,7 @@ void scancotodicom_convert_one(
   double center = 0.5*physdim[0]*(pixdim[0] - 1)/pixdim[0];
 
   if (fileType == SCANCO_RAD)
-    {
+  {
     // Convert localizer to DICOM coordinates (rotate)
     zoffset = reader->GetZPosition() - reader->GetReferenceLine();
     double radToDICOM[16] = {
@@ -642,9 +587,9 @@ void scancotodicom_convert_one(
       0.0, 1.0, 0.0, zoffset,
       0.0, 0.0, 0.0, 1.0 };
     matrix->DeepCopy(radToDICOM);
-    }
+  }
   else
-    {
+  {
     // Convert to DICOM patient coordinates as well as we can,
     // without knowing orientation of patient relative to scanner
     zoffset = reader->GetStartPosition() - reader->GetReferenceLine();
@@ -654,18 +599,18 @@ void scancotodicom_convert_one(
       0.0, 0.0, 1.0, zoffset,
       0.0, 0.0, 0.0, 1.0 };
     matrix->DeepCopy(rasToDICOM);
-    }
+  }
 
   // prepare the writer to write the image
   vtkSmartPointer<vtkDICOMWriter> writer =
     vtkSmartPointer<vtkDICOMWriter>::New();
   writer->StreamingOn();
   if (reader->GetDataScalarType() != VTK_SIGNED_CHAR)
-    {
+  {
     vtkSmartPointer<vtkDICOMCTGenerator> generator =
       vtkSmartPointer<vtkDICOMCTGenerator>::New();
     writer->SetGenerator(generator);
-    }
+  }
   writer->SetMetaData(meta);
   writer->SetFilePrefix(outfile);
   writer->SetFilePattern("%s/IM-0001-%04.4d.dcm");
@@ -675,20 +620,23 @@ void scancotodicom_convert_one(
   writer->SetInputConnection(reader->GetOutputPort());
   writer->SetFileSliceOrderToSame();
   if (fileType == SCANCO_RAD)
-    {
+  {
     writer->SetMemoryRowOrderToFileNative();
-    }
+  }
   else
-    {
+  {
     writer->SetMemoryRowOrderToBottomUp();
-    }
+  }
   writer->Write();
   scancotodicom_check_error(writer);
 }
 
 // This program will convert ScancoCT to DICOM
-MAINMACRO(argc, argv)
+int MAINMACRO(int argc, char *argv[])
 {
+  // redirect all VTK errors to stderr
+  vtkConsoleOutputWindow::Install();
+
   // for the list of input DICOM files
   vtkSmartPointer<vtkStringArray> files =
     vtkSmartPointer<vtkStringArray>::New();
@@ -701,40 +649,39 @@ MAINMACRO(argc, argv)
 
   // set the UID prefix
   if (options.uid_prefix)
-    {
+  {
     vtkDICOMUtilities::SetUIDPrefix(options.uid_prefix);
-    }
+  }
 
   // the output directory
   const char *outpath = options.output;
   if (!outpath)
-    {
+  {
     fprintf(stderr,
       "\nNo output directory was specified (\'-o\' <directory>).\n\n");
     scancotodicom_usage(stderr, argv[0]);
     exit(1);
-    }
+  }
   if (!options.input)
-    {
+  {
     fprintf(stderr,
       "\nNo input file was specified.\n\n");
     scancotodicom_usage(stderr, argv[0]);
     exit(1);
-    }
+  }
 
-  if (vtksys::SystemTools::FileExists(outpath))
-    {
-    if (!vtksys::SystemTools::FileIsDirectory(outpath))
-      {
-      fprintf(stderr, "option -o must give a directory, not a file.\n");
-      exit(1);
-      }
-    }
-  else if (!vtksys::SystemTools::MakeDirectory(outpath))
-    {
+  int code = vtkDICOMFile::Access(outpath, vtkDICOMFile::In);
+  if (code != vtkDICOMFile::FileIsDirectory)
+  {
+    fprintf(stderr, "option -o must give a directory, not a file.\n");
+    exit(1);
+  }
+  code = vtkDICOMFileDirectory::Create(outpath);
+  if (code != vtkDICOMFileDirectory::Good)
+  {
     fprintf(stderr, "Cannot create directory: %s\n", outpath);
     exit(1);
-    }
+  }
 
   scancotodicom_convert_one(&options, options.input, files, outpath);
 
diff --git a/Readme.txt b/Readme.txt
index d40344e..5d6826a 100644
--- a/Readme.txt
+++ b/Readme.txt
@@ -1,6 +1,6 @@
 DICOM for VTK
 
-Copyright (c) 2012-2015, David Gobbi
+Copyright (c) 2012-2016, David Gobbi
 All rights reserved.
 
 See Copyright.txt for more details.
@@ -22,8 +22,8 @@ given on the last page of the pdf file listed below.
 More information can be found at the following website:
 http://dgobbi.github.io/vtk-dicom/
 http://dgobbi.github.io/vtk-dicom/doc/api/
-http://dgobbi.github.io/vtk-dicom/doc/tools/
 http://dgobbi.github.io/vtk-dicom/doc/vtk-dicom.pdf
+http://github.com/dgobbi/vtk-dicom/wiki/Command-Line-Tools
 
 A software quality dashboard is provided, with nightly builds on
 Linux (gcc 4.6) and Windows (Visual Studio 2010):
diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt
index 2ba5759..669d8cb 100644
--- a/Source/CMakeLists.txt
+++ b/Source/CMakeLists.txt
@@ -3,9 +3,9 @@ set(DICOM_BUILD_SHARED_LIBS ${BUILD_SHARED_LIBS})
 set(DICOM_BUILD_TESTING ${BUILD_TESTING})
 set(DICOM_USE_GDCM ${USE_GDCM})
 set(DICOM_USE_DCMTK ${USE_DCMTK})
-configure_file(${DICOM_SOURCE_DIR}/CMake/vtkDICOMConfig.h.in
+configure_file(${DICOM_CMAKE_DIR}/vtkDICOMConfig.h.in
   "${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMConfig.h" @ONLY)
-configure_file(${DICOM_SOURCE_DIR}/CMake/vtkDICOMBuild.h.in
+configure_file(${DICOM_CMAKE_DIR}/vtkDICOMBuild.h.in
   "${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMBuild.h" @ONLY)
 
 # Include directories
@@ -24,7 +24,9 @@ endif()
 set(LIB_SRCS
   vtkDICOMMetaData.cxx
   vtkDICOMDictionary.cxx
+  vtkDICOMFilePath.cxx
   vtkDICOMFile.cxx
+  vtkDICOMFileDirectory.cxx
   vtkDICOMTag.cxx
   vtkDICOMTagPath.cxx
   vtkDICOMVR.cxx
@@ -60,6 +62,7 @@ set(LIB_SRCS
   vtkDICOMToRAS.cxx
   vtkDICOMCTRectifier.cxx
   vtkDICOMMetaDataAdapter.cxx
+  vtkDICOMUIDGenerator.cxx
   vtkNIFTIHeader.cxx
   vtkNIFTIReader.cxx
   vtkNIFTIWriter.cxx
@@ -89,6 +92,8 @@ set(LIB_ABSTRACT
 # Sources that are not vtkObjects
 set(LIB_SPECIAL
   vtkDICOMFile.cxx
+  vtkDICOMFileDirectory.cxx
+  vtkDICOMFilePath.cxx
   vtkDICOMTag.cxx
   vtkDICOMTagPath.cxx
   vtkDICOMVR.cxx
@@ -123,7 +128,7 @@ if(Module_vtkDICOM) # Building as a VTK remote module
 
 else() # else MODULE_vtkDICOM
 
-configure_file(${DICOM_SOURCE_DIR}/CMake/vtkDICOMModule.h.in
+configure_file(${DICOM_CMAKE_DIR}/vtkDICOMModule.h.in
   "${CMAKE_CURRENT_BINARY_DIR}/vtkDICOMModule.h" COPYONLY)
 
 # Automatically find the header for each cxx file
@@ -137,18 +142,15 @@ endforeach()
 
 # Create the hierarchy file
 if("${VTK_MAJOR_VERSION}" GREATER 5)
-  if(BUILD_PYTHON_WRAPPERS OR BUILD_JAVA_WRAPPERS)
+  if(BUILD_PYTHON_WRAPPERS OR BUILD_TCL_WRAPPERS OR BUILD_JAVA_WRAPPERS)
     set_source_files_properties(${LIB_SPECIAL} PROPERTIES WRAP_SPECIAL ON)
     set(MODULE_HIERARCHY_NAME ${LIB_NAME}Hierarchy)
-    # The VTK 6 wrapping macros require vtk-module to be set
-    set(vtk-module ${LIB_NAME})
     # _LINK_DEPENDS is a variable suffix from the VTK 6 module macros
-    set(${vtk-module}_LINK_DEPENDS ${VTK_LIBS} ${KWSYS_LIBS} ${ZLIB_LIBS})
-    include(${DICOM_SOURCE_DIR}/CMake/vtkWrapHierarchy.cmake)
-    vtk_wrap_hierarchy(${MODULE_HIERARCHY_NAME} ${CMAKE_CURRENT_BINARY_DIR}
-      "${LIB_SRCS}")
+    set(${LIB_NAME}_LINK_DEPENDS ${VTK_LIBS} ${KWSYS_LIBS} ${ZLIB_LIBS})
+    include(vtkWrapHierarchy)
+    vtk_wrap_hierarchy(${LIB_NAME} ${CMAKE_CURRENT_BINARY_DIR} "${LIB_SRCS}")
     set(KIT_HIERARCHY_FILE ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_HIERARCHY_NAME}.txt)
-    set(LIB_HIERARCHY_STAMP ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_HIERARCHY_NAME}.stamp)
+    set(LIB_HIERARCHY_STAMP ${CMAKE_CURRENT_BINARY_DIR}/${MODULE_HIERARCHY_NAME}.stamp.txt)
   endif()
 endif()
 
@@ -165,8 +167,9 @@ if("${VTK_MAJOR_VERSION}" GREATER 5)
     OUTPUT_NAME ${LIB_NAME}${LIB_NAME_SUFFIX})
 endif()
 set_target_properties(${LIB_NAME} PROPERTIES
-  VERSION "${DICOM_VERSION}" SOVERSION "${DICOM_SHORT_VERSION}")
-if(BUILD_PYTHON_WRAPPERS OR BUILD_JAVA_WRAPPERS AND
+  VERSION "${PROJECT_VERSION}"
+  SOVERSION "${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}")
+if(BUILD_PYTHON_WRAPPERS OR BUILD_TCL_WRAPPERS OR BUILD_JAVA_WRAPPERS AND
    NOT (CMAKE_VERSION VERSION_LESS 2.8))
   set_target_properties(${LIB_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
 endif()
@@ -175,8 +178,7 @@ target_link_libraries(${LIB_NAME} LINK_PRIVATE
   ${KWSYS_LIBS} ${ZLIB_LIBS} ${GDCM_LIBS} ${DCMTK_LIBS})
 
 # Wrappers
-if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
-  set(vtk-module ${LIB_NAME})
+if(BUILD_PYTHON_WRAPPERS)
   set(XY) # Get python version, e.g. 27 for python 2.7
   if(vtkPython_LIBRARIES)
     list(GET vtkPython_LIBRARIES 0 TMP_LIB_NAME)
@@ -206,7 +208,7 @@ if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
   endif()
   # Tell vtkWrapPython to locate the python libraries for us.
   set(VTK_WRAP_PYTHON_FIND_LIBS ON)
-  include(${VTK_CMAKE_DIR}/vtkWrapPython.cmake)
+  include(vtkWrapPython)
   vtk_wrap_python3(${MODULE_PYTHON_NAME} LIB_PYTHON_SRCS "${LIB_SRCS}")
   add_library(${LIB_PYTHON_NAME} ${LIB_PYTHON_SRCS} ${LIB_PYTHON_EXTRA_SRCS})
   if(NOT (CMAKE_VERSION VERSION_LESS 2.8))
@@ -214,7 +216,8 @@ if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
       POSITION_INDEPENDENT_CODE ON)
   endif()
   set_target_properties(${LIB_PYTHON_NAME} PROPERTIES
-    VERSION "${DICOM_VERSION}" SOVERSION "${DICOM_SHORT_VERSION}"
+    VERSION "${PROJECT_VERSION}"
+    SOVERSION "${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}"
     OUTPUT_NAME "${LIB_PYTHON_OUTPUT_NAME}")
   target_link_libraries(${LIB_PYTHON_NAME} LINK_PUBLIC
     ${LIB_NAME} ${LIB_PYTHON_LIBS})
@@ -226,10 +229,6 @@ if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
     target_link_libraries(${LIB_PYTHON_NAME} LINK_PRIVATE
       ${VTK_PYTHON_LIBRARIES})
   endif()
-  if(USE_DCMTK AND DCMTK_charls_LIBRARY)
-    target_link_libraries(${LIB_PYTHON_NAME} LINK_PRIVATE
-      ${DCMTK_charls_LIBRARY})
-  endif()
   if(KIT_PYTHON_DEPS)
     add_dependencies(${LIB_PYTHON_NAME} ${KIT_PYTHON_DEPS})
   endif()
@@ -244,8 +243,49 @@ if(BUILD_PYTHON_WRAPPERS AND NOT Module_vtkDICOM)
   target_link_libraries(${MODULE_PYTHON_NAME} ${LIB_PYTHON_NAME})
 endif()
 
-if(BUILD_JAVA_WRAPPERS AND NOT Module_vtkDICOM)
-  set(vtk-module ${LIB_NAME})
+if(BUILD_TCL_WRAPPERS)
+  set(LIB_TCL_NAME ${LIB_NAME}TCL)
+  string(TOLOWER ${LIB_NAME} MODULE_TCL_NAME)
+  set(LIB_TCL_OUTPUT_NAME ${LIB_TCL_NAME})
+  if("${VTK_MAJOR_VERSION}" GREATER 5)
+    set(LIB_TCL_OUTPUT_NAME ${LIB_TCL_NAME}${LIB_NAME_SUFFIX})
+  endif()
+  set(LIB_TCL_LIBS)
+  foreach(TMP_LIB ${VTK_LIBS})
+    set(LIB_TCL_LIBS ${LIB_TCL_LIBS} ${TMP_LIB}TCL)
+  endforeach()
+  if(VTK_TCL_INCLUDE_DIR)
+    include_directories("${VTK_TCL_INCLUDE_DIR}")
+  endif()
+  include(vtkWrapTcl)
+  vtk_wrap_tcl3(${LIB_TCL_NAME} LIB_TCL_SRCS "${LIB_SRCS}" "")
+  add_library(${LIB_TCL_NAME} ${LIB_TCL_SRCS} ${LIB_TCL_EXTRA_SRCS}
+              ${LIB_HIERARCHY_STAMP})
+  target_link_libraries(${LIB_TCL_NAME} LINK_PUBLIC
+    ${LIB_NAME} ${LIB_TCL_LIBS})
+  if(KIT_TCL_DEPS)
+    add_dependencies(${LIB_TCL_NAME} ${KIT_TCL_DEPS})
+  endif()
+  set_target_properties(${LIB_TCL_NAME} PROPERTIES
+    OUTPUT_NAME ${LIB_TCL_OUTPUT_NAME})
+  # create the pkgIndex.tcl file
+  if(CMAKE_CONFIGURATION_TYPES)
+    foreach(config ${CMAKE_CONFIGURATION_TYPES})
+      set(MODULE_TCL_PATH "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${config}")
+      configure_file(${DICOM_CMAKE_DIR}/pkgIndex.tcl.in
+        "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${config}/pkgIndex.tcl" @ONLY)
+    endforeach()
+  else()
+    set(MODULE_TCL_PATH ${CMAKE_LIBRARY_OUTPUT_DIRECTORY})
+    configure_file(${DICOM_CMAKE_DIR}/pkgIndex.tcl.in
+      "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/pkgIndex.tcl" @ONLY)
+  endif()
+  set(MODULE_TCL_PATH ${DICOM_LIBRARY_INSTALL_DEST})
+  configure_file(${DICOM_CMAKE_DIR}/pkgIndex.tcl.in
+    "${CMAKE_CURRENT_BINARY_DIR}/pkgIndex.tcl" @ONLY)
+endif()
+
+if(BUILD_JAVA_WRAPPERS)
   set(VTK_WRAP_JAVA3_INIT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
   set(VTK_JAVA_HOME ${CMAKE_CURRENT_BINARY_DIR}/java/vtk)
   set(VTK_JAVA_MANIFEST ${CMAKE_CURRENT_BINARY_DIR}/java/manifest.txt)
@@ -262,7 +302,7 @@ if(BUILD_JAVA_WRAPPERS AND NOT Module_vtkDICOM)
   else()
     include_directories("${JAVA_INCLUDE_PATH}" "${JAVA_INCLUDE_PATH2}")
   endif()
-  include(${VTK_CMAKE_DIR}/vtkWrapJava.cmake)
+  include(vtkWrapJava)
   vtk_wrap_java3(${LIB_JAVA_NAME} LIB_JAVA_SRCS "${LIB_SRCS}")
   add_library(${LIB_JAVA_NAME} SHARED ${LIB_JAVA_SRCS} ${LIB_JAVA_EXTRA_SRCS})
   if(APPLE)
@@ -272,9 +312,6 @@ if(BUILD_JAVA_WRAPPERS AND NOT Module_vtkDICOM)
     set_target_properties(${LIB_JAVA_NAME} PROPERTIES NO_SONAME 1)
   endif()
   target_link_libraries(${LIB_JAVA_NAME} ${LIB_NAME} ${LIB_JAVA_LIBS})
-  if(USE_DCMTK AND DCMTK_charls_LIBRARY)
-    target_link_libraries(${LIB_JAVA_NAME} ${DCMTK_charls_LIBRARY})
-  endif()
   add_dependencies(${LIB_JAVA_NAME} ${LIB_NAME})
   if(KIT_JAVA_DEPS)
     add_dependencies(${LIB_JAVA_NAME} ${KIT_JAVA_DEPS})
@@ -318,12 +355,18 @@ endif()
 
 # Set the install rules for the library
 install(TARGETS
-  ${LIB_NAME} ${LIB_PYTHON_NAME} ${MODULE_PYTHON_NAME} ${LIB_JAVA_NAME}
+  ${LIB_NAME} ${LIB_PYTHON_NAME} ${MODULE_PYTHON_NAME}
+    ${LIB_TCL_NAME} ${LIB_JAVA_NAME}
   EXPORT DICOMTargets
   RUNTIME DESTINATION ${DICOM_RUNTIME_INSTALL_DEST} COMPONENT RuntimeLibraries
   LIBRARY DESTINATION ${DICOM_LIBRARY_INSTALL_DEST} COMPONENT RuntimeLibraries
   ARCHIVE DESTINATION ${DICOM_ARCHIVE_INSTALL_DEST} COMPONENT Development)
 
+if(BUILD_TCL_WRAPPERS)
+  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgIndex.tcl
+    DESTINATION ${DICOM_TCL_INSTALL_DEST})
+endif()
+
 if(BUILD_JAVA_WRAPPERS)
   install(FILES ${VTK_JAR_PATH}/vtkdicom.jar
     DESTINATION ${DICOM_JAVA_INSTALL_DEST})
diff --git a/Source/vtkDICOMAlgorithm.cxx b/Source/vtkDICOMAlgorithm.cxx
index b9e5e3a..91d2fd7 100644
--- a/Source/vtkDICOMAlgorithm.cxx
+++ b/Source/vtkDICOMAlgorithm.cxx
@@ -61,18 +61,18 @@ vtkInformation *vtkDICOMAlgorithm::GetMetaDataInformation(
   // If SetInputData was used, the meta data is attached to the data
   vtkAlgorithmOutput *sourceConnection = this->GetInputConnection(0, 0);
   if (sourceConnection)
-    {
+  {
     // SetInputData causes a vtkTrivialProducer to be used
     vtkAlgorithm *producer = sourceConnection->GetProducer();
     if (producer && vtkTrivialProducer::SafeDownCast(producer))
-      {
+    {
       vtkDataObject *inputData = producer->GetOutputDataObject(0);
       if (inputData)
-        {
+      {
         metaInfo = inputData->GetInformation();
-        }
       }
     }
+  }
 
   return metaInfo;
 }
@@ -90,14 +90,14 @@ void vtkDICOMAlgorithm::CopyMetaDataToOutputInformation(
   int firstPort = outputPort;
   int lastPort = outputPort;
   if (outputPort < 0)
-    {
+  {
     firstPort = 0;
     lastPort = this->GetNumberOfOutputPorts() - 1;
-    }
+  }
 
   // Copy the meta data downstream
   for (int port = firstPort; port <= lastPort; port++)
-    {
+  {
     vtkInformation *outInfo = outputVector->GetInformationObject(port);
     // Matrix is stored as a vector of 16 doubles
     outInfo->CopyEntry(metaInfo, PATIENT_MATRIX());
@@ -106,13 +106,13 @@ void vtkDICOMAlgorithm::CopyMetaDataToOutputInformation(
     vtkDICOMMetaData *meta = vtkDICOMMetaData::SafeDownCast(
       metaInfo->Get(META_DATA()));
     if (meta)
-      {
+    {
       vtkSmartPointer<vtkDICOMMetaData> outMeta =
         vtkSmartPointer<vtkDICOMMetaData>::New();
       outMeta->ShallowCopy(meta);
       outInfo->Set(META_DATA(), outMeta);
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -133,10 +133,10 @@ int vtkDICOMAlgorithm::RequestInformation(
   // Copy the meta data to the output information
   if (this->GetNumberOfInputPorts() > 0 &&
       this->GetNumberOfInputConnections(0) > 0)
-    {
+  {
     this->CopyMetaDataToOutputInformation(
       inputVector, 0, 0, outputVector, -1);
-    }
+  }
 
   return this->Superclass::RequestInformation(
     request, inputVector, outputVector);
@@ -151,15 +151,15 @@ int vtkDICOMAlgorithm::RequestData(
   // Copy the meta data downstream
   int numPorts = this->GetNumberOfOutputPorts();
   for (int port = 0; port < numPorts; port++)
-    {
+  {
     vtkInformation *outInfo = outputVector->GetInformationObject(port);
     vtkImageData *outData = vtkImageData::SafeDownCast(
       outInfo->Get(vtkDataObject::DATA_OBJECT()));
     if (outData)
-      {
+    {
       this->CopyMetaDataToOutputData(outInfo, outData);
-      }
     }
+  }
 
   return this->Superclass::RequestData(request, inputVector, outputVector);
 }
diff --git a/Source/vtkDICOMAlgorithm.h b/Source/vtkDICOMAlgorithm.h
index bf68b73..a6ae8b8 100644
--- a/Source/vtkDICOMAlgorithm.h
+++ b/Source/vtkDICOMAlgorithm.h
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -11,12 +11,14 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkDICOMAlgorithm - Base class for DICOM image filters
-// .SECTION Description
-// This class allows the DICOM meta data to be carried by the VTK pipeline.
-// Subclasses should always call Superclass::RequestInformation() and
-// Superclass::RequestData within their own RequestInformation and
-// RequestData methods.
+/*! \class vtkDICOMAlgorithm
+ *  \brief Superclass for DICOM image filters
+ *
+ *  This class allows the DICOM meta data to be carried by the VTK pipeline.
+ *  Subclasses should always call Superclass::RequestInformation() and
+ *  Superclass::RequestData within their own RequestInformation and
+ *  RequestData methods.
+ */
 
 #ifndef vtkDICOMAlgorithm_h
 #define vtkDICOMAlgorithm_h
@@ -34,45 +36,49 @@ class vtkDICOMPerFilePalette;
 class VTKDICOM_EXPORT vtkDICOMAlgorithm : public vtkThreadedImageAlgorithm
 {
 public:
-  // Description:
-  // Static method for construction.
-  static vtkDICOMAlgorithm *New();
   vtkTypeMacro(vtkDICOMAlgorithm, vtkThreadedImageAlgorithm);
 
-  // Description:
-  // Print information about this object.
+  //@{
+  //! Static method for construction.
+  static vtkDICOMAlgorithm *New();
+
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
+  //@}
 
-  // Description:
-  // The information key for the meta data.
+  //@{
+  //! The information key for the meta data.
   static vtkInformationDataObjectKey *META_DATA();
 
-  // Description:
-  // A key to get the patient matrix from the VTK pipeline.
+  //! A key to get the patient matrix from the VTK pipeline.
   static vtkInformationDoubleVectorKey *PATIENT_MATRIX();
+  //@}
 
 protected:
   vtkDICOMAlgorithm();
   ~vtkDICOMAlgorithm();
 
-  // Description:
-  // Get the information object that holds the meta data for the given input.
+  //@{
+  //! Get the information object that holds the meta data for the given input.
   vtkInformation *GetMetaDataInformation(
     vtkInformationVector** inputVector, int inputPort, int inputConnection);
 
-  // Description:
-  // Copy the meta data from an input connection to an output port.
-  // This is called by RequestInformation. To copy the meta data to
-  // all output ports, use "-1" as the output port.
+  //! Copy the meta data from an input connection to an output port.
+  /*!
+   *  This is called by RequestInformation. To copy the meta data to
+   *  all output ports, use "-1" as the output port.
+   */
   virtual void CopyMetaDataToOutputInformation(
     vtkInformationVector** inputVector, int inputPort, int inputConnection,
     vtkInformationVector* outputVector, int outputPort);
 
-  // Description:
-  // Copy the meta data from the output information to the output data.
-  // This is called by RequestData.
+  //! Copy the meta data from the output information to the output data.
+  /*!
+   *  This is called by RequestData.
+   */
   virtual void CopyMetaDataToOutputData(
     vtkInformation *outInfo, vtkDataObject *outData);
+  //@}
 
   virtual int RequestInformation(
     vtkInformation* request, vtkInformationVector** inputVector,
@@ -88,8 +94,8 @@ protected:
     vtkImageData **outData, int ext[6], int id);
 
 private:
-  vtkDICOMAlgorithm(const vtkDICOMAlgorithm&);  // Not implemented.
-  void operator=(const vtkDICOMAlgorithm&);  // Not implemented.
+  vtkDICOMAlgorithm(const vtkDICOMAlgorithm&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMAlgorithm&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMAlgorithm_h
diff --git a/Source/vtkDICOMApplyPalette.cxx b/Source/vtkDICOMApplyPalette.cxx
index 7e61a5d..cf45bf1 100644
--- a/Source/vtkDICOMApplyPalette.cxx
+++ b/Source/vtkDICOMApplyPalette.cxx
@@ -98,12 +98,12 @@ void vtkDICOMApplyPaletteExecute(
   vtkIdType progress = 0;
 
   for (int c = 0; c < inputComponents; c++)
-    {
+  {
     T *inPtrC = inPtr0 + c;
     unsigned char *outPtrC = outPtr0 + 3*c;
 
     for (int zIdx = extent[4]; zIdx <= extent[5]; zIdx++)
-      {
+    {
       int i = meta->GetFileIndex(zIdx, c, inputComponents);
       int f = meta->GetFrameIndex(zIdx, c, inputComponents);
       i = (i >= 0 ? i : 0);
@@ -113,9 +113,9 @@ void vtkDICOMApplyPaletteExecute(
       int firstValueMapped = static_cast<int>(range[0]);
       int maxIdx = static_cast<int>(range[1]) - firstValueMapped;
       if (maxIdx >= table->GetNumberOfColors())
-        {
+      {
         maxIdx = table->GetNumberOfColors() - 1;
-        }
+      }
       const unsigned char *rgba = table->GetPointer(0);
       T *inPtrZ = inPtrC + (zIdx - extent[4])*inIncZ;
       unsigned char *outPtrZ = outPtrC + (zIdx - extent[4])*outIncZ;
@@ -125,7 +125,7 @@ void vtkDICOMApplyPaletteExecute(
       double windowCenter = 0.0;
       double windowScale = 1.0;
       if (supplemental)
-        {
+      {
         // check if this frame is specifically monochrome
         monochrome = meta->GetAttributeValue(
           i, f, DC::PixelPresentation).Matches("MONOCHROME*");
@@ -137,10 +137,10 @@ void vtkDICOMApplyPaletteExecute(
           meta->GetAttributeValue(i, f, DC::WindowWidth);
         double windowWidth = 0.0;
         if (wc.IsValid() && ww.IsValid())
-          {
+        {
           windowCenter = wc.AsDouble();
           windowWidth = ww.AsDouble();
-          }
+        }
 
         // for CT images, the rescaling must be taken into account
         const vtkDICOMValue& rs =
@@ -148,44 +148,44 @@ void vtkDICOMApplyPaletteExecute(
         const vtkDICOMValue& ri =
           meta->GetAttributeValue(i, f, DC::RescaleIntercept);
         if (rs.IsValid() && ri.IsValid())
-          {
+        {
           double slope = rs.AsDouble();
           double inter = ri.AsDouble();
           if (slope > 0)
-            {
+          {
             windowWidth = windowWidth / slope;
             windowCenter = (windowCenter - inter) / slope;
-            }
           }
+        }
 
         // a scale parameter is more efficient and convenient
         if (windowWidth > 0)
-          {
+        {
           windowScale = 255.0/windowWidth;
-          }
         }
+      }
 
       for (int yIdx = extent[2]; yIdx <= extent[3]; yIdx++)
-        {
+      {
         T *inPtr = inPtrZ + inIncY*(yIdx - extent[2]);
         unsigned char *outPtr = outPtrZ + outIncY*(yIdx - extent[2]);
 
         // in base thread, report progress every 2% of the way to 100%
         if (id == 0)
-          {
+        {
           ++progress;
           vtkIdType icount = progress*50/target;
           if (progress == icount*target/50)
-            {
+          {
             self->UpdateProgress(progress*1.0/target);
-            }
           }
+        }
 
         for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++)
-          {
+        {
           int idx = inPtr[0] - firstValueMapped;
           if (monochrome || (supplemental && idx < 0))
-            {
+          {
             // use monochrome
             double fidx = (inPtr[0] - windowCenter)*windowScale + 127.5;
             fidx = (fidx >= 0.0 ? fidx : 0.0);
@@ -194,9 +194,9 @@ void vtkDICOMApplyPaletteExecute(
             outPtr[0] = gray;
             outPtr[1] = gray;
             outPtr[2] = gray;
-            }
+          }
           else
-            {
+          {
             // use color
             idx = (idx >= 0 ? idx : 0);
             idx = (idx <= maxIdx ? idx : maxIdx);
@@ -204,13 +204,13 @@ void vtkDICOMApplyPaletteExecute(
             outPtr[0] = rgb[0];
             outPtr[1] = rgb[1];
             outPtr[2] = rgb[2];
-            }
+          }
           inPtr += inputComponents;
           outPtr += outputComponents;
-          }
         }
       }
     }
+  }
 }
 
 } // end anonymous namespace
@@ -243,8 +243,8 @@ int vtkDICOMApplyPalette::RequestInformation(
   bool hasPalette = false;
 
   if (meta && meta->GetAttributeValue(DC::SamplesPerPixel).Matches(1))
-    {
-    // Check if PhotometricInterpretation is PALETTE_COLOR
+  {
+    // Check if PhotometricInterpretation is PALETTE COLOR
     const vtkDICOMValue& u = meta->GetAttributeValue(
       DC::PhotometricInterpretation);
     hasPalette = u.Matches("PALETTE?COLOR");
@@ -255,11 +255,11 @@ int vtkDICOMApplyPalette::RequestInformation(
                             v.Matches("MIXED") ||
                             v.Matches("TRUE_COLOR"));
     hasPalette |= this->IsSupplemental;
-    }
+  }
 
   // Modify the information
   if (hasPalette)
-    {
+  {
     // By setting Palette, we let RequestData know that there is a palette
     this->Palette = new vtkDICOMPerFilePalette;
     scalarType = VTK_UNSIGNED_CHAR;
@@ -285,7 +285,7 @@ int vtkDICOMApplyPalette::RequestInformation(
     outMeta->RemoveAttribute(DC::RedPaletteColorLookupTableData);
     outMeta->RemoveAttribute(DC::GreenPaletteColorLookupTableData);
     outMeta->RemoveAttribute(DC::BluePaletteColorLookupTableData);
-    }
+  }
 
   return 1;
 }
@@ -303,7 +303,7 @@ int vtkDICOMApplyPalette::RequestData(
 
   // Passthrough if there is no palette to apply
   if (meta == 0 || this->Palette == 0)
-    {
+  {
     vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
     vtkInformation *outInfo = outputVector->GetInformationObject(0);
     vtkImageData *inData =
@@ -314,16 +314,16 @@ int vtkDICOMApplyPalette::RequestData(
     outData->CopyStructure(inData);
     outData->GetPointData()->PassData(inData->GetPointData());
     return 1;
-    }
+  }
 
   // Build the lookup tables for all files that make up the volume
   int n = meta->GetNumberOfInstances();
   this->Palette->resize(n);
   for (int i = 0; i < n; i++)
-    {
+  {
     (*(this->Palette))[i] = vtkSmartPointer<vtkDICOMLookupTable>::New();
     (*(this->Palette))[i]->BuildImagePalette(meta, i);
-    }
+  }
 
   // Allow the superclass to call the ThreadedRequestData method
   int rval = this->Superclass::RequestData(
@@ -356,11 +356,11 @@ void vtkDICOMApplyPalette::ThreadedRequestData(
   void *outVoidPtr = outData->GetScalarPointerForExtent(extent);
 
   switch (scalarType)
-    {
+  {
     vtkTemplateAliasMacro(
       vtkDICOMApplyPaletteExecute(
         this, inData, static_cast<VTK_TT *>(inVoidPtr), outData,
         static_cast<unsigned char *>(outVoidPtr), extent,
         this->Palette, this->IsSupplemental, id));
-    }
+  }
 }
diff --git a/Source/vtkDICOMApplyPalette.h b/Source/vtkDICOMApplyPalette.h
index d05c7de..57637a6 100644
--- a/Source/vtkDICOMApplyPalette.h
+++ b/Source/vtkDICOMApplyPalette.h
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -11,14 +11,16 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkDICOMApplyPalette - Apply palette to PALETTE_COLOR images
-// .SECTION Description
-// If an image contains a palette LUT, then this filter will apply that
-// LUT to the image and produce an RGB image.  Images without a palette
-// LUT will pass through unchanged.  If the image uses a supplemental
-// palette that only applies to a specific range of pixel values, then
-// pixel values outside of that range will be mapped to greyscale via
-// the WindowWidth and WindowCenter specified in the image.
+/*! \class vtkDICOMApplyPalette
+ *  \brief Apply palette to PALETTE COLOR images
+ *
+ *  If an image contains a palette LUT, then this filter will apply that
+ *  LUT to the image and produce an RGB image.  Images without a palette
+ *  LUT will pass through unchanged.  If the image uses a supplemental
+ *  palette that only applies to a specific range of pixel values, then
+ *  pixel values outside of that range will be mapped to greyscale via
+ *  the WindowWidth and WindowCenter specified in the image.
+ */
 
 #ifndef vtkDICOMApplyPalette_h
 #define vtkDICOMApplyPalette_h
@@ -33,13 +35,10 @@ class vtkDICOMPerFilePalette;
 class VTKDICOM_EXPORT vtkDICOMApplyPalette : public vtkDICOMAlgorithm
 {
 public:
-  // Description:
-  // Static method for construction.
   static vtkDICOMApplyPalette *New();
   vtkTypeMacro(vtkDICOMApplyPalette, vtkDICOMAlgorithm);
 
-  // Description:
-  // Print information about this object.
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
 protected:
@@ -59,17 +58,15 @@ protected:
     vtkInformationVector *outputVector, vtkImageData ***inData,
     vtkImageData **outData, int ext[6], int id);
 
-  // Description:
-  // Container for the lookup tables used.
+  //! Container for the lookup tables used.
   vtkDICOMPerFilePalette *Palette;
 
-  // Description:
-  // True if palette is supplemental.
+  //! True if palette is supplemental.
   bool IsSupplemental;
 
 private:
-  vtkDICOMApplyPalette(const vtkDICOMApplyPalette&);  // Not implemented.
-  void operator=(const vtkDICOMApplyPalette&);  // Not implemented.
+  vtkDICOMApplyPalette(const vtkDICOMApplyPalette&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMApplyPalette&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMApplyPalette_h
diff --git a/Source/vtkDICOMApplyRescale.cxx b/Source/vtkDICOMApplyRescale.cxx
index 8d8fa7c..2f7a65f 100644
--- a/Source/vtkDICOMApplyRescale.cxx
+++ b/Source/vtkDICOMApplyRescale.cxx
@@ -77,10 +77,10 @@ vtkDICOMApplyRescale::~vtkDICOMApplyRescale()
 void vtkDICOMApplyRescale::SetOutputScalarType(int t)
 {
   if (t != this->OutputScalarType && (t == VTK_DOUBLE || t == VTK_FLOAT))
-    {
+  {
     this->OutputScalarType = t;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -115,97 +115,97 @@ void vtkDICOMApplyRescaleExecute(
   vtkIdType progress = 0;
 
   for (int c = 0; c < numComponents; c++)
-    {
+  {
     T *inPtrC = inPtr0 + c;
     F *outPtrC = outPtr0 + c;
 
     for (int zIdx = extent[4]; zIdx <= extent[5]; zIdx++)
-      {
+    {
       vtkDICOMRealWorldMapping *mapping = 0;
       T first = vtkTypeTraits<T>::Min();
       T last = vtkTypeTraits<T>::Max();
       if (mapArray)
-        {
+      {
         mapping = &mapArray[(zIdx - wholeExtent[4])*numComponents + c];
         if (mapping->First > static_cast<int>(first))
-          {
+        {
           first = static_cast<T>(mapping->First);
-          }
+        }
         if (mapping->Last < static_cast<int>(last))
-          {
+        {
           last = static_cast<T>(mapping->Last);
-          }
         }
+      }
 
       T *inPtrZ = inPtrC + (zIdx - extent[4])*inIncZ;
       F *outPtrZ = outPtrC + (zIdx - extent[4])*outIncZ;
 
       for (int yIdx = extent[2]; yIdx <= extent[3]; yIdx++)
-        {
+      {
         T *inPtr = inPtrZ + inIncY*(yIdx - extent[2]);
         F *outPtr = outPtrZ + outIncY*(yIdx - extent[2]);
 
         // in base thread, report progress every 2% of the way to 100%
         if (id == 0)
-          {
+        {
           ++progress;
           vtkIdType icount = progress*50/target;
           if (progress == icount*target/50)
-            {
+          {
             self->UpdateProgress(progress*1.0/target);
-            }
           }
+        }
 
         if (mapping == 0)
-          {
+        {
           // no mapping to apply
           for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++)
-            {
+          {
             *outPtr = *inPtr;
             inPtr += numComponents;
             outPtr += numComponents;
-            }
           }
+        }
         else if (mapping->Map)
-          {
+        {
           // apply lookup table
           const double *table = mapping->Map;
           for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++)
-            {
+          {
             if (*inPtr >= first && *inPtr <= last)
-              {
+            {
               *outPtr = table[*inPtr - first];
-              }
+            }
             else
-              {
+            {
               *outPtr = 0;
-              }
+            }
             inPtr += numComponents;
             outPtr += numComponents;
-            }
           }
+        }
         else
-          {
+        {
           // apply slope and intercept
           double m = mapping->Slope;
           double b = mapping->Intercept;
           for (int xIdx = extent[0]; xIdx <= extent[1]; xIdx++)
-            {
+          {
             if (*inPtr >= first && *inPtr <= last)
-              {
+            {
               *outPtr = *inPtr*m + b;
-              }
+            }
             else
-              {
+            {
               *outPtr = 0;
-              }
+            }
             inPtr += numComponents;
             outPtr += numComponents;
-            }
           }
         }
       }
     }
+  }
 }
 
 } // end anonymous namespace
@@ -262,16 +262,16 @@ int vtkDICOMApplyRescale::RequestData(
       metaInfo->Get(vtkDICOMAlgorithm::META_DATA()));
 
   if (meta)
-    {
+  {
     size_t sz = (static_cast<size_t>(numComponents)*
                  static_cast<size_t>(extent[5] - extent[4] + 1));
     this->Mapping = new vtkDICOMRealWorldMapping[sz];
     bool hasMapping = false;
 
     for (int c = 0; c < numComponents; c++)
-      {
+    {
       for (int zIdx = extent[4]; zIdx <= extent[5]; zIdx++)
-        {
+      {
         vtkDICOMRealWorldMapping *mapping =
           &this->Mapping[(zIdx - extent[4])*numComponents + c];
         mapping->First = VTK_INT_MIN;
@@ -288,7 +288,7 @@ int vtkDICOMApplyRescale::RequestData(
         const vtkDICOMItem *rwvmi = rwvms.GetSequenceData();
 
         if (rwvmi)
-          {
+        {
           // use the real world value mapping first item
           mapping->First = rwvmi->GetAttributeValue(
             DC::RealWorldValueFirstValueMapped).AsInt();
@@ -304,45 +304,45 @@ int vtkDICOMApplyRescale::RequestData(
             DC::RealWorldValueLUTData);
           if (v.GetNumberOfValues() >=
               static_cast<size_t>(mapping->Last - mapping->First + 1))
-            {
+          {
             mapping->Map = v.GetDoubleData();
-            }
-          hasMapping = true;
           }
+          hasMapping = true;
+        }
         else
-          {
+        {
           // use the slope and intercept instead
           const vtkDICOMValue& u = meta->GetAttributeValue(
             i, j, DC::RescaleSlope);
           const vtkDICOMValue& v = meta->GetAttributeValue(
             i, j, DC::RescaleIntercept);
           if (u.IsValid() && v.IsValid())
-            {
+          {
             mapping->Slope = u.AsDouble();
             mapping->Intercept = v.AsDouble();
             hasMapping = true;
-            }
           }
+        }
 
         // zero slope means slope wasn't found
         if (mapping->Slope == 0)
-          {
+        {
           mapping->Slope = 1.0;
-          }
         }
       }
+    }
 
     if (!hasMapping)
-      {
+    {
       delete [] this->Mapping;
       this->Mapping = 0;
-      }
     }
+  }
 
   // Passthrough if data is already floating-point
   int rval = 1;
   if (scalarType == VTK_DOUBLE || scalarType == VTK_FLOAT)
-    {
+  {
     vtkImageData *inData =
       vtkImageData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT()));
     vtkImageData *outData =
@@ -350,13 +350,13 @@ int vtkDICOMApplyRescale::RequestData(
 
     outData->CopyStructure(inData);
     outData->GetPointData()->PassData(inData->GetPointData());
-    }
+  }
   else
-    {
+  {
     // Allow the superclass to call the ThreadedRequestData method
     rval = this->Superclass::RequestData(
       request, inputVector, outputVector);
-    }
+  }
 
   delete [] this->Mapping;
   this->Mapping = 0;
@@ -388,23 +388,23 @@ void vtkDICOMApplyRescale::ThreadedRequestData(
   int outScalarType = outData->GetScalarType();
 
   if (outScalarType == VTK_FLOAT)
-    {
+  {
     switch (scalarType)
-      {
+    {
       vtkTemplateAliasMacro(
         vtkDICOMApplyRescaleExecute(
           this, inData, static_cast<VTK_TT *>(inVoidPtr), outData,
           static_cast<float *>(outVoidPtr), this->Mapping, extent, id));
-      }
     }
+  }
   else if (outScalarType == VTK_DOUBLE)
-    {
+  {
     switch (scalarType)
-      {
+    {
       vtkTemplateAliasMacro(
         vtkDICOMApplyRescaleExecute(
           this, inData, static_cast<VTK_TT *>(inVoidPtr), outData,
           static_cast<double *>(outVoidPtr), this->Mapping, extent, id));
-      }
     }
+  }
 }
diff --git a/Source/vtkDICOMApplyRescale.h b/Source/vtkDICOMApplyRescale.h
index 92b0435..1e81ccf 100644
--- a/Source/vtkDICOMApplyRescale.h
+++ b/Source/vtkDICOMApplyRescale.h
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -11,15 +11,17 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkDICOMApplyRescale - Convert pixels to real-world values.
-// .SECTION Description
-// This filter uses the information in the DICOM meta data to convert the
-// pixel values to real-world values with known units.  It uses the DICOM
-// RealWorldValueMapping attributes, if present, otherwise it uses the
-// RescaleSlope and RescaleIntercept.  If no mapping information is present,
-// then the pixels are simply converted to floating-point.  Note that if
-// this filter is used, then AutoRescaleOff() should be set on the reader
-// to ensure that the reader does not rescale the data.
+/*! \class vtkDICOMApplyRescale
+ *  \brief Convert pixels to real-world values.
+ *
+ *  This filter uses the information in the DICOM meta data to convert the
+ *  pixel values to real-world values with known units.  It uses the DICOM
+ *  RealWorldValueMapping attributes, if present, otherwise it uses the
+ *  RescaleSlope and RescaleIntercept.  If no mapping information is present,
+ *  then the pixels are simply converted to floating-point.  Note that if
+ *  this filter is used, then AutoRescaleOff() should be set on the reader
+ *  to ensure that the reader does not rescale the data.
+ */
 
 #ifndef vtkDICOMApplyRescale_h
 #define vtkDICOMApplyRescale_h
@@ -33,15 +35,16 @@ class VTKDICOM_EXPORT vtkDICOMApplyRescale :
   public vtkDICOMAlgorithm
 {
 public:
-  static vtkDICOMApplyRescale *New();
   vtkTypeMacro(vtkDICOMApplyRescale, vtkDICOMAlgorithm);
 
-  // Description:
-  // Print information about this object.
+  //! Static method for construction.
+  static vtkDICOMApplyRescale *New();
+
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Set the output data type to float or double (default is double).
+  //@{
+  //! Set the output data type to float or double (default is double).
   void SetOutputScalarType(int t);
   void SetOutputScalarTypeToFloat() {
     this->SetOutputScalarType(VTK_FLOAT); }
@@ -49,6 +52,7 @@ public:
     this->SetOutputScalarType(VTK_DOUBLE); }
   int GetOutputScalarType() {
     return this->OutputScalarType; }
+  //@}
 
 protected:
   vtkDICOMApplyRescale();
@@ -71,8 +75,8 @@ protected:
   int OutputScalarType;
 
 private:
-  vtkDICOMApplyRescale(const vtkDICOMApplyRescale&);  // Not implemented.
-  void operator=(const vtkDICOMApplyRescale&);  // Not implemented.
+  vtkDICOMApplyRescale(const vtkDICOMApplyRescale&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMApplyRescale&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMApplyRescale_h
diff --git a/Source/vtkDICOMCTGenerator.cxx b/Source/vtkDICOMCTGenerator.cxx
index a52a7f2..ca8c7df 100644
--- a/Source/vtkDICOMCTGenerator.cxx
+++ b/Source/vtkDICOMCTGenerator.cxx
@@ -62,13 +62,13 @@ bool vtkDICOMCTGenerator::GenerateCTImageModule(vtkDICOMMetaData *source)
   // AXIAL or LOCALIZER
   const char *it = 0;
   if (source)
-    {
+  {
     it = source->GetAttributeValue(DC::ImageType).GetCharData();
-    }
+  }
   if (it == 0 || it[0] == '\0')
-    {
+  {
     it = "DERIVED\\SECONDARY\\AXIAL";
-    }
+  }
   vtkDICOMMetaData *meta = this->MetaData;
   meta->SetAttributeValue(DC::ImageType, it);
 
@@ -164,9 +164,9 @@ bool vtkDICOMCTGenerator::GenerateCTInstance(vtkInformation *info)
       !this->GenerateCTImageModule(source) ||
       !this->GenerateOverlayPlaneModule(source) ||
       !this->GenerateVOILUTModule(source))
-    {
+  {
     return false;
-    }
+  }
 
   return true;
 }
@@ -175,10 +175,10 @@ bool vtkDICOMCTGenerator::GenerateCTInstance(vtkInformation *info)
 bool vtkDICOMCTGenerator::GenerateInstance(vtkInformation *info)
 {
   if (this->MultiFrame)
-    {
+  {
     vtkErrorMacro("Enhanced Multi-Frame CT is not yet supported.");
     return false;
-    }
+  }
 
   return this->GenerateCTInstance(info);
 }
diff --git a/Source/vtkDICOMCTGenerator.h b/Source/vtkDICOMCTGenerator.h
index 7f92416..785c467 100644
--- a/Source/vtkDICOMCTGenerator.h
+++ b/Source/vtkDICOMCTGenerator.h
@@ -57,8 +57,8 @@ protected:
   virtual bool GenerateCTInstance(vtkInformation *info);
 
 private:
-  vtkDICOMCTGenerator(const vtkDICOMCTGenerator&);  // Not implemented.
-  void operator=(const vtkDICOMCTGenerator&);  // Not implemented.
+  vtkDICOMCTGenerator(const vtkDICOMCTGenerator&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMCTGenerator&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMCTGenerator_h
diff --git a/Source/vtkDICOMCTRectifier.cxx b/Source/vtkDICOMCTRectifier.cxx
index 22032f2..82290e1 100644
--- a/Source/vtkDICOMCTRectifier.cxx
+++ b/Source/vtkDICOMCTRectifier.cxx
@@ -45,17 +45,17 @@ vtkDICOMCTRectifier::vtkDICOMCTRectifier()
 vtkDICOMCTRectifier::~vtkDICOMCTRectifier()
 {
   if (this->RectifiedMatrix)
-    {
+  {
     this->RectifiedMatrix->Delete();
-    }
+  }
   if (this->VolumeMatrix)
-    {
+  {
     this->VolumeMatrix->Delete();
-    }
+  }
   if (this->Matrix)
-    {
+  {
     this->Matrix->Delete();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -65,35 +65,35 @@ void vtkDICOMCTRectifier::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "VolumeMatrix:";
   if (this->VolumeMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->VolumeMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "RectifiedMatrix:";
   if (this->RectifiedMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->RectifiedMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "Reverse: " << this->Reverse << "\n";
 }
@@ -103,10 +103,10 @@ void vtkDICOMCTRectifier::SetReverse(int val)
 {
   val = (val != 0);
   if (val != this->Reverse)
-    {
+  {
     this->Reverse = val;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -115,11 +115,11 @@ void vtkDICOMCTRectifier::ComputeMatrix(
   double spacing[3], double origin[3])
 {
   if (volumeMatrix == 0)
-    {
+  {
     this->RectifiedMatrix->Identity();
     this->Matrix->Identity();
     return;
-    }
+  }
 
   // get the first two columns of the volume matrix
   double xvec[4] = { 1.0, 0.0, 0.0, 0.0 };
@@ -138,19 +138,19 @@ void vtkDICOMCTRectifier::ComputeMatrix(
   // compute the shear matrix
   vtkMatrix4x4 *matrix = this->Matrix;
   if (this->Reverse)
-    {
+  {
     matrix->DeepCopy(this->RectifiedMatrix);
     matrix->Invert();
     double elements[16];
     vtkMatrix4x4::Multiply4x4(*matrix->Element, volumeMatrix, elements);
     matrix->DeepCopy(elements);
-    }
+  }
   else
-    {
+  {
     matrix->DeepCopy(volumeMatrix);
     matrix->Invert();
     vtkMatrix4x4::Multiply4x4(matrix, this->RectifiedMatrix, matrix);
-    }
+  }
 
   // compute the shear parameters for the volume
   double zdn = matrix->GetElement(2, 2);
@@ -169,11 +169,11 @@ void vtkDICOMCTRectifier::ComputeMatrix(
   matrix->SetElement(2, 3, pos[2]);
 
   if (this->Reverse)
-    {
+  {
     pos[0] = -pos[0];
     pos[1] = -pos[1];
     pos[2] = -pos[2];
-    }
+  }
 
   vtkMatrix4x4::MultiplyPoint(volumeMatrix, pos, pos);
   this->RectifiedMatrix->SetElement(0, 3, pos[0]);
@@ -223,15 +223,15 @@ int vtkDICOMCTRectifier::RequestInformation(
 
   double *volumeMatrix;
   if (this->VolumeMatrix)
-    {
+  {
     // If a VolumeMatrix was provided, then use it.
     volumeMatrix = *this->VolumeMatrix->Element;
-    }
+  }
   else
-    {
+  {
     // Otherwise, try to get the patient matrix from the pipeline.
     volumeMatrix = metaInfo->Get(vtkDICOMAlgorithm::PATIENT_MATRIX());
-    }
+  }
 
   // Compute the shear matrix and the new spacing and origin.
   this->ComputeMatrix(volumeMatrix, extent, spacing, origin);
@@ -239,13 +239,13 @@ int vtkDICOMCTRectifier::RequestInformation(
   // Write the new patient matrix to the pipeline.
   double *outMatrix = *this->RectifiedMatrix->Element;
   if (this->Reverse)
-    {
+  {
     outMatrix = volumeMatrix;
-    }
+  }
   if (outMatrix)
-    {
+  {
     outInfo->Set(vtkDICOMAlgorithm::PATIENT_MATRIX(), outMatrix, 16);
-    }
+  }
 
   // The spacing and origin may have changed.
   outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent, 6);
diff --git a/Source/vtkDICOMCTRectifier.h b/Source/vtkDICOMCTRectifier.h
index 379a32c..d263967 100644
--- a/Source/vtkDICOMCTRectifier.h
+++ b/Source/vtkDICOMCTRectifier.h
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -11,11 +11,13 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkDICOMCTRectifier - Prepare a CT for 3D processing
-// .SECTION Description
-// This class will identify gantry-tilted CT images and resample them
-// into a rectangular volume.  This is often a necessary step prior to
-// volume rendering or other forms of 3D rendering.
+/*! \class vtkDICOMCTRectifier
+ *  \brief Prepare a CT for 3D processing
+ *
+ *  This class will identify gantry-tilted CT images and resample them
+ *  into a rectangular volume.  This is often a necessary step prior to
+ *  volume rendering or other forms of 3D rendering.
+ */
 
 #ifndef vtkDICOMCTRectifier_h
 #define vtkDICOMCTRectifier_h
@@ -29,58 +31,72 @@ class vtkMatrix4x4;
 class VTKDICOM_EXPORT vtkDICOMCTRectifier : public vtkDICOMAlgorithm
 {
 public:
-  // Description:
-  // Static method for construction.
+  //! Static method for construction.
   static vtkDICOMCTRectifier *New();
   vtkTypeMacro(vtkDICOMCTRectifier, vtkDICOMAlgorithm);
 
-  // Description:
-  // Print information about this object.
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Reverse the default operation.
-  // When this option is set, the filter takes a rectangular volume
-  // as input, and produces a volume whose geometry matches the
-  // VolumeMatrix.
+  //@{
+  //! Reverse the default operation.
+  /*!
+   *  When this option is set, the filter takes a rectangular volume
+   *  as input, and produces a volume whose geometry matches the
+   *  VolumeMatrix.
+   */
   void SetReverse(int v);
   void ReverseOn() { this->SetReverse(1); }
   void ReverseOff() { this->SetReverse(0); }
   int GetReverse() { return this->Reverse; }
-
-  // Description:
-  // Set the matrix that describes the CT volume geometry.
-  // This should be set to the PatientMatrix that comes from the
-  // vtkDICOMReader.
+  //@}
+
+  //@{
+  //! Set the matrix that describes the CT volume geometry.
+  /*!
+   *  This should be set to the PatientMatrix that comes from the
+   *  vtkDICOMReader.
+   */
   void SetVolumeMatrix(vtkMatrix4x4 *matrix);
   vtkMatrix4x4 *GetVolumeMatrix() { return this->VolumeMatrix; }
-
-  // Description:
-  // Get the matrix that describes the rectified geometry.
-  // This matrix is generated when any of these methods is called:
-  // Update(), UpdateInformation(), or UpdateMatrix().
+  //@}
+
+  //@{
+  //! Get the matrix that describes the rectified geometry.
+  /*!
+   *  This matrix is generated when any of these methods is called:
+   *  Update(), UpdateInformation(), or UpdateMatrix().
+   */
   vtkMatrix4x4 *GetRectifiedMatrix() { return this->RectifiedMatrix; }
+  //@}
 
-  // Description:
-  // Update the RectifiedMatrix without updating the output data.
-  // The input data must be set before this is called.
+  //@{
+  //! Update the RectifiedMatrix without updating the output data.
+  /*!
+   *  The input data must be set before this is called.
+   */
   void UpdateMatrix();
-
-  // Description:
-  // A static method to measure the tilt from a matrix.
-  // This can be used to see whether it is necessary to rectify the
-  // volume.  It returns the Gantry Detector Tilt angle, in degrees,
-  // as computed from the shear in the volume matrix.
+  //@}
+
+  //@{
+  //! A static method to measure the tilt from a matrix.
+  /*!
+   *  This can be used to see whether it is necessary to rectify the
+   *  volume.  It returns the Gantry Detector Tilt angle, in degrees,
+   *  as computed from the shear in the volume matrix.
+   */
   static double GetGantryDetectorTilt(vtkMatrix4x4 *volumeMatrix);
+  //@}
 
 protected:
   vtkDICOMCTRectifier();
   ~vtkDICOMCTRectifier();
 
-  // Description:
-  // Compute the rectified matrix from the given volume matrix.
-  // The extent, spacing, and origin of the image must also be given,
-  // and they will be adjusted as necessary.
+  //! Compute the rectified matrix from the given volume matrix.
+  /*!
+   *  The extent, spacing, and origin of the image must also be given,
+   *  and they will be adjusted as necessary.
+   */
   void ComputeMatrix(
     const double matrix[16], const int extent[6], double spacing[3],
     double origin[3]);
@@ -108,8 +124,8 @@ protected:
   int Reverse;
 
 private:
-  vtkDICOMCTRectifier(const vtkDICOMCTRectifier&);  // Not implemented.
-  void operator=(const vtkDICOMCTRectifier&);  // Not implemented.
+  vtkDICOMCTRectifier(const vtkDICOMCTRectifier&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMCTRectifier&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMCTRectifier_h
diff --git a/Source/vtkDICOMCharacterSet.cxx b/Source/vtkDICOMCharacterSet.cxx
index bd47b0c..a807bb4 100644
--- a/Source/vtkDICOMCharacterSet.cxx
+++ b/Source/vtkDICOMCharacterSet.cxx
@@ -22,7 +22,7 @@ namespace {
 // of the name appears in SpecificCharacterSet, then iso-2022 escape codes
 // can be used to switch between character sets.  The escape codes to switch
 // to the character set are given in the third column.
-const char *Charsets[16][3] = {
+const char *const Charsets[16][3] = {
   { "ISO_IR 6",	  "ISO 2022 IR 6",   "(B" }, // ascii
   { "ISO_IR 100", "ISO 2022 IR 100", "-A" }, // iso-8859-1, western europe
   { "ISO_IR 101", "ISO 2022 IR 101", "-B" }, // iso-8859-2, central europe
@@ -35,7 +35,7 @@ const char *Charsets[16][3] = {
   { "ISO_IR 148", "ISO 2022 IR 148", "-M" }, // iso-8859-9, latin5, turkish
   { "ISO_IR 166", "ISO 2022 IR 166", "-T" }, // iso-8859-11, thai
   { "ISO_IR 13",  "ISO 2022 IR 13",  ")I" }, // JIS X 0201, katakana
-  { "ISO_IR 14",  "ISO 2022 IR 14",  "(J" }, // JIS X 0201, romaji
+  { "ISO_IR 13",  "ISO 2022 IR 13",  "(J" }, // JIS X 0201, romaji
   { "ISO_IR 192", "",                ""   }, // unicode multibyte
   { "GB18030",    "",                ""   }, // chinese multibyte
   { "GBK",        "",                ""   }, // subset of GB18030
@@ -45,15 +45,15 @@ const char *Charsets[16][3] = {
 const int ISO_2022_LOWBIT = 16;
 
 // This table gives secondary character sets.
-const char *Extensions[4][3] = {
-  { "ISO_IR 58",  "ISO 2022 IR 58",  "$)A" }, // GB2313, chinese
+const char *const Extensions[4][3] = {
+  { "ISO_IR 58",  "ISO 2022 IR 58",  "$)A" }, // GB2312, chinese
   { "ISO_IR 87",  "ISO 2022 IR 87",  "$B" },  // JIS X 0208, japanese
   { "ISO_IR 159", "ISO 2022 IR 159", "$(D" }, // JIS X 0212, japanese
   { "ISO_IR 149", "ISO 2022 IR 149", "$)C" } }; // KS X 1001, korean
 
 // Code pages for ISO-8859-2/3/4/5/6/7/8/9/11, these were autogenerated
 // from the files at http://www.unicode.org/Public/MAPPINGS/ISO8859/
-unsigned short CodePagesISO8859[96][9] = {
+const unsigned short CodePagesISO8859[96][9] = {
   { 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0, 0x00A0 },
   { 0x0104, 0x0126, 0x0104, 0x0401, 0xFFFD, 0x2018, 0xFFFD, 0x00A1, 0x0E01 },
   { 0x02D8, 0x02D8, 0x0138, 0x0402, 0xFFFD, 0x2019, 0x00A2, 0x00A2, 0x0E02 },
@@ -152,8 +152,9 @@ unsigned short CodePagesISO8859[96][9] = {
   { 0x02D9, 0x02D9, 0x02D9, 0x045F, 0xFFFD, 0xFFFD, 0xFFFD, 0x00FF, 0xFFFD }
 };
 
-// Code page for JIS X 0208 from java-ISO2022JP-1.3_P.ucm
-unsigned short CodePageJISX0208[8836] = {
+// Code page for JIS X 0208 from JIS0208.TXT, except that backslash has
+// been replaced by "fullwidth reverse solidus" U+FF3C (Unicode 1.1).
+const unsigned short CodePageJISX0208[8836] = {
   0x3000, 0x3001, 0x3002, 0xFF0C, 0xFF0E, 0x30FB, 0xFF1A, 0xFF1B, 0xFF1F,
   0xFF01, 0x309B, 0x309C, 0x00B4, 0xFF40, 0x00A8, 0xFF3E, 0xFFE3, 0xFF3F,
   0x30FD, 0x30FE, 0x309D, 0x309E, 0x3003, 0x4EDD, 0x3005, 0x3006, 0x3007,
@@ -467,17 +468,17 @@ unsigned short CodePageJISX0208[8836] = {
   0x937E, 0x9418, 0x969C, 0x9798, 0x4E0A, 0x4E08, 0x4E1E, 0x4E57, 0x5197,
   0x5270, 0x57CE, 0x5834, 0x58CC, 0x5B22, 0x5E38, 0x60C5, 0x64FE, 0x6761,
   0x6756, 0x6D44, 0x72B6, 0x7573, 0x7A63, 0x84B8, 0x8B72, 0x91B8, 0x9320,
-  0x5631, 0x57F4, 0x98FE, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x6F84, 0x647A,
+  0x5631, 0x57F4, 0x98FE, 0x62ED, 0x690D, 0x6B96, 0x71ED, 0x7E54, 0x8077,
+  0x8272, 0x89E6, 0x98DF, 0x8755, 0x8FB1, 0x5C3B, 0x4F38, 0x4FE1, 0x4FB5,
+  0x5507, 0x5A20, 0x5BDD, 0x5BE9, 0x5FC3, 0x614E, 0x632F, 0x65B0, 0x664B,
+  0x68EE, 0x699B, 0x6D78, 0x6DF1, 0x7533, 0x75B9, 0x771F, 0x795E, 0x79E6,
+  0x7D33, 0x81E3, 0x82AF, 0x85AA, 0x89AA, 0x8A3A, 0x8EAB, 0x8F9B, 0x9032,
+  0x91DD, 0x9707, 0x4EBA, 0x4EC1, 0x5203, 0x5875, 0x58EC, 0x5C0B, 0x751A,
+  0x5C3D, 0x814E, 0x8A0A, 0x8FC5, 0x9663, 0x976D, 0x7B25, 0x8ACF, 0x9808,
+  0x9162, 0x56F3, 0x53A8, 0x9017, 0x5439, 0x5782, 0x5E25, 0x63A8, 0x6C34,
+  0x708A, 0x7761, 0x7C8B, 0x7FE0, 0x8870, 0x9042, 0x9154, 0x9310, 0x9318,
+  0x968F, 0x745E, 0x9AC4, 0x5D07, 0x5D69, 0x6570, 0x67A2, 0x8DA8, 0x96DB,
+  0x636E, 0x6749, 0x6919, 0x83C5, 0x9817, 0x96C0, 0x88FE, 0x6F84, 0x647A,
   0x5BF8, 0x4E16, 0x702C, 0x755D, 0x662F, 0x51C4, 0x5236, 0x52E2, 0x59D3,
   0x5F81, 0x6027, 0x6210, 0x653F, 0x6574, 0x661F, 0x6674, 0x68F2, 0x6816,
   0x6B63, 0x6E05, 0x7272, 0x751F, 0x76DB, 0x7CBE, 0x8056, 0x58F0, 0x88FD,
@@ -1138,8 +1139,9 @@ unsigned short CodePageJISX0208[8836] = {
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD
 };
 
-// Code page for JIS X 0212 from JIS0212.TXT
-unsigned short CodePageJISX0212[8836] = {
+// Code page for JIS X 0212 from JIS0212.TXT, except that narrow tilde
+// has been replaced by fullwidth tilde U+FF5E (Unicode 1.1).
+const unsigned short CodePageJISX0212[8836] = {
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
@@ -1152,7 +1154,7 @@ unsigned short CodePageJISX0212[8836] = {
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0x02D8, 0x02C7, 0x00B8, 0x02D9, 0x02DD, 0x00AF, 0x02DB, 0x02DA, 0x007E,
+  0x02D8, 0x02C7, 0x00B8, 0x02D9, 0x02DD, 0x00AF, 0x02DB, 0x02DA, 0xFF5E,
   0x0384, 0x0385, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
   0xFFFD, 0x00A1, 0x00A6, 0x00BF, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
@@ -2124,8 +2126,11 @@ unsigned short CodePageJISX0212[8836] = {
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD
 };
 
-// Code page for KS X 1001 from java-ISO2022KR-1.3_P.ucm
-unsigned short CodePageKSX1001[8836] = {
+// Code page for KS X 1001 from KSX1001.TXT, with two new symbols that were
+// added for KS X 1001:1998
+// 1) "euro sign" U+20AC
+// 2) "registered sign" 0x00AE
+const unsigned short CodePageKSX1001[8836] = {
   0x3000, 0x3001, 0x3002, 0x00B7, 0x2025, 0x2026, 0x00A8, 0x3003, 0x00AD,
   0x2015, 0x2225, 0xFF3C, 0x223C, 0x2018, 0x2019, 0x201C, 0x201D, 0x3014,
   0x3015, 0x3008, 0x3009, 0x300A, 0x300B, 0x300C, 0x300D, 0x300E, 0x300F,
@@ -2144,7 +2149,7 @@ unsigned short CodePageKSX1001[8836] = {
   0x25A7, 0x25A6, 0x25A9, 0x2668, 0x260F, 0x260E, 0x261C, 0x261E, 0x00B6,
   0x2020, 0x2021, 0x2195, 0x2197, 0x2199, 0x2196, 0x2198, 0x266D, 0x2669,
   0x266A, 0x266C, 0x327F, 0x321C, 0x2116, 0x33C7, 0x2122, 0x33C2, 0x33D8,
-  0x2121, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
+  0x2121, 0x20AC, 0x00AE, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
   0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFF01,
   0xFF02, 0xFF03, 0xFF04, 0xFF05, 0xFF06, 0xFF07, 0xFF08, 0xFF09, 0xFF0A,
@@ -2439,17 +2444,17 @@ unsigned short CodePageKSX1001[8836] = {
   0xC580, 0xC584, 0xC587, 0xC58C, 0xC58D, 0xC58F, 0xC591, 0xC595, 0xC597,
   0xC598, 0xC59C, 0xC5A0, 0xC5A9, 0xC5B4, 0xC5B5, 0xC5B8, 0xC5B9, 0xC5BB,
   0xC5BC, 0xC5BD, 0xC5BE, 0xC5C4, 0xC5C5, 0xC5C6, 0xC5C7, 0xC5C8, 0xC5C9,
-  0xC5CA, 0xC5CC, 0xC5CE, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
-  0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xC6E9, 0xC6EC,
+  0xC5CA, 0xC5CC, 0xC5CE, 0xC5D0, 0xC5D1, 0xC5D4, 0xC5D8, 0xC5E0, 0xC5E1,
+  0xC5E3, 0xC5E5, 0xC5EC, 0xC5ED, 0xC5EE, 0xC5F0, 0xC5F4, 0xC5F6, 0xC5F7,
+  0xC5FC, 0xC5FD, 0xC5FE, 0xC5FF, 0xC600, 0xC601, 0xC605, 0xC606, 0xC607,
+  0xC608, 0xC60C, 0xC610, 0xC618, 0xC619, 0xC61B, 0xC61C, 0xC624, 0xC625,
+  0xC628, 0xC62C, 0xC62D, 0xC62E, 0xC630, 0xC633, 0xC634, 0xC635, 0xC637,
+  0xC639, 0xC63B, 0xC640, 0xC641, 0xC644, 0xC648, 0xC650, 0xC651, 0xC653,
+  0xC654, 0xC655, 0xC65C, 0xC65D, 0xC660, 0xC66C, 0xC66F, 0xC671, 0xC678,
+  0xC679, 0xC67C, 0xC680, 0xC688, 0xC689, 0xC68B, 0xC68D, 0xC694, 0xC695,
+  0xC698, 0xC69C, 0xC6A4, 0xC6A5, 0xC6A7, 0xC6A9, 0xC6B0, 0xC6B1, 0xC6B4,
+  0xC6B8, 0xC6B9, 0xC6BA, 0xC6C0, 0xC6C1, 0xC6C3, 0xC6C5, 0xC6CC, 0xC6CD,
+  0xC6D0, 0xC6D4, 0xC6DC, 0xC6DD, 0xC6E0, 0xC6E1, 0xC6E8, 0xC6E9, 0xC6EC,
   0xC6F0, 0xC6F8, 0xC6F9, 0xC6FD, 0xC704, 0xC705, 0xC708, 0xC70C, 0xC714,
   0xC715, 0xC717, 0xC719, 0xC720, 0xC721, 0xC724, 0xC728, 0xC730, 0xC731,
   0xC733, 0xC735, 0xC737, 0xC73C, 0xC73D, 0xC740, 0xC744, 0xC74A, 0xC74C,
@@ -3113,7 +3118,12 @@ unsigned short CodePageKSX1001[8836] = {
 // Code page for gb18030 two-byte codes from gb-18030-2005.ucm.
 // There were 24 codes with duplicate mappings, which are listed in
 // the PrivateToStandard table below.
-unsigned short CodePageGB18030[23940] = {
+// This table is also used for GB2312 and GBK, to ensure compatibility.
+// However, note that GBK/GB18030 differs from GNU iconv's GB2312 table
+// for these two code points:
+// 1) here 'middle dot' U+00B7 -> iconv 'katakana middle dot' U+30FB
+// 2) here 'em dash' U+2014 -> iconv 'horizontal bar' U+2015
+const unsigned short CodePageGB18030[23940] = {
   0x4E02, 0x4E04, 0x4E05, 0x4E06, 0x4E0F, 0x4E12, 0x4E17, 0x4E1F, 0x4E20,
   0x4E21, 0x4E23, 0x4E26, 0x4E29, 0x4E2E, 0x4E2F, 0x4E31, 0x4E33, 0x4E35,
   0x4E37, 0x4E3C, 0x4E40, 0x4E41, 0x4E42, 0x4E44, 0x4E46, 0x4E4A, 0x4E51,
@@ -5777,7 +5787,7 @@ unsigned short CodePageGB18030[23940] = {
 };
 
 // Linear table for gb18030 four-byte codes that map to the BMP.
-unsigned short LinearGB18030[412] = {
+const unsigned short LinearGB18030[412] = {
   0x0000, 0x0080,  0x0024, 0x00A5,  0x0026, 0x00A9,  0x002D, 0x00B2,
   0x0032, 0x00B8,  0x0051, 0x00D8,  0x0059, 0x00E2,  0x005F, 0x00EB,
   0x0060, 0x00EE,  0x0064, 0x00F4,  0x0067, 0x00F8,  0x0068, 0x00FB,
@@ -5832,45 +5842,53 @@ unsigned short LinearGB18030[412] = {
   0x9961, 0xFF5F,  0x99E2, 0xFFE6
 };
 
-// Note: in the GB18030-2005 tables some codepoints in the private
-// range U+E000..U+F8FF migrated to standard unicode codepoints.
-// My understanding is that this allows more characters to be displayed
-// when the PUA is not mapped to GBK characters, but reduces the ability
-// of GB18030 to reversibly encode these private codepoints.
+// Note: GB18030 maps 24 characters to the private use area, though
+// as of Unicode 4.1 there are now standard unicode codes for these.
+// By moving these out of the PUA, it becomes possible to display
+// these characters on systems that support Unicode 4.1 and have the
+// necessary fonts.  However, it breaks the round-trip compatibility
+// between GB18030 and Unicode and therefore breaks GB18030-2005.
 const unsigned int PrivateToStandard[48] = {
-  0xE81E, 0x9FB4,  0xE826, 0x9FB5,  0xE82B, 0x9FB6,  0xE82C, 0x9FB7,
-  0xE832, 0x9FB8,  0xE843, 0x9FB9,  0xE854, 0x9FBA,  0xE864, 0x9FBB,
-  0xE78D, 0xFE10,  0xE78F, 0xFE11,  0xE78E, 0xFE12,  0xE790, 0xFE13,
+  0xE78D, 0xFE10,  0xE78E, 0xFE12,  0xE78F, 0xFE11,  0xE790, 0xFE13,
   0xE791, 0xFE14,  0xE792, 0xFE15,  0xE793, 0xFE16,  0xE794, 0xFE17,
   0xE795, 0xFE18,  0xE796, 0xFE19,  0xE816, 0x20087, 0xE817, 0x20089,
-  0xE818, 0x200CC, 0xE831, 0x215D7, 0xE83B, 0x2298F, 0xE855, 0x241FE
+  0xE818, 0x200CC, 0xE81E, 0x9FB4,  0xE826, 0x9FB5,  0xE82B, 0x9FB6,
+  0xE82C, 0x9FB7,  0xE831, 0x215D7, 0xE832, 0x9FB8,  0xE83B, 0x2298F,
+  0xE843, 0x9FB9,  0xE854, 0x9FBA,  0xE855, 0x241FE, 0xE864, 0x9FBB
 };
 
 // Convert a unicode code point to UTF-8
 inline void UnicodeToUTF8(unsigned int code, std::string *s)
 {
   if (code <= 0x007F)
-    {
+  {
     s->push_back(code);
-    }
+  }
   else if (code <= 0x07FF)
-    {
+  {
     s->push_back(0xC0 | (code >> 6));
     s->push_back(0x80 | (code & 0x3F));
-    }
+  }
   else if (code <= 0xFFFF)
-    {
+  {
     s->push_back(0xE0 | (code >> 12));
     s->push_back(0x80 | ((code >> 6) & 0x3F));
     s->push_back(0x80 | (code & 0x3F));
-    }
+  }
   else if (code <= 0x10FFFF)
-    {
+  {
     s->push_back(0xF0 | (code >> 18));
     s->push_back(0x80 | ((code >> 12) & 0x3F));
     s->push_back(0x80 | ((code >> 6) & 0x3F));
     s->push_back(0x80 | (code & 0x3F));
-    }
+  }
+  else
+  {
+    // indicate bad code with U+FFFD
+    s->push_back(0xEF);
+    s->push_back(0xBF);
+    s->push_back(0xBD);
+  }
 }
 
 inline unsigned int UTF8ToUnicode(const char **cpp, const char *cpEnd)
@@ -5879,68 +5897,95 @@ inline unsigned int UTF8ToUnicode(const char **cpp, const char *cpEnd)
   const unsigned char *ep = reinterpret_cast<const unsigned char *>(cpEnd);
   unsigned int code = 0;
   if (cp != ep)
-    {
+  {
     code = *cp++;
-    }
+  }
 
+  // check for non-ASCII
   if ((code & 0x80) != 0)
-    {
+  {
     bool good = false;
     if (cp != ep)
-      {
+    {
       if ((code & 0xE0) == 0xC0)
-        {
+      {
+        // 2 bytes, 0x0080 to 0x07FF
         code &= 0x1F;
         code <<= 6;
         unsigned int s = *cp;
-        good = ((s & 0xC0) == 0x80);
+        good = (code != 0);
+        good &= ((s & 0xC0) == 0x80);
         cp += good;
         code |= (s & 0x3F);
-        }
+      }
       else if (cp+1 != ep)
-        {
+      {
         if ((code & 0xF0) == 0xE0)
-          {
+        {
+          // 3 bytes, 0x0800 to 0xFFFF
           code &= 0x0F;
           code <<= 6;
           unsigned int s = *cp;
-          good = ((s & 0xC0) == 0x80);
+          good = ((code | (s & 0x20)) != 0);
+          good &= ((s & 0xC0) == 0x80);
           cp += good;
           code |= (s & 0x3F);
           code <<= 6;
           s = *cp;
-          good = ((s & 0xC0) == 0x80);
+          good &= ((s & 0xC0) == 0x80);
           cp += good;
           code |= (s & 0x3F);
+          // check for UTF16 surrogates
+          if (good && (code & 0xF800) == 0xD800)
+          {
+            good = false;
+            // check for high surrogate followed by low surrogate
+            if ((code & 0xFC00) == 0xD800 &&
+                cp != ep && cp[0] == 0xED &&
+                cp+1 != ep && (cp[1] & 0xF0) == 0xB0 &&
+                cp+2 != ep && (cp[2] & 0xC0) == 0x80)
+            {
+              good = true;
+              code &= 0x03FF;
+              code <<= 4;
+              code |= cp[1] & 0x0F;
+              code <<= 6;
+              code |= cp[2] & 0x3F;
+              code += 0x010000;
+              cp += 3;
+            }
           }
+        }
         else if (cp+2 != ep)
-          {
+        {
           if ((code & 0xF8) == 0xF0)
-            {
+          {
+            // 4 bytes, 0x010000 to 0x10FFFF
             code &= 0x07;
             code <<= 6;
             unsigned int s = *cp;
-            good = ((s & 0xC0) == 0x80);
+            good = ((code | (s & 0x30)) != 0);
+            good &= ((s & 0xC0) == 0x80);
             cp += good;
             code |= (s & 0x3F);
             code <<= 6;
             s = *cp;
-            good = ((s & 0xC0) == 0x80);
+            good &= ((s & 0xC0) == 0x80);
             cp += good;
             code |= (s & 0x3F);
             code <<= 6;
             s = *cp;
-            good = ((s & 0xC0) == 0x80);
+            good &= ((s & 0xC0) == 0x80);
             cp += good;
             code |= (s & 0x3F);
             good &= (code <= 0x10FFFF);
-            }
           }
         }
       }
+    }
 
     code = (good ? code : 0xFFFD);
-    }
+  }
 
   *cpp = reinterpret_cast<const char *>(cp);
   return code;
@@ -5954,73 +5999,73 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
   unsigned int code3 = 0;
 
   if (code <= 0x7f)
-    {
+  {
     if (code >= 'A' && code <= 'Z')
-      { // ascii uppercase -> ascii lowercase
+    { // ascii uppercase -> ascii lowercase
       code += 0x20;
-      }
     }
+  }
   else if (code <= 0xff)
-    {
+  {
     if (code >= 0xC0 && code <= 0xDE && code != 0xD7)
-      { // latin1 uppercase -> latin1 lowercase
+    { // latin1 uppercase -> latin1 lowercase
       code += 0x20;
-      }
+    }
     else if (code == 0xDF)
-      { // latin1 s-sharp -> lowercase ss
+    { // latin1 s-sharp -> lowercase ss
       code = 's';
       code2 = 's';
-      }
+    }
     else if (code == 0xB5)
-      { // latin1 micron -> greek lowercase mu
+    { // latin1 micron -> greek lowercase mu
       code = 0x03BC;
-      }
     }
+  }
   else if (code <= 0x017f)
-    {
+  {
     if (code >= 0x0100 && code <= 0x012F)
-      { // various accented latin characters
+    { // various accented latin characters
       code |= 0x0001;
-      }
+    }
     else if (code == 0x0130)
-      { // I with dot becomes lowercase i
+    { // I with dot becomes lowercase i
       code = 'i';
       code2 = 0x0307;
-      }
+    }
     else if (code >= 0x0132 && code <= 0x0137)
-      { // IJ and various accented latin characters
+    { // IJ and various accented latin characters
       code |= 0x0001;
-      }
+    }
     else if (code >= 0x139 && code <= 0x148)
-      { // various accented latin characters
+    { // various accented latin characters
       code += (code & 0x0001);
-      }
+    }
     else if (code == 0x0149)
-      { // 'n -> two separate characters
+    { // 'n -> two separate characters
       code = 0x02BC;
       code2 = 'n';
-      }
+    }
     else if (code >= 0x014A && code <= 0x0177)
-      { // eng and various accented latin characters
+    { // eng and various accented latin characters
       code |= 0x0001;
-      }
+    }
     else if (code == 0x0178)
-      { // uppercase y with diaeresis becomes lowercase y with diaeresis
+    { // uppercase y with diaeresis becomes lowercase y with diaeresis
       code = 0xFF;
-      }
+    }
     else if (code >= 0x0179 && code <= 0x017E)
-      { // various accented latin characters
+    { // various accented latin characters
       code += (code & 0x0001);
-      }
+    }
     else if (code == 0x017F)
-      { // long s -> lowercase s
+    { // long s -> lowercase s
       code = 's';
-      }
     }
+  }
   else if (code <= 0x036f)
-    { // yet more latin with accents
+  { // yet more latin with accents
     if (code >= 0x0180 && code <= 0x01CA)
-      {
+    {
       const static unsigned short table[75] = {
         0x0180, 0x0253, 0x0183, 0x0183, 0x0185, 0x0185, 0x0254, 0x0188,
         0x0188, 0x0256, 0x0257, 0x018C, 0x018C, 0x018D, 0x01DD, 0x0259,
@@ -6034,22 +6079,22 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
         0x01C9, 0x01C9, 0x01CC };
 
       code = table[code - 0x0180];
-      }
+    }
     else if (code >= 0x01CB && code <= 0x01DC)
-      {
+    {
       code += (code & 0x0001);
-      }
+    }
     else if (code >= 0x01DE && code <= 0x01EF)
-      {
+    {
       code |= 0x0001;
-      }
+    }
     else if (code == 0x01F0)
-      {
+    {
       code = 0x006A;
       code2 = 0x030C;
-      }
+    }
     else if (code >= 0x01F0 && code <= 0x024F)
-      {
+    {
       const static unsigned short table[96] = {
         0x01F0, 0x01F3, 0x01F3, 0x01F3, 0x01F5, 0x01F5, 0x0195, 0x01BF,
         0x01F9, 0x01F9, 0x01FB, 0x01FB, 0x01FD, 0x01FD, 0x01FF, 0x01FF,
@@ -6065,17 +6110,17 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
         0x0249, 0x0249, 0x024B, 0x024B, 0x024D, 0x024D, 0x024F, 0x024F };
 
       code = table[code - 0x01F0];
-      }
+    }
     else if (code == 0x0345)
-      { // combining greek ypogegrammeni
+    { // combining greek ypogegrammeni
       code = 0x03B9;
-      }
     }
+  }
   else if (code <= 0x03ff)
-    {
+  {
     // greek characters
     if (code >= 0x0370 && code <= 0x038F)
-      {
+    {
       const static unsigned short table[32] = {
         0x0371, 0x0371, 0x0373, 0x0373, 0x0374, 0x0375, 0x0377, 0x0377,
         0x0378, 0x0379, 0x037A, 0x037B, 0x037C, 0x037D, 0x037E, 0x03F3,
@@ -6083,108 +6128,108 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
         0x03AD, 0x03AE, 0x03AF, 0x038B, 0x03CC, 0x038D, 0x03CD, 0x03CE };
 
       code = table[code - 0x0370];
-      }
+    }
     else if ((code >= 0x0391 && code <= 0x03A1) ||
              (code >= 0x03A3 && code <= 0x03AB))
-      {
+    {
       code += 0x20;
-      }
+    }
     else if (code == 0x0390)
-      {
+    {
       code = 0x03B9;
       code2 = 0x0308;
       code3 = 0x0301;
-      }
+    }
     else if (code == 0x03B0)
-      {
+    {
       code = 0x03C5;
       code2 = 0x0308;
       code3 = 0x0301;
-      }
+    }
     else if (code == 0x03C2)
-      {
+    {
       code += 0x01;
-      }
+    }
     else if (code >= 0x03CF && code <= 0x03D6)
-      {
+    {
       const static unsigned short table[8] = {
         0x03D7, 0x03B2, 0x03B8, 0x03D2, 0x03D3, 0x03D4, 0x03C6, 0x03C0 };
 
       code = table[code - 0x03CF];
-      }
+    }
     else if (code >= 0x03D8 && code <= 0x03EF)
-      {
+    {
       code |= 0x0001;
-      }
+    }
     else if (code >= 0x03F0 && code <= 0x03FF)
-      {
+    {
       const static unsigned short table[16] = {
         0x03BA, 0x03C1, 0x03F2, 0x03F3, 0x03B8, 0x03B5, 0x03F6, 0x03F8,
         0x03F8, 0x03F2, 0x03FB, 0x03FB, 0x03FC, 0x037B, 0x037C, 0x037D };
 
       code = table[code - 0x03F0];
-      }
     }
+  }
   else if (code <= 0x052f)
-    { // cyrillic
+  { // cyrillic
     if (code >= 0x0400 && code <= 0x040F)
-      {
+    {
       code += 0x50;
-      }
+    }
     else if (code >= 0x0410 && code <= 0x042F)
-      {
+    {
       code += 0x20;
-      }
+    }
     else if ((code >= 0x0460 && code <= 0x0481) ||
              (code >= 0x048A && code <= 0x04BF))
-      {
+    {
       code |= 0x0001;
-      }
+    }
     else if (code == 0x04C0)
-      {
+    {
       code = 0x04CF;
-      }
+    }
     else if (code >= 0x04C1 && code <= 0x04CE)
-      {
+    {
       code += (code & 0x0001);
-      }
+    }
     else if (code >= 0x04D0 && code <= 0x052F)
-      {
+    {
       code |= 0x0001;
-      }
     }
+  }
   else if (code <= 0x1000)
-    { // armenian
+  { // armenian
     if (code >= 0x0531 && code <= 0x0556)
-      {
+    {
       code += 0x30;
-      }
+    }
     else if (code == 0x0587)
-      {
+    {
       code = 0x0565;
       code2 = 0x0582;
-      }
     }
+  }
   else if (code <= 0x13ff)
-    {
+  {
     if ((code >= 0x10A0 && code <= 0x10C5) ||
         code == 0x10C7 || code == 0x10CD)
-      { // georgian
+    { // georgian
       code += 0x1C60;
-      }
+    }
     else if (code >= 0x13F8 && code <= 0x13FD)
-      { // cherokee
+    { // cherokee
       code -= 0x08;
-      }
     }
+  }
   else if (code <= 0x1eff)
-    { // vietnamese and other latin
+  { // vietnamese and other latin
     if (code >= 0x1E00 && code <= 0x1E95)
-      {
+    {
       code |= 0x0001;
-      }
+    }
     else if (code >= 0x1E96 && code <= 0x1E9B)
-      {
+    {
       const static unsigned short table[6] = {
         'h',    't',    'w',    'y',    'a',    0x1E61 };
       const static unsigned short table2[6] = {
@@ -6192,44 +6237,44 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
 
       code2 = table2[code - 0x1E96];
       code = table[code - 0x1E96];
-      }
+    }
     else if (code == 0x1E9E)
-      { // capital s-sharp -> ss
+    { // capital s-sharp -> ss
       code = 's';
       code2 = 's';
-      }
+    }
     else if (code >= 0x1EA0 && code <= 0x1EFE)
-      {
+    {
       code |= 0x0001;
-      }
     }
+  }
   else if (code <= 0x1fff)
-    {
+  {
     // rare greek
     if ((code >= 0x1F08 && code <= 0x1F0F) ||
         (code >= 0x1F18 && code <= 0x1F1D) ||
         (code >= 0x1F28 && code <= 0x1F2F) ||
         (code >= 0x1F38 && code <= 0x1F3F) ||
         (code >= 0x1F48 && code <= 0x1F4D))
-      {
+    {
       code -= 0x08;
-      }
+    }
     else if (code >= 0x1F50 && code <= 0x1F56 && (code & 0x1) == 0)
-      {
+    {
       const static unsigned short table3[7] = {
         0, 0, 0x0300, 0, 0x0301, 0, 0x0342 };
 
       code3 = table3[code - 0x1F50];
       code2 = 0x0313;
       code = 0x03C5;
-      }
+    }
     else if ((code >= 0x1F59 && code <= 0x1F5F && (code & 0x1) != 0) ||
              (code >= 0x1F68 && code <= 0x1F6F))
-      {
+    {
       code -= 0x08;
-      }
+    }
     else if (code >= 0x1F80 && code <= 0x1FAF)
-      {
+    {
       code2 = 0x03B9;
       if (code <= 0x1F87) { code -= 0x80; }
       else if (code <= 0x1F8F) { code -= 0x88; }
@@ -6237,9 +6282,9 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
       else if (code <= 0x1F9F) { code -= 0x78; }
       else if (code <= 0x1FA7) { code -= 0x40; }
       else { code -= 0x48; }
-      }
+    }
     else if (code >= 0x1FB2 && code <= 0x1FFC)
-      {
+    {
       const static unsigned short table[75] = {
         0x1F70, 0x03B1, 0x03AC, 0x1FB5, 0x03B1, 0x03B1, 0x1FB0, 0x1FB1,
         0x1F70, 0x1F71, 0x03B1, 0x1FBD, 0x03B9, 0x1FBF, 0x1FC0, 0x1FC1,
@@ -6256,82 +6301,82 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
           code == 0x1FBC || (code >= 0x1FC2 && code <= 0x1FC4) ||
           code == 0x1FCC || (code >= 0x1FF2 && code <= 0x1FF4) ||
           code == 0x1FFC)
-        {
+      {
         code2 = 0x03B9;
-        }
+      }
       else if (code == 0x1FB6 || code == 0x1FC6 || code == 0x1FD6 ||
                code == 0x1FE6 || code == 0x1FF6)
-        {
+      {
         code2 = 0x0342;
-        }
+      }
       else if (code == 0x1FB6 || code == 0x1FB7 || code == 0x1FC7 ||
                code == 0x1FF7)
-        {
+      {
         code2 = 0x0342;
         code3 = 0x03B9;
-        }
+      }
       else if (code >= 0x1FD2 && code <= 0x1FD3)
-        {
+      {
         code2 = 0x0308;
         code3 = code - (0x1FD2 - 0x0300);
-        }
+      }
       else if (code == 0x1FD7 || code == 0x1FE7)
-        {
+      {
         code2 = 0x0308;
         code3 = 0x0342;
-        }
+      }
       else if (code >= 0x1FE2 && code <= 0x1FE3)
-        {
+      {
         code2 = 0x0308;
         code3 = code - (0x1FE2 - 0x0300);
-        }
+      }
       else if (code == 0x1FE4)
-        {
+      {
         code2 = 0x0313;
-        }
+      }
 
       code = table[code - 0x1FB2];
-      }
     }
+  }
   else if (code <= 0x24ff)
-    { // symbols
+  { // symbols
     if (code == 0x2126)
-      { // Ohm symbol becomes omega
+    { // Ohm symbol becomes omega
       code = 0x03C9;
-      }
+    }
     else if (code == 0x212A)
-      { // Kelvin symbol becomes k
+    { // Kelvin symbol becomes k
       code = 'k';
-      }
+    }
     else if (code == 0x212B)
-      { // Angstrom symbol becomes a with circle
+    { // Angstrom symbol becomes a with circle
       code = 0xE5;
-      }
+    }
     else if (code == 0x2132)
-      {
+    {
       code = 0x214E;
-      }
+    }
     else if (code >= 0x2160 && code <= 0x216F)
-      {
+    {
       code += 0x10;
-      }
+    }
     else if (code == 0x2183)
-      {
+    {
       code += 0x01;
-      }
+    }
     else if (code >= 0x24B6 && code <= 0x24CF)
-      {
+    {
       code += 0x1a;
-      }
     }
+  }
   else if (code <= 0x2cff)
-    {
+  {
     if (code >= 0x2C00 && code <= 0x2C2E)
-      { // glagolitic
+    { // glagolitic
       code += 0x30;
-      }
+    }
     else if (code >= 0x2C60 && code <= 0x2C7F)
-      { // rare latin
+    { // rare latin
       const static unsigned short table[32] = {
         0x2C61, 0x2C61, 0x026B, 0x1D7D, 0x027D, 0x2C65, 0x2C66, 0x2C68,
         0x2C68, 0x2C6A, 0x2C6A, 0x2C6C, 0x2C6C, 0x0251, 0x0271, 0x0250,
@@ -6339,110 +6384,110 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
         0x2C78, 0x2C79, 0x2C7A, 0x2C7B, 0x2C7C, 0x2C7D, 0x023F, 0x0240 };
 
       code = table[code - 0x2C60];
-      }
+    }
     else if (code >= 0x2C80 && code <= 0x2CF3)
-      { // coptic
+    { // coptic
       if (code <= 0x2CE3)
-        {
+      {
         code |= 0x0001;
-        }
+      }
       else if (code == 0x2CEB || code == 0x2CED || code == 0x2CF2)
-        {
+      {
         code += 0x0001;
-        }
       }
     }
+  }
   else if (code <= 0x9fff)
-    {
+  {
     // cjk ideograms
-    }
+  }
   else if (code <= 0xabff)
-    {
+  {
     if ((code >= 0xA640 && code <= 0xA66D) ||
         (code >= 0xA680 && code <= 0xA69B))
-      { // rare cyrillic
+    { // rare cyrillic
       code |= 0x0001;
-      }
+    }
     else if (code >= 0xA722 && code <= 0xA76F && code != 0xA730)
-      { // rare latin
+    { // rare latin
       code |= 0x0001;
-      }
+    }
     else if (code >= 0xA779 && code <= 0xA77C)
-      {
+    {
       code += (code & 0x0001);
-      }
+    }
     else if (code == 0xA77D)
-      {
+    {
       code = 0x1D79;
-      }
+    }
     else if (code >= 0xA77E && code <= 0xA787)
-      {
+    {
       code |= 0x0001;
-      }
+    }
     else if (code == 0xA78B)
-      {
+    {
       code += 0x0001;
-      }
+    }
     else if (code == 0xA78D)
-      {
+    {
       code = 0x0265;
-      }
+    }
     else if (code >= 0xA790 && code <= 0xA7A9 && code != 0xA794)
-      {
+    {
       code |= 0x0001;
-      }
+    }
     else if (code >= 0xA7AA && code <= 0xA7B6)
-      {
+    {
       const static unsigned short table[13] = {
         0x0266, 0x025C, 0x0261, 0x026C, 0xA7AE, 0xA7AF, 0x029E, 0x0287,
         0x029D, 0xAB53, 0xA7B5, 0xA7B5, 0xA7B7 };
       code = table[code - 0xA7AA];
-      }
+    }
     else if (code >= 0xAB70 && code <= 0xABBF)
-      { // cherokee
+    { // cherokee
       code -= 0x97D0;
-      }
     }
+  }
   else if (code <= 0xfaff)
-    {
+  {
     // hangul, cjk, private use
-    }
+  }
   else if (code <= 0xfbff)
-    {
+  {
     if (code >= 0xFB00 && code <= 0xFB06)
-      { // latin ligatures
+    { // latin ligatures
       if (code <= 0xFB04)
-        {
+      {
         if (code == 0xFB01)
-          {
+        {
           code2 = 'i';
-          }
+        }
         else if (code == 0xFB02)
-          {
+        {
           code2 = 'l';
-          }
+        }
         else
-          {
+        {
           code2 = 'f';
           if (code == 0xFB03)
-            {
+          {
             code3 = 'i';
-            }
+          }
           else if (code == 0xFB04)
-            {
+          {
             code3 = 'l';
-            }
           }
-        code = 'f';
         }
+        code = 'f';
+      }
       else if (code <= 0xFB06)
-        {
+      {
         code = 's';
         code2 = 't';
-        }
       }
+    }
     else if (code >= 0xFB13 && code <= 0xFB17)
-      { // armenian ligatures
+    { // armenian ligatures
       const static unsigned short table[5] = {
         0x0574, 0x0574, 0x0574, 0x057E, 0x0574 };
       const static unsigned short table2[5] = {
@@ -6450,42 +6495,42 @@ void CaseFoldUnicode(unsigned int code, std::string *s)
 
       code2 = table2[code - 0xFB13];
       code = table[code - 0xFB13];
-      }
     }
+  }
   else if (code <= 0xffff)
-    {
+  {
     if (code >= 0xFF21 && code <= 0xFF3A)
-      { // wide latin uppercase -> wide latin lowercase
+    { // wide latin uppercase -> wide latin lowercase
       code += 0x20;
-      }
     }
+  }
   else
-    {
+  {
     if (code >= 0x10400 && code <= 0x10427 )
-      {
+    {
       code += 0x28;
-      }
+    }
     else if (code >= 0x10C80 && code <= 0x10CB2)
-      {
+    {
       code += 0x40;
-      }
+    }
     else if (code >= 0x118A0 && code <= 0x118BF)
-      {
+    {
       code += 0x20;
-      }
     }
+  }
 
   UnicodeToUTF8(code, s);
 
   if (code2)
-    {
+  {
     UnicodeToUTF8(code2, s);
 
     if (code3)
-      {
+    {
       UnicodeToUTF8(code3, s);
-      }
     }
+  }
 }
 
 } // end anonymous namespace
@@ -6497,13 +6542,13 @@ unsigned char vtkDICOMCharacterSet::KeyFromString(const char *name, size_t nl)
   const char *ep = name;
   int key = 0;
   if (cp)
-    {
+  {
     ep += nl;
-    }
+  }
 
   // Loop over backslash-separated values
   for (int n = 0; cp != ep && *cp != '\0'; n++)
-    {
+  {
     // strip leading spaces
     while (cp != ep && *cp == ' ') { cp++; }
     // search for end of value
@@ -6514,47 +6559,47 @@ unsigned char vtkDICOMCharacterSet::KeyFromString(const char *name, size_t nl)
     while (l > 0 && cp[l-1] == ' ') { l--; }
 
     if (n == 0 && l > 0)
-      {
+    {
       // find the initial character set
       for (int i = 0; i < ISO_2022_LOWBIT && key == 0; i++)
-        {
+      {
         for (int j = 0; j < 2 && key == 0; j++)
-          {
+        {
           if (l == strlen(Charsets[i][j]) &&
               strncmp(Charsets[i][j], cp, l) == 0)
-            {
+          {
             key = i;
             if (j != 0)
-              {
+            {
               key |= ISO_2022;
-              }
             }
           }
         }
       }
+    }
     else if (l > 0)
-      {
+    {
       // set the extensions as bits in the ISO_2022 bitfield
       for (int k = 0; k < 4; k++)
-        {
+      {
         if (l == strlen(Extensions[k][1]) &&
             strncmp(Extensions[k][1], cp, l) == 0)
-          {
+        {
           // if the whole ISO_2022 bitfield is set, clear it
           if ((key & ISO_2022) == ISO_2022)
-            {
+          {
             key ^= ISO_2022;
-            }
+          }
           // set each specifc extension as a bit in the bitfield
           key |= (ISO_2022_LOWBIT << k);
           break;
-          }
         }
       }
+    }
 
     cp = dp;
     if (cp != ep && *cp == '\\') { cp++; }
-    }
+  }
 
   return static_cast<unsigned char>(key);
 }
@@ -6567,23 +6612,23 @@ std::string vtkDICOMCharacterSet::GetCharacterSetString() const
   int base = (this->Key ^ ext);
 
   if (base != 0)
-    {
+  {
     bool extended = (ext != 0);
     value += Charsets[base][extended];
-    }
+  }
 
   // if ext is set to ISO_2022, there are no additional char sets
   if (ext != ISO_2022)
-    {
+  {
     for (int k = 0; k < 4; k++)
-      {
+    {
       if ((ext & (ISO_2022_LOWBIT << k)) != 0)
-        {
+      {
         value += "\\";
         value += Extensions[k][1];
-        }
       }
     }
+  }
 
   return value;
 }
@@ -6596,134 +6641,166 @@ std::string vtkDICOMCharacterSet::ConvertToUTF8(
 
   if (this->Key == ISO_IR_6 || // US-ASCII
       this->Key == ISO_IR_192) // UTF-8
-    {
+  {
     s.assign(text, l);
-    }
+  }
   else if (this->Key == ISO_IR_100) // ISO-8895-1
-    {
+  {
     // latin1, codepage is identity
     const char *cp = text;
     size_t m = l;
     // compute the size of the UTF-8 string
     for (size_t n = 0; n < l; n++)
-      {
+    {
       m += static_cast<unsigned char>(*cp++) >> 7;
-      }
+    }
     cp = text;
     s.resize(m);
     // encode as UTF-8
     size_t i = 0;
     while (i < m)
-      {
+    {
       while (i < m && (*cp & 0x80) == 0)
-        {
+      {
         s[i++] = *cp++;
-        }
+      }
       if (i < m)
-        {
+      {
         int code = static_cast<unsigned char>(*cp++);
         s[i++] = (0xC0 | (code >> 6));
         s[i++] = (0x80 | (code & 0x3F));
-        }
       }
     }
+  }
   else if (this->Key <= ISO_IR_166) // ISO-8895-X
-    {
+  {
     // Use the ISO-8859 codepages
     int page = this->Key - ISO_IR_101;
     s.reserve(l + l/2);
     const char *cp = text;
     const char *ep = text + l;
     while (cp != ep)
-      {
+    {
       int code = static_cast<unsigned char>(*cp++);
       if (code >= 0xA0)
-        {
+      {
         code = CodePagesISO8859[code - 0xA0][page];
-        }
-      UnicodeToUTF8(code, &s);
       }
+      UnicodeToUTF8(code, &s);
     }
-  else if (this->Key == ISO_IR_13 || // JIS_X_0201 katakana
-           this->Key == ISO_IR_14)   // JIS_X_0201 romaji
-    {
+  }
+  else if (this->Key == ISO_IR_13 || // JIS_X_0201 romaji & katakana
+           this->Key == ISO_IR_14)
+  {
     // JIS_X_0201 romaji (<0x7f) and half-width katakana (>0x7f)
     s.reserve(2*l);
     const char *cp = text;
     const char *ep = text + l;
     while (cp != ep)
-      {
+    {
       int code = static_cast<unsigned char>(*cp++);
-      if ((code > 0x7F && code <= 0x9F) || code == '\\')
-        {
+      if (code <= 0x7F && code != '\\' && code != '~')
+      {
+        s.push_back(code);
+      }
+      else
+      {
         if (code == '\\')
-          {
+        {
           code = 0xA5; // yen symbol
-          }
-        UnicodeToUTF8(code, &s);
         }
-      else if (code > 0x9F || code == '~')
+        else if (code == '~')
         {
-        if (code == '~')
-          {
           code = 0x203E; // macron (overline)
-          }
+        }
         else if (code >= 0xA1 && code <= 0xDF)
-          {
+        {
           code += 0xFEC0; // half-width katakana
-          }
-        else
+        }
+        else if (cp != ep)
+        {
+          // if the byte not a valid JIS X 0201 code, then it is probably
+          // the first byte of a two-byte Shift-JIS sequence (vendors are
+          // required to convert Shift-JIS to ISO 2022 for use in DICOM,
+          // so this code is for compatibility with non-conformant files).
+          int x = code;
+          int y = static_cast<unsigned char>(*cp++);
+          code = (y == 0 ? 0 : 0xFFFD); // illegal character or null
+
+          if (y >= 0x40 && y <= 0xFC && y != 0x7F)
           {
-          code = 0xFFFD; // illegal character
+            int a, b;
+            if (y < 0x9F)
+            {
+              a = 0;
+              b = y - (y < 0x7F ? 0x40 : 0x41);
+            }
+            else
+            {
+              a = 1;
+              b = y - 0x9F;
+            }
+
+            if (x >= 0x81 && x <= 0x9F)
+            {
+              a += (x - 0x81)*2;
+              code = CodePageJISX0208[a*94+b];
+            }
+            else if (x >= 0xE0 && x <= 0xEF)
+            {
+              a += (x - 0xC1)*2;
+              code = CodePageJISX0208[a*94+b];
+            }
           }
-        UnicodeToUTF8(code, &s);
         }
-      else
+        else
         {
-        s.push_back(code);
+          code = 0xFFFD; // illegal character
         }
+        UnicodeToUTF8(code, &s);
       }
     }
+  }
   else if (this->Key == GB18030 || this->Key == GBK)
-    {
+  {
     // Chinese national encoding standard
     const char *cp = text;
     const char *ep = text + l;
     while (cp != ep)
-      {
+    {
       unsigned int code = static_cast<unsigned char>(*cp++);
       if (code > 0x7f)
-        {
+      {
         if (cp == ep)
-          {
+        {
           // end of input, terminate early
           break;
-          }
+        }
         unsigned short a = static_cast<unsigned char>(code);
         unsigned short b = static_cast<unsigned char>(*cp++);
         code = 0xFFFD; // untranslated multi-byte character
         if (a > 0x80 && a < 0xFF &&
             b >= 0x40 && b < 0xFF && b != 0x7F)
-          {
+        {
           // two-byte character
           if (b > 0x7F) { b--; }
           a = (a - 0x81)*190 + (b - 0x40);
           code = CodePageGB18030[a];
-          }
+        }
         if (this->Key == GB18030)
-          {
+        {
           if (a > 0x80 && a < 0x90 && b >= '0' && b <= '9')
-            {
+          {
             // start of a four-byte code
             if (cp == ep || cp+1 == ep)
-              {
+            {
               // unexpected end of input, terminate early
               break;
-              }
+            }
             if (static_cast<unsigned char>(cp[0]) > 0x80 &&
                 static_cast<unsigned char>(cp[0]) < 0xFF &&
                 cp[1] >= '0' && cp[1] <= '9')
-              {
+            {
               // four-byte GB18030 character
               unsigned short c = static_cast<unsigned char>(*cp++);
               unsigned short d = static_cast<unsigned char>(*cp++);
@@ -6731,32 +6808,38 @@ std::string vtkDICOMCharacterSet::ConvertToUTF8(
               b = (c - 0x81)*10 + (d - '0');
               unsigned int g = a*1260 + b;
               if (g <= 0x99FB)
-                {
+              {
                 // search linearly compressed table
                 size_t n = sizeof(LinearGB18030)/sizeof(short);
                 for (size_t i = 0;; i += 2)
-                  {
+                {
                   if (i >= n || LinearGB18030[i] > g)
-                    {
+                  {
                     code = LinearGB18030[i-1] + (g - LinearGB18030[i-2]);
                     break;
-                    }
                   }
                 }
+                // this mapping was modified in GB18030-2005, after the linear
+                // table had already been defined, so it must be special-cased
+                if (code == 0x1E3F)
+                {
+                  code = 0xE7C7;
+                }
               }
             }
+          }
           else if (a >= 0x90 && a < 0xFF && b >= '0' && b <= '9')
-            {
+          {
             // start of a four-byte code
             if (cp == ep || cp+1 == ep)
-              {
+            {
               // unexpected end of input, terminate early
               break;
-              }
+            }
             if (static_cast<unsigned char>(cp[0]) > 0x80 &&
                 static_cast<unsigned char>(cp[0]) < 0xFF &&
                 cp[1] >= '0' && cp[1] <= '9')
-              {
+            {
               // four-byte GB18030 to codes beyond 0xFFFF
               unsigned short c = static_cast<unsigned char>(*cp++);
               unsigned short d = static_cast<unsigned char>(*cp++);
@@ -6764,33 +6847,33 @@ std::string vtkDICOMCharacterSet::ConvertToUTF8(
               b = (c - 0x81)*10 + (d - '0');
               unsigned int g = a*1260 + b;
               if (g <= 0xFFFFF)
-                {
+              {
                 code = g + 0x10000;
-                }
               }
             }
-          // convert some private codes to new unicode standard codes
-          // (do this only for GB18030, for GBK stay within the BMP for
-          // maximum font compatibility between GBK and Unicode)
-          if (code >= 0xE000 && code <= 0xF8FF)
-            {
-            size_t n = sizeof(PrivateToStandard)/sizeof(int);
+          }
+          // convert some private codes to Unicode 4.1 standard codes in order
+          // to ensure they these characters can be displayed (though this is
+          // done at the cost of the one-to-one Unicode-to-GB18030 mapping)
+          size_t n = sizeof(PrivateToStandard)/sizeof(int);
+          if (code >= PrivateToStandard[0] && code <= PrivateToStandard[n-2])
+          {
             for (size_t i = 0; i < n; i += 2)
-              {
+            {
               if (code == PrivateToStandard[i])
-                {
+              {
                 code = PrivateToStandard[i+1];
                 break;
-                }
               }
             }
           }
         }
-      UnicodeToUTF8(code, &s);
       }
+      UnicodeToUTF8(code, &s);
     }
+  }
   else if ((this->Key & ISO_2022) != 0)
-    {
+  {
     // Uses ISO-2022 escape codes to switch character sets.
     // To get the character set that is active at the beginning of
     // the string, remove all the bits in the ISO_2022 bitfield.
@@ -6800,163 +6883,190 @@ std::string vtkDICOMCharacterSet::ConvertToUTF8(
     // and when an escape code is found, change the charset
     size_t i = 0;
     while (i < l)
-      {
+    {
       // search for the next escape
       size_t j = i;
       for (; j < l; j++)
-        {
+      {
         if (text[j] == '\033') { break; }
-        }
+      }
       if (charset < ISO_2022_LOWBIT)
-        {
+      {
         // indicates one of the single-byte character sets, convert
         // characters up to the next escape code
         vtkDICOMCharacterSet cs(charset);
         s += cs.ConvertToUTF8(&text[i], j-i);
-        }
+      }
       else if (charset == ISO_2022_IR_58)
-        {
+      {
         // GB2312 chinese encoding
         while (i < j)
-          {
+        {
           unsigned short code = static_cast<unsigned char>(text[i++]);
           if (code >= 0xA1 && code < 0xFF)
-            {
+          {
             if (i == j)
-              {
+            {
               break;
-              }
+            }
             unsigned short a = code - 0x81;
             code = static_cast<unsigned char>(text[i++]);
             if (code >= 0xA1 && code < 0xFF)
-              {
+            {
               unsigned short b = code - 0x41;
               code = CodePageGB18030[a*190 + b];
-              }
             }
-          UnicodeToUTF8(code, &s);
           }
+          UnicodeToUTF8(code, &s);
         }
+      }
       else if (charset == ISO_2022_IR_87 ||
                charset == ISO_2022_IR_159)
-        {
+      {
         // iso-2022-jp and iso-2022-jp-2
         while (i < j)
-          {
+        {
           // convert two bytes into unicode
           unsigned short code = static_cast<unsigned char>(text[i++]);
           if (code >= 0x21 && code < 0x7F)
-            {
+          {
             if (i == j)
-              {
+            {
               break;
-              }
+            }
             unsigned short a = code - 0x21;
             code = static_cast<unsigned char>(text[i++]);
             if (code >= 0x21 && code < 0x7F)
-              {
+            {
               unsigned short b = code - 0x21;
               if (charset == ISO_2022_IR_87)
-                {
+              {
                 code = CodePageJISX0208[a*94+b];
-                }
+              }
               else
-                {
+              {
                 code = CodePageJISX0212[a*94+b];
-                }
               }
             }
+          }
           else if (code >= 0xA1 && code <= 0xDF)
-            {
+          {
             // most likely half-width katakana, which can be used in
             // DICOM even though they are not permitted in iso-2022-jp
             code += 0xFEC0;
-            }
+          }
           else if (code > 0x7F)
-            {
-            // most likely Shift JIS codes, which are not permitted
-            // in DICOM or in iso-2022-jp
+          {
+            // possibly EUC-JP or Shift-JIS, neither of which should
+            // be used with ISO 2022 escape codes
             code = 0xFFFD;
-            }
-          UnicodeToUTF8(code, &s);
           }
+          UnicodeToUTF8(code, &s);
         }
+      }
       else if (charset == ISO_2022_IR_149)
-        {
+      {
         // iso-2022-kr
         while (i < j)
-          {
+        {
           unsigned short code = static_cast<unsigned char>(text[i++]);
           if (code >= 0xA1 && code < 0xFF)
-            {
+          {
             if (i == j)
-              {
+            {
               break;
-              }
+            }
             // convert two bytes into unicode
             unsigned short a = code - 0xA1;
-            unsigned short b = static_cast<unsigned char>(text[i++]) - 0xA1;
-            code = CodePageKSX1001[a*94+b];
+            code = static_cast<unsigned char>(text[i++]);
+            if (code >= 0xA1 && code < 0xFF)
+            {
+              unsigned short b = code - 0xA1;
+              code = CodePageKSX1001[a*94+b];
             }
-          UnicodeToUTF8(code, &s);
           }
+          UnicodeToUTF8(code, &s);
         }
+      }
       else
-        {
+      {
         // other multibyte conversions
         while (i < j)
+        {
+          unsigned short code = 0xFFFD;
+          if (text[i++] == '\0')
           {
-          i++;
-          if (i == j)
+            code = 0;
+          }
+          else if (i < j)
+          {
+            if (text[i++] == '\0')
             {
-            break;
+              code = 0;
             }
-          i++;
-          // unrecognized multi-byte character
-          UnicodeToUTF8(0xFFFD, &s);
           }
+          // unrecognized multi-byte character
+          UnicodeToUTF8(code, &s);
         }
+      }
 
       // Make sure we are at the escape code (or the end of string)
       i = j;
 
       // Get the escape code for the next segment
       if (text[i] == '\033')
-        {
+      {
         i++;
         if (i + 2 > l) { break; }
+        unsigned char oldcharset = charset;
         charset = 0xFF; // indicate none found yet
         // look through single-byte charset escape codes
         for (unsigned char k = 0; k < ISO_2022_LOWBIT; k++)
-          {
+        {
           const char *escape = Charsets[k][2];
           size_t le = strlen(escape);
           if (le > 0 && strncmp(&text[i], escape, le) == 0)
+          {
+            if (k == ISO_IR_13 && (oldcharset == ISO_2022_IR_87 ||
+                                   oldcharset == ISO_2022_IR_159))
+            {
+              // The ISO_IR_13 charset goes in G1, so let's keep the
+              // currently active kanji charset in G0.
+              charset = oldcharset;
+            }
+            else if (k == ISO_IR_14)
             {
-            charset = k;
+              // The escape code for Japanese romaji (ISO_IR 14) switches
+              // to JIS X 0201, which DICOM defines as "ISO 2022 IR 13".
+              charset = ISO_IR_13;
+            }
+            else
+            {
+              charset = k;
+            }
             i += le;
             break;
-            }
           }
+        }
         // the escape code doesn't match a single-byte charset
         if (charset == 0xFF)
-          {
+        {
           // look through multibyte charset escape codes
           for (int k = 0; k < 4; k++)
-            {
+          {
             const char *escape = Extensions[k][2];
             size_t le = strlen(escape);
             if (le > 0 && strncmp(&text[i], escape, le) == 0)
-              {
+            {
               charset = (ISO_2022_LOWBIT << k);
               i += le;
               break;
-              }
             }
           }
         }
       }
     }
+  }
 
   return s;
 }
@@ -6973,17 +7083,17 @@ std::string vtkDICOMCharacterSet::CaseFoldedUTF8(
 
   if (this->Key != ISO_IR_6 && // US-ASCII
       this->Key != ISO_IR_192) // UTF-8
-    {
+  {
     t = this->ConvertToUTF8(text, l);
     cp = t.data();
     ep = cp + t.length();
-    }
+  }
 
   while (cp != ep)
-    {
+  {
     unsigned int code = UTF8ToUnicode(&cp, ep);
     CaseFoldUnicode(code, &s);
-    }
+  }
 
   return s;
 }
@@ -6995,86 +7105,113 @@ size_t vtkDICOMCharacterSet::NextBackslash(
   const char *cp = text;
 
   if (this->Key == GB18030 || this->Key == GBK)
-    {
+  {
     // ensure backslash isn't second part of a multi-byte character
     while (cp != ep && *cp != '\0')
-      {
+    {
       if (static_cast<unsigned char>(*cp) >= 0x81)
-        {
+      {
         cp++;
         if (cp != ep && static_cast<unsigned char>(*cp) >= 0x21)
-          {
+        {
           cp++;
-          }
         }
+      }
       else if (*cp != '\\')
-        {
+      {
         cp++;
-        }
+      }
       else
-        {
+      {
         break;
+      }
+    }
+  }
+  else if (this->Key == ISO_IR_13)
+  {
+    // ensure backslash isn't second part of a Shift-JIS character
+    // that has been erroneously stored as ISO_IR 13
+    while (cp != ep && *cp != '\0')
+    {
+      unsigned char x = static_cast<unsigned char>(*cp);
+      if ((x >= 0x81 && x <= 0x9F) || (x >= 0xE0 && x <= 0xEF))
+      {
+        cp++;
+        if (cp != ep && static_cast<unsigned char>(*cp) >= 0x40 &&
+            static_cast<unsigned char>(*cp) <= 0xFC &&
+            static_cast<unsigned char>(*cp) != 0x7F)
+        {
+          cp++;
         }
       }
+      else if (*cp != '\\')
+      {
+        cp++;
+      }
+      else
+      {
+        break;
+      }
     }
+  }
   else if ((this->Key & ISO_2022) != 0)
-    {
+  {
     // ensure backslash isn't part of a G0 multi-byte code
     bool multibyte = false;
     while (cp != ep && *cp != '\0')
-      {
+    {
       // look for iso 2022 escape code
       if (*cp == '\033')
-        {
+      {
         cp++;
         size_t l = 0;
         while (cp + l != ep &&
                static_cast<unsigned char>(cp[l]) >= 0x20 &&
                static_cast<unsigned char>(cp[l]) <= 0x2f)
-          {
+        {
           l++;
-          }
+        }
         if (cp + l != ep &&
             static_cast<unsigned char>(cp[l]) >= 0x40 &&
             static_cast<unsigned char>(cp[l]) <= 0x7f)
-          {
+        {
           l++;
           if ((l == 2 && cp[0] == '$') ||
               (l == 3 && cp[0] == '$' && cp[1] == '('))
-            {
+          {
             // G0 is designated to multibyte
             multibyte = true;
-            }
+          }
           else if (l == 2 && cp[0] == '(')
-            {
+          {
             // G0 is designated to single byte
             multibyte = false;
-            }
           }
-        cp += l;
         }
+        cp += l;
+      }
       else if (multibyte || *cp != '\\')
-        {
+      {
         cp++;
-        }
+      }
       else
-        {
+      {
         break;
-        }
       }
     }
+  }
   else
-    {
+  {
     // no special encoding, so backslash is backslash
     while (cp != ep && *cp != '\0')
-      {
+    {
       if (*cp == '\\')
-        {
+      {
         break;
-        }
-      cp++;
       }
+      cp++;
     }
+  }
 
   return (cp - text);
 }
@@ -7088,14 +7225,14 @@ unsigned int vtkDICOMCharacterSet::CountBackslashes(
   const char *ep = text + l;
 
   while (cp != ep && *cp != '\0')
-    {
+  {
     cp += this->NextBackslash(cp, ep);
     if (cp != ep && *cp == '\\')
-      {
+    {
       cp++;
       count++;
-      }
     }
+  }
 
   return count;
 }
@@ -7105,12 +7242,12 @@ ostream& operator<<(ostream& o, const vtkDICOMCharacterSet& a)
 {
   std::string s = a.GetCharacterSetString();
   if (s.length() == 0)
-    {
+  {
     s = "ISO_IR 6";
-    }
+  }
   else if (s[0] == '\\')
-    {
+  {
     s.insert(0, "ISO 2022 IR 6");
-    }
+  }
   return o << s.c_str();
 }
diff --git a/Source/vtkDICOMCharacterSet.h b/Source/vtkDICOMCharacterSet.h
index 2fb1a61..36861a2 100644
--- a/Source/vtkDICOMCharacterSet.h
+++ b/Source/vtkDICOMCharacterSet.h
@@ -60,6 +60,7 @@ public:
     Unknown    = 255  // signifies unknown character set
   };
 
+  //@{
   //! Construct an object that describes the default (ASCII) character set.
   vtkDICOMCharacterSet() : Key(0) {}
 
@@ -80,23 +81,29 @@ public:
     this->Key = KeyFromString(name.data(), name.length()); }
   vtkDICOMCharacterSet(const char *name, size_t nl) {
     this->Key = KeyFromString(name, nl); }
+  //@}
 
-  //! Generate a SpecificCharacterSet value.
+  //@{
+  //! Generate SpecificCharacterSet code values (diagnostic only).
   /*!
-   *  The result is given as a set of backslash-separated values if more
-   *  than one encoding is present.  The first value may be empty to indicate
-   *  that it is ASCII.  Since this class uses an unsigned char for storage,
-   *  the only secondary and tertiary values that can be represented are the
-   *  three multi-byte ISO 2022 character sets.  Therefore, if the condition
-   *  "if ((GetKey() & ISO_2022_OTHER) != 0)" is true, then the string
-   *  returned by this method will be incomplete and only the first character
-   *  set will be listed.
+   *  Attempt to generate SpecificCharacterSet code values.  If ISO 2022
+   *  encoding is not used, then a single code value is returned.  If
+   *  ISO 2022 encoding is used with the single-byte character sets, then
+   *  only the code value for first character set will be returned (due to
+   *  limitations in the way this class stores the information).  A simple
+   *  way to check whether such incomplete information will be returned is
+   *  to check if "((GetKey() & ISO_2022) == ISO_2022)" is true.  However,
+   *  if ISO 2022 encoding is used with one or more multi-byte character
+   *  sets, the result is a set of backslash-separated code values, where
+   *  the first value will be empty if the initial coding is ASCII.
    */
   std::string GetCharacterSetString() const;
 
   //! Get the numerical code for this character set object.
   unsigned char GetKey() const { return this->Key; }
+  //@}
 
+  //@{
   //! Convert text from this encoding to UTF-8.
   /*!
    *  This will convert text to UTF-8, which is generally a lossless
@@ -127,7 +134,9 @@ public:
    */
   bool IsBiDirectional() const {
     return (this->Key == ISO_IR_127 || this->Key == ISO_IR_138); }
+  //@}
 
+  //@{
   //! Count the number of backslashes in an encoded string.
   /*!
    *  The backslash byte is sometimes present as half of a multibyte
@@ -142,13 +151,16 @@ public:
    *  either at the beginning of the string or just after a backslash.
    */
   size_t NextBackslash(const char *text, const char *end) const;
+  //@}
 
+  //@{
   bool operator==(vtkDICOMCharacterSet b) const { return (this->Key == b.Key); }
   bool operator!=(vtkDICOMCharacterSet b) const { return (this->Key != b.Key); }
   bool operator<=(vtkDICOMCharacterSet a) const { return (this->Key <= a.Key); }
   bool operator>=(vtkDICOMCharacterSet a) const { return (this->Key >= a.Key); }
   bool operator<(vtkDICOMCharacterSet a) const { return (this->Key < a.Key); }
   bool operator>(vtkDICOMCharacterSet a) const { return (this->Key > a.Key); }
+  //@}
 
 private:
   static unsigned char KeyFromString(const char *name, size_t nl);
diff --git a/Source/vtkDICOMCompiler.cxx b/Source/vtkDICOMCompiler.cxx
index f33ec2a..4d7999f 100644
--- a/Source/vtkDICOMCompiler.cxx
+++ b/Source/vtkDICOMCompiler.cxx
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -244,11 +244,11 @@ inline bool EncoderBase::CheckBuffer(
 {
   bool r = true;
   if (n > static_cast<size_t>(ep - cp))
-    {
+  {
     r = vtkDICOMCompilerInternalFriendship::FlushBuffer(
           this->Compiler, cp, ep);
     r &= (n <= static_cast<size_t>(ep - cp));
-    }
+  }
   return r;
 }
 
@@ -260,36 +260,36 @@ unsigned int EncoderBase::DataSize(
   unsigned int l = 0;
 
   while (iter != iterEnd)
-    {
+  {
     const vtkDICOMValue &v = iter->GetValue(this->Index);
     vtkDICOMVR vr = v.GetVR();
     unsigned int vl = v.GetVL();
 
     if (vr == vtkDICOMVR::SQ)
-      {
+    {
       size_t n = v.GetNumberOfValues();
       const vtkDICOMItem *ptr = v.GetSequenceData();
       for (size_t i = 0; i < n && vl != HxFFFFFFFF; i++)
-        {
+      {
         unsigned int ll = this->DataSize(ptr[i].Begin(), ptr[i].End());
         // check for overflow or ll == 0xffffffff
         if (HxFFFFFFFF - vl <= ll || HxFFFFFFFF - vl - ll <= 8)
-          {
+        {
           vl = HxFFFFFFFF;
-          }
+        }
         else
-          {
+        {
           vl += ll + 8;
-          }
         }
       }
+    }
 
     // terminate if length is unknown
     if (vl == HxFFFFFFFF)
-      {
+    {
       l = vl;
       break;
-      }
+    }
 
     // force vl to even
     assert((vl & 1) == 0);
@@ -298,14 +298,14 @@ unsigned int EncoderBase::DataSize(
     unsigned int hl = (this->ImplicitVR || !vr.HasLongVL() ? 8 : 12);
     // check for overflow
     if (HxFFFFFFFF - l <= vl || HxFFFFFFFF - l - vl <= hl)
-      {
+    {
       l = HxFFFFFFFF;
       break;
-      }
+    }
     l += vl + hl;
 
     ++iter;
-    }
+  }
 
   return l;
 }
@@ -422,12 +422,12 @@ void Encoder<E>::PutValues(
   union { float f; unsigned int i; } u;
 
   do
-    {
+  {
     u.f = *ip;
     Encoder<E>::PutInt32(op, u.i);
     ip++;
     op += 4;
-    }
+  }
   while (--n);
 }
 
@@ -438,12 +438,12 @@ void Encoder<E>::PutValues(
   union { double d; unsigned long long l; } u;
 
   do
-    {
+  {
     u.d = *ip;
     Encoder<E>::PutInt64(op, u.l);
     ip++;
     op += 8;
-    }
+  }
   while (--n);
 }
 
@@ -452,12 +452,12 @@ void Encoder<E>::PutValues(
   unsigned char *op, const vtkDICOMTag *ip, size_t n)
 {
   do
-    {
+  {
     Encoder<E>::PutInt16(op, ip->GetGroup());
     Encoder<E>::PutInt16(op+2, ip->GetElement());
     ip++;
     op += 4;
-    }
+  }
   while (--n);
 }
 
@@ -469,14 +469,14 @@ bool Encoder<E>::WriteData(
   unsigned char* &cp, unsigned char* &ep, const T *ptr, size_t n)
 {
   while (n != 0 && this->CheckBuffer(cp, ep, sizeof(T)))
-    {
+  {
     size_t m = (ep - cp)/sizeof(T);
     if (m > n) { m = n; }
     Encoder<E>::PutValues(cp, ptr, m);
     cp += m*sizeof(T);
     ptr += m;
     n -= m;
-    }
+  }
 
   return (n == 0);
 }
@@ -494,16 +494,26 @@ size_t Encoder<E>::WriteElementHead(
   cp[5] = vrt[1];
   Encoder<E>::PutInt16(cp+6, static_cast<unsigned short>(vl));
   if (this->ImplicitVR)
-    {
+  {
     Encoder<E>::PutInt32(cp+4, vl);
-    }
+  }
   else if (vr.HasLongVL())
-    {
+  {
     hl = 12;
     cp[6] = 0;
     cp[7] = 0;
     Encoder<E>::PutInt32(cp+8, vl);
-    }
+  }
+  else if (vl > 65534)
+  {
+    // CP-1066 allows overlength values to be written as UN
+    hl = 12;
+    cp[4] = 'U';
+    cp[5] = 'N';
+    cp[6] = 0;
+    cp[7] = 0;
+    Encoder<E>::PutInt32(cp+8, vl);
+  }
   return hl;
 }
 
@@ -520,15 +530,15 @@ bool Encoder<E>::WriteDataElement(
 
   // do not write invalid values
   if (!v.IsValid())
-    {
+  {
     return true;
-    }
+  }
 
   // handle elements of unknown length
   if (vl == HxFFFFFFFF)
-    {
+  {
     if (vr == vtkDICOMVR::UN || vr == vtkDICOMVR::OB)
-      {
+    {
       // if VR is UN then it is a sequence encoded as implicit LE
       // (see DICOM Part 5, Section 6.2.2, Unknown (UN) Value Representation)
       // if VR is OB then it is a sequence of fragments
@@ -543,137 +553,137 @@ bool Encoder<E>::WriteDataElement(
       assert(ptr[n-4] + (ptr[n-3] << 8) +
              (ptr[n-2] << 16) + (ptr[n-1] << 24) == 0);
 #endif
-      }
+    }
     else if (vr != vtkDICOMVR::SQ)
-      {
+    {
       // only UN, OB, and SQ can have unknown length
       vtkDICOMCompilerInternalFriendship::CompileError(
         this->Compiler, "Illegal item length 0xFFFFFFFF encountered.");
       return false;
-      }
     }
+  }
   else if (vr == vtkDICOMVR::SQ)
-    {
+  {
     // compute the true vl for the sequence
     size_t n = v.GetNumberOfValues();
     const vtkDICOMItem *ptr = v.GetSequenceData();
     for (size_t i = 0; i < n && vl != HxFFFFFFFF; i++)
-      {
+    {
       unsigned int ll = this->DataSize(ptr[i].Begin(), ptr[i].End());
       // check for overflow or ll == 0xffffffff
       if (HxFFFFFFFF - vl <= ll || HxFFFFFFFF - vl - ll <= 8)
-        {
+      {
         vl = HxFFFFFFFF;
-        }
+      }
       else
-        {
+      {
         vl += ll + 8;
-        }
       }
     }
+  }
   else
-    {
+  {
     // vl must be even
     assert((vl & 1) == 0);
     vl += (vl & 1);
-    }
+  }
 
   // write the data element head (tag, vr, vl)
   if (!this->CheckBuffer(cp, ep, 12))
-    {
+  {
     return false;
-    }
+  }
   cp += this->Encoder<E>::WriteElementHead(cp, tag, vr, vl);
 
   // write the value
   bool r = true;
   switch (vr.GetType())
-    {
+  {
     case VTK_CHAR:
-      {
+    {
       const char *ptr = v.GetCharData();
       r = this->WriteData(cp, ep, ptr, vl);
-      }
       break;
+    }
     case VTK_UNSIGNED_CHAR:
-      {
+    {
       size_t n = vl;
       if (vl == HxFFFFFFFF)
-        {
+      {
         n = v.GetNumberOfValues();
         n += (n & 1);
-        }
+      }
       const unsigned char *ptr = v.GetUnsignedCharData();
       r = this->WriteData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_SHORT:
-      {
+    {
       size_t n = vl/sizeof(short);
       const short *ptr = v.GetShortData();
       r = this->WriteData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_UNSIGNED_SHORT:
-      {
+    {
       size_t n = vl/sizeof(unsigned short);
       const unsigned short *ptr = v.GetUnsignedShortData();
       r = this->WriteData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_INT:
-      {
+    {
       size_t n = vl/sizeof(int);
       const int *ptr = v.GetIntData();
       r = this->WriteData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_UNSIGNED_INT:
-      {
+    {
       size_t n = vl/sizeof(unsigned int);
       const unsigned int *ptr = v.GetUnsignedIntData();
       r = this->WriteData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_FLOAT:
-      {
+    {
       size_t n = vl/sizeof(float);
       const float *ptr = v.GetFloatData();
       r = this->WriteData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_DOUBLE:
-      {
+    {
       size_t n = vl/sizeof(double);
       const double *ptr = v.GetDoubleData();
       r = this->WriteData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_DICOM_TAG:
-      {
+    {
       size_t n = vl/sizeof(vtkDICOMTag);
       const vtkDICOMTag *ptr = v.GetTagData();
       r = this->WriteData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_DICOM_ITEM:
-      {
+    {
       size_t n = v.GetNumberOfValues();
       const vtkDICOMItem *ptr = v.GetSequenceData();
 
       for (size_t i = 0; i < n && r; i++)
-        {
+      {
         unsigned int il = 0xFFFFFFFF;
         if (!ptr[i].IsDelimited())
-          {
+        {
           // compute the bytes in the item
           il = this->DataSize(ptr[i].Begin(), ptr[i].End());
-          }
+        }
 
         if ((r = this->CheckBuffer(cp, ep, 8)) == false)
-          {
+        {
           break;
-          }
+        }
         // item start
         Encoder<E>::PutInt16(cp, HxFFFE);
         Encoder<E>::PutInt16(cp+2, HxE000);
@@ -685,33 +695,33 @@ bool Encoder<E>::WriteDataElement(
         this->Depth--;
 
         if (il == HxFFFFFFFF && r)
-          {
+        {
           if ((r = this->CheckBuffer(cp, ep, 8)) == false)
-            {
+          {
             break;
-            }
+          }
           // item delimiter
           Encoder<E>::PutInt16(cp, HxFFFE);
           Encoder<E>::PutInt16(cp+2, HxE00D);
           Encoder<E>::PutInt32(cp+4, 0);
           cp += 8;
-          }
         }
+      }
 
       if (vl == HxFFFFFFFF && r)
-        {
+      {
         if ((r = this->CheckBuffer(cp, ep, 8)) != false)
-          {
+        {
           // sequence delimiter
           Encoder<E>::PutInt16(cp, HxFFFE);
           Encoder<E>::PutInt16(cp+2, HxE0DD);
           Encoder<E>::PutInt32(cp+4, 0);
           cp += 8;
-          }
         }
       }
       break;
     }
+  }
 
   return r;
 }
@@ -724,37 +734,37 @@ bool Encoder<E>::WriteElements(
   vtkDICOMDataElementIterator iterEnd)
 {
   while (iter != iterEnd)
-    {
+  {
     // check for group length tag and length-to-end tag
     if (iter->GetTag().GetElement() == Hx0000 ||
         iter->GetTag() == vtkDICOMTag(0x0008, 0x0001))
-      {
+    {
       unsigned short group = iter->GetTag().GetGroup();
       unsigned int groupLength = HxFFFFFFFF;
       vtkDICOMDataElementIterator groupEnd = iter;
       if (iter->GetTag().GetElement() == Hx0000)
-        {
+      {
         groupEnd = ++iter;
         while (groupEnd != iterEnd && groupEnd->GetTag().GetGroup() == group)
-          {
+        {
           ++groupEnd;
-          }
-        groupLength = this->DataSize(iter, groupEnd);
         }
+        groupLength = this->DataSize(iter, groupEnd);
+      }
       // check for retired LengthToEnd tag
       unsigned int lengthToEnd = HxFFFFFFFF;
       bool hadLengthToEnd = false;
       if (group == 0x0008 && iter != iterEnd &&
           iter->GetTag() == vtkDICOMTag(0x0008, 0x0001))
-        {
+      {
         hadLengthToEnd = true;
         lengthToEnd = this->DataSize(++iter, iterEnd);
-        }
+      }
       // check for uncounted PixelData element size in 0x7FE0 group
       if (this->Depth == 0 &&
           ((groupLength != HxFFFFFFFF && group == 0x7FE0 &&
             iterEnd == groupEnd) || lengthToEnd != HxFFFFFFFF))
-        {
+      {
         // add the size of the missing PixelData element
         unsigned int pl =
           vtkDICOMCompilerInternalFriendship::ComputePixelDataSize(
@@ -763,80 +773,80 @@ bool Encoder<E>::WriteElements(
         // check for overflow of lengthToEnd
         if (HxFFFFFFFF - lengthToEnd <= pl ||
             HxFFFFFFFF - lengthToEnd - pl <= hl)
-          {
+        {
           lengthToEnd = HxFFFFFFFF;
-          }
+        }
         else
-          {
+        {
           lengthToEnd += pl + hl;
-          }
+        }
         // check for overflow of groupLength
         if (group == 0x7FE0)
-          {
+        {
           if (HxFFFFFFFF - groupLength <= pl ||
               HxFFFFFFFF - groupLength - pl <= hl)
-            {
+          {
             groupLength = HxFFFFFFFF;
-            }
+          }
           else
-            {
+          {
             groupLength += pl + hl;
-            }
           }
         }
+      }
       if (groupLength != HxFFFFFFFF)
-        {
+      {
         // subtract the size of LengthToEnd element if it is invalid
         if (lengthToEnd == HxFFFFFFFF && hadLengthToEnd)
-          {
+        {
           groupLength -= 12;
-          }
+        }
         // write out group length with correct value
         this->WriteDataElement(cp, ep,
           vtkDICOMDataElement(vtkDICOMTag(group, 0x0000),
             vtkDICOMValue(vtkDICOMVR::UL, groupLength)));
-        }
+      }
       if (lengthToEnd != HxFFFFFFFF)
-        {
+      {
         // write out LengthToEnd with correct value
         this->WriteDataElement(cp, ep,
           vtkDICOMDataElement(vtkDICOMTag(0x0008, 0x0001),
             vtkDICOMValue(vtkDICOMVR::UL, lengthToEnd)));
-        }
       }
+    }
     else if (this->Depth == 0 && this->SOPInstanceUID &&
              iter->GetTag() == vtkDICOMTag(DC::SOPInstanceUID))
-      {
+    {
       this->WriteDataElement(cp, ep,
         vtkDICOMDataElement(
           vtkDICOMTag(DC::SOPInstanceUID),
           vtkDICOMValue(vtkDICOMVR::UI, this->SOPInstanceUID)));
       ++iter;
-      }
+    }
     else if (this->Depth == 0 && this->SeriesInstanceUID &&
              iter->GetTag() == vtkDICOMTag(DC::SeriesInstanceUID))
-      {
+    {
       this->WriteDataElement(cp, ep,
         vtkDICOMDataElement(
           vtkDICOMTag(DC::SeriesInstanceUID),
           vtkDICOMValue(vtkDICOMVR::UI, this->SeriesInstanceUID)));
       ++iter;
-      }
+    }
     else if (this->Depth == 0 && this->StudyInstanceUID &&
              iter->GetTag() == vtkDICOMTag(DC::StudyInstanceUID))
-      {
+    {
       this->WriteDataElement(cp, ep,
         vtkDICOMDataElement(
           vtkDICOMTag(DC::StudyInstanceUID),
           vtkDICOMValue(vtkDICOMVR::UI, this->StudyInstanceUID)));
       ++iter;
-      }
+    }
     else
-      {
+    {
       this->WriteDataElement(cp, ep, *iter);
       ++iter;
-      }
     }
+  }
 
   return true;
 }
@@ -905,59 +915,52 @@ vtkDICOMCompiler::~vtkDICOMCompiler()
   delete [] this->TransferSyntaxUID;
 
   if (this->MetaData)
-    {
+  {
     this->MetaData->Delete();
-    }
+  }
   if (this->SeriesUIDs)
-    {
+  {
     this->SeriesUIDs->Delete();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMCompiler::SetBufferSize(int size)
 {
   if (size < 256)
-    {
+  {
     size = 256;
-    }
+  }
   if (size > (2147483647 - 8))
-    {
+  {
     size = (2147483647 - 8);
-    }
+  }
 
   if (this->BufferSize != size)
-    {
+  {
     this->BufferSize = size;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMCompiler::GenerateSeriesUIDs()
 {
   if (this->SeriesUIDs == 0)
-    {
+  {
     this->SeriesUIDs = vtkStringArray::New();
-    }
+  }
 
   this->SeriesUIDs->Initialize();
   if (this->MetaData)
-    {
+  {
     int n = this->MetaData->GetNumberOfInstances();
     this->SeriesUIDs->SetNumberOfValues(n + 1); // allocate n+1
     this->SeriesUIDs->SetNumberOfValues(n); // but set to n values
     vtkDICOMUtilities::GenerateUIDs(DC::SOPInstanceUID, this->SeriesUIDs);
     this->SeriesUIDs->InsertNextValue(
       vtkDICOMUtilities::GenerateUID(DC::SeriesInstanceUID));
-    }
-
-  // study UID is only generated once per session
-  if (vtkDICOMCompiler::StudyUID[0] == '\0')
-    {
-    std::string uid = vtkDICOMUtilities::GenerateUID(DC::StudyInstanceUID);
-    strcpy(vtkDICOMCompiler::StudyUID, uid.c_str());
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -971,33 +974,33 @@ void vtkDICOMCompiler::WriteHeader()
 void vtkDICOMCompiler::Close()
 {
   if (this->Compressed && this->FrameCounter > 0)
-    {
+  {
     this->WriteFragments();
-    }
+  }
 
   if (this->OutputFile)
-    {
+  {
     this->OutputFile->Close();
     delete this->OutputFile;
     this->OutputFile = NULL;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMCompiler::CloseAndRemove()
 {
   if (this->Compressed && this->FrameCounter > 0)
-    {
+  {
     this->FreeFragments();
-    }
+  }
 
   if (this->OutputFile)
-    {
+  {
     this->OutputFile->Close();
     delete this->OutputFile;
     this->OutputFile = NULL;
     vtkDICOMFile::Remove(this->FileName);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1006,7 +1009,7 @@ bool vtkDICOMCompiler::WriteFragments()
   bool fileError = false;
 
   if (this->OutputFile && this->ErrorCode == 0)
-    {
+  {
     // Compressed frames
     unsigned int numFrames = this->FrameCounter;
     size_t n = 0;
@@ -1024,30 +1027,30 @@ bool vtkDICOMCompiler::WriteFragments()
     const unsigned int maxOffset = HxFFFFFFFF - 1;
     unsigned int offset = 0;
     for (unsigned int i = 0; i < numFrames; i++)
-      {
+    {
       Encoder<LE>::PutInt32(buffer + 8 + i*4, offset);
       // make sure offsets don't exceed 32-bit limit
       if (maxOffset - offset >= this->FrameLength[i])
-        {
+      {
         offset += this->FrameLength[i];
-        }
+      }
       else
-        {
+      {
         tableLength = 0;
         vtkDICOMUtilities::PackUnsignedInt(tableLength, buffer + 4);
         break;
-        }
       }
+    }
 
     // write the offset table to the file
     n = this->OutputFile->Write(buffer, tableLength + 8);
     if (n < tableLength + 8)
-      {
+    {
       fileError = true;
-      }
+    }
 
     for (unsigned int i = 0; i < numFrames && !fileError; i++)
-      {
+    {
       // Fragment value header
       // - Item tag (FFFE, E000)
       // - Length of item in bytes (4 bytes)
@@ -1056,23 +1059,23 @@ bool vtkDICOMCompiler::WriteFragments()
       Encoder<LE>::PutInt32(buffer+4, this->FrameLength[i]);
       n = this->OutputFile->Write(buffer, 8);
       if (n < 8)
-        {
+      {
         fileError = true;
         break;
-        }
+      }
 
       // - Fragment data
       assert((this->FrameLength[i] & 1) == 0);
       n = this->OutputFile->Write(this->FrameData[i], this->FrameLength[i]);
       if (n < this->FrameLength[i])
-        {
+      {
         fileError = true;
         break;
-        }
       }
+    }
 
     if (!fileError)
-      {
+    {
       // After final fragment:
       // - Sequence delimiter tag (FFFE, E0DD)
       // - Zero length
@@ -1081,20 +1084,20 @@ bool vtkDICOMCompiler::WriteFragments()
       Encoder<LE>::PutInt32(buffer+4, 0);
       n = this->OutputFile->Write(buffer, 8);
       if (n < 8)
-        {
+      {
         fileError = true;
-        }
       }
+    }
 
     delete [] buffer;
-    }
+  }
 
   this->FreeFragments();
 
   if (fileError)
-    {
+  {
     this->DiskFullError();
-    }
+  }
 
   return !fileError;
 }
@@ -1104,9 +1107,9 @@ void vtkDICOMCompiler::FreeFragments()
 {
   unsigned int numFrames = this->FrameCounter;
   for (unsigned int i = 0; i < numFrames; i++)
-    {
+  {
     delete [] this->FrameData[i];
-    }
+  }
   delete [] this->FrameData;
   delete [] this->FrameLength;
   this->FrameData = 0;
@@ -1118,39 +1121,40 @@ bool vtkDICOMCompiler::WriteFile(vtkDICOMMetaData *data, int idx)
 {
   // Check that the file name has been set.
   if (!this->FileName)
-    {
+  {
     this->SetErrorCode(vtkErrorCode::NoFileNameError);
     vtkErrorMacro("WriteFile: No file name has been set");
     return false;
-    }
+  }
 
   // Generate fresh UIDs if at index zero
-  if (idx == 0 || this->SeriesUIDs == 0 ||
-      this->SeriesUIDs->GetNumberOfValues() !=
-      data->GetNumberOfInstances() + 1)
-    {
+  if ((this->SOPInstanceUID == 0 || this->SeriesInstanceUID == 0) &&
+      (idx == 0 || this->SeriesUIDs == 0 ||
+       this->SeriesUIDs->GetNumberOfValues() !=
+       data->GetNumberOfInstances() + 1))
+  {
     this->GenerateSeriesUIDs();
-    }
+  }
 
   this->OutputFile = new vtkDICOMFile(this->FileName, vtkDICOMFile::Out);
 
   if (this->OutputFile->GetError())
-    {
+  {
     this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
     const char *errText = "Can't open the file ";
     if (this->OutputFile->GetError() == vtkDICOMFile::AccessDenied)
-      {
+    {
       errText = "No permission to write the file ";
-      }
-    else if (this->OutputFile->GetError() == vtkDICOMFile::IsDirectory)
-      {
+    }
+    else if (this->OutputFile->GetError() == vtkDICOMFile::FileIsDirectory)
+    {
       errText = "The selected file is a directory ";
-      }
+    }
     delete this->OutputFile;
     this->OutputFile = 0;
     vtkErrorMacro("WriteFile: " << errText << this->FileName);
     return false;
-    }
+  }
 
   this->Buffer = new unsigned char [this->BufferSize];
   // guard against anyone changing BufferSize while compiling the file
@@ -1164,7 +1168,7 @@ bool vtkDICOMCompiler::WriteFile(vtkDICOMMetaData *data, int idx)
 
   // only write preamble and meta header if transfer syntax is set
   if (this->TransferSyntaxUID != 0)
-    {
+  {
     // write the preamble
     memset(cp, '\0', 128);
     cp += 128;
@@ -1175,30 +1179,30 @@ bool vtkDICOMCompiler::WriteFile(vtkDICOMMetaData *data, int idx)
     cp += 4;
 
     r = this->WriteMetaHeader(cp, ep, data, idx);
-    }
+  }
   if (r)
-    {
+  {
     r = this->WriteMetaData(cp, ep, data, idx);
-    }
+  }
   if (r)
-    {
+  {
     r = this->FlushBuffer(cp, ep);
-    }
+  }
 
   delete [] this->Buffer;
 
   // delete the file if an error occurred
   if (!r)
-    {
+  {
     if (this->GetErrorCode() == vtkErrorCode::NoError)
-      {
+    {
       this->DiskFullError();
-      }
+    }
     else
-      {
+    {
       this->CloseAndRemove();
-      }
     }
+  }
 
   return r;
 }
@@ -1207,24 +1211,24 @@ bool vtkDICOMCompiler::WriteFile(vtkDICOMMetaData *data, int idx)
 void vtkDICOMCompiler::WritePixelData(const unsigned char *cp, vtkIdType size)
 {
   if (this->OutputFile == 0)
-    {
+  {
     return;
-    }
+  }
 
   size_t n = this->OutputFile->Write(cp, size);
   if (n != static_cast<size_t>(size))
-    {
+  {
     this->DiskFullError();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMCompiler::WriteFrame(const unsigned char *cp, vtkIdType size)
 {
   if (this->OutputFile == 0)
-    {
+  {
     return;
-    }
+  }
 
   union { char c[2]; short s; } endiancheck;
   // this will set endiancheck.s to 1 on little endian architectures
@@ -1233,21 +1237,21 @@ void vtkDICOMCompiler::WriteFrame(const unsigned char *cp, vtkIdType size)
   size_t n = 0;
 
   if (this->Compressed)
-    {
+  {
     // if this is the first frame, do some set-up
     if (this->FrameCounter == 0)
-      {
+    {
       unsigned int numFrames =
         this->MetaData->GetAttributeValue(DC::NumberOfFrames).AsUnsignedInt();
       numFrames = (numFrames == 0 ? 1 : numFrames);
       this->FrameData = new unsigned char *[numFrames];
       this->FrameLength = new unsigned int[numFrames];
       for (unsigned int i = 0; i < numFrames; i++)
-        {
+      {
         this->FrameData[i] = 0;
         this->FrameLength[i] = 0;
-        }
       }
+    }
 
     vtkDICOMImageCodec codec(this->TransferSyntaxUID);
     size_t fl = 0;
@@ -1257,48 +1261,48 @@ void vtkDICOMCompiler::WriteFrame(const unsigned char *cp, vtkIdType size)
     this->FrameData[this->FrameCounter] = fd;
 
     if (this->ErrorCode == 0 && errCode != vtkDICOMImageCodec::NoError)
-      {
+    {
       this->SetErrorCode(vtkErrorCode::FileFormatError);
       vtkErrorMacro("Writing compressed DICOM is not supported.");
-      }
+    }
 
     // mark all data as accepted
     n = size;
-    }
+  }
   else if (((this->BigEndian != 0) ^ (endiancheck.s != 1)) &&
            this->MetaData->GetAttributeValue(DC::BitsAllocated).AsInt() > 8)
-    {
+  {
     // Swap bytes before writing
     int scalarSize =
       (this->MetaData->GetAttributeValue(DC::BitsAllocated).AsInt() + 7)/8;
     unsigned char *buf = new unsigned char[size];
     unsigned char *dp = buf;
     if (scalarSize == 2)
-      {
+    {
       for (vtkIdType i = 0; i < size; i += 2)
-        {
+      {
         dp[0] = cp[1];
         dp[1] = cp[0];
         dp += 2;
         cp += 2;
-        }
       }
+    }
     else if (scalarSize == 4)
-      {
+    {
       for (vtkIdType i = 0; i < size; i += 4)
-        {
+      {
         dp[0] = cp[3];
         dp[1] = cp[2];
         dp[2] = cp[1];
         dp[3] = cp[0];
         dp += 4;
         cp += 4;
-        }
       }
+    }
     else if (scalarSize == 8)
-      {
+    {
       for (vtkIdType i = 0; i < size; i += 8)
-        {
+      {
         dp[0] = cp[7];
         dp[1] = cp[6];
         dp[2] = cp[5];
@@ -1309,21 +1313,21 @@ void vtkDICOMCompiler::WriteFrame(const unsigned char *cp, vtkIdType size)
         dp[7] = cp[0];
         dp += 8;
         cp += 8;
-        }
       }
+    }
     n = this->OutputFile->Write(buf, size);
     delete [] buf;
-    }
+  }
   else
-    {
+  {
     // For uncompressed frames, write the data raw
     n = this->OutputFile->Write(cp, size);
-    }
+  }
 
   if (n != static_cast<size_t>(size))
-    {
+  {
     this->DiskFullError();
-    }
+  }
 
   this->FrameCounter++;
 }
@@ -1335,9 +1339,9 @@ bool vtkDICOMCompiler::WriteMetaHeader(
 {
   // if no transfer syntax is set, do not write header
   if (this->TransferSyntaxUID == 0)
-    {
+  {
     return true;
-    }
+  }
 
   // create the encoder
   LittleEndianEncoder encoder(this, idx);
@@ -1351,22 +1355,22 @@ bool vtkDICOMCompiler::WriteMetaHeader(
   std::string classUIDString =
     meta->GetAttributeValue(DC::SOPClassUID).AsString();
   if (classUIDString == "")
-    {
+  {
     // if not present (e.g. DICOMDIR) get it from the meta header
     classUIDString =
       meta->GetAttributeValue(DC::MediaStorageSOPClassUID).AsString();
-    }
+  }
   const char *classUID = classUIDString.c_str();
 
   if (instanceUID == 0)
-    {
+  {
     instanceUID = this->SeriesUIDs->GetValue(idx);
-    }
+  }
   if (implementationUID == 0)
-    {
+  {
     implementationUID =
       vtkDICOMUtilities::GetImplementationClassUID();
-    }
+  }
 
   vtkDICOMItem item;
   item.SetAttributeValue(
@@ -1389,38 +1393,38 @@ bool vtkDICOMCompiler::WriteMetaHeader(
     vtkDICOMValue(vtkDICOMVR::UI, implementationUID));
 
   if (this->ImplementationVersionName)
-    {
+  {
     item.SetAttributeValue(
       DC::ImplementationVersionName,
       vtkDICOMValue(vtkDICOMVR::SH,
                     this->ImplementationVersionName));
-    }
+  }
 
   if (this->SourceApplicationEntityTitle)
-    {
+  {
     item.SetAttributeValue(
       DC::SourceApplicationEntityTitle,
       vtkDICOMValue(vtkDICOMVR::AE,
                     this->SourceApplicationEntityTitle));
-    }
+  }
 
   // keep private information stored in meta header
   const char *creatorUID =
     meta->GetAttributeValue(DC::PrivateInformationCreatorUID).GetCharData();
   if (creatorUID)
-    {
+  {
     item.SetAttributeValue(DC::PrivateInformationCreatorUID, creatorUID);
     item.SetAttributeValue(DC::PrivateInformation,
       meta->GetAttributeValue(DC::PrivateInformation));
-    }
+  }
 
   vtkDICOMDataElementIterator iter = item.Begin();
   vtkDICOMDataElementIterator iterEnd = item.End();
 
   if (iter != iterEnd)
-    {
+  {
     encoder.WriteElements(cp, ep, iter, iterEnd);
-    }
+  }
 
   return true;
 }
@@ -1443,41 +1447,47 @@ bool vtkDICOMCompiler::WriteMetaData(
   if (tsyntax == "" || // If no meta header, use Implicit LE
       tsyntax == "1.2.840.10008.1.2" ||  // Implicit LE
       tsyntax == "1.2.840.10008.1.20")   // Papyrus Implicit LE
-    {
+  {
     encoder->SetImplicitVR(true);
-    }
+  }
   else if (tsyntax == "1.2.840.10008.1.2.2") // Explicit BE
-    {
+  {
     encoder = &encoderBE;
     this->BigEndian = true;
-    }
+  }
   else if (tsyntax == "1.2.840.113619.5.2")  // GE LE with BE data
-    {
+  {
     encoder->SetImplicitVR(true);
     this->BigEndian = true;
-    }
+  }
   else if (tsyntax != "1.2.840.10008.1.2.1") // Explicit LE
-    {
+  {
     this->Compressed = true;
-    }
+  }
 
   const char *instanceUID = this->SOPInstanceUID;
   const char *seriesUID = this->SeriesInstanceUID;
   const char *studyUID = this->StudyInstanceUID;
 
   if (instanceUID == 0)
-    {
+  {
     instanceUID = this->SeriesUIDs->GetValue(idx);
-    }
+  }
   if (seriesUID == 0)
-    {
+  {
     seriesUID = this->SeriesUIDs->GetValue(this->SeriesUIDs->GetMaxId());
-    }
+  }
   if (studyUID == 0 &&
       meta->GetAttributeValue(DC::StudyInstanceUID).AsString() == "")
+  {
+    // study UID is only generated once per session
+    if (vtkDICOMCompiler::StudyUID[0] == '\0')
     {
-    studyUID = vtkDICOMCompiler::StudyUID;
+      std::string uid = vtkDICOMUtilities::GenerateUID(DC::StudyInstanceUID);
+      strcpy(vtkDICOMCompiler::StudyUID, uid.c_str());
     }
+    studyUID = vtkDICOMCompiler::StudyUID;
+  }
 
   encoder->SetSOPInstanceUID(instanceUID);
   encoder->SetSeriesInstanceUID(seriesUID);
@@ -1488,22 +1498,22 @@ bool vtkDICOMCompiler::WriteMetaData(
 
   // skip past the meta header
   while (iter != iterEnd && iter->GetTag().GetGroup() <= 0x0002)
-    {
+  {
     ++iter;
-    }
+  }
 
   // if last element is PixelData, don't write it yet
   bool hasPixelData = false;
   if (iterEnd != iter)
-    {
+  {
     vtkDICOMDataElementIterator finalElement = iterEnd;
     --finalElement;
     if (finalElement->GetTag() == vtkDICOMTag(DC::PixelData))
-      {
+    {
       iterEnd = finalElement;
       hasPixelData = true;
-      }
     }
+  }
 
   // write the meta data, get boolean status value
   bool r = encoder->WriteElements(cp, ep, iter, iterEnd);
@@ -1511,24 +1521,24 @@ bool vtkDICOMCompiler::WriteMetaData(
   // write the PixelData element head
   if (r && hasPixelData &&
       (r = encoder->CheckBuffer(cp, ep, 12)) != false)
-    {
+  {
     vtkDICOMVR vr = vtkDICOMVR::OW;
     int bitsAllocated = this->MetaData->GetAttributeValue(
       DC::BitsAllocated).AsInt();
     if ((bitsAllocated > 0 && bitsAllocated <= 8) || this->Compressed)
-      {
+    {
       vr = vtkDICOMVR::OB;
-      }
+    }
 
     if (this->KeepOriginalPixelDataVR)
-      {
+    {
       vtkDICOMVR vrOriginal = this->MetaData->GetAttributeValue(
         idx, DC::PixelData).GetVR();
       if (vrOriginal.IsValid())
-        {
+      {
         vr = vrOriginal;
-        }
       }
+    }
 
     unsigned int vl = this->ComputePixelDataSize();
 
@@ -1536,7 +1546,7 @@ bool vtkDICOMCompiler::WriteMetaData(
     size_t l = encoder->WriteElementHead(
       cp, vtkDICOMTag(DC::PixelData), vr, vl);
     cp += l;
-    }
+  }
 
   return r;
 }
@@ -1546,13 +1556,13 @@ unsigned int vtkDICOMCompiler::ComputePixelDataSize()
 {
   unsigned int vl = HxFFFFFFFF;
   if (!this->Compressed)
-    {
+  {
     // compute the size
     vtkDICOMMetaData *meta = this->MetaData;
     int bitsAllocated = meta->GetAttributeValue(
       this->Index, DC::BitsAllocated).AsInt();
     if (bitsAllocated > 0)
-      {
+    {
       vl = meta->GetAttributeValue(
         this->Index, DC::Columns).AsUnsignedInt();
       vl *= meta->GetAttributeValue(
@@ -1564,33 +1574,39 @@ unsigned int vtkDICOMCompiler::ComputePixelDataSize()
       vl *= ((m > 1) ? m : 1);
       vl *= ((n > 1) ? n : 1);
       if (bitsAllocated % 8 == 0)
-        {
+      {
         vl *= bitsAllocated/8;
-        }
+      }
       else
-        {
+      {
         // this will only occur in ancient data
         vl = (vl*bitsAllocated + 7)/8;
         vl += (vl & 1); // make it even
-        }
       }
     }
+  }
 
   return vl;
 }
 
 //----------------------------------------------------------------------------
 bool vtkDICOMCompiler::FlushBuffer(
-  unsigned char* &ucp, unsigned char* &)
+  unsigned char* &ucp, unsigned char* &ep)
 {
+  bool rval = true;
   const unsigned char *cp = ucp;
   unsigned char *dp = this->Buffer;
   ucp = dp;
-  size_t n = cp - dp;
+  ep = dp + this->ChunkSize;
 
-  size_t m = this->OutputFile->Write(dp, n);
+  if (cp)
+  {
+    size_t n = cp - dp;
+    size_t m = this->OutputFile->Write(dp, n);
+    rval = (n == m);
+  }
 
-  return (n == m);
+  return rval;
 }
 
 //----------------------------------------------------------------------------
diff --git a/Source/vtkDICOMCompiler.h b/Source/vtkDICOMCompiler.h
index 2b4afb9..9677c3e 100644
--- a/Source/vtkDICOMCompiler.h
+++ b/Source/vtkDICOMCompiler.h
@@ -40,10 +40,13 @@ public:
   //! Print a summary of the contents of this object.
   void PrintSelf(ostream& os, vtkIndent indent);
 
+  //@{
   //! Set the file name.
   vtkSetStringMacro(FileName);
   vtkGetStringMacro(FileName);
+  //@}
 
+  //@{
   //! Set the SOP Instance UID.
   /*!
    *  If you do not supply a UID, a random UID will be generated.
@@ -51,7 +54,9 @@ public:
    */
   vtkSetStringMacro(SOPInstanceUID);
   vtkGetStringMacro(SOPInstanceUID);
+  //@}
 
+  //@{
   //! Set the Series Instance UID.
   /*!
    *  If you do not supply a UID, a random UID will be generated.
@@ -59,7 +64,9 @@ public:
    */
   vtkSetStringMacro(SeriesInstanceUID);
   vtkGetStringMacro(SeriesInstanceUID);
+  //@}
 
+  //@{
   //! Set the Study Instance UID.
   /*!
    *  If you do not supply a UID, a random UID will be generated.
@@ -67,21 +74,27 @@ public:
    */
   vtkSetStringMacro(StudyInstanceUID);
   vtkGetStringMacro(StudyInstanceUID);
+  //@}
 
+  //@{
   //! Set the Implementation Class UID.
   /*!
    *  If you do not supply a UID, a default one will be used.
    */
   vtkSetStringMacro(ImplementationClassUID);
   vtkGetStringMacro(ImplementationClassUID);
+  //@}
 
+  //@{
   //! Set the Implementation Version Name.
   /*!
    *  If you do not supply a name, a default one will be used.
    */
   vtkSetStringMacro(ImplementationVersionName);
   vtkGetStringMacro(ImplementationVersionName);
+  //@}
 
+  //@{
   //! Set the Source Application Entity Title.
   /*!
    *  Provide a short name (16 chars max) for the network node that
@@ -90,7 +103,9 @@ public:
    */
   vtkSetStringMacro(SourceApplicationEntityTitle);
   vtkGetStringMacro(SourceApplicationEntityTitle);
+  //@}
 
+  //@{
   //! Set the Transfer Syntax UID.
   /*!
    *  The transfer syntax should be left at its default value of
@@ -101,15 +116,21 @@ public:
    */
   vtkSetStringMacro(TransferSyntaxUID);
   vtkGetStringMacro(TransferSyntaxUID);
+  //@}
 
+  //@{
   //! Set the metadata object to write to the file.
   void SetMetaData(vtkDICOMMetaData *);
   vtkDICOMMetaData *GetMetaData() { return this->MetaData; }
+  //@}
 
+  //@{
   //! Set the instance index to use when accessing vtkDICOMMataData.
   vtkSetMacro(Index, int);
   int GetIndex() { return this->Index; }
+  //@}
 
+  //@{
   //! Set the buffer size, the default is 8192 (8k).
   /*!
    *  A larger buffer size results in fewer IO calls.  The
@@ -117,7 +138,9 @@ public:
    */
   void SetBufferSize(int size);
   int GetBufferSize() { return this->BufferSize; }
+  //@}
 
+  //@{
   //! Write the metadata to the file.
   virtual void WriteHeader();
 
@@ -144,16 +167,20 @@ public:
 
   //! Get the IO error code.
   unsigned long GetErrorCode() { return this->ErrorCode; }
+  //@}
 
+  //@{
   //! Generate a series UID and instance UIDs for the meta data.
   /*!
    *  This will be called automatically whenever you provide a
    *  new meta data object for the compiler.  Note that new UIDs
    *  will not be generated if you have already provided them with
-   *  SetSOPInstanceUID() and SetSeriesUID().
+   *  SetSOPInstanceUID() and SetSeriesInstanceUID().
    */
   void GenerateSeriesUIDs();
+  //@}
 
+  //@{
   //! Use the original PixelData VR when writing pixel data element.
   /*!
    *  This is really only useful when cloning data sets.  It ensures
@@ -162,6 +189,7 @@ public:
   vtkSetMacro(KeepOriginalPixelDataVR, bool);
   vtkBooleanMacro(KeepOriginalPixelDataVR, bool);
   vtkGetMacro(KeepOriginalPixelDataVR, bool);
+  //@}
 
 protected:
   vtkDICOMCompiler();
@@ -170,10 +198,14 @@ protected:
   //! Internal method for flushing the IO buffer.
   /*!
    *  This is an internal method that flushes the buffer to the file.
-   *  The pointer cp markes the current position in the buffer, and
-   *  ep marks the end of the buffer.  By checking ep-cp, subroutines
-   *  can check how much space is left in the buffer and call FlushBuffer
-   *  only when the buffer is nearly full.
+   *  If called with cp = 0, it will initialize cp to the beginning of
+   *  the write buffer, and ep to the end of the buffer, without writing
+   *  anything to the file.  The caller should then write to the buffer,
+   *  incrementing the pointer cp while doing so.  When cp approaches the
+   *  end of the buffer (which is stored in ep), FlushBuffer should be
+   *  called to flush the buffer contents to the file.  Every call will
+   *  reset cp to the beginning of the buffer and ep to the end of the
+   *  buffer.
    */
   virtual bool FlushBuffer(unsigned char* &cp, unsigned char* &ep);
 
@@ -237,8 +269,8 @@ protected:
   friend class vtkDICOMCompilerInternalFriendship;
 
 private:
-  vtkDICOMCompiler(const vtkDICOMCompiler&);  // Not implemented.
-  void operator=(const vtkDICOMCompiler&);  // Not implemented.
+  vtkDICOMCompiler(const vtkDICOMCompiler&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMCompiler&) VTK_DELETE_FUNCTION;
 };
 
 #endif /* vtkDICOMCompiler_h */
diff --git a/Source/vtkDICOMDataElement.h b/Source/vtkDICOMDataElement.h
index b406988..fd8f6ba 100644
--- a/Source/vtkDICOMDataElement.h
+++ b/Source/vtkDICOMDataElement.h
@@ -29,21 +29,27 @@
 class VTKDICOM_EXPORT vtkDICOMDataElement
 {
 public:
+  //@{
   vtkDICOMDataElement() : Tag(), Value(), Next(0), Prev(0) {}
   vtkDICOMDataElement(const vtkDICOMTag& t, const vtkDICOMValue &v) :
     Tag(t), Value(v), Next(0), Prev(0) {}
+  //@}
 
+  //@{
   //! Get the tag for this data element.
   vtkDICOMTag GetTag() const { return this->Tag; }
 
   //! Get the VR for this data element.
   vtkDICOMVR GetVR() const { return this->Value.GetVR(); }
+  //@}
 
+  //@{
   //! Check whether this data element carries per-instance values.
   bool IsPerInstance() const { return (this->Value.GetMultiplexData() != 0); }
 
   //! Get the number of value instances in this data element.
-  int GetNumberOfInstances() const { return this->Value.GetNumberOfValues(); }
+  int GetNumberOfInstances() const {
+    return static_cast<int>(this->Value.GetNumberOfValues()); }
 
   //! Get the value of the data element, if not multi-valued.
   const vtkDICOMValue& GetValue() const { return this->Value; }
@@ -52,12 +58,15 @@ public:
   const vtkDICOMValue& GetValue(int i) const {
     const vtkDICOMValue *vptr = this->Value.GetMultiplexData();
     return (vptr == 0 ? this->Value : vptr[i]); }
+  //@}
 
+  //@{
   bool operator==(const vtkDICOMDataElement& o) const {
     return (this->Tag == o.Tag && this->Value == o.Value); }
 
   bool operator!=(const vtkDICOMDataElement& o) const {
     return (this->Tag != o.Tag || this->Value != o.Value); }
+  //@}
 
 private:
   vtkDICOMTag          Tag;
@@ -77,8 +86,11 @@ private:
 class VTKDICOM_EXPORT vtkDICOMDataElementIterator
 {
 public:
+  //@{
   vtkDICOMDataElementIterator() : Pointer(0) {}
+  //@}
 
+  //@{
   vtkDICOMDataElementIterator& operator++() {
     if (this->Pointer) { this->Pointer = this->Pointer->Next; }
     return *this; }
@@ -96,15 +108,20 @@ public:
     const vtkDICOMDataElement *ptr = this->Pointer;
     if (ptr) { this->Pointer = this->Pointer->Prev; }
     return vtkDICOMDataElementIterator(ptr); }
+  //@}
 
+  //@{
   const vtkDICOMDataElement *operator->() const { return this->Pointer; }
   const vtkDICOMDataElement& operator*() const { return *this->Pointer; }
+  //@}
 
+  //@{
   bool operator==(const vtkDICOMDataElementIterator& it) const {
     return (this->Pointer == it.Pointer); }
 
   bool operator!=(const vtkDICOMDataElementIterator& it) const {
     return (this->Pointer != it.Pointer); }
+  //@}
 
 private:
   vtkDICOMDataElementIterator(const vtkDICOMDataElement *ptr) {
diff --git a/Source/vtkDICOMDictEntry.cxx b/Source/vtkDICOMDictEntry.cxx
index d0e1165..25c2401 100644
--- a/Source/vtkDICOMDictEntry.cxx
+++ b/Source/vtkDICOMDictEntry.cxx
@@ -19,14 +19,14 @@ const vtkDICOMDictEntry::Entry vtkDICOMDictEntry::InvalidEntry = {
 ostream& operator<<(ostream& o, const vtkDICOMDictEntry& a)
 {
   if (!a.IsValid())
-    {
+  {
     o << "INVALID";
-    }
+  }
   else
-    {
+  {
     o << a.GetTag() << "," << a.GetVR() << "," << a.GetVM() << ","
       << "\"" << a.GetName() << "\"";
-    }
+  }
 
   return o;
 }
diff --git a/Source/vtkDICOMDictHash.cxx b/Source/vtkDICOMDictHash.cxx
index 7afc460..6edd42a 100644
--- a/Source/vtkDICOMDictHash.cxx
+++ b/Source/vtkDICOMDictHash.cxx
@@ -11,7 +11,7 @@ typedef vtkDICOMVR VR;
 typedef vtkDICOMVM VM;
 typedef vtkDICOMDictEntry::Entry DictEntry;
 
-DictEntry DictContents[] = {
+const DictEntry DictContents[] = {
 { 0x0002, 0x0000, 0, VR::UL, VM::M1, "FileMetaInformationGroupLength" },
 { 0x0002, 0x0001, 0, VR::OB, VM::M1, "FileMetaInformationVersion" },
 { 0x0002, 0x0002, 0, VR::UI, VM::M1, "MediaStorageSOPClassUID" },
@@ -77,6 +77,7 @@ DictEntry DictContents[] = {
 { 0x0008, 0x0052, 0, VR::CS, VM::M1, "QueryRetrieveLevel" },
 { 0x0008, 0x0053, 0, VR::CS, VM::M1, "QueryRetrieveView" },
 { 0x0008, 0x0054, 0, VR::AE, VM::M1TN, "RetrieveAETitle" },
+{ 0x0008, 0x0055, 0, VR::AE, VM::M1, "StationAETitle" },
 { 0x0008, 0x0056, 0, VR::CS, VM::M1, "InstanceAvailability" },
 { 0x0008, 0x0058, 0, VR::UI, VM::M1TN, "FailedSOPInstanceUIDList" },
 { 0x0008, 0x0060, 0, VR::CS, VM::M1, "Modality" },
@@ -117,6 +118,9 @@ DictEntry DictContents[] = {
 { 0x0008, 0x0119, 0, VR::UC, VM::M1, "LongCodeValue" },
 { 0x0008, 0x0120, 0, VR::UR, VM::M1, "URNCodeValue" },
 { 0x0008, 0x0121, 0, VR::SQ, VM::M1, "EquivalentCodeSequence" },
+{ 0x0008, 0x0122, 0, VR::LO, VM::M1, "MappingResourceName" },
+{ 0x0008, 0x0123, 0, VR::SQ, VM::M1, "ContextGroupIdentificationSequence" },
+{ 0x0008, 0x0124, 0, VR::SQ, VM::M1, "MappingResourceIdentificationSequence" },
 { 0x0008, 0x0201, 0, VR::SH, VM::M1, "TimezoneOffsetFromUTC" },
 { 0x0008, 0x0300, 0, VR::SQ, VM::M1, "PrivateDataElementCharacteristicsSequence" },
 { 0x0008, 0x0301, 0, VR::US, VM::M1, "PrivateGroupReference" },
@@ -172,6 +176,7 @@ DictEntry DictContents[] = {
 { 0x0008, 0x1197, 0, VR::US, VM::M1, "FailureReason" },
 { 0x0008, 0x1198, 0, VR::SQ, VM::M1, "FailedSOPSequence" },
 { 0x0008, 0x1199, 0, VR::SQ, VM::M1, "ReferencedSOPSequence" },
+{ 0x0008, 0x119A, 0, VR::SQ, VM::M1, "OtherFailuresSequence" },
 { 0x0008, 0x1200, 0, VR::SQ, VM::M1, "StudiesContainingOtherReferencedInstancesSequence" },
 { 0x0008, 0x1250, 0, VR::SQ, VM::M1, "RelatedSeriesSequence" },
 { 0x0008, 0x2110, 1, VR::CS, VM::M1, "LossyImageCompressionRetired" },
@@ -240,14 +245,28 @@ DictEntry DictContents[] = {
 { 0x0010, 0x0021, 0, VR::LO, VM::M1, "IssuerOfPatientID" },
 { 0x0010, 0x0022, 0, VR::CS, VM::M1, "TypeOfPatientID" },
 { 0x0010, 0x0024, 0, VR::SQ, VM::M1, "IssuerOfPatientIDQualifiersSequence" },
+{ 0x0010, 0x0026, 0, VR::SQ, VM::M1, "SourcePatientGroupIdentificationSequence" },
+{ 0x0010, 0x0027, 0, VR::SQ, VM::M1, "GroupOfPatientsIdentificationSequence" },
+{ 0x0010, 0x0028, 0, VR::US, VM::M3, "SubjectRelativePositionInImage" },
 { 0x0010, 0x0030, 0, VR::DA, VM::M1, "PatientBirthDate" },
 { 0x0010, 0x0032, 0, VR::TM, VM::M1, "PatientBirthTime" },
+{ 0x0010, 0x0033, 0, VR::LO, VM::M1, "PatientBirthDateInAlternativeCalendar" },
+{ 0x0010, 0x0034, 0, VR::LO, VM::M1, "PatientDeathDateInAlternativeCalendar" },
+{ 0x0010, 0x0035, 0, VR::CS, VM::M1, "PatientAlternativeCalendar" },
 { 0x0010, 0x0040, 0, VR::CS, VM::M1, "PatientSex" },
 { 0x0010, 0x0050, 0, VR::SQ, VM::M1, "PatientInsurancePlanCodeSequence" },
 { 0x0010, 0x0101, 0, VR::SQ, VM::M1, "PatientPrimaryLanguageCodeSequence" },
 { 0x0010, 0x0102, 0, VR::SQ, VM::M1, "PatientPrimaryLanguageModifierCodeSequence" },
 { 0x0010, 0x0200, 0, VR::CS, VM::M1, "QualityControlSubject" },
 { 0x0010, 0x0201, 0, VR::SQ, VM::M1, "QualityControlSubjectTypeCodeSequence" },
+{ 0x0010, 0x0212, 0, VR::UC, VM::M1, "StrainDescription" },
+{ 0x0010, 0x0213, 0, VR::LO, VM::M1, "StrainNomenclature" },
+{ 0x0010, 0x0214, 0, VR::LO, VM::M1, "StrainStockNumber" },
+{ 0x0010, 0x0215, 0, VR::SQ, VM::M1, "StrainSourceRegistryCodeSequence" },
+{ 0x0010, 0x0216, 0, VR::SQ, VM::M1, "StrainStockSequence" },
+{ 0x0010, 0x0217, 0, VR::LO, VM::M1, "StrainSource" },
+{ 0x0010, 0x0218, 0, VR::UT, VM::M1, "StrainAdditionalInformation" },
+{ 0x0010, 0x0219, 0, VR::SQ, VM::M1, "StrainCodeSequence" },
 { 0x0010, 0x1000, 0, VR::LO, VM::M1TN, "OtherPatientIDs" },
 { 0x0010, 0x1001, 0, VR::PN, VM::M1TN, "OtherPatientNames" },
 { 0x0010, 0x1002, 0, VR::SQ, VM::M1, "OtherPatientIDsSequence" },
@@ -310,21 +329,30 @@ DictEntry DictContents[] = {
 { 0x0012, 0x0083, 0, VR::SQ, VM::M1, "ConsentForClinicalTrialUseSequence" },
 { 0x0012, 0x0084, 0, VR::CS, VM::M1, "DistributionType" },
 { 0x0012, 0x0085, 0, VR::CS, VM::M1, "ConsentForDistributionFlag" },
-{ 0x0014, 0x0023, 1, VR::ST, VM::M1TN, "CADFileFormat" },
-{ 0x0014, 0x0024, 1, VR::ST, VM::M1TN, "ComponentReferenceSystem" },
-{ 0x0014, 0x0025, 2, VR::ST, VM::M1TN, "ComponentManufacturingProcedure" },
-{ 0x0014, 0x0028, 2, VR::ST, VM::M1TN, "ComponentManufacturer" },
+{ 0x0014, 0x0023, 1, VR::ST, VM::M1, "CADFileFormat" },
+{ 0x0014, 0x0024, 1, VR::ST, VM::M1, "ComponentReferenceSystem" },
+{ 0x0014, 0x0025, 2, VR::ST, VM::M1, "ComponentManufacturingProcedure" },
+{ 0x0014, 0x0028, 2, VR::ST, VM::M1, "ComponentManufacturer" },
 { 0x0014, 0x0030, 2, VR::DS, VM::M1TN, "MaterialThickness" },
 { 0x0014, 0x0032, 2, VR::DS, VM::M1TN, "MaterialPipeDiameter" },
 { 0x0014, 0x0034, 2, VR::DS, VM::M1TN, "MaterialIsolationDiameter" },
-{ 0x0014, 0x0042, 2, VR::ST, VM::M1TN, "MaterialGrade" },
-{ 0x0014, 0x0044, 2, VR::ST, VM::M1TN, "MaterialPropertiesDescription" },
-{ 0x0014, 0x0045, 1, VR::ST, VM::M1TN, "MaterialPropertiesFileFormatRetired" },
+{ 0x0014, 0x0042, 2, VR::ST, VM::M1, "MaterialGrade" },
+{ 0x0014, 0x0044, 2, VR::ST, VM::M1, "MaterialPropertiesDescription" },
+{ 0x0014, 0x0045, 1, VR::ST, VM::M1, "MaterialPropertiesFileFormatRetired" },
 { 0x0014, 0x0046, 2, VR::LT, VM::M1, "MaterialNotes" },
 { 0x0014, 0x0050, 2, VR::CS, VM::M1, "ComponentShape" },
 { 0x0014, 0x0052, 2, VR::CS, VM::M1, "CurvatureType" },
 { 0x0014, 0x0054, 2, VR::DS, VM::M1, "OuterDiameter" },
 { 0x0014, 0x0056, 2, VR::DS, VM::M1, "InnerDiameter" },
+{ 0x0014, 0x0100, 2, VR::LO, VM::M1TN, "ComponentWelderIDs" },
+{ 0x0014, 0x0101, 2, VR::CS, VM::M1, "SecondaryApprovalStatus" },
+{ 0x0014, 0x0102, 2, VR::DA, VM::M1, "SecondaryReviewDate" },
+{ 0x0014, 0x0103, 2, VR::TM, VM::M1, "SecondaryReviewTime" },
+{ 0x0014, 0x0104, 2, VR::PN, VM::M1, "SecondaryReviewerName" },
+{ 0x0014, 0x0105, 2, VR::ST, VM::M1, "RepairID" },
+{ 0x0014, 0x0106, 2, VR::SQ, VM::M1, "MultipleComponentApprovalSequence" },
+{ 0x0014, 0x0107, 2, VR::CS, VM::M1TN, "OtherApprovalStatus" },
+{ 0x0014, 0x0108, 2, VR::CS, VM::M1TN, "OtherSecondaryApprovalStatus" },
 { 0x0014, 0x1010, 2, VR::ST, VM::M1, "ActualEnvironmentalConditions" },
 { 0x0014, 0x1020, 2, VR::DA, VM::M1, "ExpiryDate" },
 { 0x0014, 0x1040, 2, VR::ST, VM::M1, "EnvironmentalConditions" },
@@ -671,6 +699,8 @@ DictEntry DictContents[] = {
 { 0x0018, 0x1251, 0, VR::SH, VM::M1, "TransmitCoilName" },
 { 0x0018, 0x1260, 0, VR::SH, VM::M1, "PlateType" },
 { 0x0018, 0x1261, 0, VR::LO, VM::M1, "PhosphorType" },
+{ 0x0018, 0x1271, 0, VR::FD, VM::M1, "WaterEquivalentDiameter" },
+{ 0x0018, 0x1272, 0, VR::SQ, VM::M1, "WaterEquivalentDiameterCalculationMethodCodeSequence" },
 { 0x0018, 0x1300, 0, VR::DS, VM::M1, "ScanVelocity" },
 { 0x0018, 0x1301, 0, VR::CS, VM::M1TN, "WholeBodyTechnique" },
 { 0x0018, 0x1302, 0, VR::IS, VM::M1, "ScanLength" },
@@ -1169,6 +1199,10 @@ DictEntry DictContents[] = {
 { 0x0018, 0x9605, 0, VR::FD, VM::M1, "DiffusionBValueYY" },
 { 0x0018, 0x9606, 0, VR::FD, VM::M1, "DiffusionBValueYZ" },
 { 0x0018, 0x9607, 0, VR::FD, VM::M1, "DiffusionBValueZZ" },
+{ 0x0018, 0x9621, 0, VR::SQ, VM::M1, "FunctionalMRSequence" },
+{ 0x0018, 0x9622, 0, VR::CS, VM::M1, "FunctionalSettlingPhaseFramesPresent" },
+{ 0x0018, 0x9623, 0, VR::DT, VM::M1, "FunctionalSyncPulse" },
+{ 0x0018, 0x9624, 0, VR::CS, VM::M1, "SettlingPhaseFrame" },
 { 0x0018, 0x9701, 0, VR::DT, VM::M1, "DecayCorrectionDateTime" },
 { 0x0018, 0x9715, 0, VR::FD, VM::M1, "StartDensityThreshold" },
 { 0x0018, 0x9716, 0, VR::FD, VM::M1, "StartRelativeDensityDifferenceThreshold" },
@@ -2100,6 +2134,11 @@ DictEntry DictContents[] = {
 { 0x0040, 0x4050, 0, VR::DT, VM::M1, "PerformedProcedureStepStartDateTime" },
 { 0x0040, 0x4051, 0, VR::DT, VM::M1, "PerformedProcedureStepEndDateTime" },
 { 0x0040, 0x4052, 0, VR::DT, VM::M1, "ProcedureStepCancellationDateTime" },
+{ 0x0040, 0x4070, 0, VR::SQ, VM::M1, "OutputDestinationSequence" },
+{ 0x0040, 0x4071, 0, VR::SQ, VM::M1, "DICOMStorageSequence" },
+{ 0x0040, 0x4072, 0, VR::SQ, VM::M1, "STOWRSStorageSequence" },
+{ 0x0040, 0x4073, 0, VR::UR, VM::M1, "StorageURL" },
+{ 0x0040, 0x4074, 0, VR::SQ, VM::M1, "XDSStorageSequence" },
 { 0x0040, 0x8302, 0, VR::DS, VM::M1, "EntranceDoseInmGy" },
 { 0x0040, 0x9092, 0, VR::SQ, VM::M1, "ParametricMapFrameTypeSequence" },
 { 0x0040, 0x9094, 0, VR::SQ, VM::M1, "ReferencedImageRealWorldValueMappingSequence" },
@@ -2108,6 +2147,8 @@ DictEntry DictContents[] = {
 { 0x0040, 0x9210, 0, VR::SH, VM::M1, "LUTLabel" },
 { 0x0040, 0x9211, 0, VR::XS, VM::M1, "RealWorldValueLastValueMapped" },
 { 0x0040, 0x9212, 0, VR::FD, VM::M1TN, "RealWorldValueLUTData" },
+{ 0x0040, 0x9213, 0, VR::FD, VM::M1, "DoubleFloatRealWorldValueLastValueMapped" },
+{ 0x0040, 0x9214, 0, VR::FD, VM::M1, "DoubleFloatRealWorldValueFirstValueMapped" },
 { 0x0040, 0x9216, 0, VR::XS, VM::M1, "RealWorldValueFirstValueMapped" },
 { 0x0040, 0x9220, 0, VR::SQ, VM::M1, "QuantityDefinitionSequence" },
 { 0x0040, 0x9224, 0, VR::FD, VM::M1, "RealWorldValueIntercept" },
@@ -2518,6 +2559,8 @@ DictEntry DictContents[] = {
 { 0x0062, 0x0010, 0, VR::CS, VM::M1, "SegmentationFractionalType" },
 { 0x0062, 0x0011, 0, VR::SQ, VM::M1, "SegmentedPropertyTypeModifierCodeSequence" },
 { 0x0062, 0x0012, 0, VR::SQ, VM::M1, "UsedSegmentsSequence" },
+{ 0x0062, 0x0020, 0, VR::UT, VM::M1, "TrackingID" },
+{ 0x0062, 0x0021, 0, VR::UI, VM::M1, "TrackingUID" },
 { 0x0064, 0x0002, 0, VR::SQ, VM::M1, "DeformableRegistrationSequence" },
 { 0x0064, 0x0003, 0, VR::UI, VM::M1, "SourceFrameOfReferenceUID" },
 { 0x0064, 0x0005, 0, VR::SQ, VM::M1, "DeformableRegistrationGridSequence" },
@@ -2552,13 +2595,13 @@ DictEntry DictContents[] = {
 { 0x0066, 0x001F, 0, VR::US, VM::M1, "VectorDimensionality" },
 { 0x0066, 0x0020, 0, VR::FL, VM::M1TN, "VectorAccuracy" },
 { 0x0066, 0x0021, 0, VR::OF, VM::M1, "VectorCoordinateData" },
-{ 0x0066, 0x0023, 0, VR::OW, VM::M1, "TrianglePointIndexList" },
-{ 0x0066, 0x0024, 0, VR::OW, VM::M1, "EdgePointIndexList" },
-{ 0x0066, 0x0025, 0, VR::OW, VM::M1, "VertexPointIndexList" },
+{ 0x0066, 0x0023, 1, VR::OW, VM::M1, "TrianglePointIndexList" },
+{ 0x0066, 0x0024, 1, VR::OW, VM::M1, "EdgePointIndexList" },
+{ 0x0066, 0x0025, 1, VR::OW, VM::M1, "VertexPointIndexList" },
 { 0x0066, 0x0026, 0, VR::SQ, VM::M1, "TriangleStripSequence" },
 { 0x0066, 0x0027, 0, VR::SQ, VM::M1, "TriangleFanSequence" },
 { 0x0066, 0x0028, 0, VR::SQ, VM::M1, "LineSequence" },
-{ 0x0066, 0x0029, 0, VR::OW, VM::M1, "PrimitivePointIndexList" },
+{ 0x0066, 0x0029, 1, VR::OW, VM::M1, "PrimitivePointIndexList" },
 { 0x0066, 0x002A, 0, VR::UL, VM::M1, "SurfaceCount" },
 { 0x0066, 0x002B, 0, VR::SQ, VM::M1, "ReferencedSurfaceSequence" },
 { 0x0066, 0x002C, 0, VR::UL, VM::M1, "ReferencedSurfaceNumber" },
@@ -2573,10 +2616,10 @@ DictEntry DictContents[] = {
 { 0x0066, 0x0036, 0, VR::LO, VM::M1, "AlgorithmName" },
 { 0x0066, 0x0037, 0, VR::FL, VM::M1, "RecommendedPointRadius" },
 { 0x0066, 0x0038, 0, VR::FL, VM::M1, "RecommendedLineThickness" },
-{ 0x0066, 0x0040, 0, VR::UL, VM::M1TN, "LongPrimitivePointIndexList" },
-{ 0x0066, 0x0041, 0, VR::UL, VM::M3T3N, "LongTrianglePointIndexList" },
-{ 0x0066, 0x0042, 0, VR::UL, VM::M2T2N, "LongEdgePointIndexList" },
-{ 0x0066, 0x0043, 0, VR::UL, VM::M1TN, "LongVertexPointIndexList" },
+{ 0x0066, 0x0040, 0, VR::OL, VM::M1, "LongPrimitivePointIndexList" },
+{ 0x0066, 0x0041, 0, VR::OL, VM::M1, "LongTrianglePointIndexList" },
+{ 0x0066, 0x0042, 0, VR::OL, VM::M1, "LongEdgePointIndexList" },
+{ 0x0066, 0x0043, 0, VR::OL, VM::M1, "LongVertexPointIndexList" },
 { 0x0066, 0x0101, 0, VR::SQ, VM::M1, "TrackSetSequence" },
 { 0x0066, 0x0102, 0, VR::SQ, VM::M1, "TrackSequence" },
 { 0x0066, 0x0103, 0, VR::OW, VM::M1, "RecommendedDisplayCIELabValueList" },
@@ -2753,6 +2796,7 @@ DictEntry DictContents[] = {
 { 0x0070, 0x0308, 0, VR::SQ, VM::M1, "RegistrationSequence" },
 { 0x0070, 0x0309, 0, VR::SQ, VM::M1, "MatrixRegistrationSequence" },
 { 0x0070, 0x030A, 0, VR::SQ, VM::M1, "MatrixSequence" },
+{ 0x0070, 0x030B, 0, VR::FD, VM::M16, "FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix" },
 { 0x0070, 0x030C, 0, VR::CS, VM::M1, "FrameOfReferenceTransformationMatrixType" },
 { 0x0070, 0x030D, 0, VR::SQ, VM::M1, "RegistrationTypeCodeSequence" },
 { 0x0070, 0x030F, 0, VR::ST, VM::M1, "FiducialDescription" },
@@ -2785,8 +2829,8 @@ DictEntry DictContents[] = {
 { 0x0070, 0x1302, 0, VR::CS, VM::M1, "VolumeCroppingMethod" },
 { 0x0070, 0x1303, 0, VR::FD, VM::M6, "BoundingBoxCrop" },
 { 0x0070, 0x1304, 0, VR::SQ, VM::M1, "ObliqueCroppingPlaneSequence" },
-{ 0x0070, 0x1305, 0, VR::FD, VM::M4, "ObliqueCroppingPlane" },
-{ 0x0070, 0x1306, 0, VR::FD, VM::M3, "ObliqueCroppingPlaneNormal" },
+{ 0x0070, 0x1305, 0, VR::FD, VM::M4, "Plane" },
+{ 0x0070, 0x1306, 0, VR::FD, VM::M3, "PlaneNormal" },
 { 0x0070, 0x1309, 0, VR::US, VM::M1, "CroppingSpecificationNumber" },
 { 0x0070, 0x1501, 0, VR::CS, VM::M1, "MultiPlanarReconstructionStyle" },
 { 0x0070, 0x1502, 0, VR::CS, VM::M1, "MPRThicknessType" },
@@ -2842,17 +2886,30 @@ DictEntry DictContents[] = {
 { 0x0072, 0x0052, 0, VR::AT, VM::M1TN, "SelectorSequencePointer" },
 { 0x0072, 0x0054, 0, VR::LO, VM::M1TN, "SelectorSequencePointerPrivateCreator" },
 { 0x0072, 0x0056, 0, VR::LO, VM::M1, "SelectorAttributePrivateCreator" },
+{ 0x0072, 0x005E, 0, VR::AE, VM::M1TN, "SelectorAEValue" },
+{ 0x0072, 0x005F, 0, VR::AS, VM::M1TN, "SelectorASValue" },
 { 0x0072, 0x0060, 0, VR::AT, VM::M1TN, "SelectorATValue" },
+{ 0x0072, 0x0061, 0, VR::DA, VM::M1TN, "SelectorDAValue" },
 { 0x0072, 0x0062, 0, VR::CS, VM::M1TN, "SelectorCSValue" },
+{ 0x0072, 0x0063, 0, VR::DT, VM::M1TN, "SelectorDTValue" },
 { 0x0072, 0x0064, 0, VR::IS, VM::M1TN, "SelectorISValue" },
+{ 0x0072, 0x0065, 0, VR::OB, VM::M1, "SelectorOBValue" },
 { 0x0072, 0x0066, 0, VR::LO, VM::M1TN, "SelectorLOValue" },
+{ 0x0072, 0x0067, 0, VR::OF, VM::M1, "SelectorOFValue" },
 { 0x0072, 0x0068, 0, VR::LT, VM::M1, "SelectorLTValue" },
+{ 0x0072, 0x0069, 0, VR::OW, VM::M1, "SelectorOWValue" },
 { 0x0072, 0x006A, 0, VR::PN, VM::M1TN, "SelectorPNValue" },
+{ 0x0072, 0x006B, 0, VR::TM, VM::M1TN, "SelectorTMValue" },
 { 0x0072, 0x006C, 0, VR::SH, VM::M1TN, "SelectorSHValue" },
+{ 0x0072, 0x006D, 0, VR::UN, VM::M1, "SelectorUNValue" },
 { 0x0072, 0x006E, 0, VR::ST, VM::M1, "SelectorSTValue" },
+{ 0x0072, 0x006F, 0, VR::UC, VM::M1TN, "SelectorUCValue" },
 { 0x0072, 0x0070, 0, VR::UT, VM::M1, "SelectorUTValue" },
+{ 0x0072, 0x0071, 0, VR::UR, VM::M1, "SelectorURValue" },
 { 0x0072, 0x0072, 0, VR::DS, VM::M1TN, "SelectorDSValue" },
+{ 0x0072, 0x0073, 0, VR::OD, VM::M1, "SelectorODValue" },
 { 0x0072, 0x0074, 0, VR::FD, VM::M1TN, "SelectorFDValue" },
+{ 0x0072, 0x0075, 0, VR::OL, VM::M1, "SelectorOLValue" },
 { 0x0072, 0x0076, 0, VR::FL, VM::M1TN, "SelectorFLValue" },
 { 0x0072, 0x0078, 0, VR::UL, VM::M1TN, "SelectorULValue" },
 { 0x0072, 0x007A, 0, VR::US, VM::M1TN, "SelectorUSValue" },
@@ -2982,6 +3039,20 @@ DictEntry DictContents[] = {
 { 0x0074, 0x1324, 0, VR::UL, VM::M1, "BeamOrderIndex" },
 { 0x0074, 0x1338, 0, VR::FD, VM::M1, "DoubleExposureMeterset" },
 { 0x0074, 0x133A, 0, VR::FD, VM::M4, "DoubleExposureFieldDelta" },
+{ 0x0074, 0x1401, 0, VR::SQ, VM::M1, "BrachyTaskSequence" },
+{ 0x0074, 0x1402, 0, VR::DS, VM::M1, "ContinuationStartTotalReferenceAirKerma" },
+{ 0x0074, 0x1403, 0, VR::DS, VM::M1, "ContinuationEndTotalReferenceAirKerma" },
+{ 0x0074, 0x1404, 0, VR::IS, VM::M1, "ContinuationPulseNumber" },
+{ 0x0074, 0x1405, 0, VR::SQ, VM::M1, "ChannelDeliveryOrderSequence" },
+{ 0x0074, 0x1406, 0, VR::IS, VM::M1, "ReferencedChannelNumber" },
+{ 0x0074, 0x1407, 0, VR::DS, VM::M1, "StartCumulativeTimeWeight" },
+{ 0x0074, 0x1408, 0, VR::DS, VM::M1, "EndCumulativeTimeWeight" },
+{ 0x0074, 0x1409, 0, VR::SQ, VM::M1, "OmittedChannelSequence" },
+{ 0x0074, 0x140A, 0, VR::CS, VM::M1, "ReasonForChannelOmission" },
+{ 0x0074, 0x140B, 0, VR::LO, VM::M1, "ReasonForChannelOmissionDescription" },
+{ 0x0074, 0x140C, 0, VR::IS, VM::M1, "ChannelDeliveryOrderIndex" },
+{ 0x0074, 0x140D, 0, VR::SQ, VM::M1, "ChannelDeliveryContinuationSequence" },
+{ 0x0074, 0x140E, 0, VR::SQ, VM::M1, "OmittedApplicationSetupSequence" },
 { 0x0076, 0x0001, 0, VR::LO, VM::M1, "ImplantAssemblyTemplateName" },
 { 0x0076, 0x0003, 0, VR::LO, VM::M1, "ImplantAssemblyTemplateIssuer" },
 { 0x0076, 0x0006, 0, VR::LO, VM::M1, "ImplantAssemblyTemplateVersion" },
@@ -3036,6 +3107,29 @@ DictEntry DictContents[] = {
 { 0x0080, 0x0011, 0, VR::OF, VM::M1TN, "VValueData" },
 { 0x0080, 0x0012, 0, VR::SQ, VM::M1, "ReferencedTextureSequence" },
 { 0x0080, 0x0013, 0, VR::SQ, VM::M1, "ReferencedSurfaceDataSequence" },
+{ 0x0082, 0x0001, 0, VR::CS, VM::M1, "AssessmentSummary" },
+{ 0x0082, 0x0003, 0, VR::UT, VM::M1, "AssessmentSummaryDescription" },
+{ 0x0082, 0x0004, 0, VR::SQ, VM::M1, "AssessedSOPInstanceSequence" },
+{ 0x0082, 0x0005, 0, VR::SQ, VM::M1, "ReferencedComparisonSOPInstanceSequence" },
+{ 0x0082, 0x0006, 0, VR::UL, VM::M1, "NumberOfAssessmentObservations" },
+{ 0x0082, 0x0007, 0, VR::SQ, VM::M1, "AssessmentObservationsSequence" },
+{ 0x0082, 0x0008, 0, VR::CS, VM::M1, "ObservationSignificance" },
+{ 0x0082, 0x000A, 0, VR::UT, VM::M1, "ObservationDescription" },
+{ 0x0082, 0x000C, 0, VR::SQ, VM::M1, "StructuredContraintObservationSequence" },
+{ 0x0082, 0x0010, 0, VR::SQ, VM::M1, "AssessedAttributeValueSequence" },
+{ 0x0082, 0x0016, 0, VR::LO, VM::M1, "AssessmentSetID" },
+{ 0x0082, 0x0017, 0, VR::SQ, VM::M1, "AssessmentRequesterSequence" },
+{ 0x0082, 0x0018, 0, VR::LO, VM::M1, "SelectorAttributeName" },
+{ 0x0082, 0x0019, 0, VR::LO, VM::M1, "SelectorAttributeKeyword" },
+{ 0x0082, 0x0021, 0, VR::SQ, VM::M1, "AssessmentTypeCodeSequence" },
+{ 0x0082, 0x0022, 0, VR::SQ, VM::M1, "ObservationBasisCodeSequence" },
+{ 0x0082, 0x0023, 0, VR::LO, VM::M1, "AssessmentLabel" },
+{ 0x0082, 0x0032, 0, VR::CS, VM::M1, "ConstraintType" },
+{ 0x0082, 0x0033, 0, VR::UT, VM::M1, "SpecificationSelectionGuidance" },
+{ 0x0082, 0x0034, 0, VR::SQ, VM::M1, "ConstraintValueSequence" },
+{ 0x0082, 0x0035, 0, VR::SQ, VM::M1, "RecommendedDefaultValueSequence" },
+{ 0x0082, 0x0036, 0, VR::CS, VM::M1, "ConstraintViolationSignificance" },
+{ 0x0082, 0x0037, 0, VR::UT, VM::M1, "ConstraintViolationCondition" },
 { 0x0088, 0x0130, 0, VR::SH, VM::M1, "StorageMediaFileSetID" },
 { 0x0088, 0x0140, 0, VR::UI, VM::M1, "StorageMediaFileSetUID" },
 { 0x0088, 0x0200, 0, VR::SQ, VM::M1, "IconImageSequence" },
@@ -3159,7 +3253,7 @@ DictEntry DictContents[] = {
 { 0x2100, 0x0040, 0, VR::DA, VM::M1, "CreationDate" },
 { 0x2100, 0x0050, 0, VR::TM, VM::M1, "CreationTime" },
 { 0x2100, 0x0070, 0, VR::AE, VM::M1, "Originator" },
-{ 0x2100, 0x0140, 1, VR::AE, VM::M1, "DestinationAE" },
+{ 0x2100, 0x0140, 0, VR::AE, VM::M1, "DestinationAE" },
 { 0x2100, 0x0160, 0, VR::SH, VM::M1, "OwnerID" },
 { 0x2100, 0x0170, 0, VR::IS, VM::M1, "NumberOfFilms" },
 { 0x2100, 0x0500, 1, VR::SQ, VM::M1, "ReferencedPrintJobSequencePullStoredPrint" },
@@ -3454,6 +3548,9 @@ DictEntry DictContents[] = {
 { 0x300A, 0x008D, 0, VR::FL, VM::M1, "AverageBeamDosePointDepth" },
 { 0x300A, 0x008E, 0, VR::FL, VM::M1, "AverageBeamDosePointEquivalentDepth" },
 { 0x300A, 0x008F, 0, VR::FL, VM::M1, "AverageBeamDosePointSSD" },
+{ 0x300A, 0x0090, 0, VR::CS, VM::M1, "BeamDoseType" },
+{ 0x300A, 0x0091, 0, VR::DS, VM::M1, "AlternateBeamDose" },
+{ 0x300A, 0x0092, 0, VR::CS, VM::M1, "AlternateBeamDoseType" },
 { 0x300A, 0x00A0, 0, VR::IS, VM::M1, "NumberOfBrachyApplicationSetups" },
 { 0x300A, 0x00A2, 0, VR::DS, VM::M3, "BrachyApplicationSetupDoseSpecificationPoint" },
 { 0x300A, 0x00A4, 0, VR::DS, VM::M1, "BrachyApplicationSetupDose" },
@@ -3556,7 +3653,7 @@ DictEntry DictContents[] = {
 { 0x300A, 0x012C, 0, VR::DS, VM::M3, "IsocenterPosition" },
 { 0x300A, 0x012E, 0, VR::DS, VM::M3, "SurfaceEntryPoint" },
 { 0x300A, 0x0130, 0, VR::DS, VM::M1, "SourceToSurfaceDistance" },
-{ 0x300A, 0x0131, 0, VR::FL, VM::M1, "AverageBeamDosePointSourceToExternalContourSurfaceDistance" },
+{ 0x300A, 0x0131, 0, VR::FL, VM::M1, "AverageBeamDosePointSourceToExternalContourDistance" },
 { 0x300A, 0x0132, 0, VR::FL, VM::M1, "SourceToExternalContourDistance" },
 { 0x300A, 0x0133, 0, VR::FL, VM::M3, "ExternalContourEntryPoint" },
 { 0x300A, 0x0134, 0, VR::DS, VM::M1, "CumulativeMetersetWeight" },
@@ -3568,6 +3665,12 @@ DictEntry DictContents[] = {
 { 0x300A, 0x014A, 0, VR::FL, VM::M1, "GantryPitchAngle" },
 { 0x300A, 0x014C, 0, VR::CS, VM::M1, "GantryPitchRotationDirection" },
 { 0x300A, 0x014E, 0, VR::FL, VM::M1, "GantryPitchAngleTolerance" },
+{ 0x300A, 0x0150, 0, VR::CS, VM::M1, "FixationEye" },
+{ 0x300A, 0x0151, 0, VR::DS, VM::M1, "ChairHeadFramePosition" },
+{ 0x300A, 0x0152, 0, VR::DS, VM::M1, "HeadFixationAngleTolerance" },
+{ 0x300A, 0x0153, 0, VR::DS, VM::M1, "ChairHeadFramePositionTolerance" },
+{ 0x300A, 0x0154, 0, VR::DS, VM::M1, "FixationLightAzimuthalAngleTolerance" },
+{ 0x300A, 0x0155, 0, VR::DS, VM::M1, "FixationLightPolarAngleTolerance" },
 { 0x300A, 0x0180, 0, VR::SQ, VM::M1, "PatientSetupSequence" },
 { 0x300A, 0x0182, 0, VR::IS, VM::M1, "PatientSetupNumber" },
 { 0x300A, 0x0183, 0, VR::LO, VM::M1, "PatientSetupLabel" },
@@ -3675,6 +3778,7 @@ DictEntry DictContents[] = {
 { 0x300A, 0x0304, 0, VR::IS, VM::M1, "RadiationAtomicNumber" },
 { 0x300A, 0x0306, 0, VR::SS, VM::M1, "RadiationChargeState" },
 { 0x300A, 0x0308, 0, VR::CS, VM::M1, "ScanMode" },
+{ 0x300A, 0x0309, 0, VR::CS, VM::M1, "ModulatedScanModeType" },
 { 0x300A, 0x030A, 0, VR::FL, VM::M2, "VirtualSourceAxisDistances" },
 { 0x300A, 0x030C, 0, VR::SQ, VM::M1, "SnoutSequence" },
 { 0x300A, 0x030D, 0, VR::FL, VM::M1, "SnoutPosition" },
@@ -3702,6 +3806,7 @@ DictEntry DictContents[] = {
 { 0x300A, 0x0350, 0, VR::CS, VM::M1, "PatientSupportType" },
 { 0x300A, 0x0352, 0, VR::SH, VM::M1, "PatientSupportID" },
 { 0x300A, 0x0354, 0, VR::LO, VM::M1, "PatientSupportAccessoryCode" },
+{ 0x300A, 0x0355, 0, VR::LO, VM::M1, "TrayAccessoryCode" },
 { 0x300A, 0x0356, 0, VR::FL, VM::M1, "FixationLightAzimuthalAngle" },
 { 0x300A, 0x0358, 0, VR::FL, VM::M1, "FixationLightPolarAngle" },
 { 0x300A, 0x035A, 0, VR::FL, VM::M1, "MetersetRate" },
@@ -3719,8 +3824,11 @@ DictEntry DictContents[] = {
 { 0x300A, 0x0388, 0, VR::FL, VM::M1, "RangeModulatorGatingStopWaterEquivalentThickness" },
 { 0x300A, 0x038A, 0, VR::FL, VM::M1, "IsocenterToRangeModulatorDistance" },
 { 0x300A, 0x0390, 0, VR::SH, VM::M1, "ScanSpotTuneID" },
+{ 0x300A, 0x0391, 0, VR::IS, VM::M1TN, "ScanSpotPrescribedIndices" },
 { 0x300A, 0x0392, 0, VR::IS, VM::M1, "NumberOfScanSpotPositions" },
+{ 0x300A, 0x0393, 0, VR::CS, VM::M1, "ScanSpotReordered" },
 { 0x300A, 0x0394, 0, VR::FL, VM::M1TN, "ScanSpotPositionMap" },
+{ 0x300A, 0x0395, 0, VR::CS, VM::M1, "ScanSpotReorderingAllowed" },
 { 0x300A, 0x0396, 0, VR::FL, VM::M1TN, "ScanSpotMetersetWeights" },
 { 0x300A, 0x0398, 0, VR::FL, VM::M2, "ScanningSpotSize" },
 { 0x300A, 0x039A, 0, VR::IS, VM::M1, "NumberOfPaintings" },
@@ -3755,6 +3863,18 @@ DictEntry DictContents[] = {
 { 0x300A, 0x0451, 0, VR::CS, VM::M1, "DeviceMotionExecutionMode" },
 { 0x300A, 0x0452, 0, VR::CS, VM::M1, "DeviceMotionObservationMode" },
 { 0x300A, 0x0453, 0, VR::SQ, VM::M1, "DeviceMotionParameterCodeSequence" },
+{ 0x300A, 0x0501, 0, VR::FL, VM::M1, "DistalDepthFraction" },
+{ 0x300A, 0x0502, 0, VR::FL, VM::M1, "DistalDepth" },
+{ 0x300A, 0x0503, 0, VR::FL, VM::M2, "NominalRangeModulationFractions" },
+{ 0x300A, 0x0504, 0, VR::FL, VM::M2, "NominalRangeModulatedRegionDepths" },
+{ 0x300A, 0x0505, 0, VR::SQ, VM::M1, "DepthDoseParametersSequence" },
+{ 0x300A, 0x0506, 0, VR::SQ, VM::M1, "DeliveredDepthDoseParametersSequence" },
+{ 0x300A, 0x0507, 0, VR::FL, VM::M1, "DeliveredDistalDepthFraction" },
+{ 0x300A, 0x0508, 0, VR::FL, VM::M1, "DeliveredDistalDepth" },
+{ 0x300A, 0x0509, 0, VR::FL, VM::M2, "DeliveredNominalRangeModulationFractions" },
+{ 0x300A, 0x0510, 0, VR::FL, VM::M2, "DeliveredNominalRangeModulatedRegionDepths" },
+{ 0x300A, 0x0511, 0, VR::CS, VM::M1, "DeliveredReferenceDoseDefinition" },
+{ 0x300A, 0x0512, 0, VR::CS, VM::M1, "ReferenceDoseDefinition" },
 { 0x300C, 0x0002, 0, VR::SQ, VM::M1, "ReferencedRTPlanSequence" },
 { 0x300C, 0x0004, 0, VR::SQ, VM::M1, "ReferencedBeamSequence" },
 { 0x300C, 0x0006, 0, VR::IS, VM::M1, "ReferencedBeamNumber" },
@@ -4770,231 +4890,232 @@ DictEntry DictContents[] = {
 { 0xFFFE, 0xE0DD, 0, VR::XX, VM::M0, "SequenceDelimitationItem" },
 };
 
-unsigned short DictTagHashTable[] = {
- 4097,  4132,  4153,  4174,  4193,  4212,  4231,  4252,  4269,  4284,
- 4297,  4310,  4321,  4334,  4351,  4362,  4373,  4398,  4419,  4440,
- 4457,  4472,  4489,  4502,  4519,  4542,  4559,  4576,  4593,  4606,
- 4619,  4632,  4645,  4674,  4691,  4716,  4735,  4752,  4765,  4786,
- 4797,  4816,  4835,  4854,  4871,  4890,  4905,  4922,  4935,  4958,
- 4983,  5006,  5025,  5038,  5055,  5068,  5087,  5106,  5133,  5154,
- 5179,  5202,  5221,  5238,  5259,  5300,  5345,  5384,  5421,  5456,
- 5483,  5518,  5553,  5590,  5619,  5652,  5675,  5704,  5723,  5748,
- 5773,  5810,  5851,  5880,  5911,  5930,  5961,  5982,  6009,  6038,
- 6057,  6080,  6105,  6130,  6153,  6168,  6185,  6206,  6227,  6248,
- 6267,  6282,  6299,  6314,  6331,  6342,  6361,  6380,  6395,  6408,
- 6425,  6432,  6437,  6460,  6481,  6502,  6523,  6548,  6567,  6590,
- 6613,  6632,  6649,  6662,  6683,  6694,  6707,  6716,  6725,  6746,
- 6759,  6774,  6783,  6796,  6807,  6820,  6829,  6850,  6857,  6874,
- 6885,  6900,  6907,  6924,  6935,  6956,  6965,  6984,  6997,  7008,
- 7015,  7028,  7035,  7052,  7061,  7078,  7087,  7106,  7117,  7136,
- 7141,  7154,  7163,  7168,  7177,  7182,  7191,  7198,  7209,  7218,
- 7223,  7230,  7235,  7240,  7247,  7252,  7257,  7268,  7279,  7286,
- 7293,  7300,  7307,  7310,  7315,  7322,  7329,  7334,  7341,  7344,
- 7347,  7354,  7357,  7374,  7393,  7406,  7417,  7432,  7453,  7472,
- 7483,  7498,  7511,  7528,  7539,  7552,  7561,  7580,  7591,  7610,
- 7625,  7642,  7651,  7660,  7667,  7680,  7691,  7706,  7717,  7734,
- 7745,  7758,  7767,  7780,  7791,  7800,  7811,  7822,  7827,  7836,
- 7839,  7848,  7851,  7860,  7865,  7878,  7889,  7900,  7907,  7914,
- 7917,  7928,  7941,  7952,  7959,  7966,  7975,  7984,  7989,  4096,
- 7994,  7999,  8002,  4096,  8005,  8010,  8015,  8028,  8041,  8048,
- 8063,  8082,  8093,  8106,  8127,  8142,  8159,  8162,  8171,  8180,
- 8195,  8204,  8219,  8234,  8247,  8258,  8269,  8284,  8299,  8312,
- 8323,  8334,  8349,  8356,  8369,  8376,  8387,  8394,  8403,  8412,
- 8419,  8426,  8431,  8444,  8451,  8460,  8469,  8480,  8487,  8494,
- 8499,  8510,  8521,  8528,  8535,  8542,  8547,  8556,  8561,  8572,
- 8579,  8590,  8597,  8604,  4096,  8609,  8612,  8623,  8632,  8639,
- 8644,  8655,  8668,  8685,  8700,  8715,  8732,  8745,  8764,  8781,
- 8790,  8805,  8814,  8831,  8844,  8855,  8870,  8887,  8902,  8911,
- 8920,  8935,  8950,  8965,  8980,  8993,  9004,  9013,  9016,  9031,
- 9040,  9049,  9056,  9077,  9094,  9111,  9122,  9145,  9154,  9177,
- 9198,  9219,  9230,  9243,  9252,  9269,  9280,  9293,  9298,  9317,
- 9330,  9341,  9350,  9369,  9382,  9403,  9418,  9433,  9440,  9455,
- 9460,  9479,  9490,  9505,  9514,  9519,  9524,  9529,  9532,  9547,
- 9550,  9555,  9560,  9565,  9574,  9583,  9592,  9601,  9610,  9615,
- 9622,  9629,  9636,  9643,  9646,  9659,  9666,  9671,  9674,  9687,
- 9690,  9695,  9700,  9705,  9714,  9723,  9732,  9735,  9740,  9745,
- 9748,  9761,  9768,  9773,  9776,  9781,  9786,  9789,  9794,  9801,
- 9804,  9809,  9812,  4096,  9815,  4096,  9818,  9833,  9836,  9841,
- 9844,  9853,  9860,  9863,  9866,  9879,  9882,  9895,  9900,  9923,
- 9936,  9959,  9966,  9989, 10002, 10023, 10034, 10059, 10074, 10101,
-10110, 10139, 10148, 10175, 10188, 10211, 10220, 10241, 10248, 10269,
-10282, 10305, 10312, 10339, 10352, 10379, 10390, 10417, 10428, 10457,
-10468, 10479, 10486, 10495, 10502, 10511, 10520, 10527, 10536, 10545,
-10552, 10561, 10568, 10579, 10586, 10597, 10604, 10613, 10618, 10625,
-10632, 10641, 10656, 10663, 10672, 10681, 10688, 10701, 10706, 10721,
-10728, 10741, 10748, 10755, 10764, 10769, 10774, 10777, 10780, 10785,
-10788, 10793, 10808, 10815, 10826, 10835, 10846, 10851, 10854, 10861,
-10872, 10877,  4096, 10886, 10891, 10894, 10897, 10906, 10915, 10922,
-10927, 10936, 10947, 10954, 10963, 10974, 10981, 10986, 10991, 10994,
-10997, 11004, 11009, 11018, 11027, 11036, 11043, 11048, 11055, 11062,
-11069, 11078, 11087,  4096,  4096,  4096, 11090, 11095, 11100, 11109,
-11116, 11125, 11136, 11145, 11158, 11169, 11178, 11189, 11198, 11203,
-11212,  4096, 11217, 11224, 11231, 11240, 11245, 11258, 11267, 11278,
-11287, 11294, 11303, 11312, 11321, 11326, 11329,  4096, 11332, 11335,
-11340,  4096, 11343, 11348, 11351, 11358, 11365, 11378, 11387, 11394,
-11399, 11404, 11409,  4096,  4096, 11414, 11417, 11424, 11431, 11438,
-11449, 11456, 11461, 11466, 11473, 11480, 11489, 11496, 11507, 11514,
-11517, 11520, 11527, 11538, 11545, 11554, 11563, 11566, 11575, 11582,
-11591, 11598, 11605, 11610, 11617, 11624, 11627, 11630, 11637, 11642,
-11645, 11648, 11651, 11656, 11659, 11662, 11665, 11672, 11677, 11680,
-11683, 11686, 11689, 11692, 11697, 11702, 11707, 11714,  4096,  4096,
-11721,  4096, 11724, 11731, 11738, 11741, 11746, 11749, 11752, 11755,
-11760, 11767,  4096,  4096,  4096,  4096,  4096, 11772, 11775,  4096,
- 4096, 11782, 11785, 11792, 11795,  4096, 11800,  4096, 11805,  4096,
-11810,  4096, 11815,  4096, 11818, 11825, 11832, 11841, 11848, 11853,
-11862, 11867, 11874, 11879, 11886, 11893, 11902, 11907, 11912, 11917,
-11924, 11931, 11938, 11945, 11952, 11959, 11966, 11973, 11980, 11993,
-12004, 12011, 12020, 12023, 12034, 12043, 12052, 12059, 12062, 12065,
-12070, 12075, 12080, 12085, 12088, 12091, 12096, 12099, 12102,  4096,
-12105, 12110, 12113, 12118, 12121, 12126, 12133, 12136, 12139,  4096,
- 4096, 12142, 12145,  4096, 12148,  4096, 12151, 12154, 12157, 12164,
-12171, 12180, 12185, 12192, 12195, 12200, 12205, 12212,  4096,  4096,
-12215, 12220,  4096, 12223, 12226,  4096, 12233,  4096, 12238, 12241,
- 4096, 12244,  4096, 12247, 12252,  4096,  4096, 12255,  4096,  4096,
-12258, 12263, 12266,  4096, 12269, 12274, 12279, 12282, 12285, 12290,
-12297, 12300, 12303, 12306, 12309, 12314, 12319, 12324, 12327, 12332,
-12335, 12346, 12351, 12356, 12363, 12368, 12373, 12376, 12383, 12386,
-12391, 12394, 12401, 12408, 12411, 12418, 12423, 12432, 12435, 12442,
-12445, 12448, 12451, 12454, 12459, 12470, 12475, 12482, 12487, 12490,
-12493, 12498, 12501, 12508, 12515,  4096, 12520, 12523, 12530, 12533,
-12540, 12545, 12552, 12559, 12568, 12571, 12574, 12577, 12582, 12589,
-12592, 12595, 12600, 12607,  4096, 12614, 12617, 12624, 12635, 12640,
-12647, 12650, 12653,  4096, 12658, 12663,  4096, 12668,  4096, 12675,
-12680, 12683, 12690, 12693, 12698, 12701, 12704, 12709, 12712, 12715,
-12718, 12721, 12726, 12729, 12732,  4096, 12735, 12738, 12741, 12744,
-12747, 12750, 12753, 12758, 12761, 12764, 12767, 12770, 12773, 12776,
-12779,  4096, 12782,  4096, 12785, 12788, 12791, 12794,  4096, 12797,
- 4096, 12800, 12805, 12808, 12813, 12816,  4096,  4096,  4096,  4096,
-12821,  4096, 12824,  4096, 12827,  4096,  4096, 12830, 12833, 12836,
-12841, 12844,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
-12849, 12860, 12865, 12874, 12881, 12890, 12899, 12906, 12917, 12924,
-12935, 12942, 12951, 12958, 12963, 12970, 12975, 12984, 12993, 13000,
-13005, 13012, 13019, 13024, 13031, 13038, 13043, 13050, 13057, 13064,
-13071, 13080, 13087, 13092, 13097, 13100, 13103, 13110, 13115, 13120,
- 4096,  4096,  4096, 13123,  4096,  4096,  4096,  4096, 13126, 13131,
-13136, 13139, 13142, 13145, 13148, 13151,  4096,  4096, 13154,  4096,
-13157, 13160, 13163, 13166, 13169, 13172,  4096, 13175, 13178, 13181,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 13186,  4096,
-13189, 13194,  4096, 13199, 13202, 13205, 13210,  4096,  4096, 13213,
- 4096, 13216,  4096,  4096, 13219,  4096,  4096, 13222,  4096, 13225,
- 4096,  4096,  4096, 13228, 13231, 13236, 13241, 13244,  4096,  4096,
-13249,  4096, 13252,  4096,  4096,  4096,  4096,  4096, 13257,  4096,
-13260, 13263, 13268, 13271, 13274,  4096,  4096,  4096,  4096, 13277,
-13282, 13287, 13292, 13303, 13308, 13313, 13318, 13321, 13324, 13327,
-13330, 13333,  4096, 13336,  4096, 13339, 13348, 13351, 13354, 13359,
- 4096, 13362,  4096, 13367, 13370, 13373,  4096,  4096,  4096, 13376,
-13379, 13382, 13385, 13388, 13393, 13398, 13403, 13406, 13411,  4096,
- 4096,  4096,  4096,  4096,  4096, 13414, 13417,  4096,  4096, 13420,
-13423, 13428, 13431, 13434,  4096, 13437, 13440, 13443, 13446, 13449,
-13452, 13455,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
-13458, 13461, 13464, 13467,  4096,  4096,  4096,  4096, 13470,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096, 13473, 13476, 13479, 13482,
-13485,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096, 13488,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 13491,
- 4096,  4096, 13494,  4096,  4096,  4096, 13497,  4096, 13502,  4096,
-13507,  4096, 13512,  4096, 13517,  4096, 13524,  4096, 13533, 13538,
-13541,  4096, 13546, 13551, 13554,  4096, 13559,  4096, 13564,  4096,
-13569, 13578, 13581, 13590, 13595, 13600, 13603, 13608,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096, 13611, 13614,  4096, 13617,
-13620, 13623, 13626, 13629,  4096, 13632, 13635, 13638, 13641, 13644,
-13647,  4096, 13650, 13653, 13656, 13659,  4096, 13662, 13665, 13668,
-13671, 13676, 13681,  4096, 13684, 13691, 13696, 13699,  4096,  4096,
-13702,  4096, 13705,  4096,  4096,  4096, 13708, 13711,  4096, 13714,
-13717,  4096, 13724,  4096,  4096,  4096, 13727,  4096, 13730, 13733,
- 4096,  4096, 13736, 13741, 13744, 13749, 13752, 13757, 13760, 13765,
-13770, 13773, 13776,  4096, 13779, 13784, 13789,  4096, 13792,  4096,
-13795,  4096, 13798, 13809, 13812, 13815,  4096,  4096, 13820,  4096,
- 4096,  4096,  4096,  4096, 13823, 13830, 13835,  4096, 13838, 13841,
-13844, 13849,  4096,  4096, 13856,  4096, 13859, 13862,  4096, 13865,
-13868, 13873, 13878, 13881, 13886, 13889,  4096,  4096,  4096,  4096,
- 4096, 13892, 13895, 13900, 13905, 13908, 13913, 13916, 13921, 13924,
-13929, 13934, 13939, 13942,  4096,  4096,  4096, 13947, 13950, 13953,
-13958,  4096, 13961, 13964, 13969, 13972,  4096, 13977, 13982, 13985,
- 4096,  4096,  4096,  4096, 13990, 13995,  4096,  4096,  4096,  4096,
- 4096,  4096, 14000,  4096,  4096,  4096, 14005,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 14008,  4096,
- 4096,  4096, 14013,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096, 14018,  4096,  4096,  4096, 14021,  4096,
+const unsigned short DictTagHashTable[] = {
+ 4097,  4132,  4155,  4176,  4197,  4216,  4235,  4256,  4275,  4290,
+ 4303,  4316,  4327,  4340,  4357,  4368,  4379,  4404,  4427,  4448,
+ 4467,  4482,  4501,  4514,  4533,  4556,  4575,  4594,  4613,  4626,
+ 4643,  4656,  4671,  4700,  4717,  4742,  4763,  4782,  4797,  4818,
+ 4829,  4848,  4867,  4886,  4903,  4924,  4941,  4958,  4971,  4994,
+ 5019,  5042,  5061,  5074,  5091,  5106,  5127,  5148,  5175,  5196,
+ 5221,  5244,  5263,  5280,  5301,  5342,  5387,  5428,  5467,  5502,
+ 5529,  5564,  5599,  5636,  5665,  5698,  5721,  5750,  5769,  5794,
+ 5819,  5856,  5897,  5926,  5957,  5976,  6007,  6028,  6055,  6086,
+ 6107,  6132,  6157,  6184,  6207,  6222,  6239,  6260,  6281,  6302,
+ 6321,  6336,  6353,  6368,  6385,  6396,  6415,  6434,  6449,  6462,
+ 6479,  6486,  6491,  6514,  6535,  6556,  6577,  6602,  6621,  6644,
+ 6667,  6686,  6703,  6716,  6737,  6748,  6761,  6770,  6779,  6800,
+ 6815,  6830,  6841,  6856,  6869,  6884,  6895,  6918,  6925,  6944,
+ 6955,  6972,  6979,  6996,  7007,  7030,  7039,  7058,  7071,  7082,
+ 7089,  7104,  7113,  7132,  7143,  7160,  7169,  7188,  7199,  7218,
+ 7223,  7236,  7247,  7254,  7265,  7270,  7279,  7286,  7297,  7306,
+ 7311,  7318,  7323,  7328,  7335,  7340,  7345,  7356,  7367,  7376,
+ 7385,  7394,  7403,  7408,  7415,  7422,  7429,  7434,  7441,  7444,
+ 7447,  7454,  7457,  7474,  7493,  7506,  7517,  7532,  7553,  7572,
+ 7583,  7598,  7611,  7628,  7639,  7652,  7661,  7680,  7691,  7710,
+ 7725,  7742,  7751,  7760,  7767,  7780,  7791,  7806,  7817,  7834,
+ 7845,  7858,  7867,  7880,  7891,  7900,  7911,  7922,  7927,  7936,
+ 7939,  7948,  7951,  7960,  7965,  7978,  7989,  8000,  8007,  8014,
+ 8017,  8028,  8041,  8052,  8059,  8066,  8075,  8084,  8089,  4096,
+ 8094,  8099,  8102,  4096,  8105,  8110,  8115,  8128,  8141,  8148,
+ 8163,  8182,  8193,  8206,  8227,  8242,  8259,  8262,  8271,  8280,
+ 8295,  8304,  8319,  8336,  8351,  8364,  8377,  8394,  8411,  8426,
+ 8439,  8452,  8467,  8474,  8487,  8494,  8505,  8512,  8521,  8530,
+ 8537,  8544,  8549,  8562,  8569,  8578,  8587,  8600,  8607,  8614,
+ 8619,  8630,  8641,  8650,  8659,  8668,  8675,  8686,  8693,  8706,
+ 8713,  8724,  8731,  8738,  4096,  8743,  8746,  8757,  8766,  8773,
+ 8778,  8789,  8802,  8819,  8834,  8849,  8866,  8879,  8898,  8915,
+ 8924,  8939,  8948,  8965,  8978,  8989,  9004,  9021,  9036,  9045,
+ 9054,  9069,  9084,  9099,  9114,  9127,  9138,  9147,  9150,  9165,
+ 9174,  9183,  9190,  9211,  9228,  9245,  9256,  9279,  9288,  9311,
+ 9332,  9353,  9364,  9377,  9386,  9403,  9414,  9427,  9432,  9451,
+ 9464,  9475,  9484,  9503,  9516,  9537,  9552,  9567,  9574,  9589,
+ 9594,  9613,  9624,  9639,  9648,  9653,  9658,  9663,  9666,  9681,
+ 9684,  9689,  9694,  9699,  9708,  9717,  9726,  9735,  9744,  9749,
+ 9756,  9763,  9770,  9777,  9780,  9793,  9800,  9805,  9808,  9821,
+ 9824,  9831,  9838,  9845,  9856,  9867,  9878,  9881,  9886,  9891,
+ 9894,  9907,  9914,  9919,  9922,  9927,  9932,  9935,  9940,  9947,
+ 9950,  9955,  9958,  4096,  9961,  4096,  9964,  9979,  9982,  9987,
+ 9990,  9999, 10006, 10009, 10012, 10025, 10028, 10041, 10046, 10069,
+10082, 10105, 10112, 10135, 10148, 10169, 10180, 10205, 10220, 10247,
+10256, 10285, 10294, 10321, 10334, 10357, 10366, 10387, 10394, 10417,
+10430, 10453, 10460, 10487, 10500, 10527, 10538, 10565, 10576, 10605,
+10616, 10627, 10634, 10643, 10650, 10659, 10668, 10675, 10684, 10693,
+10700, 10709, 10716, 10727, 10734, 10745, 10752, 10761, 10766, 10773,
+10780, 10789, 10804, 10811, 10820, 10829, 10836, 10849, 10854, 10869,
+10876, 10889, 10896, 10905, 10916, 10921, 10926, 10929, 10932, 10937,
+10940, 10945, 10960, 10969, 10982, 10993, 11006, 11013, 11018, 11025,
+11036, 11041,  4096, 11050, 11055, 11058, 11061, 11070, 11079, 11086,
+11091, 11100, 11111, 11118, 11127, 11140, 11147, 11152, 11159, 11162,
+11165, 11172, 11177, 11186, 11195, 11204, 11211, 11216, 11223, 11230,
+11237, 11246, 11255,  4096,  4096,  4096, 11258, 11263, 11268, 11277,
+11284, 11293, 11304, 11313, 11326, 11337, 11346, 11357, 11366, 11371,
+11380,  4096, 11385, 11392, 11399, 11408, 11413, 11426, 11435, 11446,
+11455, 11462, 11471, 11480, 11489, 11494, 11497,  4096, 11500, 11503,
+11508,  4096, 11511, 11516, 11519, 11526, 11533, 11546, 11555, 11562,
+11567, 11572, 11577,  4096,  4096, 11582, 11585, 11592, 11599, 11606,
+11617, 11624, 11629, 11634, 11641, 11648, 11657, 11664, 11675, 11682,
+11685, 11688, 11695, 11706, 11713, 11722, 11731, 11734, 11743, 11750,
+11759, 11766, 11773, 11778, 11785, 11792, 11795, 11798, 11805, 11810,
+11813, 11816, 11819, 11824, 11827, 11830, 11833, 11840, 11845, 11848,
+11851, 11854, 11857, 11860, 11865, 11870, 11875, 11882,  4096,  4096,
+11889,  4096, 11892, 11899, 11906, 11909, 11914, 11917, 11920, 11923,
+11928, 11935,  4096,  4096,  4096,  4096,  4096, 11940, 11943,  4096,
+ 4096, 11950, 11953, 11960, 11963,  4096, 11968,  4096, 11973,  4096,
+11978,  4096, 11983,  4096, 11986, 11993, 12000, 12009, 12016, 12021,
+12030, 12035, 12042, 12047, 12054, 12061, 12070, 12075, 12080, 12085,
+12092, 12099, 12106, 12113, 12120, 12127, 12134, 12141, 12148, 12161,
+12172, 12179, 12188, 12191, 12202, 12211, 12220, 12227, 12230, 12233,
+12238, 12243, 12248, 12253, 12256, 12259, 12264, 12267, 12270,  4096,
+12273, 12278, 12281, 12286, 12289, 12294, 12301, 12304, 12307,  4096,
+ 4096, 12310, 12313,  4096, 12316,  4096, 12319, 12322, 12325, 12332,
+12339, 12348, 12353, 12360, 12363, 12368, 12373, 12380,  4096,  4096,
+12383, 12388,  4096, 12391, 12394,  4096, 12401,  4096, 12406, 12409,
+ 4096, 12412,  4096, 12415, 12420,  4096,  4096, 12423,  4096,  4096,
+12426, 12431, 12434,  4096, 12437, 12442, 12447, 12450, 12453, 12458,
+12465, 12468, 12471, 12474, 12477, 12482, 12487, 12492, 12495, 12500,
+12503, 12514, 12519, 12524, 12531, 12536, 12541, 12544, 12551, 12554,
+12559, 12562, 12569, 12576, 12579, 12586, 12591, 12600, 12603, 12610,
+12613, 12616, 12619, 12622, 12627, 12638, 12643, 12650, 12655, 12658,
+12663, 12668, 12671, 12678, 12687, 12692, 12695, 12698, 12705, 12708,
+12715, 12720, 12727, 12734, 12743, 12746, 12749, 12752, 12757, 12764,
+12767, 12770, 12775, 12782,  4096, 12789, 12792, 12799, 12810, 12815,
+12822, 12825, 12828,  4096, 12833, 12838, 12843, 12846,  4096, 12853,
+12858, 12861, 12868, 12871, 12876, 12879, 12882, 12887, 12890, 12893,
+12896, 12899, 12904, 12907, 12910,  4096, 12913, 12916, 12919, 12922,
+12925, 12928, 12931, 12936, 12939, 12944, 12947, 12950, 12953, 12956,
+12959,  4096, 12962,  4096, 12965, 12968, 12971, 12974,  4096, 12977,
+ 4096, 12980, 12985, 12988, 12993, 12996,  4096,  4096,  4096,  4096,
+13001,  4096, 13004,  4096, 13007,  4096,  4096, 13010, 13013, 13016,
+13021, 13024,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+13029, 13040, 13045, 13054, 13061, 13070, 13079, 13086, 13097, 13104,
+13115, 13122, 13131, 13138, 13143, 13150, 13157, 13166, 13175, 13182,
+13187, 13194, 13201, 13206, 13213, 13220, 13225, 13232, 13239, 13246,
+13253, 13262, 13269, 13274, 13279, 13282, 13285, 13292, 13297, 13302,
+ 4096,  4096,  4096, 13305,  4096,  4096,  4096,  4096, 13308, 13313,
+13318, 13321, 13324, 13327, 13330, 13333,  4096,  4096, 13336,  4096,
+13339, 13342, 13345, 13348, 13351, 13354,  4096, 13357, 13360, 13363,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 13368,  4096,
+13371, 13376,  4096, 13381, 13384, 13387, 13392,  4096,  4096, 13395,
+ 4096, 13398,  4096,  4096, 13401,  4096, 13404, 13407, 13412, 13415,
+13420,  4096, 13423, 13426, 13431, 13438, 13445, 13448, 13455, 13458,
+13461, 13466, 13469,  4096,  4096,  4096,  4096,  4096, 13474,  4096,
+13477, 13480, 13485, 13488, 13491,  4096,  4096,  4096,  4096, 13494,
+13499, 13504, 13509, 13520, 13525, 13530, 13535, 13538, 13541, 13544,
+13547, 13550,  4096, 13553,  4096, 13556, 13565, 13568, 13571, 13576,
+ 4096, 13579,  4096, 13584, 13587, 13590,  4096,  4096,  4096, 13593,
+13596, 13599, 13604, 13609, 13616, 13623, 13628, 13631, 13636,  4096,
+ 4096,  4096,  4096,  4096,  4096, 13639, 13642,  4096,  4096, 13645,
+13648, 13653, 13656, 13659,  4096, 13662, 13665, 13668, 13671, 13674,
+13677, 13680,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+13683, 13686, 13689, 13692,  4096,  4096,  4096,  4096, 13695,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096, 13698, 13701, 13704, 13707,
+13710,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096, 13713,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 13716,
+ 4096,  4096, 13719,  4096,  4096,  4096, 13722,  4096, 13727,  4096,
+13732,  4096, 13737,  4096, 13742,  4096, 13749,  4096, 13758, 13763,
+13766,  4096, 13771, 13776, 13779,  4096, 13784,  4096, 13789,  4096,
+13794, 13803, 13806, 13815, 13820, 13825, 13828, 13833,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096, 13836, 13839,  4096, 13842,
+13845, 13848, 13851, 13854,  4096, 13857, 13860, 13863, 13866, 13869,
+13872,  4096, 13875, 13878, 13881, 13884,  4096, 13887, 13890, 13893,
+13896, 13901, 13906,  4096, 13909, 13916, 13921, 13924,  4096,  4096,
+13927,  4096, 13930,  4096,  4096,  4096, 13933, 13936,  4096, 13939,
+13942,  4096, 13949,  4096,  4096,  4096, 13952,  4096, 13955, 13958,
+ 4096,  4096, 13961, 13966, 13969, 13974, 13977, 13982, 13985, 13990,
+13995, 13998, 14001,  4096, 14004, 14009, 14014,  4096, 14017,  4096,
+14020,  4096, 14023, 14034, 14037, 14040,  4096,  4096, 14045,  4096,
+ 4096,  4096,  4096,  4096, 14048, 14055, 14060,  4096, 14063, 14066,
+14069, 14074,  4096,  4096, 14081,  4096, 14084, 14087,  4096, 14090,
+14093, 14098, 14103, 14106, 14111, 14114,  4096,  4096,  4096,  4096,
+ 4096, 14117, 14120, 14125, 14130, 14133, 14138, 14141, 14146, 14149,
+14154, 14159, 14164, 14167,  4096,  4096,  4096, 14172, 14175, 14178,
+14183,  4096, 14186, 14189, 14194, 14197,  4096, 14202, 14207, 14210,
+ 4096,  4096,  4096,  4096, 14215, 14220,  4096,  4096,  4096,  4096,
+ 4096,  4096, 14225,  4096,  4096,  4096, 14230,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 14233,  4096,
+ 4096,  4096, 14238,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096, 14243,  4096,  4096,  4096, 14246,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096, 14024,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096, 14027,  4096,  4096,
- 4096, 14030,  4096,  4096,  4096, 14033,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096, 14036,  4096,  4096,  4096, 14039,  4096,  4096,
+ 4096,  4096,  4096,  4096, 14249,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096, 14252,  4096,  4096,
+ 4096, 14255,  4096,  4096, 14258, 14261, 14264, 14267,  4096,  4096,
+ 4096,  4096,  4096, 14270, 14273, 14276, 14279, 14282, 14287, 14290,
+14293, 14296,  4096, 14299,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096, 14302,  4096,  4096, 14305, 14308,  4096, 14311,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 14314,
+ 4096,  4096,  4096,  4096,  4096,  4096, 14317, 14322,  4096,  4096,
+ 4096,  4096,  4096,  4096, 14327, 14330,  4096, 14333,  4096, 14336,
+14339,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+14342,  4096,  4096, 14345, 14348,  4096, 14351, 14354, 14357, 14360,
+14365,  4096,  4096,  4096,  4096,  4096, 14368,  4096, 14371, 14374,
+14377, 14380, 14385, 14388,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096, 14391, 14394, 14399, 14404, 14407, 14410, 14415, 14418,
+14423, 14428, 14431,  4096, 14436, 14439, 14442, 14445, 14448, 14453,
+14458, 14461, 14466, 14469, 14472, 14475, 14478, 14481, 14484,  4096,
+ 4096,  4096,  4096,  4096, 14487, 14490, 14493, 14498, 14501,  4096,
+ 4096, 14504, 14507, 14512, 14515, 14518, 14521,  4096,  4096,  4096,
+14524, 14527,  4096, 14532, 14537, 14540, 14545, 14550, 14555, 14558,
+ 4096,  4096,  4096,  4096,  4096,  4096, 14563, 14566, 14569, 14572,
+14575, 14578, 14581, 14584,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096, 14042,  4096,  4096, 14045, 14048,  4096, 14051,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 14054,
- 4096,  4096,  4096,  4096,  4096,  4096, 14057, 14062,  4096,  4096,
- 4096,  4096,  4096,  4096, 14067, 14070,  4096, 14073,  4096, 14076,
-14079,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
-14082,  4096,  4096, 14085, 14088,  4096, 14091, 14094, 14097, 14100,
-14105,  4096,  4096,  4096,  4096,  4096, 14108,  4096, 14111, 14114,
-14117, 14120, 14125, 14128,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096, 14131, 14134, 14139, 14144, 14147, 14150, 14155, 14158,
-14163, 14168, 14171,  4096, 14176, 14179, 14182, 14185, 14188, 14193,
-14198, 14201, 14206, 14209, 14212, 14215, 14218, 14221, 14224,  4096,
- 4096,  4096,  4096,  4096, 14227, 14230, 14233, 14238, 14241,  4096,
- 4096, 14244, 14247, 14252, 14255, 14258, 14261,  4096,  4096,  4096,
-14264, 14267,  4096, 14272, 14277, 14280, 14285, 14290, 14295, 14298,
- 4096,  4096,  4096,  4096,  4096,  4096, 14303, 14306, 14309, 14312,
-14315, 14318, 14321, 14324,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096, 14587,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096, 14327,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096, 14590, 14593,  4096, 14596,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096, 14330, 14333,  4096, 14336,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096, 14599, 14604,  4096,  4096,
+14607, 14610, 14613, 14616, 14619,  4096, 14624, 14627,  4096,  4096,
+ 4096,  4096, 14630, 14635, 14640,  4096, 14645, 14648, 14653, 14656,
+14659, 14662, 14665, 14668,  4096,  4096,  4096,  4096, 14671,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096, 14339, 14344,  4096,  4096,
-14347, 14350, 14353, 14356, 14359,  4096, 14364, 14367,  4096,  4096,
- 4096,  4096, 14370, 14375, 14380,  4096, 14385, 14388, 14393, 14396,
-14399, 14402, 14405, 14408,  4096,  4096,  4096,  4096, 14411,  4096,
+ 4096,  4096,  4096,  4096, 14674, 14677, 14680,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096, 14683,  4096, 14686,  4096,
+14691, 14696, 14699, 14702, 14705,  4096, 14710, 14713, 14718,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096, 14721, 14726, 14729,  4096,
+14732, 14735, 14738, 14741, 14744, 14749,  4096,  4096,  4096,  4096,
+ 4096,  4096, 14754,  4096,  4096, 14759, 14762, 14765, 14770, 14775,
+14780, 14783,  4096, 14786,  4096,  4096,  4096,  4096, 14789, 14792,
+ 4096, 14795, 14800, 14805, 14810, 14813, 14818, 14821, 14828, 14831,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096, 14414, 14417, 14420,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096, 14423,  4096, 14426,  4096,
-14431, 14436, 14439, 14442, 14445,  4096, 14450, 14453, 14458,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096, 14461, 14466, 14469,  4096,
-14472, 14475, 14478, 14481, 14484, 14489,  4096,  4096,  4096,  4096,
- 4096,  4096, 14494,  4096,  4096, 14499, 14502, 14505, 14510, 14515,
-14520, 14523,  4096, 14526,  4096,  4096,  4096,  4096, 14529, 14532,
- 4096, 14535, 14540, 14545, 14550, 14553, 14558, 14561, 14568, 14571,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096, 14836,  4096, 14841,  4096, 14846,  4096,
+14851,  4096, 14856,  4096, 14861,  4096, 14866,  4096, 14871,  4096,
+14876, 14881, 14886,  4096, 14891,  4096, 14896,  4096, 14901,  4096,
+14906,  4096, 14911,  4096, 14916,  4096,  4096, 14921,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096, 14576,  4096, 14581,  4096, 14586,  4096,
-14591,  4096, 14596,  4096, 14601,  4096, 14606,  4096, 14611,  4096,
-14616, 14621, 14626,  4096, 14631,  4096, 14636,  4096, 14641,  4096,
-14646,  4096, 14651,  4096, 14656,  4096,  4096, 14661,  4096,  4096,
+ 4096,  4096, 14924,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096, 14664,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096, 14927,  4096, 14932, 14935, 14938, 14941,
+14944, 14947, 14950, 14953, 14956, 14959, 14962,  4096,  4096,  4096,
+14965, 14968,  4096,  4096,  4096,  4096, 14971,  4096,  4096,  4096,
+14974, 14977,  4096, 14980,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096, 14667,  4096, 14672, 14675, 14678, 14681,
-14684, 14687, 14690, 14693, 14696, 14699, 14702,  4096,  4096,  4096,
-14705, 14708,  4096,  4096,  4096,  4096, 14711,  4096,  4096,  4096,
-14714, 14717,  4096, 14720,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096, 14983,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096, 14723,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 14986, 14989,
+14992, 14995,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096, 14998,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 14726, 14729,
-14732, 14735,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096, 14738,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096, 15001,  4096, 15004,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096, 14741,  4096, 14744,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
@@ -5002,8 +5123,8 @@ unsigned short DictTagHashTable[] = {
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+15007, 15010, 15013,  4096, 15016,  4096, 15019,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
-14747, 14750, 14753,  4096, 14756,  4096, 14759,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
@@ -5016,30 +5137,30 @@ unsigned short DictTagHashTable[] = {
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096, 15022,  4096, 15025, 15032, 15035, 15042, 15045, 15052,
+15055, 15062, 15065, 15074, 15077, 15086, 15089, 15096, 15099, 15106,
+15109, 15116, 15119, 15126, 15129, 15136, 15139, 15146, 15149, 15156,
+15159, 15166, 15169, 15178, 15181, 15190,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096, 14762,  4096, 14765, 14772, 14775, 14782, 14785, 14792,
-14795, 14802, 14805, 14814, 14817, 14826, 14829, 14836, 14839, 14846,
-14849, 14856, 14859, 14866, 14869, 14876, 14879, 14886, 14889, 14896,
-14899, 14906, 14909, 14918, 14921, 14930,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096, 15193,  4096, 15196,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096, 14933,  4096, 14936,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096, 15199,  4096, 15202,  4096, 15205, 15208,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096, 14939,  4096, 14942,  4096, 14945, 14948,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096, 15211,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096, 15214, 15217,  4096, 15220, 15223, 15226, 15229, 15232,
+ 4096, 15235,  4096, 15238, 15241, 15244, 15247, 15250,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096, 14951,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096, 14954, 14957,  4096, 14960, 14963, 14966, 14969, 14972,
- 4096, 14975,  4096, 14978, 14981, 14984, 14987, 14990,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
@@ -5063,8 +5184,8 @@ unsigned short DictTagHashTable[] = {
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096, 15253,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096, 14993,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
@@ -5129,16 +5250,16 @@ unsigned short DictTagHashTable[] = {
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 15256,
+ 4096,  4096,  4096,  4096,  4096,  4096, 15259, 15262,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 14996,
- 4096,  4096,  4096,  4096,  4096,  4096, 14999, 15002,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096, 15265,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 15268,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096, 15271,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096, 15005,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 15008,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096, 15011,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 15274,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 15014,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
@@ -5147,13 +5268,13 @@ unsigned short DictTagHashTable[] = {
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096, 15277,  4096,  4096, 15280,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 15283,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096, 15017,  4096,  4096, 15020,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 15023,  4096,
+ 4096,  4096,  4096,  4096, 15286,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096, 15026,  4096,  4096,  4096,  4096,  4096,
+15289, 15292,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
-15029, 15032,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
@@ -5163,13 +5284,12 @@ unsigned short DictTagHashTable[] = {
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096, 15295,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096, 15035,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 15298,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096, 15038,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
-15041,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
+15301,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
@@ -5181,2746 +5301,2800 @@ unsigned short DictTagHashTable[] = {
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
  4096,  4096,  4096,  4096,  4096,  4096,     0,    17,     2,     2,
-   34,     8,   122,  4169,   223,    16,   990, 37457,  1229,    32,
- 1369,    34,  1489,    36,  1829,    50,  2020,  4097,  2263,    70,
- 2839,   114,  3119,   162,  3782, 16384,  3795,   268,  4751, 65530,
- 4752, 65532,    10,     3,     3,   121,  4168,   245,  4176,   989,
-37456,  1490,    37,  1830,    51,  2934,  4148,  3046,  1025,  3280,
-  196,  3462,   200,    10,     0,     0,   278,    16,   992, 37459,
- 1230,    34,  1367,    32,  2022,  4099,  2262,    68,  2838,   112,
- 3047,  1026,  3118,   160,     9,     1,     1,   991, 37458,  1368,
-   33,  1851,  4208,  2021,  4098,  2935,  4150,  3048,  1027,  3281,
-  198,  3463,   202,     9,   994, 37461,  1231,    36,  1487,    32,
- 2024,  4101,  2261,    66,  2420,    80,  2841,   118,  3049,  1028,
- 3791,   264,     9,   993, 37460,  1409,  4198,  1488,    33,  2023,
- 4100,  2421,    81,  2932,  4144,  3278,   192,  3464,   204,  3792,
-  265,    10,   996, 37463,  1232,    38,  1408,  4197,  1831,    52,
- 2026,  4103,  2260,    64,  2422,    82,  2840,   116,  2987,   112,
- 3793,   266,     8,   995, 37462,  1832,    53,  2025,  4102,  2423,
-   83,  2933,  4146,  3279,   194,  3465,   206,  3794,   267,     7,
-  481,    16,   998, 37465,  1866,    48,  2028,  4105,  2843,   122,
- 3003,   112,  3810, 16384,     6,    31,     1,   120,  4160,   565,
- 4176,   997, 37464,  2027,  4104,  3455,   192,     6,   482,    18,
- 1000, 37467,  1370,    40,  1867,    50,  2842,   120,  3457,   195,
-    5,   483,    19,   999, 37466,  2029,  4106,  3336,   192,  3456,
-  194,     6,   484,    20,  1002, 37469,  1491,    40,  2845,   126,
- 3459,   197,  3787,   256,     8,    32,     5,   485,    21,  1001,
-37468,  2846,   127,  2936,  4152,  3282,   200,  3458,   196,  3788,
-  257,     5,    33,     6,  1004, 37471,  2844,   124,  3461,   199,
- 3789,   258,     5,  1003, 37470,  2937,  4154,  3460,   198,  3764,
-  192,  3790,   259,    12,     5,    18,    41,    24,   564,  4169,
-  988, 37441,  1233,    48,  1373,    50,  1494,    52,  2031,  4113,
- 2677,    96,  2831,    98,  2924,  4133,  3475,   217,    10,     6,
-   19,   244,  4160,   563,  4168,   987, 37440,  1258,  4208,  1495,
-   53,  2030,  4112,  2457,  4100,  2923,  4132,  3474,   216,    10,
-    4,    16,    42,    26,  1234,    50,  1371,    48,  1496,    54,
- 2678,    98,  2830,    96,  2926,  4135,  3094,   128,  3477,   219,
-    8,    43,    27,  1372,    49,  1497,    55,  1849,  4192,  2032,
- 4114,  2458,  4102,  2925,  4134,  3476,   218,     7,     7,    22,
- 1375,    54,  2265,    82,  2455,  4097,  2833,   102,  3479,   221,
- 3802,   280,     8,     8,    23,   315,  4160,  1235,    53,  1376,
-   55,  2454,  4096,  2921,  4128,  3478,   220,  3803,   281,     6,
- 1492,    50,  2264,    80,  2679,   102,  2832,   100,  2986,    96,
- 3804,   282,     8,  1236,    55,  1374,    53,  1493,    51,  1850,
- 4196,  2456,  4098,  2680,   103,  2922,  4130,  3480,   222,    11,
-   35,    16,   556,  4161,  1595,    48,  1864,    32,  2094, 37393,
- 2681,   104,  2835,   106,  2931,  4141,  3002,    96,  3467,   209,
- 3799,   276,     8,   123,  4176,   555,  4160,  1596,    49,  1865,
-   33,  2093, 37392,  2930,  4140,  3466,   208,  3800,   277,     8,
-    9,    24,    36,    18,   558,  4163,  1377,    56,  1597,    50,
- 1887,    32,  2834,   104,  3469,   211,     8,    37,    19,   124,
- 4178,   557,  4162,  1378,    57,  2095, 37394,  3337,   208,  3468,
-  210,  3801,   279,     6,    38,    20,   560,  4165,  1498,    56,
- 1598,    52,  2837,   110,  3471,   213,     6,    39,    21,   559,
- 4164,  1499,    57,  2927,  4136,  3470,   212,  3796,   273,     6,
-   40,    22,   562,  4167,  2836,   108,  2929,  4139,  3473,   215,
- 3797,   274,     6,   561,  4166,  2096, 37398,  2928,  4138,  3472,
-  214,  3765,   208,  3798,   275,    14,   228,    48,   304,    52,
-  505,    56,   588,  4217,  1257,  4161,  1308, 37449,  1339,     2,
- 1588,     8,  1828,    18,  1886,    26,  2672,    80,  2827,    82,
- 3082,   162,  3490,   233,     8,   506,    57,   587,  4216,  1256,
- 4160,  1307, 37448,  1340,     3,  1589,     9,  2673,    81,  3489,
-  232,    12,    50,    42,   229,    50,   281,    48,   507,    58,
- 1590,    10,  1847,  4177,  1859,    26,  2269,   100,  2674,    82,
- 2826,    80,  3080,   160,  3492,   235,     9,   282,    49,  1338,
-    1,  1402,  4160,  1846,  4176,  1860,    27,  2675,    83,  2985,
-   85,  3081,   161,  3491,   234,     8,   302,    48,  1343,     6,
- 1861,    28,  2267,    98,  2428,   112,  2563,    66,  2829,    86,
- 3494,   237,     6,  1344,     7,  1862,    29,  2268,    99,  2429,
-  113,  2564,    67,  3493,   236,    10,   303,    50,  1341,     4,
- 1848,  4181,  1863,    30,  2266,    96,  2430,   114,  2561,    64,
- 2828,    84,  3083,   164,  3496,   239,     5,  1342,     5,  1403,
- 4164,  2431,   115,  2562,    65,  3495,   238,     9,    44,    32,
-  497,    48,   580,  4209,  1303, 37441,  1347,    10,  1671,  4161,
- 1855,    16,  3001,    80,  3482,   225,     9,    45,    33,   125,
- 4192,   498,    49,   579,  4208,  1348,    11,  1670,  4160,  1856,
-   17,  2097, 37408,  3481,   224,     9,    46,    34,   499,    50,
-  582,  4211,  1345,     8,  1583,     2,  1885,    16,  2676,    90,
- 3084,   168,  3484,   227,     8,    47,    35,   126,  4194,   500,
-   51,   581,  4210,  1346,     9,  1584,     3,  3338,   224,  3483,
-  226,     9,    48,    36,   501,    52,   584,  4213,  1304, 37445,
- 1351,    14,  1585,     4,  1857,    20,  2099, 37413,  3486,   229,
-    7,    49,    37,   502,    53,   583,  4212,  1217,    13,  1586,
-    5,  2098, 37412,  3485,   228,     8,   503,    54,   586,  4215,
- 1218,    14,  1306, 37447,  1349,    12,  1587,     6,  1858,    22,
- 3488,   231,     6,   504,    55,   585,  4214,  1305, 37446,  1350,
-   13,  3487,   230,  3766,   224,    11,   224,    32,   299,    36,
-  494,    40,   575,  4201,  1219,    16,  1354,    18,  1405,  4179,
- 1854,     8,  2274,   118,  2669,    64,  3505,   249,    12,   225,
-   33,   246,  4192,   300,    37,   495,    41,   574,  4200,  1005,
-37472,  1220,    17,  1355,    19,  2275,   119,  2670,    65,  2915,
- 4100,  3504,   248,    11,   226,    34,   279,    32,   496,    42,
- 1221,    18,  1352,    16,  1485,    22,  1845,  4161,  2272,   116,
- 2671,    66,  2825,    64,  3507,   251,     9,   280,    33,   576,
- 4202,  1222,    19,  1353,    17,  1404,  4176,  1844,  4160,  2273,
-  117,  2916,  4102,  3506,   250,     6,   227,    36,  1223,    20,
- 1358,    22,  1482,    16,  2424,    96,  3095,   166,     8,   577,
- 4204,  1224,    21,  1359,    23,  1483,    17,  2425,    97,  2913,
- 4096,  3096,   167,  3508,   252,     6,  1225,    22,  1356,    20,
- 1484,    18,  2270,   112,  2426,    98,  2984,    64,     9,   298,
-   35,   578,  4206,  1226,    23,  1357,    21,  1406,  4180,  2271,
-  113,  2427,    99,  2914,  4098,  3509,   254,     9,    51,    48,
-  486,    32,   567,  4193,  1227,    24,  1310, 37457,  1362,    26,
- 1591,    16,  1673,  4177,  1826,    10,    13,    52,    49,   127,
- 4208,   487,    33,   566,  4192,  1228,    25,  1309, 37456,  1363,
-   27,  1592,    17,  1672,  4176,  2919,  4108,  3340,   242,  3497,
-  240,  3770,   246,    10,    53,    50,   488,    34,   569,  4195,
- 1312, 37459,  1360,    24,  1407,  4185,  1593,    18,  1675,  4179,
- 3097,   168,  3499,   243,    12,    54,    51,   128,  4210,   489,
-   35,   568,  4194,  1311, 37458,  1361,    25,  1674,  4178,  2920,
- 4110,  3098,   169,  3339,   240,  3498,   242,  3769,   244,    11,
-   55,    52,   301,    40,   490,    36,   571,  4197,  1314, 37461,
- 1366,    30,  1486,    24,  1594,    20,  1677,  4181,  1853,     4,
- 3501,   245,     9,    56,    53,   491,    37,   570,  4196,  1313,
-37460,  1676,  4180,  2917,  4104,  3342,   246,  3500,   244,  3768,
-  242,     8,   492,    38,   573,  4199,  1316, 37463,  1364,    28,
- 1749, 24976,  1827,    12,  1883,     4,  3503,   247,    10,   493,
-   39,   572,  4198,  1315, 37462,  1365,    29,  1678,  4182,  1884,
-    5,  2918,  4106,  3341,   244,  3502,   246,  3767,   240,    20,
-  240,  4112,   465, 20752,   547,  4120,  1255,  4128,  1301, 37416,
- 1521,   101,  1610,   105,  1841,  4146,  1921,     1,  2385,    19,
- 2406,    21,  2544,    39,  3059,     0,  3264,   132,  3434,   136,
- 3905,   260,  3933,   262,  4118,   276,  4168,   272,  4195,   274,
-   22,   231,    80,   311,    84,   466, 20753,   548,  4121,  1239,
-   96,  1520,   100,  1609,   104,  1842,  4147,  2238,     4,  2333,
-    8,  2360,    16,  2384,    18,  2405,    20,  2543,    38,  2819,
-   50,  2982,    54,  3060,     1,  3134,   130,  3265,   133,  3435,
-  137,  3906,   261,  3982,   259,    19,   286,    81,   467, 20754,
-  549,  4122,  1523,   103,  1839,  4144,  1923,     3,  2239,     7,
- 2362,    19,  2383,    17,  2408,    23,  2542,    37,  3061,     2,
- 3266,   134,  3436,   138,  3907,   262,  3931,   260,  4144,   276,
- 4169,   274,  4194,   272,    18,   285,    80,   312,    86,   468,
-20755,   550,  4123,  1240,    98,  1522,   102,  1840,  4145,  1922,
-    2,  2361,    18,  2407,    22,  2541,    36,  2818,    48,  2981,
-   52,  3062,     3,  3133,   128,  3437,   139,  3932,   261,  3956,
-  259,    17,   313,  4112,   469, 20756,   975, 37396,  1517,    97,
- 1925,     5,  2235,     1,  2364,    21,  2402,    17,  2540,    35,
- 3063,     4,  3262,   128,  3438,   140,  3957,   260,  3985,   262,
- 4116,   272,  4143,   274,  4170,   276,    13,   212, 37381,   309,
-   80,   470, 20757,  1516,    96,  1924,     4,  2363,    20,  2387,
-   22,  2401,    16,  2980,    50,  3064,     5,  3439,   141,  3930,
-  259,  3958,   261,    17,   213, 37382,   471, 20758,  1394,  4132,
- 1519,    99,  1843,  4148,  1927,     7,  2237,     3,  2366,    23,
- 2404,    19,  2539,    33,  3263,   130,  3440,   142,  3959,   262,
- 3983,   260,  4117,   274,  4142,   272,  4196,   276,    17,   214,
-37383,   310,    82,   472, 20759,   976, 37399,  1395,  4133,  1518,
-   98,  1926,     6,  2236,     2,  2365,    22,  2386,    20,  2403,
-   18,  2538,    32,  2820,    52,  2979,    48,  3441,   143,  3904,
-  259,  3984,   261,    18,    58,    65,   114,  4096,   215, 37384,
-  473, 20760,   541,  4112,   977, 37400,  1604,    97,  1929,     9,
- 2328,     1,  2368,    25,  2552,    47,  3331,   130,  3430,   128,
- 4009,   260,  4037,   262,  4222,   276,  4272,   272,  4299,   274,
-   14,    57,    64,   216, 37385,   474, 20761,   510,    80,   542,
- 4113,   978, 37401,  1299, 37409,  1603,    96,  1928,     8,  2367,
-   24,  2551,    46,  2822,    58,  4010,   261,  4086,   259,    16,
-  475, 20762,   543,  4114,  1300, 37410,  1396,  4136,  1606,    99,
- 1931,    11,  2330,     3,  2370,    27,  2550,    45,  3330,   128,
- 3431,   130,  4011,   262,  4035,   260,  4248,   276,  4273,   274,
- 4298,   272,    11,    59,    66,   476, 20763,  1397,  4137,  1605,
-   98,  1930,    10,  2329,     2,  2369,    26,  2549,    44,  2821,
-   56,  4036,   261,  4060,   259,    14,   477, 20764,   544,  4116,
- 1525,   105,  1607,   101,  2241,     9,  2372,    29,  2548,    43,
- 3267,   136,  3432,   132,  4061,   260,  4089,   262,  4220,   272,
- 4247,   274,  4274,   276,     9,   478, 20765,  1524,   104,  2240,
-    8,  2371,    28,  2409,    24,  2547,    42,  2824,    62,  4034,
-  259,  4062,   261,    12,   479, 20766,   545,  4118,  2243,    11,
- 2332,     7,  2546,    41,  3433,   134,  3761,   128,  4063,   262,
- 4087,   260,  4221,   274,  4246,   272,  4300,   276,    12,   363,
-12441,   480, 20767,   546,  4119,  1608,   102,  2242,    10,  2331,
-    6,  2373,    30,  2545,    40,  2823,    60,  2983,    56,  4008,
-  259,  4088,   261,    18,   236,  4096,   307,    69,   449, 20736,
-  540,  4104,   974, 37376,  1302, 37432,  1531,   117,  1933,    17,
- 2233,    19,  2377,     3,  2559,    55,  2665,    33,  3065,     0,
- 3910,   276,  3960,   272,  3987,   274,  4113,   260,  4141,   262,
-   20,    66,    88,   230,    64,   237,  4097,   284,    66,   306,
-   68,   450, 20737,  1241,   112,  1398,  4147,  1530,   116,  1932,
-   16,  2171, 41626,  2232,    18,  2252,    22,  2376,     2,  2558,
-   54,  2664,    32,  2814,    34,  2998,    40,  4114,   261,  4190,
-  259,    14,   238,  4098,   451, 20738,  1533,   119,  1837,  4128,
- 2231,    17,  2251,    21,  2375,     1,  2557,    53,  2667,    35,
- 3936,   276,  3961,   274,  3986,   272,  4115,   262,  4139,   260,
-   15,   283,    64,   308,    70,   452, 20739,  1532,   118,  1838,
- 4129,  1934,    18,  2230,    16,  2250,    20,  2556,    52,  2666,
-   34,  2813,    32,  2999,    42,  3135,   144,  4140,   261,  4164,
-  259,     9,   453, 20740,  1527,   113,  2245,    17,  2380,     7,
- 3908,   272,  3935,   274,  3962,   276,  4165,   260,  4193,   262,
-   15,   217, 37397,   239,  4101,   454, 20741,  1400,  4151,  1526,
-  112,  1806, 37429,  2244,    16,  2249,    18,  2359,     4,  2379,
-    6,  2555,    50,  2668,    36,  2816,    38,  4138,   259,  4166,
-  261,    10,   362, 12416,   455, 20742,  1529,   115,  2247,    19,
- 2554,    49,  3909,   274,  3934,   272,  3988,   276,  4167,   262,
- 4191,   260,    13,   305,    66,   456, 20743,  1399,  4149,  1528,
-  114,  2234,    20,  2246,    18,  2378,     4,  2553,    48,  2815,
-   36,  2978,    32,  3000,    46,  4112,   259,  4192,   261,    14,
-   61,    81,   115,  4112,   457, 20744,   533,  4096,   754, 20740,
- 1612,   113,  1872,    97,  2335,    17,  3333,   146,  4014,   276,
- 4064,   272,  4091,   274,  4217,   260,  4245,   262,     9,    60,
-   80,   458, 20745,   508,    64,  1611,   112,  1871,    96,  2334,
-   16,  2995,    32,  4218,   261,  4294,   259,    11,    63,    83,
-  459, 20746,   534,  4098,  2337,    19,  2382,     9,  3332,   144,
- 4040,   276,  4065,   274,  4090,   272,  4219,   262,  4243,   260,
-   12,    62,    82,   460, 20747,   509,    66,   535,  4099,  1401,
- 4153,  1873,    98,  2168, 41616,  2336,    18,  2381,     8,  2817,
-   40,  4244,   261,  4268,   259,    12,   461, 20748,   536,  4100,
-  752, 20736,  1535,   121,  2170, 41623,  2248,    25,  2339,    21,
- 4012,   272,  4039,   274,  4066,   276,  4269,   260,  4297,   262,
-   11,    64,    84,   462, 20749,   537,  4101,   753, 20737,  1534,
-  120,  1874,   100,  2169, 41622,  2338,    20,  2996,    36,  4242,
-  259,  4270,   261,     7,   463, 20750,   538,  4102,  4013,   274,
- 4038,   272,  4092,   276,  4271,   262,  4295,   260,     8,    65,
-   86,   464, 20751,   539,  4103,  2253,    24,  2560,    56,  2997,
-   38,  4216,   259,  4296,   261,    10,   243,  4144,  1249,  4096,
- 1503,    69,  2033,  4192,  2395,    51,  2491,     3,  2508,     5,
- 2660,    17,  2948,  4180,  3269,   164,    10,    71,   104,   292,
-  114,   982, 37425,  1250,  4097,  1380,    66,  1502,    68,  1935,
-   32,  2490,     2,  2659,    16,  2811,    18,    10,   291,   113,
-  983, 37426,  1251,  4098,  1379,    65,  1835,  4112,  2394,    49,
- 2489,     1,  2509,     7,  2949,  4182,  3270,   166,     9,  1252,
- 4099,  1504,    70,  1836,  4113,  2393,    48,  2417,    54,  2517,
-    4,  2661,    18,  2810,    16,  2950,  4183,     7,   984, 37428,
- 1253,  4100,  2414,    49,  2516,     3,  2663,    21,  2946,  4176,
- 3268,   160,     8,  1254,  4101,  1388,  4103,  1500,    64,  2397,
-   54,  2413,    48,  2494,     6,  2515,     2,  2662,    20,     7,
-  985, 37430,  1937,    39,  2416,    51,  2493,     5,  2507,     3,
- 2514,     1,  2947,  4178,     8,  1501,    66,  1936,    38,  2396,
-   52,  2415,    50,  2492,     4,  2506,     2,  2812,    20,  2977,
-   16,     5,    68,    97,   513,   113,   554,  4144,  2498,    11,
- 3442,   160,     9,    67,    96,   512,   112,   986, 37433,  1599,
-   64,  1870,    80,  2400,    58,  2497,    10,  2523,    14,  2994,
-   16,     9,   515,   115,  1382,    73,  1389,  4104,  2399,    57,
- 2496,     9,  2512,    15,  2522,    13,  3334,   160,  3443,   162,
-    7,    69,    98,   514,   114,  1381,    72,  1390,  4105,  2398,
-   56,  2495,     8,  2521,    12,     6,   517,   117,  2419,    57,
- 2502,    15,  2511,     9,  2520,    11,  3444,   164,     8,    70,
-  100,   516,   116,  1383,    78,  1505,    72,  2418,    56,  2501,
-   14,  2510,     8,  2519,    10,     3,  2500,    13,  2518,     9,
- 3762,   160,     2,  2254,    40,  2499,    12,    11,   241,  4128,
-  289,    99,   979, 37408,  1392,  4114,  1511,    85,  1938,    49,
- 2530,    23,  2651,     1,  2940,  4164,  3273,   180,  3450,   184,
-   10,   242,  4129,   288,    98,  1237,    80,  1510,    84,  2258,
-   54,  2374,    32,  2505,    18,  2529,    22,  2803,     2,  2972,
-    6,    10,  1391,  4112,  1513,    87,  1833,  4096,  1940,    51,
- 2504,    17,  2528,    21,  2653,     3,  2941,  4166,  3274,   182,
- 3451,   186,    10,   287,    96,  1238,    82,  1512,    86,  1834,
- 4097,  1939,    50,  2257,    52,  2503,    16,  2652,     2,  3275,
-  183,  3452,   187,    12,   314,  4128,  1386,    87,  1507,    81,
- 1941,    53,  2390,    39,  2411,    33,  2527,    19,  2655,     5,
- 2938,  4160,  2971,     3,  3271,   176,  3453,   188,     9,  1385,
-   86,  1506,    80,  2256,    50,  2389,    38,  2410,    32,  2513,
-   16,  2526,    18,  2654,     4,  2805,     6,    11,   118,  4158,
-  980, 37414,  1384,    85,  1509,    83,  1602,    95,  2388,    37,
- 2525,    17,  2939,  4162,  2970,     1,  3272,   178,  3454,   190,
-   11,   119,  4159,   218, 37431,   290,   100,   981, 37415,  1508,
-   82,  1942,    54,  2255,    48,  2412,    34,  2524,    16,  2656,
-    6,  2804,     4,     9,   116,  4144,   551,  4128,  1601,    81,
- 1943,    57,  2537,    31,  2658,     9,  2944,  4172,  2993,     1,
- 3445,   176,     8,    72,   112,   511,    96,  1600,    80,  1868,
-   64,  2536,    30,  2657,     8,  2807,    10,  2976,    14,     6,
-  117,  4146,   552,  4130,  2392,    41,  2945,  4174,  3335,   176,
- 3446,   178,    10,   553,  4131,  1298, 37395,  1387,    88,  1393,
- 4121,  1944,    58,  2391,    40,  2535,    28,  2806,     8,  2975,
-   12,  3447,   179,     5,  1515,    89,  2534,    27,  2942,  4168,
- 3276,   184,  3448,   180,     6,  1514,    88,  1869,    68,  2533,
-   26,  2809,    14,  2974,    10,  3277,   185,     4,  2532,    25,
- 2943,  4170,  3449,   182,  3763,   176,     4,  2259,    56,  2531,
-   24,  2808,    12,  2973,     8,    10,   321,  8212,  2051, 12289,
- 3012,     2,  3087,    16,  3114,    32,  3414,    75,  4364, 16384,
- 4392,   256,  4418,   258,  4594,   272,     6,  2488, 12320,  3013,
-    3,  3204,    66,  3258,    70,  3309,    72,  3413,    74,     7,
-  322,  8214,  3203,    65,  3257,    69,  4389, 16384,  4393,   258,
- 4417,   256,  4619,   272,     4,  3011,     1,  3202,    64,  3256,
-   68,  3412,    72,     6,  3016,     6,  3417,    79,  4342,   256,
- 4368,   258,  4414, 16384,  4544,   272,     5,   352, 12368,  3017,
-    7,  3220,    64,  3255,    66,  3416,    78,     6,   320,  8210,
- 3014,     4,  4343,   258,  4367,   256,  4439, 16384,  4569,   272,
-    4,  3015,     5,  3221,    66,  3254,    64,  3415,    76,    10,
-   75,   130,   325,  8220,   722,  8208,  1243,   170,  3303,    65,
- 3409,    67,  4464, 16384,  4492,   256,  4518,   258,  4694,   272,
-    3,   530,   147,  3302,    64,  3408,    66,     8,    73,   128,
-  326,  8222,   528,   144,  3018,     8,  4489, 16384,  4493,   258,
- 4517,   256,  4719,   272,     5,    74,   129,   529,   145,  3019,
-    9,  3304,    66,  3407,    64,     7,   323,  8216,  1748, 24864,
- 3306,    69,  4442,   256,  4468,   258,  4514, 16384,  4644,   272,
-    3,  3305,    68,  3411,    70,  3754,    64,     8,   324,  8218,
-  531,   148,  3260,    73,  3308,    71,  4443,   258,  4467,   256,
- 4539, 16384,  4669,   272,     5,   532,   149,  3259,    72,  3307,
-   70,  3410,    68,  3755,    66,    10,   251,  8192,   317,  8196,
- 3022,    18,  3066,    16,  3115,    48,  3125,    32,  4394,   272,
- 4564, 16384,  4592,   256,  4618,   258,     4,   293,   129,  3023,
-   19,  3207,    82,  3224,    84,     9,   294,   130,   318,  8198,
-  526,   136,  3020,    16,  3206,    81,  4419,   272,  4589, 16384,
- 4593,   258,  4617,   256,     6,   295,   131,   527,   137,  3021,
-   17,  3205,    80,  3225,    86,  3314,    90,     5,   296,   132,
- 4344,   272,  4542,   256,  4568,   258,  4614, 16384,     3,   297,
-  133,   351, 12352,  3222,    80,     6,    80,   156,   316,  8194,
- 4369,   272,  4543,   258,  4567,   256,  4639, 16384,     3,    81,
-  157,  3223,    82,  3261,    80,     8,    77,   146,   520,   130,
- 3421,    83,  3758,    85,  4494,   272,  4664, 16384,  4692,   256,
- 4718,   258,     4,   521,   131,   716,  8193,  3310,    80,  3420,
-   82,     8,    76,   144,   518,   128,   717,  8194,  3419,    81,
- 4519,   272,  4689, 16384,  4693,   258,  4717,   256,     4,   519,
-  129,   718,  8195,  3311,    82,  3418,    80,     9,    79,   150,
-  319,  8200,   524,   134,   719,  8196,  3757,    81,  4444,   272,
- 4642,   256,  4668,   258,  4714, 16384,     5,   525,   135,   720,
- 8197,  3226,    88,  3312,    84,  3756,    80,     9,    78,   148,
-  522,   132,   721,  8198,  3067,    30,  3422,    85,  4469,   272,
- 4643,   258,  4667,   256,  4739, 16384,     2,   523,   133,  3313,
-   86,     6,   359, 12405,  1540,   134,  3068,    32,  3088,    48,
- 3124,    16,  3129,    96,     4,   358, 12404,  1541,   135,  2482,
-12288,  3322,   104,     2,   361, 12407,  1242,   128,     4,   360,
-12406,  1539,   133,  2483, 12290,  3323,   106,     2,   327,  8240,
-  355, 12401,     4,   354, 12400,  1538,   131,  2484, 12292,  3227,
-   96,     3,   328,  8242,   357, 12403,  1536,   128,     5,   356,
-12402,  1537,   129,  2485, 12294,  3228,    98,  3760,   106,     4,
-  724,  8240,  1615,   130,  1722,  8192,  3316,    97,     2,  2486,
-12296,  3315,    96,     3,  1613,   128,  1723,  8194,  3318,    99,
-    2,  1614,   129,  3317,    98,     2,  1742, 24832,  3320,   101,
-    3,  1743, 24833,  3319,   100,  3759,    96,     2,  1542,   136,
- 1744, 24834,     2,  1543,   137,  3321,   102,     5,  1550,   150,
- 3069,    48,  3113,    16,  3130,   112,  3429,   123,     5,  1551,
-  151,  2487, 12304,  3231,   116,  3328,   120,  3428,   122,     3,
- 1548,   148,  3131,   114,  3427,   121,     3,  1549,   149,  3329,
-  122,  3426,   120,     3,  1546,   146,  2992,   192,  3132,   116,
-    3,   353, 12384,  1547,   147,  3229,   112,     1,  1544,   144,
-    2,  1545,   145,  3230,   114,     3,   723,  8224,  1618,   146,
- 1747, 24852,     3,  1619,   147,  3324,   112,  3425,   114,     2,
- 1616,   144,  3424,   113,     3,  1617,   145,  3325,   114,  3423,
-  112,     1,  1745, 24848,     1,  3326,   116,     3,  1552,   152,
- 1620,   148,  1746, 24850,     1,  3327,   118,     8,  2039,  8193,
- 3183,     2,  3210,     4,  3234,     6,  3383,    10,  3750,    12,
- 4401,  4352,  4428,  4354,     9,  3070,    64,  3090,    80,  3138,
-   16,  3147,   320,  3184,     3,  3211,     5,  3384,    11,  4402,
- 4353,  4429,  4355,     6,   249,  4240,  3212,     6,  3233,     4,
- 3751,    14,  4403,  4354,  4426,  4352,     5,  3010,   184,  3091,
-   82,  3382,     9,  4404,  4355,  4427,  4353,     7,  1007, 37526,
- 2041,  8197,  3232,     2,  3386,    14,  3747,     8,  4351,  4352,
- 4378,  4354,    10,   344, 12305,  1008, 37527,  2040,  8196,  2276,
-  128,  2991,   176,  3092,    84,  3208,     1,  3748,     9,  4352,
- 4353,  4379,  4355,     9,   345, 12306,  2043,  8199,  3185,     4,
- 3209,     2,  3385,    12,  3749,    10,  3780,     8,  4353,  4354,
- 4376,  4352,     5,  1006, 37525,  2042,  8198,  2434,   144,  4354,
- 4355,  4377,  4353,     7,  2045,  8201,  3186,    10,  3215,    12,
- 3377,     2,  3744,     4,  4501,  4352,  4528,  4354,     6,   201,
-12289,  2044,  8200,  3007,   178,  3378,     3,  4502,  4353,  4529,
- 4355,     8,   129,  4224,   597,  4240,  1009, 37528,  3216,    14,
- 3745,     6,  3778,     4,  4503,  4354,  4526,  4352,     5,  3006,
-  176,  3746,     7,  3779,     5,  4504,  4355,  4527,  4353,     6,
- 3189,    14,  3213,     8,  3380,     6,  3777,     2,  4451,  4352,
- 4478,  4354,     4,  3009,   182,  3381,     7,  4452,  4353,  4479,
- 4355,     9,   130,  4228,   598,  4244,  3187,    12,  3214,    10,
- 3235,     8,  3379,     4,  3743,     2,  4453,  4354,  4476,  4352,
-    5,  3008,   180,  3188,    13,  3236,     9,  4454,  4355,  4477,
- 4353,     9,  2047,  8209,  2279,   149,  3127,    17,  3192,    18,
- 3219,    20,  3240,    22,  3394,    26,  4601,  4352,  4628,  4354,
-    7,  2046,  8208,  2278,   148,  3071,    80,  3089,    64,  3126,
-   16,  4602,  4353,  4629,  4355,     8,   247,  4224,   596,  4232,
- 2280,   151,  3190,    16,  3239,    20,  3393,    24,  4603,  4354,
- 4626,  4352,     4,   248,  4225,  3191,    17,  4604,  4355,  4627,
- 4353,     4,  3217,    16,  3238,    18,  4551,  4352,  4578,  4354,
-    3,  2990,   160,  4552,  4353,  4579,  4355,     6,  2049,  8215,
- 2433,   129,  3218,    18,  3237,    16,  4553,  4354,  4576,  4352,
-    5,  2048,  8214,  2277,   146,  2432,   128,  4554,  4355,  4577,
- 4353,     7,   202, 12304,   591,  4226,   725,  8257,  3283,    16,
- 3388,    18,  4701,  4352,  4728,  4354,     5,   203, 12305,   592,
- 4227,  3389,    19,  4702,  4353,  4729,  4355,     8,   131,  4240,
-  204, 12306,   589,  4224,   727,  8259,  3284,    18,  3387,    16,
- 4703,  4354,  4726,  4352,     5,   590,  4225,   726,  8258,  3005,
-  160,  4704,  4355,  4727,  4353,     6,   595,  4230,   729,  8261,
- 3285,    20,  3392,    22,  4651,  4352,  4678,  4354,     4,   728,
- 8260,  2281,   152,  4652,  4353,  4679,  4355,     6,   593,  4228,
- 3241,    24,  3286,    22,  3390,    20,  4653,  4354,  4676,  4352,
-    5,   594,  4229,   730,  8262,  3391,    21,  4654,  4355,  4677,
- 4353,     4,  3073,    97,  3194,    34,  3245,    38,  3403,    42,
-    5,  3072,    96,  3116,    64,  3128,    32,  3148,   352,  3404,
-   43,     5,  3075,    99,  3193,    32,  3244,    36,  3292,    42,
- 3402,    40,     2,  3074,    98,  3293,    43,     4,  3076,   101,
- 3196,    38,  3243,    34,  3294,    44,     1,  2989,   144,     4,
- 3077,   103,  3195,    36,  3242,    32,  3405,    44,     1,  3406,
-   45,     4,  1727, 12288,  3078,   105,  3287,    32,  3397,    34,
-    2,  3288,    33,  3398,    35,     6,  1679,  4224,  1728, 12290,
- 3197,    40,  3248,    44,  3289,    34,  3395,    32,     5,  1729,
-12291,  3004,   144,  3079,   106,  3198,    41,  3396,    33,     5,
- 1730, 12292,  3247,    42,  3290,    36,  3400,    38,  3752,    32,
-    3,  2167, 41508,  3291,    37,  3401,    39,     3,  1731, 12294,
- 3246,    40,  3753,    34,     1,  3399,    37,     5,   348, 12324,
- 1410,  4240,  2685,   131,  3200,    50,  3251,    54,     6,  2684,
-  130,  2847,   128,  3093,    96,  3117,    80,  3139,    32,  3149,
-  368,     5,   349, 12326,  1411,  4242,  2683,   129,  3199,    48,
- 3300,    58,     3,  1412,  4243,  2682,   128,  3301,    59,     3,
-  346, 12320,  1413,  4244,  2688,   135,     4,  1414,  4245,  2687,
-  134,  2988,   128,  3250,    51,     4,   347, 12322,  1415,  4246,
- 3201,    52,  3249,    48,     2,  1416,  4247,  2686,   132,     2,
- 1732, 12304,  3295,    48,     2,  1680,  4240,  3296,    50,     1,
- 3297,    51,     1,   350, 12328,     2,  3252,    56,  3298,    54,
-    2,  3253,    57,  3299,    55,     6,    13,  4417,    92,   268,
-  376, 16404,  1568,   288,  2083, 16448,  3864,  4177,     6,    93,
-  269,   377, 16405,  2037,  4356,  2084, 16449,  3903,    64,  3911,
- 4097,     3,   378, 16406,  1569,   290,  3866,  4179,     7,    14,
- 4418,    94,   271,   379, 16407,   630,  4446,  3865,  4178,  3929,
-   64,  3937,  4097,     9,    11,   258,    90,   264,   372, 16400,
- 1053, 37713,  1570,   292,  2034,  4353,  2296,   326,  3050,  1280,
- 3868,  4181,     5,   373, 16401,  2297,   327,  3867,  4180,  3955,
-   64,  3963,  4097,     6,    10,   256,   144,  4427,   374, 16402,
- 1055, 37715,  1571,   294,  2036,  4355,    10,    91,   267,   143,
- 4426,   375, 16403,   629,  4442,  1054, 37714,  2035,  4354,  2295,
-  325,  3869,  4182,  3981,    64,  3989,  4097,     7,    86,   260,
-  142,  4421,   205, 16384,   384, 16412,   627,  4437,  1637,   292,
- 3871,  4185,     8,    87,   261,   385, 16413,   626,  4436,   751,
-20560,  1638,   293,  3870,  4184,  4007,    64,  4015,  4097,     1,
-   88,   262,     4,    89,   263,   628,  4438,  4033,    64,  4041,
- 4097,     4,    82,   256,   380, 16408,   623,  4433,  1633,   288,
-    7,    83,   257,   141,  4416,   381, 16409,   622,  4432,  1634,
-  289,  4059,    64,  4067,  4097,     4,    84,   258,   382, 16410,
-  625,  4435,  1635,   290,     7,    85,   259,   383, 16411,   624,
- 4434,  1636,   291,  3154,   153,  4085,    64,  4093,  4097,     7,
-  276, 16384,   365, 16388,  1051, 37701,  2085, 16464,  2460,  4353,
- 3781,    16,  3856,  4161,     6,  1050, 37700,  2086, 16465,  2459,
- 4352,  3811,     1,  4111,    64,  4119,  4097,     5,   366, 16390,
- 2087, 16466,  2462,  4355,  3812,     2,  3858,  4163,     5,  1052,
-37702,  2461,  4354,  3857,  4162,  4137,    64,  4145,  4097,     7,
-  101,   280,   621,  4425,  1047, 37697,  2464,  4357,  3051,  1296,
- 3813,     4,  3860,  4165,     7,   102,   281,   232,   257,  1046,
-37696,  2463,  4356,  3859,  4164,  4163,    64,  4171,  4097,     6,
-  233,   258,   258,  8576,   364, 16386,  1049, 37699,  3165,   160,
- 3862,  4167,     5,   147,  4442,  1048, 37698,  3861,  4166,  4189,
-   64,  4197,  4097,     5,    97,   276,   146,  4437,   369, 16396,
-  618,  4421,   737, 16384,     7,    98,   277,   617,  4420,   750,
-20544,  3581,   468,  3863,  4168,  4215,    64,  4223,  4097,     3,
-   99,   278,   370, 16398,   620,  4423,     6,   100,   279,   371,
-16399,   619,  4422,  3582,   470,  4241,    64,  4249,  4097,     3,
-   95,   272,   367, 16392,   614,  4417,     5,   145,  4432,   613,
- 4416,  3579,   464,  4267,    64,  4275,  4097,     3,    96,   274,
-  368, 16394,   616,  4419,     4,   615,  4418,  3580,   466,  4293,
-   64,  4301,  4097,     4,   395, 16436,  1272, 16384,  1553,   256,
- 3884,  4209,     3,   396, 16437,  1245,   261,  3883,  4208,     3,
-  397, 16438,  1554,   258,  3886,  4211,     2,  1555,   259,  3885,
- 4210,     6,   391, 16432,  1244,   256,  1556,   260,  1629,   264,
- 3052,  1312,  3887,  4213,     3,   392, 16433,  1557,   261,  1630,
-  265,     4,   260,  8624,   393, 16434,  1558,   262,  3889,  4215,
-    4,   394, 16435,  1431,  4416,  1559,   263,  3888,  4214,     5,
-  400, 16444,  1560,   264,  1625,   260,  1734, 16384,  3891,  4217,
-    3,   152,  4452,  1626,   261,  3890,  4216,     3,   153,  4455,
- 1627,   262,  3893,  4219,     2,  1628,   263,  3892,  4218,     5,
-  103,   288,   149,  4449,   398, 16440,  1621,   256,  3895,  4221,
-    5,   104,   289,   148,  4448,   636,  4464,  1622,   257,  3894,
- 4220,     3,   151,  4451,   399, 16442,  1623,   258,     3,   150,
- 4450,  1624,   259,  3896,  4222,     3,   388, 16420,  1561,   272,
- 3873,  4193,     2,  2760,  4356,  3872,  4192,     4,   389, 16422,
- 1434,  4437,  1562,   274,  1852, 16384,     2,  1563,   275,  3874,
- 4194,     5,   386, 16416,  1246,   272,  1433,  4435,  1564,   276,
- 2757,  4353,     3,  1056, 37728,  1565,   277,  3875,  4196,     5,
-  259,  8608,   387, 16418,  2759,  4355,  3164,   128,  3876,  4199,
-    3,  1432,  4432,  1566,   279,  2758,  4354,     3,  1567,   280,
- 1882, 16384,  3878,  4201,     2,   634,  4452,  3877,  4200,     1,
-  635,  4454,     5,   390, 16424,   632,  4449,  1631,   272,  1875,
-  256,  3880,  4205,     4,   631,  4448,  1632,   273,  1876,   257,
- 3879,  4204,     3,  1435,  4441,  1877,   258,  3882,  4207,     2,
-  633,  4450,  3881,  4206,     5,  1023, 37652,  2052, 16385,  3822,
- 4112,  4107,    16,  4363, 12288,     6,   405, 16468,  1024, 37653,
- 1423,  4391,  2284,   258,  3823,  4113,  3950,     5,     8,   407,
-16471,  1025, 37654,  2054, 16387,  2283,   257,  2573,   289,  3824,
- 4114,  4133,    16,  4388, 12288,     7,   406, 16470,  1026, 37655,
- 1422,  4389,  2053, 16386,  2282,   256,  3825,  4115,  3976,     5,
-    7,   403, 16465,  1019, 37648,  1421,  4386,  2056, 16389,  3826,
- 4116,  4159,    16,  4413, 12288,     8,   402, 16464,  1020, 37649,
- 1945,   256,  2055, 16388,  2286,   262,  2345,   264,  3827,  4117,
- 3898,     5,     6,  1021, 37650,  2058, 16391,  2575,   293,  3828,
- 4118,  4185,    16,  4438, 12288,     9,   262,  8656,   404, 16466,
- 1022, 37651,  1420,  4385,  2057, 16390,  2285,   260,  2574,   292,
- 3829,  4119,  3924,     5,     8,   602,  4372,   739, 20496,  2059,
-16393,  2342,   261,  3559,   388,  3830,  4120,  4211,    16,  4463,
-12288,     4,   411, 16476,  3783,    64,  3831,  4121,  4054,     5,
-    7,   740, 20498,  2188, 41861,  2344,   263,  2576,   297,  3832,
- 4122,  4237,    16,  4488, 12288,     4,  2343,   262,  3784,    66,
- 3833,  4123,  4080,     5,     8,   132,  4352,   409, 16473,   600,
- 4368,  1027, 37656,  3556,   384,  3834,  4124,  4263,    16,  4513,
-12288,     6,   408, 16472,   601,  4369,  1028, 37657,  2340,   256,
- 3835,  4125,  4002,     5,     5,  1424,  4392,  3557,   386,  3836,
- 4126,  4289,    16,  4538, 12288,     7,   410, 16474,  2088, 33538,
- 2187, 41856,  2341,   258,  3558,   387,  3837,  4127,  4028,     5,
-    8,   448, 20484,  1013, 37636,  2061, 16401,  2436,   257,  2579,
-  307,  2912,   289,  3899,    16,  4563, 12288,     7,  1014, 37637,
- 2060, 16400,  2435,   256,  2578,   306,  2911,   288,  3814,  4097,
- 4158,     5,     4,  1015, 37638,  1429,  4404,  3925,    16,  4588,
-12288,     4,  1016, 37639,  1430,  4405,  2577,   304,  4184,     5,
-    7,   250,  4352,  1427,  4402,  2062, 16405,  3564,   408,  3815,
- 4100,  3951,    16,  4613, 12288,     7,   401, 16448,  1010, 37633,
- 1428,  4403,  3053,  1360,  3565,   409,  3816,  4101,  4106,     5,
-    7,   447, 20482,  1011, 37634,  1425,  4400,  3566,   410,  3817,
- 4102,  3977,    16,  4638, 12288,     7,   261,  8640,  1012, 37635,
- 1426,  4401,  2063, 16406,  2580,   308,  3818,  4103,  4132,     5,
-    6,   738, 20480,  2065, 16409,  3562,   404,  3819,  4104,  4003,
-   16,  4663, 12288,     5,   135,  4373,  2064, 16408,  3785,    80,
- 3820,  4105,  4262,     5,     4,  3563,   406,  3821,  4106,  4029,
-   16,  4688, 12288,     1,  4288,     5,     7,   133,  4368,   599,
- 4352,  1017, 37640,  2347,   273,  3560,   400,  4055,    16,  4713,
-12288,     4,   134,  4369,  1018, 37641,  2346,   272,  4210,     5,
-    4,  2349,   275,  3561,   402,  4081,    16,  4738, 12288,     3,
- 2189, 41872,  2348,   274,  4236,     5,    10,  1042, 37684,  1273,
-20480,  1324, 37644,  2067, 16417,  2289,   291,  2567,   259,  3058,
- 1381,  3900,    32,  3927,    34,  4110,    48,     8,   417, 16500,
- 1043, 37685,  1325, 37645,  2066, 16416,  2288,   290,  2566,   258,
- 3057,  1380,  3849,  4145,     8,  1274, 20482,  1326, 37646,  2069,
-16419,  2287,   289,  2565,   257,  3901,    34,  3926,    32,  4136,
-   48,     5,   418, 16502,  1044, 37687,  1327, 37647,  2068, 16418,
- 3850,  4147,    11,   611,  4408,  1039, 37680,  1320, 37640,  2070,
-16421,  2571,   263,  3054,  1377,  3571,   424,  3851,  4148,  3952,
-   32,  3979,    34,  4162,    48,     4,   415, 16496,  1321, 37641,
- 1419,  4355,  2570,   262,    11,   612,  4410,  1040, 37682,  1322,
-37642,  1417,  4352,  2072, 16423,  2291,   293,  2569,   261,  3056,
- 1379,  3953,    34,  3978,    32,  4188,    48,    10,   263,  8688,
-  416, 16498,  1041, 37683,  1323, 37643,  1418,  4353,  2071, 16422,
- 2290,   292,  2568,   260,  3055,  1378,  3852,  4151,    10,   607,
- 4404,   749, 20528,  1685,  4356,  1735, 20480,  2074, 16425,  3569,
-  420,  3853,  4152,  4004,    32,  4031,    34,  4214,    48,     5,
-  137,  4389,   421, 16508,   608,  4405,  2073, 16424,  3854,  4153,
-    6,   609,  4406,  3570,   422,  3855,  4154,  4005,    34,  4030,
-   32,  4240,    48,     4,   422, 16510,   610,  4407,  1319, 37639,
- 2572,   264,     8,   136,  4384,   605,  4400,  1045, 37688,  1681,
- 4352,  3567,   416,  4056,    32,  4083,    34,  4266,    48,     5,
-  419, 16504,   606,  4401,  1317, 37633,  1682,  4353,  2350,   288,
-    6,  1318, 37634,  1683,  4354,  3568,   418,  4057,    34,  4082,
-   32,  4292,    48,     2,   420, 16506,  1684,  4355,     9,    12,
- 4400,   747, 20520,  1033, 37668,  2076, 16433,  3578,   444,  3838,
- 4128,  3902,    48,  4108,    32,  4135,    34,     6,   414, 16484,
-  748, 20521,  1034, 37669,  2075, 16432,  2851,   262,  3839,  4129,
-    5,  1035, 37670,  2078, 16435,  3928,    48,  4109,    34,  4134,
-   32,     4,  1036, 37671,  2077, 16434,  2850,   260,  3840,  4131,
-    9,  1029, 37664,  2080, 16437,  2293,   311,  2690,   257,  3576,
-  440,  3841,  4132,  3954,    48,  4160,    32,  4187,    34,     6,
-  412, 16480,  1030, 37665,  2079, 16436,  2689,   256,  2849,   258,
- 3842,  4133,    10,   140,  4410,  1031, 37666,  2082, 16439,  2292,
-  309,  2692,   259,  3577,   442,  3843,  4134,  3980,    48,  4161,
-   34,  4186,    32,     7,   413, 16482,  1032, 37667,  2081, 16438,
- 2691,   258,  2848,   256,  3166,   192,  3844,  4135,     7,   139,
- 4404,   741, 20512,  3574,   436,  3845,  4136,  4006,    48,  4212,
-   32,  4239,    34,     3,   742, 20513,  2855,   270,  3846,  4137,
-    7,   743, 20514,  2294,   313,  3575,   438,  3847,  4138,  4032,
-   48,  4213,    34,  4238,    32,     2,  2854,   268,  3848,  4139,
-    9,   138,  4400,   603,  4384,   744, 20516,  1037, 37672,  1328,
-37648,  3572,   432,  4058,    48,  4264,    32,  4291,    34,     5,
-  604,  4385,  1038, 37673,  1329, 37649,  1686,  4369,  2853,   266,
-    7,   745, 20518,  1330, 37650,  1687,  4370,  3573,   434,  4084,
-   48,  4265,    34,  4290,    32,     4,   746, 20519,  1331, 37651,
- 1688,  4371,  2852,   264,     2,   762, 24600,  3923, 12288,     2,
-  842, 28760,  3555,   334,     2,   763, 24602,  3949, 12288,     1,
- 3554,   332,     7,   252,  8464,   438, 16530,   764, 24604,  3100,
-  272,  3151,    16,  3160,    48,  3975, 12288,     1,  3553,   330,
-    2,   765, 24606,  4001, 12288,     2,   437, 16529,  3552,   328,
-    2,  1737, 24608,  4027, 12288,     4,   443, 16543,   758, 24593,
-  838, 28752,  3551,   326,     4,   441, 16540,   759, 24594,  1738,
-24610,  4053, 12288,     4,   442, 16541,   839, 28754,  1739, 24611,
- 3550,   324,     4,   439, 16538,   760, 24596,  2178, 41792,  4079,
-12288,     4,   440, 16539,   840, 28756,  3356,   320,  3549,   322,
-    2,   761, 24598,  4105, 12288,     3,   841, 28758,  3357,   322,
- 3548,   320,     3,   429, 16518,  4131, 12288,  4325,    16,     3,
-  430, 16519,   836, 28744,  4326,    17,     3,   427, 16516,  4157,
-12288,  4327,    18,     1,   428, 16517,     6,   425, 16514,  2182,
-41816,  3099,   256,  3122,   304,  3141,    16,  4183, 12288,     3,
-  426, 16515,   837, 28748,  4328,    21,     2,   423, 16512,  4209,
-12288,     1,   424, 16513,     6,   436, 16526,   757, 24576,   832,
-28737,  1740, 24624,  2181, 41812,  4235, 12288,     1,   831, 28736,
-    2,   434, 16524,  4261, 12288,     2,   435, 16525,   833, 28738,
-    2,   162,  8464,  4287, 12288,     4,   163,  8465,   433, 16523,
-  834, 28740,  3358,   336,     4,   164,  8466,   431, 16520,  2179,
-41810,  4313, 12288,     4,   432, 16521,   835, 28742,  2180, 41811,
- 3359,   338,     1,   779, 24632,     2,   780, 24633,  3159,    21,
-    2,   781, 24634,  4329,    34,     1,   782, 24635,     6,   169,
- 8488,   783, 24636,  3102,   304,  3142,    32,  3153,    48,  3158,
-   16,     3,   170,  8489,   784, 24637,  3364,   360,     2,   171,
- 8490,   785, 24638,     1,   786, 24639,     2,   167,  8484,   774,
-24624,     2,   775, 24625,  3362,   356,     1,   776, 24626,     2,
-  168,  8487,  3363,   358,     3,   165,  8480,   777, 24628,  2183,
-41824,     1,  3360,   352,     2,   166,  8482,   778, 24630,     1,
- 3361,   354,     1,   770, 24616,     1,   771, 24618,     7,   446,
-16546,   772, 24620,  3101,   288,  3120,   272,  3143,    48,  3152,
-   32,  3155,    16,     1,  3121,   273,     2,   444, 16544,   773,
-24622,     1,   445, 16545,     4,   175,  8500,   766, 24608,  1726,
- 8468,  1736, 24592,     3,   176,  8501,   843, 28768,  2186, 41845,
-    1,   767, 24610,     1,   844, 28770,     6,   172,  8496,   768,
-24612,   846, 28773,  1724,  8464,  2184, 41840,  3365,   369,     1,
-  845, 28772,     6,   173,  8498,   769, 24614,  1725,  8466,  2185,
-41842,  3024,   304,  3367,   371,     2,   174,  8499,  3366,   370,
-   11,   256,  8533,  1790, 28712,  3519,   270,  3912,  8192,  3939,
- 8194,  3966,  8196,  3993,  8198,  4020,  8200,  4047,  8202,  4074,
- 8204,  4101,  8206,     6,   255,  8532,   801, 24664,  1791, 28713,
- 3106,   340,  4330,    64,  4350,  4097,    11,   818, 28698,  1792,
-28714,  3518,   268,  3913,  8194,  3938,  8192,  3967,  8198,  3992,
- 8196,  4021,  8202,  4046,  8200,  4075,  8206,  4100,  8204,     3,
-  802, 24666,  1793, 28715,  4375,  4097,    11,  1794, 28716,  3517,
-  266,  3914,  8196,  3941,  8198,  3964,  8192,  3991,  8194,  4022,
- 8204,  4049,  8206,  4072,  8200,  4099,  8202,  4331,    69,     6,
-  253,  8528,  1795, 28717,  3104,   336,  3136,   256,  3144,    64,
- 4400,  4097,    10,  1796, 28718,  3515,   264,  3915,  8198,  3940,
- 8196,  3965,  8194,  3990,  8192,  4023,  8206,  4048,  8204,  4073,
- 8202,  4098,  8200,     5,   254,  8530,  2175, 41738,  3105,   338,
- 3516,   265,  4425,  4097,    12,   813, 28688,  1782, 28704,  3513,
-  262,  3771,   256,  3916,  8200,  3943,  8202,  3970,  8204,  3997,
- 8206,  4016,  8192,  4043,  8194,  4070,  8196,  4097,  8198,     7,
-  179,  8516,   797, 24656,   814, 28689,  1783, 28705,  3344,   261,
- 3514,   263,  4450,  4097,    13,   815, 28690,  1784, 28706,  2174,
-41735,  3512,   260,  3772,   258,  3917,  8202,  3942,  8200,  3971,
- 8206,  3996,  8204,  4017,  8194,  4042,  8192,  4071,  8198,  4096,
- 8196,     4,   798, 24658,  1785, 28707,  3107,   350,  4475,  4097,
-   14,   816, 28692,  1786, 28708,  2173, 41729,  3343,   256,  3511,
-  258,  3773,   260,  3918,  8204,  3945,  8206,  3968,  8200,  3995,
- 8202,  4018,  8196,  4045,  8198,  4068,  8192,  4095,  8194,     4,
-  799, 24660,  1787, 28709,  2172, 41728,  4500,  4097,    13,   178,
- 8515,   642,  4496,   817, 28694,  1788, 28710,  3510,   256,  3919,
- 8206,  3944,  8204,  3969,  8202,  3994,  8200,  4019,  8198,  4044,
- 8196,  4069,  8194,  4094,  8192,     6,   177,  8514,   643,  4497,
-  800, 24662,  1789, 28711,  3025,   320,  4525,  4097,    11,   809,
-28680,  3529,   286,  4120,  8192,  4147,  8194,  4174,  8196,  4201,
- 8198,  4228,  8200,  4255,  8202,  4282,  8204,  4309,  8206,  4333,
-   81,     4,   793, 24648,  3530,   287,  4332,    80,  4550,  4097,
-   10,   810, 28682,  3528,   284,  4121,  8194,  4146,  8192,  4175,
- 8198,  4200,  8196,  4229,  8202,  4254,  8200,  4283,  8206,  4308,
- 8204,     3,   794, 24650,  4334,    82,  4575,  4097,    10,   811,
-28684,  3527,   282,  4122,  8196,  4149,  8198,  4172,  8192,  4199,
- 8194,  4230,  8204,  4257,  8206,  4280,  8200,  4307,  8202,     6,
-  795, 24652,  3103,   320,  3145,    80,  3157,   112,  3163,    96,
- 4600,  4097,    11,   158,  4504,   812, 28686,  3526,   280,  4123,
- 8198,  4148,  8196,  4173,  8194,  4198,  8192,  4231,  8206,  4256,
- 8204,  4281,  8202,  4306,  8200,     3,   159,  4505,   796, 24654,
- 4625,  4097,    13,   156,  4502,   735, 12548,   788, 24641,   804,
-28672,  3525,   278,  4124,  8200,  4151,  8202,  4178,  8204,  4205,
- 8206,  4224,  8192,  4251,  8194,  4278,  8196,  4305,  8198,     6,
-  157,  4503,   736, 12549,   787, 24640,   805, 28673,  3774,   273,
- 4650,  4097,    13,   641,  4484,   790, 24643,  3346,   278,  3523,
-  276,  3775,   274,  4125,  8202,  4150,  8200,  4179,  8206,  4204,
- 8204,  4225,  8194,  4250,  8192,  4279,  8198,  4304,  8196,     5,
-  155,  4501,   789, 24642,  3524,   277,  3776,   275,  4675,  4097,
-   13,   639,  4482,   731, 12544,   806, 28676,  3345,   272,  3522,
-  274,  4126,  8204,  4153,  8206,  4176,  8200,  4203,  8202,  4226,
- 8196,  4253,  8198,  4276,  8192,  4303,  8194,     5,   640,  4483,
-  732, 12545,   791, 24644,   807, 28677,  4700,  4097,    14,   154,
- 4496,   637,  4480,   733, 12546,   808, 28678,  2176, 41747,  3520,
-  272,  4127,  8206,  4152,  8204,  4177,  8202,  4202,  8200,  4227,
- 8198,  4252,  8196,  4277,  8194,  4302,  8192,     5,   638,  4481,
-  734, 12547,   792, 24646,  3521,   273,  4725,  4097,     5,   830,
-28728,  1758, 28680,  3542,   302,  4336,    97,  4441,   105,     3,
- 1759, 28681,  4335,    96,  4440,   104,     4,  1760, 28682,  3541,
-  300,  4338,    99,  4466,   105,     3,  1761, 28683,  4337,    98,
- 4465,   104,     4,  1265, 12544,  1762, 28684,  3540,   298,  4491,
-  105,     4,  1763, 28685,  3123,   320,  3162,    80,  4490,   104,
-    3,  1764, 28686,  3538,   296,  4516,   105,     4,  1765, 28687,
- 3539,   297,  4339,   102,  4515,   104,     4,   826, 28720,  1750,
-28672,  3537,   294,  4341,   105,     3,  1741, 24640,  1751, 28673,
- 4340,   104,     4,   827, 28722,  1752, 28674,  3535,   292,  4366,
-  105,     3,  1753, 28675,  3536,   293,  4365,   104,     5,   828,
-28724,  1754, 28676,  3347,   288,  3533,   290,  4391,   105,     3,
- 1755, 28677,  3534,   291,  4390,   104,     5,   829, 28726,  1756,
-28678,  3348,   290,  3531,   288,  4416,   105,     3,  1757, 28679,
- 3532,   289,  4415,   104,     4,   823, 28712,  1774, 28696,  3355,
-  316,  4641,   105,     2,  1775, 28697,  4640,   104,     3,   824,
-28714,  1776, 28698,  4666,   105,     3,   825, 28715,  1777, 28699,
- 4665,   104,     4,  1778, 28700,  3353,   312,  3786,   255,  4691,
-  105,     7,   257,  8544,  1779, 28701,  3108,   352,  3146,   112,
- 3156,    80,  3161,    64,  4690,   104,     3,  1780, 28702,  3354,
-  314,  4716,   105,     4,  1689,  4505,  1781, 28703,  2177, 41786,
- 4715,   104,     4,   819, 28704,  1766, 28688,  3351,   308,  4541,
-  105,     3,   803, 24672,  1767, 28689,  4540,   104,     6,   646,
- 4516,   820, 28706,  1768, 28690,  3352,   310,  3547,   308,  4566,
-  105,     2,  1769, 28691,  4565,   104,     7,   645,  4514,   821,
-28708,  1733, 12560,  1770, 28692,  3349,   304,  3545,   306,  4591,
-  105,     3,  1771, 28693,  3546,   307,  4590,   104,     6,   644,
- 4512,   822, 28710,  1772, 28694,  3350,   306,  3543,   304,  4616,
-  105,     3,  1773, 28695,  3544,   305,  4615,   104,     3,   656,
- 4689,   894, 36953,  2727,   632,     4,   105,   513,   655,  4688,
-  893, 36952,  2728,   633,     2,   274,  8856,  1908,   560,     2,
-  275,  8857,  1909,   561,     1,  3809,   768,     1,  2963,  4664,
-    2,  2322,   584,  2620, 25568,     1,  2323,   585,     2,   268,
- 8850,   889, 36945,     7,   269,  8851,   888, 36944,  1446,  4706,
- 1947,   577,  2321,   583,  2961,  4660,  3643,   712,     3,   891,
-36947,  1948,   578,  2320,   580,     5,   890, 36946,  1445,  4704,
- 1949,   579,  2725,   627,  2962,  4662,     4,   272,  8854,  1950,
-  580,  2319,   578,  2726,   628,     5,   273,  8855,   892, 36948,
- 1951,   581,  2469,  4624,  2960,  4656,     2,   270,  8852,  1447,
- 4709,     1,   271,  8853,     3,   887, 36937,  1277, 36977,  1906,
-  546,     5,   161,  4688,   651,  4672,   886, 36936,  1907,   547,
- 3644,   720,     2,   653,  4675,  1904,   544,     4,   652,  4674,
- 1278, 36978,  1905,   545,  3645,   722,     2,   654,  4676,  3646,
-  724,     1,  2621, 25584,     1,  3647,   726,     4,   234,   512,
-  879, 36929,  1448,  4723,  1952,   592,     4,   235,   513,  1953,
-  593,  2723,   609,  2959,  4644,     3,   881, 36931,  1954,   594,
- 2724,   610,     2,   880, 36930,  1955,   595,     4,   883, 36933,
- 1956,   596,  2326,   594,  2466,  4609,     5,   882, 36932,  1957,
-  597,  2327,   595,  2465,  4608,  2957,  4640,     3,   885, 36935,
- 2324,   592,  2468,  4611,     4,   884, 36934,  2325,   593,  2467,
- 4610,  2958,  4642,     5,   911, 36985,  1639,   512,  1898,   530,
- 2722,   600,  3649,   737,     3,   910, 36984,  1899,   531,  3648,
-  736,     2,  1896,   528,  3651,   739,     2,  1897,   529,  3650,
-  738,     1,  3653,   741,     1,  3652,   740,     3,  1900,   532,
- 2618, 25536,  3655,   743,     2,  1901,   533,  3654,   742,     4,
- 1247,   512,  1903,   538,  1958,   608,  2714,   592,     4,   904,
-36976,  1959,   609,  2715,   593,  3656,   744,     4,   905, 36979,
- 1902,   536,  2716,   594,  3658,   747,     3,  2717,   595,  2956,
- 4630,  3657,   746,     2,   907, 36981,  2718,   596,     3,   906,
-36980,  2719,   597,  2954,  4624,     3,   909, 36983,  1572,   514,
- 2720,   598,     3,   908, 36982,  2721,   599,  2955,  4626,     4,
-  658,  4705,   903, 36969,  1889,   514,  2712,   584,     4,   657,
- 4704,  1890,   515,  2713,   585,  2768,  4616,     1,  1888,   512,
-    2,  1276, 36951,  2619, 25552,     2,  1275, 36950,  1891,   517,
-    4,   896, 36961,  1894,   522,  1960,   624,  2761,  4609,     3,
-  895, 36960,  2705,   577,  2953,  4612,     4,   898, 36963,  1892,
-  520,  2706,   578,  2763,  4611,     5,   897, 36962,  1442,  4688,
- 1893,   521,  2707,   579,  2762,  4610,     4,   900, 36965,  1444,
- 4695,  2708,   580,  2765,  4613,     6,   899, 36964,  1961,   629,
- 2470,  4640,  2709,   581,  2764,  4612,  2951,  4608,     5,   902,
-36967,  1443,  4693,  1895,   524,  2710,   582,  2767,  4615,     4,
-  901, 36966,  2711,   583,  2766,  4614,  2952,  4610,     5,   160,
- 4608,   650,  4624,   861, 36888,  2352,   513,  3619,   640,     4,
-  862, 36889,  1699,  4641,  2130, 41090,  2351,   512,     2,  1700,
- 4642,  3620,   642,     4,  1701,  4643,  2129, 41088,  2353,   514,
- 2614, 25508,     2,  1702,  4644,  3621,   644,     3,  2132, 41093,
- 2354,   519,  3622,   646,     3,  2131, 41092,  2304,   520,  2613,
-25504,     4,   854, 36880,  2303,   519,  2701,   561,  3623,   648,
-    2,   855, 36881,  2700,   560,     6,   856, 36882,  1439,  4640,
- 2134, 41097,  2302,   517,  2703,   563,  3624,   650,     4,  2133,
-41096,  2301,   516,  2616, 25516,  2702,   562,     5,    15,  4608,
-  857, 36884,  2300,   515,  2440,   529,  3625,   652,     4,   858,
-36885,  2299,   514,  2439,   528,  2704,   564,     3,    16,  4610,
-  859, 36886,  2298,   513,     4,   206, 36871,   860, 36887,  1440,
- 4645,  2615, 25512,     4,   647,  4608,   852, 36872,  2699,   553,
- 3626,   656,     4,   648,  4609,   853, 36873,  2698,   552,  3627,
-  657,     2,   649,  4610,  3628,   658,     1,  2135, 41104,     1,
- 3629,   660,     1,  3630,   662,     2,  2310,   536,  2617, 25520,
-    1,  3631,   664,     2,  1441,  4656,  2309,   533,     1,  2355,
-  538,     3,   849, 36868,  2308,   531,  3632,   668,     3,   850,
-36869,  2307,   530,  2437,   512,     6,    17,  4626,   851, 36870,
- 2306,   529,  2357,   543,  2697,   551,  3633,   670,     4,  2305,
-  528,  2356,   542,  2438,   514,  2696,   550,     3,  1263,  4616,
- 1690,  4608,  3634,   672,     2,  1264,  4617,  1691,  4609,     2,
- 1692,  4610,  3635,   674,     2,  1693,  4611,  2866,   536,     2,
- 1694,  4612,  3636,   676,     1,  2611, 25472,     3,   872, 36912,
- 1259,  4608,  2313,   551,     3,  1798, 36865,  1946,   544,  2863,
-  530,     3,   873, 36914,  1260,  4610,  1799, 36866,     5,   874,
-36915,  1248,   578,  1800, 36867,  2312,   548,  2862,   528,     3,
-   18,  4640,   875, 36916,  1261,  4612,     2,   876, 36917,  2865,
-  534,     2,   877, 36918,  1262,  4614,     3,   878, 36919,  2311,
-  544,  2864,   532,     3,   870, 36904,  2695,   521,  3637,   688,
-    4,   871, 36905,  1695,  4625,  1912,   578,  2694,   520,     3,
- 1696,  4626,  1911,   577,  3638,   690,     5,  1697,  4627,  1910,
-  576,  2136, 41136,  2861,   520,  3639,   691,     3,  1698,  4628,
- 1916,   583,  3640,   692,     1,  1915,   582,     1,  1914,   581,
-    3,  1913,   580,  2318,   568,  2612, 25488,     5,   863, 36896,
- 1438,  4626,  2858,   515,  2965,  4676,  3641,   696,     3,   864,
-36897,  2317,   566,  2857,   514,     4,   865, 36898,  1436,  4624,
- 2966,  4678,  3642,   698,     4,  1437,  4625,  1917,   584,  2316,
-  564,  2856,   512,     1,   866, 36900,     4,   867, 36901,  2315,
-  562,  2441,   544,  2860,   518,     3,   868, 36902,  2693,   519,
- 2964,  4674,     4,   869, 36903,  2314,   560,  2442,   546,  2859,
-  516,     3,   180,  8704,  2112, 41024,  3174,     8,     3,  3175,
-    9,  3374,   576,  3609,   578,     2,  3026,   512,  3176,    10,
-    3,  2113, 41027,  3177,    11,  3608,   576,     3,   181,  8708,
- 2610, 25440,  3178,    12,     1,  3179,    13,     1,  3180,    14,
-    3,  2114, 41031,  3181,    15,  3610,   580,     2,   182,  8712,
-  267,  8720,     1,  3167,     1,     1,  3168,     2,     1,  3169,
-    3,     2,   336,  8720,  3170,     4,     1,  3171,     5,     1,
- 3172,     6,     1,  3173,     7,     3,   334,  8716,  2115, 41040,
- 3376,   593,     2,  2089, 37010,  3375,   592,     1,   335,  8718,
-    1,  3611,   592,     1,   332,  8712,     1,  2091, 37014,     1,
-  333,  8714,     2,  2090, 37012,  2116, 41047,     2,   183,  8728,
-  330,  8708,     2,   264,  8705,  1214, 40961,     3,   265,  8706,
-  331,  8710,  1215, 40962,     3,   266,  8707,  1216, 40963,  2092,
-37016,     1,   329,  8706,     3,   184,  8736,  2117, 41056,  3614,
-  611,     3,  2208, 45088,  2606, 25413,  3613,   610,     1,  2607,
-25414,     2,  2608, 25415,  3612,   608,     1,  2605, 25408,     1,
- 3616,   614,     1,  2118, 41062,     2,  2119, 41063,  3615,   612,
-    3,   185,  8744,  2120, 41064,  3182,    32,     2,   186,  8745,
- 3617,   618,     1,  3618,   620,     3,   187,  8752,   343,  8748,
- 2121, 41072,     1,  2122, 41075,     3,   341,  8744,  2123, 41076,
- 2609, 25424,     1,  2124, 41077,     2,   342,  8746,  2125, 41078,
-    2,   339,  8740,  2126, 41080,     2,   340,  8742,  2127, 41082,
-    2,   337,  8736,  2128, 41084,     1,   338,  8738,     3,  3368,
-  512,  3584,   514,  4535,  4866,     3,   188,  8768,  4509,  4865,
- 4536,  4867,     4,   927, 37016,  3369,   514,  3583,   512,  4510,
- 4866,     3,   189,  8770,  4511,  4867,  4534,  4865,     2,  3585,
-  518,  4485,  4866,     4,   190,  8772,  2603, 25376,  4459,  4865,
- 4486,  4867,     2,  2100, 40967,  4460,  4866,     3,   191,  8774,
- 4461,  4867,  4484,  4865,     2,   922, 37010,  4435,  4866,     3,
-  923, 37011,  4409,  4865,  4436,  4867,     3,   920, 37008,  1963,
-  641,  4410,  4866,     4,   921, 37009,  1962,   640,  4411,  4867,
- 4434,  4865,     2,   926, 37014,  4385,  4866,     2,  4359,  4865,
- 4386,  4867,     2,   924, 37012,  4360,  4866,     3,   925, 37013,
- 4361,  4867,  4384,  4865,     3,   192,  8785,  3587,   530,  4735,
- 4866,     3,  2101, 40976,  4709,  4865,  4736,  4867,     3,   193,
- 8787,  3586,   528,  4710,  4866,     3,   919, 37001,  4711,  4867,
- 4734,  4865,     3,   194,  8789,  3589,   534,  4685,  4866,     3,
- 2604, 25392,  4659,  4865,  4686,  4867,     3,   196,  8791,  3588,
-  532,  4660,  4866,     3,   195,  8790,  4661,  4867,  4684,  4865,
-    6,   198,  8793,   207, 37010,   914, 36994,  1964,   659,  3591,
-  538,  4635,  4866,     5,   197,  8792,   915, 36995,  3592,   539,
- 4609,  4865,  4636,  4867,     3,   912, 36992,  3590,   536,  4610,
- 4866,     4,   199,  8794,   913, 36993,  4611,  4867,  4634,  4865,
-    1,  4585,  4866,     5,   200,  8796,   918, 36999,  1967,   662,
- 4559,  4865,  4586,  4867,     4,   916, 36996,  1966,   661,  3593,
-  540,  4560,  4866,     4,   917, 36997,  1965,   660,  4561,  4867,
- 4584,  4865,     3,  2103, 40993,  3370,   544,  3594,   546,     1,
- 2102, 40992,     1,  2105, 40995,     2,  2104, 40994,  3371,   547,
-    2,  3372,   548,  3596,   550,     2,  2106, 40996,  2601, 25344,
-    2,  2108, 40999,  3595,   548,     1,  2107, 40998,     1,  3599,
-  554,     2,  2109, 41000,  3600,   555,     1,  3597,   552,     1,
- 3598,   553,     1,  3602,   558,     2,  2736,   661,  3601,   556,
-    1,  2735,   660,     2,  3373,   560,  3604,   562,     1,  2110,
-41008,     2,  2734,   649,  3603,   560,     3,  1801, 37017,  2111,
-41010,  2733,   648,     1,  3606,   566,     1,  2602, 25360,     1,
- 3605,   564,     1,  2729,   642,     1,  3607,   568,     1,  2732,
-  647,     1,  2731,   645,     1,  2730,   644,     3,   110,   772,
- 1293, 37221,  3805,   512,     3,   111,   773,  1292, 37220,  2968,
- 4920,     4,   112,   774,  1294, 37223,  2598, 25312,  3806,   514,
-    2,   113,   775,  2969,  4922,     3,   106,   768,   948, 37209,
- 1289, 37217,     1,   107,   769,     2,   108,   770,  1291, 37219,
-    2,   109,   771,  1290, 37218,     3,   947, 37205,  1578,   800,
- 2473,  4881,     1,  2472,  4880,     2,   945, 37201,  1984,   832,
-    1,  1579,   805,     1,   946, 37202,     3,  1580,   824,  2600,
-25330,  3807,   528,     2,  2599, 25328,  3808,   530,     1,  1296,
-37233,     1,  1295, 37232,     1,  1297, 37234,     2,   211, 37204,
- 2471,  4864,     1,   944, 37191,     1,  2967,  4900,     2,  1575,
-  776,  1644,   772,     1,  1576,   777,     1,  2595, 25280,     2,
-  961, 37241,  1640,   768,     2,   960, 37240,  1641,   769,     1,
- 1642,   770,     1,  1643,   771,     2,   957, 37237,  1805, 37189,
-    3,   956, 37236,  2479,  4912,  4314, 37417,     1,   959, 37239,
-    1,   958, 37238,     1,   953, 37233,     1,   952, 37232,     2,
-  955, 37235,  1573,   774,     2,   954, 37234,  1574,   775,     2,
- 1285, 37205,  4315, 37424,     1,  1284, 37204,     2,  1287, 37207,
- 2596, 25296,     1,  1286, 37206,     5,   951, 37225,  1705,  4945,
- 1878,   768,  1920,   770,  2775,  4873,     2,   950, 37224,  1704,
- 4944,     2,  1283, 37203,  1918,   768,     3,  1706,  4946,  1919,
-  769,  2597, 25301,     2,  2475,  4897,  2773,  4869,     2,  2474,
- 4896,  2772,  4868,     1,  2477,  4899,     3,   949, 37222,  2476,
- 4898,  2774,  4870,     1,  2769,  4865,     2,  1288, 37208,  2478,
- 4900,     1,  2771,  4867,     3,  1577,   791,  1707,  4954,  2770,
- 4866,     3,   664,  4884,   755, 21008,  3702,   900,     1,   665,
- 4885,     3,   666,  4886,   756, 21010,  3703,   902,     2,  1974,
-  782,  2593, 25248,     4,   662,  4880,   939, 37144,  2358,   769,
- 3700,   896,     1,   940, 37145,     3,   663,  4882,  2594, 25253,
- 3701,   898,     1,  2162, 41344,     1,   936, 37140,     1,   937,
-37141,     1,  1973,   775,     2,   938, 37143,  1972,   774,     5,
-  667,  4888,   848, 33105,  1282, 37160,  1969,   769,  3704,   904,
-    2,   847, 33104,  1968,   768,     3,   935, 37138,  1971,   771,
- 3705,   906,     2,  1970,   770,  2878,   816,     1,  3708,   916,
-    1,  2447,   776,     2,  2166, 41365,  3709,   918,     1,  2165,
-41364,     3,   659,  4864,  2164, 41363,  3706,   912,     3,   660,
- 4865,  1979,   792,  2163, 41362,     2,   661,  4866,  3707,   914,
-    1,   931, 37124,     3,   932, 37125,  1977,   788,  2443,   768,
-    1,   933, 37126,     3,   934, 37127,  1978,   790,  2444,   770,
-    2,   928, 37120,  3710,   920,     3,   929, 37121,  1975,   784,
- 2445,   772,     3,  1451,  4912,  1804, 37170,  3711,   922,     4,
-  930, 37123,  1976,   786,  2446,   774,  2877,   800,     1,  3714,
-  932,     1,  2750,   796,     1,  3715,   934,     2,  2592, 25216,
- 2751,   798,     3,  1703,  4864,  1802, 37128,  3712,   928,     1,
- 2748,   792,     1,  3713,   930,     2,  2749,   794,  2876,   792,
-    3,   210, 37156,  1581,   833,  3718,   940,     3,  1982,   804,
- 2747,   788,  2875,   790,     1,  2874,   788,     3,  1981,   801,
- 2745,   785,  3716,   936,     5,   208, 37153,  1582,   836,  1980,
-  800,  2744,   784,  2873,   786,     2,  1449,  4864,  3717,   938,
-    3,   209, 37155,  2746,   786,  2872,   784,     1,  2742,   781,
-    1,  2741,   780,     2,  1281, 37142,  2743,   783,     2,   668,
- 4896,  2739,   777,     2,  1279, 37137,  2738,   776,     3,  1280,
-37139,  2740,   778,  2871,   776,     2,   941, 37157,  2870,   774,
-    1,   942, 37158,     3,   943, 37159,  2737,   774,  2869,   772,
-    1,  1803, 37136,     2,  1983,   816,  2868,   770,     1,  1450,
- 4880,     1,  2867,   768,     2,  2589, 25184,  4445,   512,     1,
- 3683,   838,     1,  4470,   512,     1,  3682,   836,     1,  4495,
-  512,     2,  2590, 25189,  3681,   834,     1,  4520,   512,     1,
- 3680,   832,     1,  4345,   512,     1,  4370,   512,     1,  3686,
-  844,     1,  4395,   512,     1,  3685,   842,     1,  4420,   512,
-    1,  3684,   840,     2,  2591, 25200,  4645,   512,     1,  3690,
-  854,     1,  4670,   512,     1,  3689,   852,     1,  4695,   512,
-    1,  3688,   850,     1,  4720,   512,     1,  3687,   848,     1,
- 4545,   512,     1,  4570,   512,     1,  4595,   512,     1,  3692,
-  858,     1,  4620,   512,     1,  3691,   856,     1,  3696,   870,
-    2,  2154, 41319,  3695,   868,     1,  2150, 41312,     2,  2151,
-41313,  3694,   866,     1,  2152, 41314,     2,  2153, 41315,  3693,
-  864,     1,  2155, 41320,     1,  2156, 41322,     1,  2161, 41332,
-    1,  3699,   884,     1,  2157, 41328,     2,  2158, 41329,  3698,
-  882,     1,  2159, 41330,     2,  2160, 41331,  3697,   880,     5,
- 2216, 57345,  2582, 25121,  3661,   774,  4455,  4608,  4482,  4610,
-    2,  4456,  4609,  4483,  4611,     4,  2584, 25123,  3660,   772,
- 4457,  4610,  4480,  4608,     3,  2583, 25122,  4458,  4611,  4481,
- 4609,     4,  2586, 25125,  3659,   770,  4505,  4608,  4532,  4610,
-    4,  2217, 57348,  2585, 25124,  4506,  4609,  4533,  4611,     3,
-  972, 37272,  4507,  4610,  4530,  4608,     5,   973, 37273,  2218,
-57350,  2587, 25126,  4508,  4611,  4531,  4609,     3,   970, 37270,
- 4355,  4608,  4382,  4610,     5,   971, 37271,  2219, 57352,  3666,
-  783,  4356,  4609,  4383,  4611,     3,  3664,   780,  4357,  4610,
- 4380,  4608,     4,   969, 37269,  3665,   781,  4358,  4611,  4381,
- 4609,     3,  3663,   778,  4405,  4608,  4432,  4610,     2,  4406,
- 4609,  4433,  4611,     3,  3662,   776,  4407,  4610,  4430,  4608,
-    2,  4408,  4611,  4431,  4609,     4,  2221, 57361,  3669,   790,
- 4655,  4608,  4682,  4610,     4,  2220, 57360,  2588, 25136,  4656,
- 4609,  4683,  4611,     3,  3668,   788,  4657,  4610,  4680,  4608,
-    2,  4658,  4611,  4681,  4609,     3,  3667,   786,  4705,  4608,
- 4732,  4610,     3,  2137, 41232,  4706,  4609,  4733,  4611,     2,
- 4707,  4610,  4730,  4608,     3,  2138, 41234,  4708,  4611,  4731,
- 4609,     3,   968, 37254,  4555,  4608,  4582,  4610,     2,  4556,
- 4609,  4583,  4611,     3,   966, 37252,  4557,  4610,  4580,  4608,
-    3,   967, 37253,  4558,  4611,  4581,  4609,     3,   964, 37250,
- 4605,  4608,  4632,  4610,     3,   965, 37251,  4606,  4609,  4633,
- 4611,     4,   962, 37248,  3670,   792,  4607,  4610,  4630,  4608,
-    3,   963, 37249,  4608,  4611,  4631,  4609,     2,  2144, 41253,
- 2223, 57377,     2,  2143, 41252,  2222, 57376,     1,  2225, 57379,
-    1,  2224, 57378,     3,  2140, 41249,  2227, 57381,  3672,   802,
-    2,  2139, 41248,  2226, 57380,     2,  2142, 41251,  3671,   800,
-    1,  2141, 41250,     1,  3109,   886,     2,  2229, 57393,  3676,
-  822,     2,  2228, 57392,  2581, 25104,     1,  3675,   820,     1,
- 2147, 41270,     1,  3674,   818,     1,  2145, 41264,     1,  3673,
-  816,     1,  2146, 41266,     1,  3679,   828,     1,  3678,   826,
-    1,  2148, 41272,     1,  3677,   824,     1,  2149, 41274,     1,
- 3036,    16,     1,  1469,  5234,     1,  1468,  5232,     1,  2481,
- 5121,     2,  2480,  5120,  3037,    21,     1,  2648, 26096,     2,
- 1463,  5219,  1986,  1088,     2,  1987,  1089,  2038,  5120,     1,
- 1462,  5216,     1,  1466,  5223,     2,  1465,  5222,  3035,     5,
-    1,  1464,  5221,     1,   678,  5200,     1,  1467,  5224,     1,
- 2647, 26080,     1,  1459,  5202,     1,  1458,  5200,     1,  1460,
- 5204,     2,  1650,  1040,  1879,  1024,     2,   679,  5216,  1651,
- 1041,     1,  1652,  1042,     2,  1461,  5208,  1653,  1043,     1,
- 2646, 26064,     2,  1456,  5187,  3038,    32,     1,  1457,  5189,
-    1,  1645,  1024,     2,   680,  5232,  1646,  1025,     1,  1647,
- 1026,     1,  1648,  1027,     1,  1649,  1028,     2,  1150, 38401,
- 2885,  1058,     2,  1151, 38402,  2884,  1057,     2,  1152, 38403,
- 2883,  1056,     5,    20,  5136,  1153, 38404,  1455,  5174,  2887,
- 1063,  4317,   272,     2,  1154, 38405,  2448,  1024,     2,  1155,
-38406,  4318,   274,     2,  1156, 38407,  2886,  1060,     1,   669,
- 5120,     1,   670,  5121,     1,   671,  5122,     1,   672,  5123,
-    1,   673,  5124,     1,   674,  5125,     1,  2645, 26032,     4,
- 1454,  5155,  1985,  1024,  2451,  1044,  2889,  1074,     1,  1453,
- 5152,     1,  2888,  1072,     2,    19,  5120,  4316,   256,     1,
- 2449,  1040,     2,  2450,  1042,  2890,  1076,     1,   675,  5137,
-    1,   676,  5138,     1,   677,  5139,     1,  2644, 26016,     1,
- 2752,  1025,     1,  2880,  1026,     1,  2754,  1027,     2,  2753,
- 1026,  2879,  1024,     2,    22,  5168,  2756,  1029,     2,  2755,
- 1028,  2882,  1030,     1,    23,  5170,     2,  1452,  5141,  2881,
- 1028,     1,  1721,  5136,     1,  2643, 26000,     1,  1715,  5128,
-    1,  1716,  5131,     2,    21,  5152,  1717,  5132,     1,  1718,
- 5133,     1,  1719,  5134,     1,  1720,  5135,     1,  1708,  5121,
-    1,  1709,  5122,     1,  1710,  5123,     1,  1711,  5124,     1,
- 1712,  5125,     1,  1713,  5126,     1,  1714,  5127,     1,  3742,
- 1107,     1,  3741,  1106,     1,  3740,  1105,     1,  3739,  1104,
-    1,  3150,  1280,     1,  3738,  1091,     1,  3737,  1090,     1,
- 3736,  1089,     1,  3735,  1088,     1,  2642, 25952,     1,  2641,
-25936,     1,  2640, 25925,     1,  2639, 25920,     2,  4180,  9472,
- 4612,  5376,     2,  4206,  9472,  4637,  5376,     2,  4128,  9472,
- 4562,  5376,     2,  4154,  9472,  4587,  5376,     3,  3722,  1042,
- 4284,  9472,  4712,  5376,     4,   681,  5248,  3721,  1040,  4310,
- 9472,  4737,  5376,     2,  4232,  9472,  4662,  5376,     1,  2638,
-25904,     2,  4258,  9472,  4687,  5376,     2,  3972,  9472,  4412,
- 5376,     1,  2050,  9216,     2,  3998,  9472,  4437,  5376,     2,
- 3920,  9472,  4362,  5376,     2,  3946,  9472,  4387,  5376,     4,
- 2201, 42497,  3720,  1026,  4076,  9472,  4512,  5376,     1,  2200,
-42496,     4,   682,  5264,  2202, 42499,  4102,  9472,  4537,  5376,
-    2,   683,  5265,  3719,  1025,     2,  4024,  9472,  4462,  5376,
-    1,  2637, 25888,     2,  4050,  9472,  4487,  5376,     1,   684,
- 5269,     1,  3730,  1074,     1,  3731,  1075,     1,  3729,  1073,
-    1,  3734,  1078,     1,  2636, 25872,     1,  3732,  1076,     1,
- 3733,  1077,     1,  1266, 13313,     1,  1267, 13314,     1,  1268,
-13315,     1,  1269, 13316,     1,  1270, 13317,     1,  1271, 13318,
-    1,  3725,  1058,     1,  3726,  1059,     1,  3723,  1056,     1,
- 3724,  1057,     1,  2635, 25856,     1,  3727,  1060,     1,  3728,
- 1061,     2,  2000,  1364,  4322,  4112,     2,  2001,  1365,  3042,
-  277,     1,  2002,  1366,     3,  1996,  1360,  3031,  1040,  3041,
-  272,     2,  1180, 38720,  1997,  1361,     1,  1998,  1362,     1,
- 1999,  1363,     1,  2634, 25840,     1,  1181, 38729,     1,  1183,
-38741,     1,  3040,   261,     1,  1184, 38742,     3,  1182, 38737,
- 3039,   256,  4319,  4100,     1,  4320,  4102,     1,  4321,  4106,
-    1,  1186, 38745,     1,  1185, 38744,     2,  1192, 38757,  2779,
- 5381,     1,  1191, 38756,     2,  1194, 38759,  2780,  5383,     1,
- 1193, 38758,     2,  1188, 38753,  2776,  5377,     1,  1187, 38752,
-    2,  1190, 38755,  2778,  5379,     2,  1189, 38754,  2777,  5378,
-    1,  2783,  5389,     1,  2782,  5388,     1,  2633, 25808,     2,
- 1196, 38761,  1880,  1280,     2,  1195, 38760,  2781,  5384,     1,
- 1881,  1282,     1,  3033,  1060,     1,  3034,  1062,     5,  1198,
-38769,  2004,  1376,  2784,  5393,  3032,  1056,  3043,   288,     1,
- 1197, 38768,     1,  2005,  1378,     2,  1199, 38770,  2785,  5394,
-    1,  2632, 25792,     3,    26,  5392,  1992,  1301,  2453,  1281,
-    2,    27,  5393,  2452,  1280,     1,    28,  5394,     1,   686,
- 5384,     1,  1157, 38657,     2,  1480,  5424,  1991,  1299,     3,
- 1481,  5425,  1990,  1298,  2896,  1312,     1,    29,  5402,     1,
-  685,  5376,     1,  1993,  1304,     1,  1994,  1306,     2,    24,
- 5376,  1476,  5414,     2,  1158, 38677,  1477,  5415,     1,  1159,
-38678,     2,  1160, 38679,  1475,  5413,     1,    25,  5380,     1,
- 1988,  1280,     1,  2631, 25760,     2,   687,  5392,  1161, 38680,
-    2,   688,  5393,  1162, 38681,     1,  1478,  5416,     2,  1479,
- 5417,  1989,  1290,     1,  1167, 38692,     2,  1168, 38693,  1473,
- 5399,     1,  1169, 38694,     2,  1170, 38695,  1472,  5397,     2,
- 1163, 38688,  1470,  5394,     2,  1164, 38689,  1471,  5395,     1,
- 1165, 38690,     2,  1166, 38691,  2891,  1280,     1,  2630, 25744,
-    1,   689,  5408,     2,   690,  5409,  1171, 38697,     1,  1474,
- 5400,     1,  1174, 38708,     2,  1175, 38709,  2895,  1302,     1,
- 1176, 38710,     2,  1177, 38711,  2894,  1300,     2,  1995,  1312,
- 2893,  1298,     1,  1172, 38706,     2,  1173, 38707,  2892,  1296,
-    2,   691,  5424,  1178, 38712,     2,   692,  5425,  1179, 38713,
-    2,  3086,  1296,  3110,  1280,     1,  2629, 25712,     2,  3085,
- 1280,  3111,  1296,     2,  2206, 42820,  2628, 25696,     1,  3112,
- 1312,     1,  2627, 25680,     1,  2626, 25664,     1,  3140,  1280,
-    1,  2625, 25648,     1,  2003,  1434,     1,  3137,  1280,     1,
- 2624, 25632,     1,  2623, 25616,     1,  2204, 42801,     1,  2203,
-42800,     1,  2205, 42802,     1,  2622, 25600,     2,   221, 37977,
- 1088, 37961,     2,   220, 37976,  1817, 38008,     1,  1085, 37953,
-    1,  1084, 37952,     1,  1086, 37954,     1,  1816, 38004,     1,
- 1087, 37959,     1,  1089, 37969,     1,  1090, 37970,     1,  1091,
-37973,     1,  1093, 37975,     1,  1092, 37974,     1,  1102, 37993,
-    2,  1101, 37992,  1333, 37968,     1,  1334, 37971,     1,  1094,
-37985,     1,  1096, 37987,     1,  1095, 37986,     1,  1098, 37989,
-    2,  1097, 37988,  1815, 37972,     1,  1100, 37991,     1,  1099,
-37990,     1,  1104, 38001,     2,   222, 37984,  1103, 38000,     2,
- 1106, 38003,  1811, 37955,     1,  1105, 38002,     1,  1813, 37957,
-    2,  1107, 38004,  1812, 37956,     1,  1109, 38007,     2,  1108,
-38006,  1814, 37958,     2,   693,  5632,  2195, 42131,     1,  2194,
-42130,     2,   694,  5634,  2193, 42129,     1,   695,  5636,     1,
- 2197, 42134,     1,   696,  5638,     1,  2196, 42132,     2,   219,
-37904,   697,  5640,     2,  1057, 37889,  2008,  1552,     1,  1058,
-37890,     2,  1059, 37891,  2009,  1554,     1,  1060, 37892,     1,
- 1061, 37893,     1,  1062, 37894,     1,  1063, 37895,     1,   698,
- 5648,     1,  1332, 37921,     1,   699,  5650,     1,  1064, 37904,
-    1,  2006,  1536,     2,  1065, 37906,  1810, 37922,     1,  2007,
- 1538,     1,    30,  5632,     1,  1066, 37911,     2,   700,  5664,
- 1073, 37928,     1,  1074, 37929,     1,   701,  5666,     1,   702,
- 5667,     1,   703,  5668,     1,  1067, 37920,     2,  1807, 37905,
- 2898,  1538,     2,  1068, 37923,  2897,  1536,     1,  1069, 37924,
-    2,  1070, 37925,  1808, 37909,     2,  1071, 37926,  1809, 37910,
-    2,  1072, 37927,  2899,  1540,     1,  1082, 37944,     2,   277,
-37937,  1083, 37945,     1,  1075, 37936,     1,  2010,  1568,     1,
- 1076, 37938,     1,  1077, 37939,     1,  1078, 37940,     1,  1079,
-37941,     1,  1080, 37942,     1,  1081, 37943,     1,  2011,  1786,
-    1,  2191, 41987,     1,  2190, 41986,     1,  2192, 41988,     2,
- 1139, 38217,  1661,  1840,     1,  1138, 38216,     1,  1135, 38213,
-    1,  1134, 38212,     1,  1137, 38215,     1,  1136, 38214,     2,
- 1131, 38209,  3045,   784,     1,  1133, 38211,     1,  1132, 38210,
-    2,  1149, 38233,  1658,  1824,     2,  1148, 38232,  1659,  1825,
-    2,  1660,  1826,  2015,  1866,     1,  1145, 38229,     2,  1144,
-38228,  3044,   773,     1,  1147, 38231,     1,  1146, 38230,     1,
- 1141, 38225,     1,  1140, 38224,     1,  1143, 38227,     1,  1142,
-38226,     1,  1657,  1808,     1,  1654,  1792,     1,  1655,  1793,
-    1,  1656,  1794,     1,   706,  5892,     2,   707,  5894,  1337,
-38198,     2,   704,  5888,  1113, 38152,     1,  1114, 38153,     1,
-  705,  5890,     1,  2012,  1818,     2,  1110, 38148,  4323,    16,
-    1,  1111, 38150,     2,  1112, 38151,  1825, 38199,     1,   708,
- 5896,     2,   709,  5904,  1121, 38168,     1,  1122, 38169,     1,
-  710,  5906,     1,  1117, 38164,     1,  1118, 38165,     1,  1119,
-38166,     1,  1120, 38167,     2,  1115, 38160,  1824, 38176,     2,
- 1116, 38161,  1336, 38185,     2,   711,  5920,  1127, 38184,     1,
- 2014,  1850,     1,  1123, 38180,     2,  1124, 38181,  2904,  1798,
-    2,  1125, 38182,  2903,  1797,     2,  1126, 38183,  2902,  1796,
-    1,  1335, 38168,     1,  2901,  1794,     1,  2900,  1792,     1,
- 1130, 38200,     1,  1662,  1856,     2,  2013,  1834,  2910,  1816,
-    2,  2909,  1815,  4324,    32,     2,  1821, 38149,  2908,  1814,
-    1,  1822, 38150,     2,  1823, 38151,  2907,  1812,     1,  1128,
-38192,     3,  1129, 38193,  1818, 38145,  2906,  1810,     1,  1819,
-38146,     2,  1820, 38147,  2905,  1808,     2,  4026,  9744,  4233,
- 9728,     2,  4052,  9744,  4259,  9728,     2,  4078,  9744,  4285,
- 9728,     2,  4104,  9744,  4311,  9728,     2,  3922,  9744,  4129,
- 9728,     2,  3948,  9744,  4155,  9728,     2,  3974,  9744,  4181,
- 9728,     2,  4000,  9744,  4207,  9728,     2,  4025,  9728,  4234,
- 9744,     2,  2198, 42244,  2650, 26144,     2,  4051,  9728,  4260,
- 9744,     2,  4077,  9728,  4286,  9744,     2,  4103,  9728,  4312,
- 9744,     2,  3921,  9728,  4130,  9744,     2,  3947,  9728,  4156,
- 9744,     2,  3973,  9728,  4182,  9744,     2,  3999,  9728,  4208,
- 9744,     1,  2649, 26128,     1,  2199, 42277,     2,  1667,  2072,
- 2786,  6145,     1,  2788,  6147,     1,  2787,  6146,     1,  2790,
- 6149,     1,  2789,  6148,     1,  2792,  6151,     1,  2791,  6150,
-    1,  1663,  2064,     1,  2793,  6152,     1,  1664,  2066,     1,
- 1665,  2067,     1,  1666,  2068,     1,  2214, 56077,     1,  2213,
-56076,     1,  2212, 56075,     1,  2211, 56071,     1,  2210, 56070,
-    1,  2209, 56064,     1,  2215, 56179,     1,   712,  6144,     1,
-  713,  6145,     1,   714,  6146,     1,   715,  6147,     1,  2018,
- 2282,     1,  2017,  2266,     1,  2016,  2264,     1,  2797,  6405,
-    1,  2796,  6404,     1,  2798,  6407,     1,  2794,  6401,     1,
- 2795,  6403,     1,  2019,  2552,     3,  4346,  2048,  4372,  2050,
- 4399,  2052,     1,  4373,  2051,     3,  4347,  2050,  4371,  2048,
- 4424,  2052,     1,  4348,  2051,     3,  4349,  2052,  4396,  2048,
- 4422,  2050,     1,  4423,  2051,     3,  4374,  2052,  4397,  2050,
- 4421,  2048,     1,  4398,  2051,     4,  3028,  2310,  4446,  2048,
- 4472,  2050,  4499,  2052,     1,  4473,  2051,     4,  3027,  2308,
- 4447,  2050,  4471,  2048,  4524,  2052,     1,  4448,  2051,     3,
- 4449,  2052,  4496,  2048,  4522,  2050,     1,  4523,  2051,     3,
- 4474,  2052,  4497,  2050,  4521,  2048,     1,  4498,  2051,     3,
- 4546,  2048,  4572,  2050,  4599,  2052,     1,  4573,  2051,     3,
- 4547,  2050,  4571,  2048,  4624,  2052,     1,  4548,  2051,     3,
- 4549,  2052,  4596,  2048,  4622,  2050,     1,  4623,  2051,     3,
- 4574,  2052,  4597,  2050,  4621,  2048,     1,  4598,  2051,     3,
- 4646,  2048,  4672,  2050,  4699,  2052,     1,  4673,  2051,     3,
- 4647,  2050,  4671,  2048,  4724,  2052,     1,  4648,  2051,     4,
- 3030,  2322,  4649,  2052,  4696,  2048,  4722,  2050,     1,  4723,
- 2051,     4,  3029,  2320,  4674,  2052,  4697,  2050,  4721,  2048,
-    1,  4698,  2051,     1,  1668,  2562,     1,  1669,  2564,     1,
- 2799,  6657,     1,  2800,  6659,     1,  2802,  6661,     1,  2801,
- 6660,     1,  1213, 38928,     1,  1206, 38920,     1,  1207, 38921,
-    1,  1208, 38923,     1,  1209, 38924,     1,  1210, 38925,     1,
- 1211, 38926,     1,  1212, 38927,     1,  1200, 38913,     1,  1201,
-38915,     1,  1202, 38916,     1,  1203, 38917,     1,  1204, 38918,
-    1,  1205, 38919,     1,  2207, 43410,     1,  4742,    16,     1,
- 4741,     9,     1,  4740,     8,     1,  4744,    48,     1,  1797,
-32736,     1,  4743,    32,     1,  4745,    64,     1,  4750,    64,
-    1,  3897,     1,     1,  4749,    48,     1,  4748,    32,     1,
- 4746,    16,     1,  4747,    17,     1,  4755, 57565,     1,  4753,
-57344,     1,  4754, 57357,
+   34,     8,   126,  4169,   228,    16,  1020, 37457,  1263,    32,
+ 1403,    34,  1523,    36,  1863,    50,  2054,  4097,  2304,    70,
+ 2894,   114,  3213,   162,  3902, 16384,  3915,   268,  4871, 65530,
+ 4872, 65532,    11,     3,     3,   125,  4168,   264,  4176,  1019,
+37456,  1524,    37,  1864,    51,  2895,   115,  2991,  4148,  3140,
+ 1025,  3374,   196,  3559,   200,    10,     0,     0,   297,    16,
+ 1022, 37459,  1264,    34,  1401,    32,  2056,  4099,  2303,    68,
+ 2892,   112,  3141,  1026,  3212,   160,    10,     1,     1,  1021,
+37458,  1402,    33,  1885,  4208,  2055,  4098,  2893,   113,  2992,
+ 4150,  3142,  1027,  3375,   198,  3560,   202,     9,  1024, 37461,
+ 1265,    36,  1521,    32,  2058,  4101,  2302,    66,  2461,    80,
+ 2898,   118,  3143,  1028,  3911,   264,     9,  1023, 37460,  1443,
+ 4198,  1522,    33,  2057,  4100,  2462,    81,  2989,  4144,  3372,
+  192,  3561,   204,  3912,   265,    10,  1026, 37463,  1266,    38,
+ 1442,  4197,  1865,    52,  2060,  4103,  2301,    64,  2463,    82,
+ 2896,   116,  3058,   112,  3913,   266,     9,  1025, 37462,  1866,
+   53,  2059,  4102,  2464,    83,  2897,   117,  2990,  4146,  3373,
+  194,  3562,   206,  3914,   267,     7,   509,    16,  1028, 37465,
+ 1900,    48,  2062,  4105,  2900,   122,  3074,   112,  3930, 16384,
+    6,    31,     1,   124,  4160,   593,  4176,  1027, 37464,  2061,
+ 4104,  3552,   192,     6,   510,    18,  1030, 37467,  1404,    40,
+ 1901,    50,  2899,   120,  3554,   195,     5,   511,    19,  1029,
+37466,  2063,  4106,  3430,   192,  3553,   194,     6,   512,    20,
+ 1032, 37469,  1525,    40,  2902,   126,  3556,   197,  3907,   256,
+    8,    32,     5,   513,    21,  1031, 37468,  2903,   127,  2993,
+ 4152,  3376,   200,  3555,   196,  3908,   257,     5,    33,     6,
+ 1034, 37471,  2901,   124,  3558,   199,  3909,   258,     5,  1033,
+37470,  2994,  4154,  3557,   198,  3884,   192,  3910,   259,    12,
+    5,    18,    41,    24,   592,  4169,  1018, 37441,  1267,    48,
+ 1407,    50,  1528,    52,  2065,  4113,  2720,    96,  2878,    98,
+ 2981,  4133,  3572,   217,    11,     6,    19,   263,  4160,   591,
+ 4168,  1017, 37440,  1292,  4208,  1529,    53,  2064,  4112,  2498,
+ 4100,  2879,    99,  2980,  4132,  3571,   216,    10,     4,    16,
+   42,    26,  1268,    50,  1405,    48,  1530,    54,  2721,    98,
+ 2876,    96,  2983,  4135,  3188,   128,  3574,   219,     9,    43,
+   27,  1406,    49,  1531,    55,  1883,  4192,  2066,  4114,  2499,
+ 4102,  2877,    97,  2982,  4134,  3573,   218,     7,     7,    22,
+ 1409,    54,  2306,    82,  2496,  4097,  2882,   102,  3576,   221,
+ 3922,   280,     9,     8,    23,   343,  4160,  1269,    53,  1410,
+   55,  2495,  4096,  2883,   103,  2978,  4128,  3575,   220,  3923,
+  281,     6,  1526,    50,  2305,    80,  2722,   102,  2880,   100,
+ 3057,    96,  3924,   282,     9,  1270,    55,  1408,    53,  1527,
+   51,  1884,  4196,  2497,  4098,  2723,   103,  2881,   101,  2979,
+ 4130,  3577,   222,    11,    35,    16,   584,  4161,  1629,    48,
+ 1898,    32,  2133, 37393,  2724,   104,  2886,   106,  2988,  4141,
+ 3073,    96,  3564,   209,  3919,   276,     9,   127,  4176,   583,
+ 4160,  1630,    49,  1899,    33,  2132, 37392,  2887,   107,  2987,
+ 4140,  3563,   208,  3920,   277,     9,     9,    24,    36,    18,
+  586,  4163,  1411,    56,  1631,    50,  1921,    32,  2135, 37395,
+ 2884,   104,  3566,   211,     9,    37,    19,   128,  4178,   585,
+ 4162,  1412,    57,  2134, 37394,  2885,   105,  3431,   208,  3565,
+  210,  3921,   279,     6,    38,    20,   588,  4165,  1532,    56,
+ 1632,    52,  2890,   110,  3568,   213,     8,    39,    21,   587,
+ 4164,  1533,    57,  2136, 37396,  2891,   111,  2984,  4136,  3567,
+  212,  3916,   273,     6,    40,    22,   590,  4167,  2888,   108,
+ 2986,  4139,  3570,   215,  3917,   274,     7,   589,  4166,  2137,
+37398,  2889,   109,  2985,  4138,  3569,   214,  3885,   208,  3918,
+  275,    14,   236,    48,   323,    52,   533,    56,   616,  4217,
+ 1291,  4161,  1342, 37449,  1373,     2,  1622,     8,  1862,    18,
+ 1920,    26,  2715,    80,  2871,    82,  3176,   162,  3587,   233,
+    8,   534,    57,   615,  4216,  1290,  4160,  1341, 37448,  1374,
+    3,  1623,     9,  2716,    81,  3586,   232,    12,    50,    42,
+  237,    50,   300,    48,   535,    58,  1624,    10,  1881,  4177,
+ 1893,    26,  2310,   100,  2717,    82,  2870,    80,  3174,   160,
+ 3589,   235,    10,   238,    51,   301,    49,  1372,     1,  1436,
+ 4160,  1880,  4176,  1894,    27,  2718,    83,  3056,    85,  3175,
+  161,  3588,   234,     9,   239,    52,   321,    48,  1377,     6,
+ 1895,    28,  2308,    98,  2469,   112,  2606,    66,  2873,    86,
+ 3591,   237,     7,   240,    53,  1378,     7,  1896,    29,  2309,
+   99,  2470,   113,  2607,    67,  3590,   236,    10,   322,    50,
+ 1375,     4,  1882,  4181,  1897,    30,  2307,    96,  2471,   114,
+ 2604,    64,  2872,    84,  3177,   164,  3593,   239,     5,  1376,
+    5,  1437,  4164,  2472,   115,  2605,    65,  3592,   238,     9,
+   44,    32,   525,    48,   608,  4209,  1337, 37441,  1381,    10,
+ 1705,  4161,  1889,    16,  3072,    80,  3579,   225,     9,    45,
+   33,   129,  4192,   526,    49,   607,  4208,  1382,    11,  1704,
+ 4160,  1890,    17,  2138, 37408,  3578,   224,     9,    46,    34,
+  527,    50,   610,  4211,  1379,     8,  1617,     2,  1919,    16,
+ 2719,    90,  3178,   168,  3581,   227,     8,    47,    35,   130,
+ 4194,   528,    51,   609,  4210,  1380,     9,  1618,     3,  3432,
+  224,  3580,   226,    10,    48,    36,   529,    52,   612,  4213,
+ 1338, 37445,  1385,    14,  1619,     4,  1891,    20,  2140, 37413,
+ 2874,    94,  3583,   229,     8,    49,    37,   530,    53,   611,
+ 4212,  1251,    13,  1620,     5,  2139, 37412,  2875,    95,  3582,
+  228,     8,   531,    54,   614,  4215,  1252,    14,  1340, 37447,
+ 1383,    12,  1621,     6,  1892,    22,  3585,   231,     6,   532,
+   55,   613,  4214,  1339, 37446,  1384,    13,  3584,   230,  3886,
+  224,    11,   229,    32,   318,    36,   522,    40,   603,  4201,
+ 1253,    16,  1388,    18,  1439,  4179,  1888,     8,  2315,   118,
+ 2712,    64,  3602,   249,    12,   230,    33,   265,  4192,   319,
+   37,   523,    41,   602,  4200,  1035, 37472,  1254,    17,  1389,
+   19,  2316,   119,  2713,    65,  2972,  4100,  3601,   248,    11,
+  231,    34,   298,    32,   524,    42,  1255,    18,  1386,    16,
+ 1519,    22,  1879,  4161,  2313,   116,  2714,    66,  2869,    64,
+ 3604,   251,     9,   299,    33,   604,  4202,  1256,    19,  1387,
+   17,  1438,  4176,  1878,  4160,  2314,   117,  2973,  4102,  3603,
+  250,     6,   232,    36,  1257,    20,  1392,    22,  1516,    16,
+ 2465,    96,  3189,   166,     8,   605,  4204,  1258,    21,  1393,
+   23,  1517,    17,  2466,    97,  2970,  4096,  3190,   167,  3605,
+  252,     7,   233,    38,  1259,    22,  1390,    20,  1518,    18,
+ 2311,   112,  2467,    98,  3055,    64,    10,   234,    39,   317,
+   35,   606,  4206,  1260,    23,  1391,    21,  1440,  4180,  2312,
+  113,  2468,    99,  2971,  4098,  3606,   254,    10,    51,    48,
+  235,    40,   514,    32,   595,  4193,  1261,    24,  1344, 37457,
+ 1396,    26,  1625,    16,  1707,  4177,  1860,    10,    13,    52,
+   49,   131,  4208,   515,    33,   594,  4192,  1262,    25,  1343,
+37456,  1397,    27,  1626,    17,  1706,  4176,  2976,  4108,  3434,
+  242,  3594,   240,  3890,   246,    10,    53,    50,   516,    34,
+  597,  4195,  1346, 37459,  1394,    24,  1441,  4185,  1627,    18,
+ 1709,  4179,  3191,   168,  3596,   243,    12,    54,    51,   132,
+ 4210,   517,    35,   596,  4194,  1345, 37458,  1395,    25,  1708,
+ 4178,  2977,  4110,  3192,   169,  3433,   240,  3595,   242,  3889,
+  244,    11,    55,    52,   320,    40,   518,    36,   599,  4197,
+ 1348, 37461,  1400,    30,  1520,    24,  1628,    20,  1711,  4181,
+ 1887,     4,  3598,   245,     9,    56,    53,   519,    37,   598,
+ 4196,  1347, 37460,  1710,  4180,  2974,  4104,  3436,   246,  3597,
+  244,  3888,   242,     8,   520,    38,   601,  4199,  1350, 37463,
+ 1398,    28,  1783, 24976,  1861,    12,  1917,     4,  3600,   247,
+   10,   521,    39,   600,  4198,  1349, 37462,  1399,    29,  1712,
+ 4182,  1918,     5,  2975,  4106,  3435,   244,  3599,   246,  3887,
+  240,    20,   259,  4112,   493, 20752,   575,  4120,  1289,  4128,
+ 1335, 37416,  1555,   101,  1644,   105,  1875,  4146,  1955,     1,
+ 2426,    19,  2447,    21,  2587,    39,  3153,     0,  3358,   132,
+ 3528,   136,  4025,   260,  4053,   262,  4238,   276,  4288,   272,
+ 4315,   274,    22,   242,    80,   330,    84,   494, 20753,   576,
+ 4121,  1273,    96,  1554,   100,  1643,   104,  1876,  4147,  2279,
+    4,  2374,     8,  2401,    16,  2425,    18,  2446,    20,  2586,
+   38,  2863,    50,  3053,    54,  3154,     1,  3228,   130,  3359,
+  133,  3529,   137,  4026,   261,  4102,   259,    20,   305,    81,
+  495, 20754,   577,  4122,  1557,   103,  1873,  4144,  1957,     3,
+ 2280,     7,  2403,    19,  2424,    17,  2449,    23,  2548,    33,
+ 2585,    37,  3155,     2,  3360,   134,  3530,   138,  4027,   262,
+ 4051,   260,  4264,   276,  4289,   274,  4314,   272,    19,   304,
+   80,   331,    86,   496, 20755,   578,  4123,  1274,    98,  1556,
+  102,  1874,  4145,  1956,     2,  2402,    18,  2448,    22,  2547,
+   32,  2584,    36,  2862,    48,  3052,    52,  3156,     3,  3227,
+  128,  3531,   139,  4052,   261,  4076,   259,    17,   341,  4112,
+  497, 20756,  1005, 37396,  1551,    97,  1959,     5,  2276,     1,
+ 2405,    21,  2443,    17,  2583,    35,  3157,     4,  3356,   128,
+ 3532,   140,  4077,   260,  4105,   262,  4236,   272,  4263,   274,
+ 4290,   276,    13,   217, 37381,   328,    80,   498, 20757,  1550,
+   96,  1958,     4,  2404,    20,  2428,    22,  2442,    16,  3051,
+   50,  3158,     5,  3533,   141,  4050,   259,  4078,   261,    17,
+  218, 37382,   499, 20758,  1428,  4132,  1553,    99,  1877,  4148,
+ 1961,     7,  2278,     3,  2407,    23,  2445,    19,  2582,    33,
+ 3357,   130,  3534,   142,  4079,   262,  4103,   260,  4237,   274,
+ 4262,   272,  4316,   276,    17,   219, 37383,   329,    82,   500,
+20759,  1006, 37399,  1429,  4133,  1552,    98,  1960,     6,  2277,
+    2,  2406,    22,  2427,    20,  2444,    18,  2581,    32,  2864,
+   52,  3050,    48,  3535,   143,  4024,   259,  4104,   261,    18,
+   58,    65,   118,  4096,   220, 37384,   501, 20760,   569,  4112,
+ 1007, 37400,  1638,    97,  1963,     9,  2369,     1,  2409,    25,
+ 2595,    47,  3425,   130,  3524,   128,  4129,   260,  4157,   262,
+ 4342,   276,  4392,   272,  4419,   274,    14,    57,    64,   221,
+37385,   502, 20761,   538,    80,   570,  4113,  1008, 37401,  1333,
+37409,  1637,    96,  1962,     8,  2408,    24,  2594,    46,  2866,
+   58,  4130,   261,  4206,   259,    16,   503, 20762,   571,  4114,
+ 1334, 37410,  1430,  4136,  1640,    99,  1965,    11,  2371,     3,
+ 2411,    27,  2593,    45,  3424,   128,  3525,   130,  4131,   262,
+ 4155,   260,  4368,   276,  4393,   274,  4418,   272,    11,    59,
+   66,   504, 20763,  1431,  4137,  1639,    98,  1964,    10,  2370,
+    2,  2410,    26,  2592,    44,  2865,    56,  4156,   261,  4180,
+  259,    14,   505, 20764,   572,  4116,  1559,   105,  1641,   101,
+ 2282,     9,  2413,    29,  2591,    43,  3361,   136,  3526,   132,
+ 4181,   260,  4209,   262,  4340,   272,  4367,   274,  4394,   276,
+    9,   506, 20765,  1558,   104,  2281,     8,  2412,    28,  2450,
+   24,  2590,    42,  2868,    62,  4154,   259,  4182,   261,    12,
+  507, 20766,   573,  4118,  2284,    11,  2373,     7,  2589,    41,
+ 3527,   134,  3881,   128,  4183,   262,  4207,   260,  4341,   274,
+ 4366,   272,  4420,   276,    12,   391, 12441,   508, 20767,   574,
+ 4119,  1642,   102,  2283,    10,  2372,     6,  2414,    30,  2588,
+   40,  2867,    60,  3054,    56,  4128,   259,  4208,   261,    18,
+  255,  4096,   326,    69,   477, 20736,   568,  4104,  1004, 37376,
+ 1336, 37432,  1565,   117,  1967,    17,  2274,    19,  2418,     3,
+ 2602,    55,  2708,    33,  3159,     0,  4030,   276,  4080,   272,
+ 4107,   274,  4233,   260,  4261,   262,    20,    67,    88,   241,
+   64,   256,  4097,   303,    66,   325,    68,   478, 20737,  1275,
+  112,  1432,  4147,  1564,   116,  1966,    16,  2212, 41626,  2273,
+   18,  2293,    22,  2417,     2,  2601,    54,  2707,    32,  2858,
+   34,  3069,    40,  4234,   261,  4310,   259,    14,   257,  4098,
+  479, 20738,  1567,   119,  1871,  4128,  2272,    17,  2292,    21,
+ 2416,     1,  2600,    53,  2710,    35,  4056,   276,  4081,   274,
+ 4106,   272,  4235,   262,  4259,   260,    15,   302,    64,   327,
+   70,   480, 20739,  1566,   118,  1872,  4129,  1968,    18,  2271,
+   16,  2291,    20,  2599,    52,  2709,    34,  2857,    32,  3070,
+   42,  3229,   144,  4260,   261,  4284,   259,     9,   481, 20740,
+ 1561,   113,  2286,    17,  2421,     7,  4028,   272,  4055,   274,
+ 4082,   276,  4285,   260,  4313,   262,    15,   222, 37397,   258,
+ 4101,   482, 20741,  1434,  4151,  1560,   112,  1840, 37429,  2285,
+   16,  2290,    18,  2400,     4,  2420,     6,  2598,    50,  2711,
+   36,  2860,    38,  4258,   259,  4286,   261,    10,   390, 12416,
+  483, 20742,  1563,   115,  2288,    19,  2597,    49,  4029,   274,
+ 4054,   272,  4108,   276,  4287,   262,  4311,   260,    13,   324,
+   66,   484, 20743,  1433,  4149,  1562,   114,  2275,    20,  2287,
+   18,  2419,     4,  2596,    48,  2859,    36,  3049,    32,  3071,
+   46,  4232,   259,  4312,   261,    15,    61,    81,   119,  4112,
+  485, 20744,   561,  4096,   784, 20740,  1646,   113,  1906,    97,
+ 2376,    17,  3427,   146,  3536,   144,  4134,   276,  4184,   272,
+ 4211,   274,  4337,   260,  4365,   262,    10,    60,    80,   486,
+20745,   536,    64,  1645,   112,  1905,    96,  2375,    16,  3066,
+   32,  3537,   145,  4338,   261,  4414,   259,    12,    63,    83,
+  487, 20746,   562,  4098,  2378,    19,  2423,     9,  3426,   144,
+ 3538,   146,  4160,   276,  4185,   274,  4210,   272,  4339,   262,
+ 4363,   260,    12,    62,    82,   488, 20747,   537,    66,   563,
+ 4099,  1435,  4153,  1907,    98,  2209, 41616,  2377,    18,  2422,
+    8,  2861,    40,  4364,   261,  4388,   259,    13,    65,    85,
+  489, 20748,   564,  4100,   782, 20736,  1569,   121,  2211, 41623,
+ 2289,    25,  2380,    21,  4132,   272,  4159,   274,  4186,   276,
+ 4389,   260,  4417,   262,    11,    64,    84,   490, 20749,   565,
+ 4101,   783, 20737,  1568,   120,  1908,   100,  2210, 41622,  2379,
+   20,  3067,    36,  4362,   259,  4390,   261,     7,   491, 20750,
+  566,  4102,  4133,   274,  4158,   272,  4212,   276,  4391,   262,
+ 4415,   260,     8,    66,    86,   492, 20751,   567,  4103,  2294,
+   24,  2603,    56,  3068,    38,  4336,   259,  4416,   261,    10,
+  262,  4144,  1283,  4096,  1537,    69,  2067,  4192,  2436,    51,
+ 2532,     3,  2551,     5,  2703,    17,  3005,  4180,  3363,   164,
+   10,    72,   104,   311,   114,  1012, 37425,  1284,  4097,  1414,
+   66,  1536,    68,  1969,    32,  2531,     2,  2702,    16,  2855,
+   18,    10,   310,   113,  1013, 37426,  1285,  4098,  1413,    65,
+ 1869,  4112,  2435,    49,  2530,     1,  2552,     7,  3006,  4182,
+ 3364,   166,     9,  1286,  4099,  1538,    70,  1870,  4113,  2434,
+   48,  2458,    54,  2560,     4,  2704,    18,  2854,    16,  3007,
+ 4183,     7,  1014, 37428,  1287,  4100,  2455,    49,  2559,     3,
+ 2706,    21,  3003,  4176,  3362,   160,     8,  1288,  4101,  1422,
+ 4103,  1534,    64,  2438,    54,  2454,    48,  2535,     6,  2558,
+    2,  2705,    20,     7,  1015, 37430,  1971,    39,  2457,    51,
+ 2534,     5,  2550,     3,  2557,     1,  3004,  4178,     8,  1535,
+   66,  1970,    38,  2437,    52,  2456,    50,  2533,     4,  2549,
+    2,  2856,    20,  3048,    16,     5,    69,    97,   541,   113,
+  582,  4144,  2539,    11,  3539,   160,     9,    68,    96,   540,
+  112,  1016, 37433,  1633,    64,  1904,    80,  2441,    58,  2538,
+   10,  2566,    14,  3065,    16,     9,   543,   115,  1416,    73,
+ 1423,  4104,  2440,    57,  2537,     9,  2555,    15,  2565,    13,
+ 3428,   160,  3540,   162,     7,    70,    98,   542,   114,  1415,
+   72,  1424,  4105,  2439,    56,  2536,     8,  2564,    12,     6,
+  545,   117,  2460,    57,  2543,    15,  2554,     9,  2563,    11,
+ 3541,   164,     8,    71,   100,   544,   116,  1417,    78,  1539,
+   72,  2459,    56,  2542,    14,  2553,     8,  2562,    10,     3,
+ 2541,    13,  2561,     9,  3882,   160,     2,  2295,    40,  2540,
+   12,    11,   260,  4128,   308,    99,  1009, 37408,  1426,  4114,
+ 1545,    85,  1972,    49,  2573,    23,  2694,     1,  2997,  4164,
+ 3367,   180,  3547,   184,    10,   261,  4129,   307,    98,  1271,
+   80,  1544,    84,  2299,    54,  2415,    32,  2546,    18,  2572,
+   22,  2847,     2,  3043,     6,    10,  1425,  4112,  1547,    87,
+ 1867,  4096,  1974,    51,  2545,    17,  2571,    21,  2696,     3,
+ 2998,  4166,  3368,   182,  3548,   186,    10,   306,    96,  1272,
+   82,  1546,    86,  1868,  4097,  1973,    50,  2298,    52,  2544,
+   16,  2695,     2,  3369,   183,  3549,   187,    12,   342,  4128,
+ 1420,    87,  1541,    81,  1975,    53,  2431,    39,  2452,    33,
+ 2570,    19,  2698,     5,  2995,  4160,  3042,     3,  3365,   176,
+ 3550,   188,     9,  1419,    86,  1540,    80,  2297,    50,  2430,
+   38,  2451,    32,  2556,    16,  2569,    18,  2697,     4,  2849,
+    6,    11,   122,  4158,  1010, 37414,  1418,    85,  1543,    83,
+ 1636,    95,  2429,    37,  2568,    17,  2996,  4162,  3041,     1,
+ 3366,   178,  3551,   190,    11,   123,  4159,   223, 37431,   309,
+  100,  1011, 37415,  1542,    82,  1976,    54,  2296,    48,  2453,
+   34,  2567,    16,  2699,     6,  2848,     4,     9,   120,  4144,
+  579,  4128,  1635,    81,  1977,    57,  2580,    31,  2701,     9,
+ 3001,  4172,  3064,     1,  3542,   176,     8,    73,   112,   539,
+   96,  1634,    80,  1902,    64,  2579,    30,  2700,     8,  2851,
+   10,  3047,    14,     6,   121,  4146,   580,  4130,  2433,    41,
+ 3002,  4174,  3429,   176,  3543,   178,    10,   581,  4131,  1332,
+37395,  1421,    88,  1427,  4121,  1978,    58,  2432,    40,  2578,
+   28,  2850,     8,  3046,    12,  3544,   179,     5,  1549,    89,
+ 2577,    27,  2999,  4168,  3370,   184,  3545,   180,     6,  1548,
+   88,  1903,    68,  2576,    26,  2853,    14,  3045,    10,  3371,
+  185,     4,  2575,    25,  3000,  4170,  3546,   182,  3883,   176,
+    4,  2300,    56,  2574,    24,  2852,    12,  3044,     8,    10,
+  349,  8212,  2085, 12289,  3083,     2,  3181,    16,  3208,    32,
+ 3508,    75,  4484, 16384,  4512,   256,  4538,   258,  4714,   272,
+    7,  2529, 12320,  3084,     3,  3095,     1,  3298,    66,  3352,
+   70,  3403,    72,  3507,    74,     7,   350,  8214,  3297,    65,
+ 3351,    69,  4509, 16384,  4513,   258,  4537,   256,  4739,   272,
+    5,  3082,     1,  3096,     3,  3296,    64,  3350,    68,  3506,
+   72,     7,  3087,     6,  3097,     4,  3511,    79,  4462,   256,
+ 4488,   258,  4534, 16384,  4664,   272,     6,   380, 12368,  3088,
+    7,  3098,     5,  3314,    64,  3349,    66,  3510,    78,     7,
+  348,  8210,  3085,     4,  3099,     6,  4463,   258,  4487,   256,
+ 4559, 16384,  4689,   272,     5,  3086,     5,  3100,     7,  3315,
+   66,  3348,    64,  3509,    76,    11,    76,   130,   353,  8220,
+  752,  8208,  1277,   170,  3101,     8,  3397,    65,  3503,    67,
+ 4584, 16384,  4612,   256,  4638,   258,  4814,   272,     3,   558,
+  147,  3396,    64,  3502,    66,     9,    74,   128,   354,  8222,
+  556,   144,  3089,     8,  3102,    10,  4609, 16384,  4613,   258,
+ 4637,   256,  4839,   272,     5,    75,   129,   557,   145,  3090,
+    9,  3398,    66,  3501,    64,     8,   351,  8216,  1782, 24864,
+ 3103,    12,  3400,    69,  4562,   256,  4588,   258,  4634, 16384,
+ 4764,   272,     3,  3399,    68,  3505,    70,  3874,    64,     8,
+  352,  8218,   559,   148,  3354,    73,  3402,    71,  4563,   258,
+ 4587,   256,  4659, 16384,  4789,   272,     5,   560,   149,  3353,
+   72,  3401,    70,  3504,    68,  3875,    66,    11,   270,  8192,
+  345,  8196,  3093,    18,  3104,    16,  3160,    16,  3209,    48,
+ 3219,    32,  4514,   272,  4684, 16384,  4712,   256,  4738,   258,
+    4,   312,   129,  3094,    19,  3301,    82,  3318,    84,     9,
+  313,   130,   346,  8198,   554,   136,  3091,    16,  3300,    81,
+ 4539,   272,  4709, 16384,  4713,   258,  4737,   256,     6,   314,
+  131,   555,   137,  3092,    17,  3299,    80,  3319,    86,  3408,
+   90,     5,   315,   132,  4464,   272,  4662,   256,  4688,   258,
+ 4734, 16384,     3,   316,   133,   379, 12352,  3316,    80,     7,
+   81,   156,   344,  8194,  3105,    22,  4489,   272,  4663,   258,
+ 4687,   256,  4759, 16384,     4,    82,   157,  3106,    23,  3317,
+   82,  3355,    80,     9,    78,   146,   548,   130,  3107,    24,
+ 3515,    83,  3878,    85,  4614,   272,  4784, 16384,  4812,   256,
+ 4838,   258,     5,   549,   131,   746,  8193,  3108,    25,  3404,
+   80,  3514,    82,     8,    77,   144,   546,   128,   747,  8194,
+ 3513,    81,  4639,   272,  4809, 16384,  4813,   258,  4837,   256,
+    4,   547,   129,   748,  8195,  3405,    82,  3512,    80,     9,
+   80,   150,   347,  8200,   552,   134,   749,  8196,  3877,    81,
+ 4564,   272,  4762,   256,  4788,   258,  4834, 16384,     5,   553,
+  135,   750,  8197,  3320,    88,  3406,    84,  3876,    80,     9,
+   79,   148,   550,   132,   751,  8198,  3161,    30,  3516,    85,
+ 4589,   272,  4763,   258,  4787,   256,  4859, 16384,     2,   551,
+  133,  3407,    86,     6,   387, 12405,  1574,   134,  3162,    32,
+ 3182,    48,  3218,    16,  3223,    96,     5,   386, 12404,  1575,
+  135,  2523, 12288,  3109,    33,  3416,   104,     3,   389, 12407,
+ 1276,   128,  3110,    34,     5,   388, 12406,  1573,   133,  2524,
+12290,  3111,    35,  3417,   106,     2,   355,  8240,   383, 12401,
+    4,   382, 12400,  1572,   131,  2525, 12292,  3321,    96,     3,
+  356,  8242,   385, 12403,  1570,   128,     5,   384, 12402,  1571,
+  129,  2526, 12294,  3322,    98,  3880,   106,     4,   754,  8240,
+ 1649,   130,  1756,  8192,  3410,    97,     2,  2527, 12296,  3409,
+   96,     3,  1647,   128,  1757,  8194,  3412,    99,     2,  1648,
+  129,  3411,    98,     2,  1776, 24832,  3414,   101,     3,  1777,
+24833,  3413,   100,  3879,    96,     2,  1576,   136,  1778, 24834,
+    2,  1577,   137,  3415,   102,     5,  1584,   150,  3163,    48,
+ 3207,    16,  3224,   112,  3523,   123,     5,  1585,   151,  2528,
+12304,  3325,   116,  3422,   120,  3522,   122,     4,  1582,   148,
+ 3112,    50,  3225,   114,  3521,   121,     4,  1583,   149,  3113,
+   51,  3423,   122,  3520,   120,     4,  1580,   146,  3063,   192,
+ 3114,    52,  3226,   116,     4,   381, 12384,  1581,   147,  3115,
+   53,  3323,   112,     2,  1578,   144,  3116,    54,     3,  1579,
+  145,  3117,    55,  3324,   114,     3,   753,  8224,  1652,   146,
+ 1781, 24852,     3,  1653,   147,  3418,   112,  3519,   114,     2,
+ 1650,   144,  3518,   113,     3,  1651,   145,  3419,   114,  3517,
+  112,     1,  1779, 24848,     1,  3420,   116,     3,  1586,   152,
+ 1654,   148,  1780, 24850,     1,  3421,   118,     8,  2073,  8193,
+ 3277,     2,  3304,     4,  3328,     6,  3477,    10,  3870,    12,
+ 4521,  4352,  4548,  4354,     9,  3164,    64,  3184,    80,  3232,
+   16,  3241,   320,  3278,     3,  3305,     5,  3478,    11,  4522,
+ 4353,  4549,  4355,     6,   268,  4240,  3306,     6,  3327,     4,
+ 3871,    14,  4523,  4354,  4546,  4352,     5,  3081,   184,  3185,
+   82,  3476,     9,  4524,  4355,  4547,  4353,     7,  1037, 37526,
+ 2075,  8197,  3326,     2,  3480,    14,  3867,     8,  4471,  4352,
+ 4498,  4354,    10,   372, 12305,  1038, 37527,  2074,  8196,  2317,
+  128,  3062,   176,  3186,    84,  3302,     1,  3868,     9,  4472,
+ 4353,  4499,  4355,     9,   373, 12306,  2077,  8199,  3279,     4,
+ 3303,     2,  3479,    12,  3869,    10,  3900,     8,  4473,  4354,
+ 4496,  4352,     5,  1036, 37525,  2076,  8198,  2475,   144,  4474,
+ 4355,  4497,  4353,     7,  2079,  8201,  3280,    10,  3309,    12,
+ 3471,     2,  3864,     4,  4621,  4352,  4648,  4354,     6,   206,
+12289,  2078,  8200,  3078,   178,  3472,     3,  4622,  4353,  4649,
+ 4355,     8,   133,  4224,   625,  4240,  1039, 37528,  3310,    14,
+ 3865,     6,  3898,     4,  4623,  4354,  4646,  4352,     5,  3077,
+  176,  3866,     7,  3899,     5,  4624,  4355,  4647,  4353,     6,
+ 3283,    14,  3307,     8,  3474,     6,  3897,     2,  4571,  4352,
+ 4598,  4354,     4,  3080,   182,  3475,     7,  4572,  4353,  4599,
+ 4355,     9,   134,  4228,   626,  4244,  3281,    12,  3308,    10,
+ 3329,     8,  3473,     4,  3863,     2,  4573,  4354,  4596,  4352,
+    5,  3079,   180,  3282,    13,  3330,     9,  4574,  4355,  4597,
+ 4353,     9,  2081,  8209,  2320,   149,  3221,    17,  3286,    18,
+ 3313,    20,  3334,    22,  3488,    26,  4721,  4352,  4748,  4354,
+    7,  2080,  8208,  2319,   148,  3165,    80,  3183,    64,  3220,
+   16,  4722,  4353,  4749,  4355,     8,   266,  4224,   624,  4232,
+ 2321,   151,  3284,    16,  3333,    20,  3487,    24,  4723,  4354,
+ 4746,  4352,     4,   267,  4225,  3285,    17,  4724,  4355,  4747,
+ 4353,     4,  3311,    16,  3332,    18,  4671,  4352,  4698,  4354,
+    3,  3061,   160,  4672,  4353,  4699,  4355,     6,  2083,  8215,
+ 2474,   129,  3312,    18,  3331,    16,  4673,  4354,  4696,  4352,
+    5,  2082,  8214,  2318,   146,  2473,   128,  4674,  4355,  4697,
+ 4353,     7,   207, 12304,   619,  4226,   755,  8257,  3377,    16,
+ 3482,    18,  4821,  4352,  4848,  4354,     5,   208, 12305,   620,
+ 4227,  3483,    19,  4822,  4353,  4849,  4355,     8,   135,  4240,
+  209, 12306,   617,  4224,   757,  8259,  3378,    18,  3481,    16,
+ 4823,  4354,  4846,  4352,     5,   618,  4225,   756,  8258,  3076,
+  160,  4824,  4355,  4847,  4353,     6,   623,  4230,   759,  8261,
+ 3379,    20,  3486,    22,  4771,  4352,  4798,  4354,     4,   758,
+ 8260,  2322,   152,  4772,  4353,  4799,  4355,     6,   621,  4228,
+ 3335,    24,  3380,    22,  3484,    20,  4773,  4354,  4796,  4352,
+    5,   622,  4229,   760,  8262,  3485,    21,  4774,  4355,  4797,
+ 4353,     4,  3167,    97,  3288,    34,  3339,    38,  3497,    42,
+    5,  3166,    96,  3210,    64,  3222,    32,  3242,   352,  3498,
+   43,     5,  3169,    99,  3287,    32,  3338,    36,  3386,    42,
+ 3496,    40,     2,  3168,    98,  3387,    43,     4,  3170,   101,
+ 3290,    38,  3337,    34,  3388,    44,     1,  3060,   144,     4,
+ 3171,   103,  3289,    36,  3336,    32,  3499,    44,     1,  3500,
+   45,     4,  1761, 12288,  3172,   105,  3381,    32,  3491,    34,
+    2,  3382,    33,  3492,    35,     6,  1713,  4224,  1762, 12290,
+ 3291,    40,  3342,    44,  3383,    34,  3489,    32,     5,  1763,
+12291,  3075,   144,  3173,   106,  3292,    41,  3490,    33,     5,
+ 1764, 12292,  3341,    42,  3384,    36,  3494,    38,  3872,    32,
+    3,  2208, 41508,  3385,    37,  3495,    39,     3,  1765, 12294,
+ 3340,    40,  3873,    34,     1,  3493,    37,     5,   376, 12324,
+ 1444,  4240,  2728,   131,  3294,    50,  3345,    54,     6,  2727,
+  130,  2904,   128,  3187,    96,  3211,    80,  3233,    32,  3243,
+  368,     5,   377, 12326,  1445,  4242,  2726,   129,  3293,    48,
+ 3394,    58,     3,  1446,  4243,  2725,   128,  3395,    59,     3,
+  374, 12320,  1447,  4244,  2731,   135,     4,  1448,  4245,  2730,
+  134,  3059,   128,  3344,    51,     4,   375, 12322,  1449,  4246,
+ 3295,    52,  3343,    48,     2,  1450,  4247,  2729,   132,     2,
+ 1766, 12304,  3389,    48,     2,  1714,  4240,  3390,    50,     1,
+ 3391,    51,     1,   378, 12328,     2,  3346,    56,  3392,    54,
+    2,  3347,    57,  3393,    55,     6,    13,  4417,    93,   268,
+  404, 16404,  1602,   288,  2117, 16448,  3984,  4177,     6,    94,
+  269,   405, 16405,  2071,  4356,  2118, 16449,  4023,    64,  4031,
+ 4097,     3,   406, 16406,  1603,   290,  3986,  4179,     7,    14,
+ 4418,    95,   271,   407, 16407,   658,  4446,  3985,  4178,  4049,
+   64,  4057,  4097,     9,    11,   258,    91,   264,   400, 16400,
+ 1083, 37713,  1604,   292,  2068,  4353,  2337,   326,  3144,  1280,
+ 3988,  4181,     5,   401, 16401,  2338,   327,  3987,  4180,  4075,
+   64,  4083,  4097,     6,    10,   256,   148,  4427,   402, 16402,
+ 1085, 37715,  1605,   294,  2070,  4355,    10,    92,   267,   147,
+ 4426,   403, 16403,   657,  4442,  1084, 37714,  2069,  4354,  2336,
+  325,  3989,  4182,  4101,    64,  4109,  4097,     7,    87,   260,
+  146,  4421,   210, 16384,   412, 16412,   655,  4437,  1671,   292,
+ 3991,  4185,     8,    88,   261,   413, 16413,   654,  4436,   781,
+20560,  1672,   293,  3990,  4184,  4127,    64,  4135,  4097,     1,
+   89,   262,     4,    90,   263,   656,  4438,  4153,    64,  4161,
+ 4097,     4,    83,   256,   408, 16408,   651,  4433,  1667,   288,
+    7,    84,   257,   145,  4416,   409, 16409,   650,  4432,  1668,
+  289,  4179,    64,  4187,  4097,     4,    85,   258,   410, 16410,
+  653,  4435,  1669,   290,     7,    86,   259,   411, 16411,   652,
+ 4434,  1670,   291,  3248,   153,  4205,    64,  4213,  4097,     8,
+  295, 16384,   332,   256,   393, 16388,  1081, 37701,  2119, 16464,
+ 2501,  4353,  3901,    16,  3976,  4161,     7,   333,   257,  1080,
+37700,  2120, 16465,  2500,  4352,  3931,     1,  4231,    64,  4239,
+ 4097,     6,   334,   258,   394, 16390,  2121, 16466,  2503,  4355,
+ 3932,     2,  3978,  4163,     6,   335,   259,  1082, 37702,  2502,
+ 4354,  3977,  4162,  4257,    64,  4265,  4097,     8,   102,   280,
+  336,   260,   649,  4425,  1077, 37697,  2505,  4357,  3145,  1296,
+ 3933,     4,  3980,  4165,     8,   103,   281,   243,   257,   337,
+  261,  1076, 37696,  2504,  4356,  3979,  4164,  4283,    64,  4291,
+ 4097,     7,   244,   258,   277,  8576,   338,   262,   392, 16386,
+ 1079, 37699,  3259,   160,  3982,  4167,     6,   151,  4442,   339,
+  263,  1078, 37698,  3981,  4166,  4309,    64,  4317,  4097,     6,
+   98,   276,   150,  4437,   340,   264,   397, 16396,   646,  4421,
+  767, 16384,     7,    99,   277,   645,  4420,   780, 20544,  3684,
+  468,  3983,  4168,  4335,    64,  4343,  4097,     3,   100,   278,
+  398, 16398,   648,  4423,     6,   101,   279,   399, 16399,   647,
+ 4422,  3685,   470,  4361,    64,  4369,  4097,     3,    96,   272,
+  395, 16392,   642,  4417,     5,   149,  4432,   641,  4416,  3682,
+  464,  4387,    64,  4395,  4097,     3,    97,   274,   396, 16394,
+  644,  4419,     4,   643,  4418,  3683,   466,  4413,    64,  4421,
+ 4097,     4,   423, 16436,  1306, 16384,  1587,   256,  4004,  4209,
+    3,   424, 16437,  1279,   261,  4003,  4208,     3,   425, 16438,
+ 1588,   258,  4006,  4211,     2,  1589,   259,  4005,  4210,     6,
+  419, 16432,  1278,   256,  1590,   260,  1663,   264,  3146,  1312,
+ 4007,  4213,     3,   420, 16433,  1591,   261,  1664,   265,     4,
+  279,  8624,   421, 16434,  1592,   262,  4009,  4215,     4,   422,
+16435,  1465,  4416,  1593,   263,  4008,  4214,     6,   108,   292,
+  428, 16444,  1594,   264,  1659,   260,  1768, 16384,  4011,  4217,
+    3,   156,  4452,  1660,   261,  4010,  4216,     3,   157,  4455,
+ 1661,   262,  4013,  4219,     2,  1662,   263,  4012,  4218,     5,
+  104,   288,   153,  4449,   426, 16440,  1655,   256,  4015,  4221,
+    5,   105,   289,   152,  4448,   664,  4464,  1656,   257,  4014,
+ 4220,     4,   106,   290,   155,  4451,   427, 16442,  1657,   258,
+    4,   107,   291,   154,  4450,  1658,   259,  4016,  4222,     4,
+  416, 16420,  1595,   272,  2122, 16496,  3993,  4193,     3,  2123,
+16497,  2804,  4356,  3992,  4192,     5,   417, 16422,  1468,  4437,
+ 1596,   274,  1886, 16384,  2124, 16498,     3,  1597,   275,  2125,
+16499,  3994,  4194,     6,   414, 16416,  1280,   272,  1467,  4435,
+ 1598,   276,  2126, 16500,  2801,  4353,     3,  1086, 37728,  1599,
+  277,  3995,  4196,     5,   278,  8608,   415, 16418,  2803,  4355,
+ 3258,   128,  3996,  4199,     3,  1466,  4432,  1600,   279,  2802,
+ 4354,     3,  1601,   280,  1916, 16384,  3998,  4201,     2,   662,
+ 4452,  3997,  4200,     1,   663,  4454,     5,   418, 16424,   660,
+ 4449,  1665,   272,  1909,   256,  4000,  4205,     4,   659,  4448,
+ 1666,   273,  1910,   257,  3999,  4204,     3,  1469,  4441,  1911,
+  258,  4002,  4207,     2,   661,  4450,  4001,  4206,     5,  1053,
+37652,  2086, 16385,  3942,  4112,  4227,    16,  4483, 12288,     6,
+  433, 16468,  1054, 37653,  1457,  4391,  2325,   258,  3943,  4113,
+ 4070,     5,     8,   435, 16471,  1055, 37654,  2088, 16387,  2324,
+  257,  2616,   289,  3944,  4114,  4253,    16,  4508, 12288,     7,
+  434, 16470,  1056, 37655,  1456,  4389,  2087, 16386,  2323,   256,
+ 3945,  4115,  4096,     5,     7,   431, 16465,  1049, 37648,  1455,
+ 4386,  2090, 16389,  3946,  4116,  4279,    16,  4533, 12288,     8,
+  430, 16464,  1050, 37649,  1979,   256,  2089, 16388,  2327,   262,
+ 2386,   264,  3947,  4117,  4018,     5,     6,  1051, 37650,  2092,
+16391,  2618,   293,  3948,  4118,  4305,    16,  4558, 12288,     9,
+  281,  8656,   432, 16466,  1052, 37651,  1454,  4385,  2091, 16390,
+ 2326,   260,  2617,   292,  3949,  4119,  4044,     5,     8,   630,
+ 4372,   769, 20496,  2093, 16393,  2383,   261,  3662,   388,  3950,
+ 4120,  4331,    16,  4583, 12288,     4,   439, 16476,  3903,    64,
+ 3951,  4121,  4174,     5,     7,   770, 20498,  2229, 41861,  2385,
+  263,  2619,   297,  3952,  4122,  4357,    16,  4608, 12288,     4,
+ 2384,   262,  3904,    66,  3953,  4123,  4200,     5,     8,   136,
+ 4352,   437, 16473,   628,  4368,  1057, 37656,  3659,   384,  3954,
+ 4124,  4383,    16,  4633, 12288,     6,   436, 16472,   629,  4369,
+ 1058, 37657,  2381,   256,  3955,  4125,  4122,     5,     5,  1458,
+ 4392,  3660,   386,  3956,  4126,  4409,    16,  4658, 12288,     7,
+  438, 16474,  2127, 33538,  2228, 41856,  2382,   258,  3661,   387,
+ 3957,  4127,  4148,     5,     8,   476, 20484,  1043, 37636,  2095,
+16401,  2477,   257,  2622,   307,  2969,   289,  4019,    16,  4683,
+12288,     7,  1044, 37637,  2094, 16400,  2476,   256,  2621,   306,
+ 2968,   288,  3934,  4097,  4278,     5,     4,  1045, 37638,  1463,
+ 4404,  4045,    16,  4708, 12288,     4,  1046, 37639,  1464,  4405,
+ 2620,   304,  4304,     5,     7,   269,  4352,  1461,  4402,  2096,
+16405,  3667,   408,  3935,  4100,  4071,    16,  4733, 12288,     7,
+  429, 16448,  1040, 37633,  1462,  4403,  3147,  1360,  3668,   409,
+ 3936,  4101,  4226,     5,     7,   475, 20482,  1041, 37634,  1459,
+ 4400,  3669,   410,  3937,  4102,  4097,    16,  4758, 12288,     7,
+  280,  8640,  1042, 37635,  1460,  4401,  2097, 16406,  2623,   308,
+ 3938,  4103,  4252,     5,     6,   768, 20480,  2099, 16409,  3665,
+  404,  3939,  4104,  4123,    16,  4783, 12288,     5,   139,  4373,
+ 2098, 16408,  3905,    80,  3940,  4105,  4382,     5,     4,  3666,
+  406,  3941,  4106,  4149,    16,  4808, 12288,     1,  4408,     5,
+    7,   137,  4368,   627,  4352,  1047, 37640,  2388,   273,  3663,
+  400,  4175,    16,  4833, 12288,     4,   138,  4369,  1048, 37641,
+ 2387,   272,  4330,     5,     4,  2390,   275,  3664,   402,  4201,
+   16,  4858, 12288,     3,  2230, 41872,  2389,   274,  4356,     5,
+   10,  1072, 37684,  1307, 20480,  1358, 37644,  2101, 16417,  2330,
+  291,  2610,   259,  3152,  1381,  4020,    32,  4047,    34,  4230,
+   48,     8,   445, 16500,  1073, 37685,  1359, 37645,  2100, 16416,
+ 2329,   290,  2609,   258,  3151,  1380,  3969,  4145,     8,  1308,
+20482,  1360, 37646,  2103, 16419,  2328,   289,  2608,   257,  4021,
+   34,  4046,    32,  4256,    48,     5,   446, 16502,  1074, 37687,
+ 1361, 37647,  2102, 16418,  3970,  4147,    11,   639,  4408,  1069,
+37680,  1354, 37640,  2104, 16421,  2614,   263,  3148,  1377,  3674,
+  424,  3971,  4148,  4072,    32,  4099,    34,  4282,    48,     4,
+  443, 16496,  1355, 37641,  1453,  4355,  2613,   262,    11,   640,
+ 4410,  1070, 37682,  1356, 37642,  1451,  4352,  2106, 16423,  2332,
+  293,  2612,   261,  3150,  1379,  4073,    34,  4098,    32,  4308,
+   48,    10,   282,  8688,   444, 16498,  1071, 37683,  1357, 37643,
+ 1452,  4353,  2105, 16422,  2331,   292,  2611,   260,  3149,  1378,
+ 3972,  4151,    10,   635,  4404,   779, 20528,  1719,  4356,  1769,
+20480,  2108, 16425,  3672,   420,  3973,  4152,  4124,    32,  4151,
+   34,  4334,    48,     5,   141,  4389,   449, 16508,   636,  4405,
+ 2107, 16424,  3974,  4153,     6,   637,  4406,  3673,   422,  3975,
+ 4154,  4125,    34,  4150,    32,  4360,    48,     4,   450, 16510,
+  638,  4407,  1353, 37639,  2615,   264,     8,   140,  4384,   633,
+ 4400,  1075, 37688,  1715,  4352,  3670,   416,  4176,    32,  4203,
+   34,  4386,    48,     5,   447, 16504,   634,  4401,  1351, 37633,
+ 1716,  4353,  2391,   288,     6,  1352, 37634,  1717,  4354,  3671,
+  418,  4177,    34,  4202,    32,  4412,    48,     2,   448, 16506,
+ 1718,  4355,     9,    12,  4400,   777, 20520,  1063, 37668,  2110,
+16433,  3681,   444,  3958,  4128,  4022,    48,  4228,    32,  4255,
+   34,     6,   442, 16484,   778, 20521,  1064, 37669,  2109, 16432,
+ 2908,   262,  3959,  4129,     5,  1065, 37670,  2112, 16435,  4048,
+   48,  4229,    34,  4254,    32,     4,  1066, 37671,  2111, 16434,
+ 2907,   260,  3960,  4131,     9,  1059, 37664,  2114, 16437,  2334,
+  311,  2733,   257,  3679,   440,  3961,  4132,  4074,    48,  4280,
+   32,  4307,    34,     6,   440, 16480,  1060, 37665,  2113, 16436,
+ 2732,   256,  2906,   258,  3962,  4133,    10,   144,  4410,  1061,
+37666,  2116, 16439,  2333,   309,  2735,   259,  3680,   442,  3963,
+ 4134,  4100,    48,  4281,    34,  4306,    32,     7,   441, 16482,
+ 1062, 37667,  2115, 16438,  2734,   258,  2905,   256,  3260,   192,
+ 3964,  4135,     7,   143,  4404,   771, 20512,  3677,   436,  3965,
+ 4136,  4126,    48,  4332,    32,  4359,    34,     3,   772, 20513,
+ 2912,   270,  3966,  4137,     7,   773, 20514,  2335,   313,  3678,
+  438,  3967,  4138,  4152,    48,  4333,    34,  4358,    32,     2,
+ 2911,   268,  3968,  4139,     9,   142,  4400,   631,  4384,   774,
+20516,  1067, 37672,  1362, 37648,  3675,   432,  4178,    48,  4384,
+   32,  4411,    34,     5,   632,  4385,  1068, 37673,  1363, 37649,
+ 1720,  4369,  2910,   266,     7,   775, 20518,  1364, 37650,  1721,
+ 4370,  3676,   434,  4204,    48,  4385,    34,  4410,    32,     4,
+  776, 20519,  1365, 37651,  1722,  4371,  2909,   264,     2,   792,
+24600,  4043, 12288,     2,   872, 28760,  3652,   334,     2,   793,
+24602,  4069, 12288,     1,  3651,   332,     7,   271,  8464,   466,
+16530,   794, 24604,  3194,   272,  3245,    16,  3254,    48,  4095,
+12288,     1,  3650,   330,     2,   795, 24606,  4121, 12288,     2,
+  465, 16529,  3649,   328,     2,  1771, 24608,  4147, 12288,     4,
+  471, 16543,   788, 24593,   868, 28752,  3648,   326,     4,   469,
+16540,   789, 24594,  1772, 24610,  4173, 12288,     4,   470, 16541,
+  869, 28754,  1773, 24611,  3647,   324,     4,   467, 16538,   790,
+24596,  2219, 41792,  4199, 12288,     4,   468, 16539,   870, 28756,
+ 3450,   320,  3646,   322,     2,   791, 24598,  4225, 12288,     3,
+  871, 28758,  3451,   322,  3645,   320,     3,   457, 16518,  4251,
+12288,  4445,    16,     3,   458, 16519,   866, 28744,  4446,    17,
+    3,   455, 16516,  4277, 12288,  4447,    18,     1,   456, 16517,
+    6,   453, 16514,  2223, 41816,  3193,   256,  3216,   304,  3235,
+   16,  4303, 12288,     3,   454, 16515,   867, 28748,  4448,    21,
+    2,   451, 16512,  4329, 12288,     1,   452, 16513,     6,   464,
+16526,   787, 24576,   862, 28737,  1774, 24624,  2222, 41812,  4355,
+12288,     1,   861, 28736,     3,   462, 16524,  3658,   341,  4381,
+12288,     3,   463, 16525,   863, 28738,  3657,   340,     3,   167,
+ 8464,  3656,   339,  4407, 12288,     5,   168,  8465,   461, 16523,
+  864, 28740,  3452,   336,  3655,   338,     5,   169,  8466,   459,
+16520,  2220, 41810,  3654,   337,  4433, 12288,     5,   460, 16521,
+  865, 28742,  2221, 41811,  3453,   338,  3653,   336,     1,   809,
+24632,     2,   810, 24633,  3253,    21,     2,   811, 24634,  4449,
+   34,     1,   812, 24635,     6,   174,  8488,   813, 24636,  3196,
+  304,  3236,    32,  3247,    48,  3252,    16,     3,   175,  8489,
+  814, 24637,  3458,   360,     2,   176,  8490,   815, 24638,     1,
+  816, 24639,     2,   172,  8484,   804, 24624,     2,   805, 24625,
+ 3456,   356,     1,   806, 24626,     2,   173,  8487,  3457,   358,
+    3,   170,  8480,   807, 24628,  2224, 41824,     1,  3454,   352,
+    2,   171,  8482,   808, 24630,     1,  3455,   354,     1,   800,
+24616,     1,   801, 24618,     7,   474, 16546,   802, 24620,  3195,
+  288,  3214,   272,  3237,    48,  3246,    32,  3249,    16,     1,
+ 3215,   273,     2,   472, 16544,   803, 24622,     1,   473, 16545,
+    4,   180,  8500,   796, 24608,  1760,  8468,  1770, 24592,     3,
+  181,  8501,   873, 28768,  2227, 41845,     1,   797, 24610,     1,
+  874, 28770,     6,   177,  8496,   798, 24612,   876, 28773,  1758,
+ 8464,  2225, 41840,  3459,   369,     1,   875, 28772,     6,   178,
+ 8498,   799, 24614,  1759,  8466,  2226, 41842,  3118,   304,  3461,
+  371,     2,   179,  8499,  3460,   370,    11,   275,  8533,  1824,
+28712,  3616,   270,  4032,  8192,  4059,  8194,  4086,  8196,  4113,
+ 8198,  4140,  8200,  4167,  8202,  4194,  8204,  4221,  8206,     6,
+  274,  8532,   831, 24664,  1825, 28713,  3200,   340,  4450,    64,
+ 4470,  4097,    11,   848, 28698,  1826, 28714,  3615,   268,  4033,
+ 8194,  4058,  8192,  4087,  8198,  4112,  8196,  4141,  8202,  4166,
+ 8200,  4195,  8206,  4220,  8204,     3,   832, 24666,  1827, 28715,
+ 4495,  4097,    11,  1828, 28716,  3614,   266,  4034,  8196,  4061,
+ 8198,  4084,  8192,  4111,  8194,  4142,  8204,  4169,  8206,  4192,
+ 8200,  4219,  8202,  4451,    69,     6,   272,  8528,  1829, 28717,
+ 3198,   336,  3230,   256,  3238,    64,  4520,  4097,    10,  1830,
+28718,  3612,   264,  4035,  8198,  4060,  8196,  4085,  8194,  4110,
+ 8192,  4143,  8206,  4168,  8204,  4193,  8202,  4218,  8200,     5,
+  273,  8530,  2216, 41738,  3199,   338,  3613,   265,  4545,  4097,
+   12,   843, 28688,  1816, 28704,  3610,   262,  3891,   256,  4036,
+ 8200,  4063,  8202,  4090,  8204,  4117,  8206,  4136,  8192,  4163,
+ 8194,  4190,  8196,  4217,  8198,     7,   184,  8516,   827, 24656,
+  844, 28689,  1817, 28705,  3438,   261,  3611,   263,  4570,  4097,
+   13,   845, 28690,  1818, 28706,  2215, 41735,  3609,   260,  3892,
+  258,  4037,  8202,  4062,  8200,  4091,  8206,  4116,  8204,  4137,
+ 8194,  4162,  8192,  4191,  8198,  4216,  8196,     4,   828, 24658,
+ 1819, 28707,  3201,   350,  4595,  4097,    14,   846, 28692,  1820,
+28708,  2214, 41729,  3437,   256,  3608,   258,  3893,   260,  4038,
+ 8204,  4065,  8206,  4088,  8200,  4115,  8202,  4138,  8196,  4165,
+ 8198,  4188,  8192,  4215,  8194,     4,   829, 24660,  1821, 28709,
+ 2213, 41728,  4620,  4097,    13,   183,  8515,   670,  4496,   847,
+28694,  1822, 28710,  3607,   256,  4039,  8206,  4064,  8204,  4089,
+ 8202,  4114,  8200,  4139,  8198,  4164,  8196,  4189,  8194,  4214,
+ 8192,     6,   182,  8514,   671,  4497,   830, 24662,  1823, 28711,
+ 3119,   320,  4645,  4097,    11,   839, 28680,  3626,   286,  4240,
+ 8192,  4267,  8194,  4294,  8196,  4321,  8198,  4348,  8200,  4375,
+ 8202,  4402,  8204,  4429,  8206,  4453,    81,     4,   823, 24648,
+ 3627,   287,  4452,    80,  4670,  4097,    10,   840, 28682,  3625,
+  284,  4241,  8194,  4266,  8192,  4295,  8198,  4320,  8196,  4349,
+ 8202,  4374,  8200,  4403,  8206,  4428,  8204,     3,   824, 24650,
+ 4454,    82,  4695,  4097,    11,   164,  4506,   841, 28684,  3624,
+  282,  4242,  8196,  4269,  8198,  4292,  8192,  4319,  8194,  4350,
+ 8204,  4377,  8206,  4400,  8200,  4427,  8202,     6,   825, 24652,
+ 3197,   320,  3239,    80,  3251,   112,  3257,    96,  4720,  4097,
+   11,   162,  4504,   842, 28686,  3623,   280,  4243,  8198,  4268,
+ 8196,  4293,  8194,  4318,  8192,  4351,  8206,  4376,  8204,  4401,
+ 8202,  4426,  8200,     3,   163,  4505,   826, 24654,  4745,  4097,
+   13,   160,  4502,   765, 12548,   818, 24641,   834, 28672,  3622,
+  278,  4244,  8200,  4271,  8202,  4298,  8204,  4325,  8206,  4344,
+ 8192,  4371,  8194,  4398,  8196,  4425,  8198,     6,   161,  4503,
+  766, 12549,   817, 24640,   835, 28673,  3894,   273,  4770,  4097,
+   13,   669,  4484,   820, 24643,  3440,   278,  3620,   276,  3895,
+  274,  4245,  8202,  4270,  8200,  4299,  8206,  4324,  8204,  4345,
+ 8194,  4370,  8192,  4399,  8198,  4424,  8196,     5,   159,  4501,
+  819, 24642,  3621,   277,  3896,   275,  4795,  4097,    13,   667,
+ 4482,   761, 12544,   836, 28676,  3439,   272,  3619,   274,  4246,
+ 8204,  4273,  8206,  4296,  8200,  4323,  8202,  4346,  8196,  4373,
+ 8198,  4396,  8192,  4423,  8194,     5,   668,  4483,   762, 12545,
+  821, 24644,   837, 28677,  4820,  4097,    14,   158,  4496,   665,
+ 4480,   763, 12546,   838, 28678,  2217, 41747,  3617,   272,  4247,
+ 8206,  4272,  8204,  4297,  8202,  4322,  8200,  4347,  8198,  4372,
+ 8196,  4397,  8194,  4422,  8192,     5,   666,  4481,   764, 12547,
+  822, 24646,  3618,   273,  4845,  4097,     5,   860, 28728,  1792,
+28680,  3639,   302,  4456,    97,  4561,   105,     3,  1793, 28681,
+ 4455,    96,  4560,   104,     4,  1794, 28682,  3638,   300,  4458,
+   99,  4586,   105,     3,  1795, 28683,  4457,    98,  4585,   104,
+    4,  1299, 12544,  1796, 28684,  3637,   298,  4611,   105,     4,
+ 1797, 28685,  3217,   320,  3256,    80,  4610,   104,     3,  1798,
+28686,  3635,   296,  4636,   105,     4,  1799, 28687,  3636,   297,
+ 4459,   102,  4635,   104,     4,   856, 28720,  1784, 28672,  3634,
+  294,  4461,   105,     3,  1775, 24640,  1785, 28673,  4460,   104,
+    4,   857, 28722,  1786, 28674,  3632,   292,  4486,   105,     3,
+ 1787, 28675,  3633,   293,  4485,   104,     5,   858, 28724,  1788,
+28676,  3441,   288,  3630,   290,  4511,   105,     3,  1789, 28677,
+ 3631,   291,  4510,   104,     5,   859, 28726,  1790, 28678,  3442,
+  290,  3628,   288,  4536,   105,     3,  1791, 28679,  3629,   289,
+ 4535,   104,     4,   853, 28712,  1808, 28696,  3449,   316,  4761,
+  105,     2,  1809, 28697,  4760,   104,     3,   854, 28714,  1810,
+28698,  4786,   105,     3,   855, 28715,  1811, 28699,  4785,   104,
+    4,  1812, 28700,  3447,   312,  3906,   255,  4811,   105,     7,
+  276,  8544,  1813, 28701,  3202,   352,  3240,   112,  3250,    80,
+ 3255,    64,  4810,   104,     3,  1814, 28702,  3448,   314,  4836,
+  105,     4,  1723,  4505,  1815, 28703,  2218, 41786,  4835,   104,
+    4,   849, 28704,  1800, 28688,  3445,   308,  4661,   105,     3,
+  833, 24672,  1801, 28689,  4660,   104,     6,   674,  4516,   850,
+28706,  1802, 28690,  3446,   310,  3644,   308,  4686,   105,     2,
+ 1803, 28691,  4685,   104,     7,   673,  4514,   851, 28708,  1767,
+12560,  1804, 28692,  3443,   304,  3642,   306,  4711,   105,     3,
+ 1805, 28693,  3643,   307,  4710,   104,     6,   672,  4512,   852,
+28710,  1806, 28694,  3444,   306,  3640,   304,  4736,   105,     3,
+ 1807, 28695,  3641,   305,  4735,   104,     4,   253,   536,   684,
+ 4689,   924, 36953,  2770,   632,     5,   109,   513,   254,   537,
+  683,  4688,   923, 36952,  2771,   633,     2,   293,  8856,  1942,
+  560,     2,   294,  8857,  1943,   561,     1,  3929,   768,     1,
+ 3020,  4664,     2,  2363,   584,  2663, 25568,     1,  2364,   585,
+    2,   287,  8850,   919, 36945,     7,   288,  8851,   918, 36944,
+ 1480,  4706,  1981,   577,  2362,   583,  3018,  4660,  3746,   712,
+    4,   247,   530,   921, 36947,  1982,   578,  2361,   580,     6,
+  248,   531,   920, 36946,  1479,  4704,  1983,   579,  2768,   627,
+ 3019,  4662,     5,   249,   532,   291,  8854,  1984,   580,  2360,
+  578,  2769,   628,     6,   250,   533,   292,  8855,   922, 36948,
+ 1985,   581,  2510,  4624,  3017,  4656,     3,   251,   534,   289,
+ 8852,  1481,  4709,     2,   252,   535,   290,  8853,     3,   917,
+36937,  1311, 36977,  1940,   546,     5,   166,  4688,   679,  4672,
+  916, 36936,  1941,   547,  3747,   720,     2,   681,  4675,  1938,
+  544,     4,   680,  4674,  1312, 36978,  1939,   545,  3748,   722,
+    2,   682,  4676,  3749,   724,     1,  2664, 25584,     1,  3750,
+  726,     4,   245,   512,   909, 36929,  1482,  4723,  1986,   592,
+    4,   246,   513,  1987,   593,  2766,   609,  3016,  4644,     3,
+  911, 36931,  1988,   594,  2767,   610,     2,   910, 36930,  1989,
+  595,     4,   913, 36933,  1990,   596,  2367,   594,  2507,  4609,
+    5,   912, 36932,  1991,   597,  2368,   595,  2506,  4608,  3014,
+ 4640,     3,   915, 36935,  2365,   592,  2509,  4611,     4,   914,
+36934,  2366,   593,  2508,  4610,  3015,  4642,     6,   687,  4721,
+  941, 36985,  1673,   512,  1932,   530,  2765,   600,  3752,   737,
+    3,   940, 36984,  1933,   531,  3751,   736,     2,  1930,   528,
+ 3754,   739,     3,   688,  4722,  1931,   529,  3753,   738,     1,
+ 3756,   741,     1,  3755,   740,     3,  1934,   532,  2661, 25536,
+ 3758,   743,     2,  1935,   533,  3757,   742,     4,  1281,   512,
+ 1937,   538,  1992,   608,  2757,   592,     4,   934, 36976,  1993,
+  609,  2758,   593,  3759,   744,     4,   935, 36979,  1936,   536,
+ 2759,   594,  3761,   747,     3,  2760,   595,  3013,  4630,  3760,
+  746,     2,   937, 36981,  2761,   596,     3,   936, 36980,  2762,
+  597,  3011,  4624,     3,   939, 36983,  1606,   514,  2763,   598,
+    3,   938, 36982,  2764,   599,  3012,  4626,     4,   686,  4705,
+  933, 36969,  1923,   514,  2755,   584,     4,   685,  4704,  1924,
+  515,  2756,   585,  2812,  4616,     1,  1922,   512,     2,  1310,
+36951,  2662, 25552,     2,  1309, 36950,  1925,   517,     4,   926,
+36961,  1928,   522,  1994,   624,  2805,  4609,     3,   925, 36960,
+ 2748,   577,  3010,  4612,     4,   928, 36963,  1926,   520,  2749,
+  578,  2807,  4611,     5,   927, 36962,  1476,  4688,  1927,   521,
+ 2750,   579,  2806,  4610,     4,   930, 36965,  1478,  4695,  2751,
+  580,  2809,  4613,     6,   929, 36964,  1995,   629,  2511,  4640,
+ 2752,   581,  2808,  4612,  3008,  4608,     5,   932, 36967,  1477,
+ 4693,  1929,   524,  2753,   582,  2811,  4615,     4,   931, 36966,
+ 2754,   583,  2810,  4614,  3009,  4610,     5,   165,  4608,   678,
+ 4624,   891, 36888,  2393,   513,  3722,   640,     4,   892, 36889,
+ 1733,  4641,  2171, 41090,  2392,   512,     2,  1734,  4642,  3723,
+  642,     4,  1735,  4643,  2170, 41088,  2394,   514,  2657, 25508,
+    2,  1736,  4644,  3724,   644,     3,  2173, 41093,  2395,   519,
+ 3725,   646,     3,  2172, 41092,  2345,   520,  2656, 25504,     4,
+  884, 36880,  2344,   519,  2744,   561,  3726,   648,     2,   885,
+36881,  2743,   560,     6,   886, 36882,  1473,  4640,  2175, 41097,
+ 2343,   517,  2746,   563,  3727,   650,     4,  2174, 41096,  2342,
+  516,  2659, 25516,  2745,   562,     5,    15,  4608,   887, 36884,
+ 2341,   515,  2481,   529,  3728,   652,     4,   888, 36885,  2340,
+  514,  2480,   528,  2747,   564,     3,    16,  4610,   889, 36886,
+ 2339,   513,     4,   211, 36871,   890, 36887,  1474,  4645,  2658,
+25512,     4,   675,  4608,   882, 36872,  2742,   553,  3729,   656,
+    4,   676,  4609,   883, 36873,  2741,   552,  3730,   657,     2,
+  677,  4610,  3731,   658,     1,  2176, 41104,     1,  3732,   660,
+    1,  3733,   662,     2,  2351,   536,  2660, 25520,     1,  3734,
+  664,     2,  1475,  4656,  2350,   533,     1,  2396,   538,     3,
+  879, 36868,  2349,   531,  3735,   668,     3,   880, 36869,  2348,
+  530,  2478,   512,     6,    17,  4626,   881, 36870,  2347,   529,
+ 2398,   543,  2740,   551,  3736,   670,     4,  2346,   528,  2397,
+  542,  2479,   514,  2739,   550,     3,  1297,  4616,  1724,  4608,
+ 3737,   672,     2,  1298,  4617,  1725,  4609,     2,  1726,  4610,
+ 3738,   674,     2,  1727,  4611,  2923,   536,     2,  1728,  4612,
+ 3739,   676,     1,  2654, 25472,     3,   902, 36912,  1293,  4608,
+ 2354,   551,     3,  1832, 36865,  1980,   544,  2920,   530,     3,
+  903, 36914,  1294,  4610,  1833, 36866,     5,   904, 36915,  1282,
+  578,  1834, 36867,  2353,   548,  2919,   528,     3,    18,  4640,
+  905, 36916,  1295,  4612,     2,   906, 36917,  2922,   534,     2,
+  907, 36918,  1296,  4614,     3,   908, 36919,  2352,   544,  2921,
+  532,     3,   900, 36904,  2738,   521,  3740,   688,     4,   901,
+36905,  1729,  4625,  1946,   578,  2737,   520,     3,  1730,  4626,
+ 1945,   577,  3741,   690,     5,  1731,  4627,  1944,   576,  2177,
+41136,  2918,   520,  3742,   691,     3,  1732,  4628,  1950,   583,
+ 3743,   692,     1,  1949,   582,     1,  1948,   581,     3,  1947,
+  580,  2359,   568,  2655, 25488,     5,   893, 36896,  1472,  4626,
+ 2915,   515,  3022,  4676,  3744,   696,     3,   894, 36897,  2358,
+  566,  2914,   514,     4,   895, 36898,  1470,  4624,  3023,  4678,
+ 3745,   698,     4,  1471,  4625,  1951,   584,  2357,   564,  2913,
+  512,     1,   896, 36900,     4,   897, 36901,  2356,   562,  2482,
+  544,  2917,   518,     3,   898, 36902,  2736,   519,  3021,  4674,
+    4,   899, 36903,  2355,   560,  2483,   546,  2916,   516,     3,
+  185,  8704,  2153, 41024,  3268,     8,     3,  3269,     9,  3468,
+  576,  3712,   578,     2,  3120,   512,  3270,    10,     3,  2154,
+41027,  3271,    11,  3711,   576,     3,   186,  8708,  2653, 25440,
+ 3272,    12,     1,  3273,    13,     1,  3274,    14,     3,  2155,
+41031,  3275,    15,  3713,   580,     2,   187,  8712,   286,  8720,
+    1,  3261,     1,     1,  3262,     2,     1,  3263,     3,     2,
+  364,  8720,  3264,     4,     1,  3265,     5,     1,  3266,     6,
+    1,  3267,     7,     3,   362,  8716,  2156, 41040,  3470,   593,
+    2,  2128, 37010,  3469,   592,     1,   363,  8718,     1,  3714,
+  592,     1,   360,  8712,     1,  2130, 37014,     1,   361,  8714,
+    2,  2129, 37012,  2157, 41047,     2,   188,  8728,   358,  8708,
+    2,   283,  8705,  1248, 40961,     3,   284,  8706,   359,  8710,
+ 1249, 40962,     3,   285,  8707,  1250, 40963,  2131, 37016,     1,
+  357,  8706,     3,   189,  8736,  2158, 41056,  3717,   611,     3,
+ 2249, 45088,  2649, 25413,  3716,   610,     1,  2650, 25414,     2,
+ 2651, 25415,  3715,   608,     1,  2648, 25408,     1,  3719,   614,
+    1,  2159, 41062,     2,  2160, 41063,  3718,   612,     3,   190,
+ 8744,  2161, 41064,  3276,    32,     2,   191,  8745,  3720,   618,
+    1,  3721,   620,     3,   192,  8752,   371,  8748,  2162, 41072,
+    1,  2163, 41075,     3,   369,  8744,  2164, 41076,  2652, 25424,
+    1,  2165, 41077,     2,   370,  8746,  2166, 41078,     2,   367,
+ 8740,  2167, 41080,     2,   368,  8742,  2168, 41082,     2,   365,
+ 8736,  2169, 41084,     1,   366,  8738,     3,  3462,   512,  3687,
+  514,  4655,  4866,     3,   193,  8768,  4629,  4865,  4656,  4867,
+    4,   957, 37016,  3463,   514,  3686,   512,  4630,  4866,     3,
+  194,  8770,  4631,  4867,  4654,  4865,     2,  3688,   518,  4605,
+ 4866,     4,   195,  8772,  2646, 25376,  4579,  4865,  4606,  4867,
+    2,  2141, 40967,  4580,  4866,     3,   196,  8774,  4581,  4867,
+ 4604,  4865,     2,   952, 37010,  4555,  4866,     3,   953, 37011,
+ 4529,  4865,  4556,  4867,     3,   950, 37008,  1997,   641,  4530,
+ 4866,     4,   951, 37009,  1996,   640,  4531,  4867,  4554,  4865,
+    2,   956, 37014,  4505,  4866,     2,  4479,  4865,  4506,  4867,
+    2,   954, 37012,  4480,  4866,     3,   955, 37013,  4481,  4867,
+ 4504,  4865,     3,   197,  8785,  3690,   530,  4855,  4866,     3,
+ 2142, 40976,  4829,  4865,  4856,  4867,     3,   198,  8787,  3689,
+  528,  4830,  4866,     3,   949, 37001,  4831,  4867,  4854,  4865,
+    3,   199,  8789,  3692,   534,  4805,  4866,     3,  2647, 25392,
+ 4779,  4865,  4806,  4867,     3,   201,  8791,  3691,   532,  4780,
+ 4866,     3,   200,  8790,  4781,  4867,  4804,  4865,     6,   203,
+ 8793,   212, 37010,   944, 36994,  1998,   659,  3694,   538,  4755,
+ 4866,     5,   202,  8792,   945, 36995,  3695,   539,  4729,  4865,
+ 4756,  4867,     3,   942, 36992,  3693,   536,  4730,  4866,     4,
+  204,  8794,   943, 36993,  4731,  4867,  4754,  4865,     1,  4705,
+ 4866,     5,   205,  8796,   948, 36999,  2001,   662,  4679,  4865,
+ 4706,  4867,     4,   946, 36996,  2000,   661,  3696,   540,  4680,
+ 4866,     4,   947, 36997,  1999,   660,  4681,  4867,  4704,  4865,
+    3,  2144, 40993,  3464,   544,  3697,   546,     1,  2143, 40992,
+    1,  2146, 40995,     2,  2145, 40994,  3465,   547,     2,  3466,
+  548,  3699,   550,     2,  2147, 40996,  2644, 25344,     2,  2149,
+40999,  3698,   548,     1,  2148, 40998,     1,  3702,   554,     2,
+ 2150, 41000,  3703,   555,     1,  3700,   552,     1,  3701,   553,
+    1,  3705,   558,     2,  2779,   661,  3704,   556,     1,  2778,
+  660,     2,  3467,   560,  3707,   562,     1,  2151, 41008,     2,
+ 2777,   649,  3706,   560,     3,  1835, 37017,  2152, 41010,  2776,
+  648,     1,  3709,   566,     1,  2645, 25360,     1,  3708,   564,
+    1,  2772,   642,     1,  3710,   568,     1,  2775,   647,     1,
+ 2774,   645,     1,  2773,   644,     3,   114,   772,  1327, 37221,
+ 3925,   512,     3,   115,   773,  1326, 37220,  3025,  4920,     4,
+  116,   774,  1328, 37223,  2641, 25312,  3926,   514,     2,   117,
+  775,  3026,  4922,     3,   110,   768,   978, 37209,  1323, 37217,
+    1,   111,   769,     2,   112,   770,  1325, 37219,     2,   113,
+  771,  1324, 37218,     3,   977, 37205,  1612,   800,  2514,  4881,
+    1,  2513,  4880,     2,   975, 37201,  2018,   832,     1,  1613,
+  805,     1,   976, 37202,     3,  1614,   824,  2643, 25330,  3927,
+  528,     2,  2642, 25328,  3928,   530,     1,  1330, 37233,     1,
+ 1329, 37232,     1,  1331, 37234,     2,   216, 37204,  2512,  4864,
+    1,   974, 37191,     1,  3024,  4900,     2,  1609,   776,  1678,
+  772,     1,  1610,   777,     1,  2638, 25280,     2,   991, 37241,
+ 1674,   768,     2,   990, 37240,  1675,   769,     1,  1676,   770,
+    1,  1677,   771,     2,   987, 37237,  1839, 37189,     3,   986,
+37236,  2520,  4912,  4434, 37417,     1,   989, 37239,     1,   988,
+37238,     1,   983, 37233,     1,   982, 37232,     2,   985, 37235,
+ 1607,   774,     2,   984, 37234,  1608,   775,     2,  1319, 37205,
+ 4435, 37424,     1,  1318, 37204,     2,  1321, 37207,  2639, 25296,
+    1,  1320, 37206,     5,   981, 37225,  1739,  4945,  1912,   768,
+ 1954,   770,  2819,  4873,     2,   980, 37224,  1738,  4944,     2,
+ 1317, 37203,  1952,   768,     3,  1740,  4946,  1953,   769,  2640,
+25301,     2,  2516,  4897,  2817,  4869,     2,  2515,  4896,  2816,
+ 4868,     1,  2518,  4899,     3,   979, 37222,  2517,  4898,  2818,
+ 4870,     1,  2813,  4865,     2,  1322, 37208,  2519,  4900,     1,
+ 2815,  4867,     3,  1611,   791,  1741,  4954,  2814,  4866,     3,
+  694,  4884,   785, 21008,  3807,   900,     1,   695,  4885,     3,
+  696,  4886,   786, 21010,  3808,   902,     2,  2008,   782,  2636,
+25248,     4,   692,  4880,   969, 37144,  2399,   769,  3805,   896,
+    1,   970, 37145,     3,   693,  4882,  2637, 25253,  3806,   898,
+    1,  2203, 41344,     1,   966, 37140,     1,   967, 37141,     1,
+ 2007,   775,     2,   968, 37143,  2006,   774,     5,   697,  4888,
+  878, 33105,  1316, 37160,  2003,   769,  3809,   904,     2,   877,
+33104,  2002,   768,     3,   965, 37138,  2005,   771,  3810,   906,
+    2,  2004,   770,  2935,   816,     1,  3815,   916,     2,  2488,
+  776,  3816,   917,     2,  2207, 41365,  3817,   918,     1,  2206,
+41364,     3,   689,  4864,  2205, 41363,  3811,   912,     4,   690,
+ 4865,  2013,   792,  2204, 41362,  3812,   913,     2,   691,  4866,
+ 3813,   914,     1,  3814,   915,     1,   961, 37124,     3,   962,
+37125,  2011,   788,  2484,   768,     1,   963, 37126,     3,   964,
+37127,  2012,   790,  2485,   770,     2,   958, 37120,  3818,   920,
+    3,   959, 37121,  2009,   784,  2486,   772,     3,  1485,  4912,
+ 1838, 37170,  3819,   922,     4,   960, 37123,  2010,   786,  2487,
+  774,  2934,   800,     1,  3822,   932,     1,  2794,   796,     1,
+ 3823,   934,     2,  2635, 25216,  2795,   798,     3,  1737,  4864,
+ 1836, 37128,  3820,   928,     1,  2792,   792,     1,  3821,   930,
+    2,  2793,   794,  2933,   792,     3,   215, 37156,  1615,   833,
+ 3826,   940,     3,  2016,   804,  2791,   788,  2932,   790,     1,
+ 2931,   788,     3,  2015,   801,  2789,   785,  3824,   936,     5,
+  213, 37153,  1616,   836,  2014,   800,  2788,   784,  2930,   786,
+    2,  1483,  4864,  3825,   938,     3,   214, 37155,  2790,   786,
+ 2929,   784,     1,  2786,   781,     1,  2785,   780,     2,  1315,
+37142,  2787,   783,     2,   698,  4896,  2782,   777,     2,  1313,
+37137,  2781,   776,     1,  2784,   779,     3,  1314, 37139,  2783,
+  778,  2928,   776,     2,   971, 37157,  2927,   774,     1,   972,
+37158,     3,   973, 37159,  2780,   774,  2926,   772,     1,  1837,
+37136,     2,  2017,   816,  2925,   770,     1,  1484,  4880,     1,
+ 2924,   768,     2,  2632, 25184,  4565,   512,     1,  3787,   838,
+    1,  4590,   512,     1,  3786,   836,     1,  4615,   512,     2,
+ 2633, 25189,  3785,   834,     1,  4640,   512,     1,  3784,   832,
+    1,  4465,   512,     1,  4490,   512,     1,  3790,   844,     1,
+ 4515,   512,     1,  3789,   842,     1,  4540,   512,     1,  3788,
+  840,     2,  2634, 25200,  4765,   512,     1,  3795,   854,     2,
+ 3794,   853,  4790,   512,     1,  3793,   852,     1,  4815,   512,
+    1,  3792,   850,     1,  4840,   512,     1,  3791,   848,     1,
+ 4665,   512,     1,  4690,   512,     1,  4715,   512,     1,  3797,
+  858,     1,  4740,   512,     1,  3796,   856,     1,  3801,   870,
+    2,  2195, 41319,  3800,   868,     1,  2191, 41312,     2,  2192,
+41313,  3799,   866,     1,  2193, 41314,     2,  2194, 41315,  3798,
+  864,     1,  2196, 41320,     1,  2197, 41322,     1,  2202, 41332,
+    1,  3804,   884,     1,  2198, 41328,     2,  2199, 41329,  3803,
+  882,     1,  2200, 41330,     2,  2201, 41331,  3802,   880,     5,
+ 2257, 57345,  2625, 25121,  3764,   774,  4575,  4608,  4602,  4610,
+    2,  4576,  4609,  4603,  4611,     4,  2627, 25123,  3763,   772,
+ 4577,  4610,  4600,  4608,     3,  2626, 25122,  4578,  4611,  4601,
+ 4609,     4,  2629, 25125,  3762,   770,  4625,  4608,  4652,  4610,
+    4,  2258, 57348,  2628, 25124,  4626,  4609,  4653,  4611,     3,
+ 1002, 37272,  4627,  4610,  4650,  4608,     5,  1003, 37273,  2259,
+57350,  2630, 25126,  4628,  4611,  4651,  4609,     3,  1000, 37270,
+ 4475,  4608,  4502,  4610,     5,  1001, 37271,  2260, 57352,  3770,
+  783,  4476,  4609,  4503,  4611,     3,  3768,   780,  4477,  4610,
+ 4500,  4608,     4,   999, 37269,  3769,   781,  4478,  4611,  4501,
+ 4609,     3,  3767,   778,  4525,  4608,  4552,  4610,     2,  4526,
+ 4609,  4553,  4611,     3,  3765,   776,  4527,  4610,  4550,  4608,
+    3,  3766,   777,  4528,  4611,  4551,  4609,     4,  2262, 57361,
+ 3773,   790,  4775,  4608,  4802,  4610,     4,  2261, 57360,  2631,
+25136,  4776,  4609,  4803,  4611,     3,  3772,   788,  4777,  4610,
+ 4800,  4608,     2,  4778,  4611,  4801,  4609,     3,  3771,   786,
+ 4825,  4608,  4852,  4610,     3,  2178, 41232,  4826,  4609,  4853,
+ 4611,     2,  4827,  4610,  4850,  4608,     3,  2179, 41234,  4828,
+ 4611,  4851,  4609,     3,   998, 37254,  4675,  4608,  4702,  4610,
+    2,  4676,  4609,  4703,  4611,     3,   996, 37252,  4677,  4610,
+ 4700,  4608,     3,   997, 37253,  4678,  4611,  4701,  4609,     3,
+  994, 37250,  4725,  4608,  4752,  4610,     3,   995, 37251,  4726,
+ 4609,  4753,  4611,     4,   992, 37248,  3774,   792,  4727,  4610,
+ 4750,  4608,     3,   993, 37249,  4728,  4611,  4751,  4609,     2,
+ 2185, 41253,  2264, 57377,     2,  2184, 41252,  2263, 57376,     1,
+ 2266, 57379,     1,  2265, 57378,     3,  2181, 41249,  2268, 57381,
+ 3776,   802,     2,  2180, 41248,  2267, 57380,     2,  2183, 41251,
+ 3775,   800,     1,  2182, 41250,     1,  3203,   886,     2,  2270,
+57393,  3780,   822,     2,  2269, 57392,  2624, 25104,     1,  3779,
+  820,     1,  2188, 41270,     1,  3778,   818,     1,  2186, 41264,
+    1,  3777,   816,     1,  2187, 41266,     1,  3783,   828,     1,
+ 3782,   826,     1,  2189, 41272,     1,  3781,   824,     1,  2190,
+41274,     1,  3130,    16,     1,  1503,  5234,     1,  1502,  5232,
+    1,  2522,  5121,     2,  2521,  5120,  3131,    21,     1,  2691,
+26096,     2,  1497,  5219,  2020,  1088,     2,  2021,  1089,  2072,
+ 5120,     1,  1496,  5216,     1,  1500,  5223,     2,  1499,  5222,
+ 3129,     5,     1,  1498,  5221,     1,   708,  5200,     1,  1501,
+ 5224,     1,  2690, 26080,     1,  3031,  5125,     2,  1493,  5202,
+ 3030,  5124,     1,  3033,  5127,     2,  1492,  5200,  3032,  5126,
+    1,  3027,  5121,     1,  3029,  5123,     2,  1494,  5204,  3028,
+ 5122,     3,  1684,  1040,  1913,  1024,  3039,  5133,     3,   709,
+ 5216,  1685,  1041,  3038,  5132,     1,  1686,  1042,     3,  1495,
+ 5208,  1687,  1043,  3040,  5134,     1,  3035,  5129,     1,  3034,
+ 5128,     2,  2689, 26064,  3037,  5131,     1,  3036,  5130,     2,
+ 1490,  5187,  3132,    32,     1,  1491,  5189,     1,  1679,  1024,
+    2,   710,  5232,  1680,  1025,     1,  1681,  1026,     1,  1682,
+ 1027,     1,  1683,  1028,     2,  1180, 38401,  2942,  1058,     2,
+ 1181, 38402,  2941,  1057,     2,  1182, 38403,  2940,  1056,     5,
+   20,  5136,  1183, 38404,  1489,  5174,  2944,  1063,  4437,   272,
+    2,  1184, 38405,  2489,  1024,     2,  1185, 38406,  4438,   274,
+    2,  1186, 38407,  2943,  1060,     1,   699,  5120,     1,   700,
+ 5121,     1,   701,  5122,     1,   702,  5123,     1,   703,  5124,
+    1,   704,  5125,     1,  2688, 26032,     4,  1488,  5155,  2019,
+ 1024,  2492,  1044,  2946,  1074,     1,  1487,  5152,     1,  2945,
+ 1072,     2,    19,  5120,  4436,   256,     1,  2490,  1040,     2,
+ 2491,  1042,  2947,  1076,     1,   705,  5137,     1,   706,  5138,
+    1,   707,  5139,     1,  2687, 26016,     1,  2796,  1025,     2,
+ 1187, 38433,  2937,  1026,     2,  1188, 38434,  2798,  1027,     3,
+ 1189, 38435,  2797,  1026,  2936,  1024,     3,    22,  5168,  1190,
+38436,  2800,  1029,     2,  2799,  1028,  2939,  1030,     1,    23,
+ 5170,     2,  1486,  5141,  2938,  1028,     1,  1755,  5136,     1,
+ 2686, 26000,     1,  1749,  5128,     1,  1750,  5131,     2,    21,
+ 5152,  1751,  5132,     1,  1752,  5133,     1,  1753,  5134,     1,
+ 1754,  5135,     1,  1742,  5121,     1,  1743,  5122,     1,  1744,
+ 5123,     1,  1745,  5124,     1,  1746,  5125,     1,  1747,  5126,
+    1,  1748,  5127,     1,  3850,  1107,     1,  3849,  1106,     1,
+ 3848,  1105,     1,  3847,  1104,     1,  3244,  1280,     1,  3846,
+ 1091,     1,  3845,  1090,     1,  3844,  1089,     1,  3843,  1088,
+    1,  2685, 25952,     1,  2684, 25936,     1,  2683, 25925,     1,
+ 2682, 25920,     2,  4300,  9472,  4732,  5376,     2,  4326,  9472,
+ 4757,  5376,     2,  4248,  9472,  4682,  5376,     2,  4274,  9472,
+ 4707,  5376,     3,  3830,  1042,  4404,  9472,  4832,  5376,     4,
+  711,  5248,  3829,  1040,  4430,  9472,  4857,  5376,     2,  4352,
+ 9472,  4782,  5376,     1,  2681, 25904,     2,  4378,  9472,  4807,
+ 5376,     2,  4092,  9472,  4532,  5376,     1,  2084,  9216,     2,
+ 4118,  9472,  4557,  5376,     2,  4040,  9472,  4482,  5376,     2,
+ 4066,  9472,  4507,  5376,     4,  2242, 42497,  3828,  1026,  4196,
+ 9472,  4632,  5376,     1,  2241, 42496,     4,   712,  5264,  2243,
+42499,  4222,  9472,  4657,  5376,     2,   713,  5265,  3827,  1025,
+    2,  4144,  9472,  4582,  5376,     1,  2680, 25888,     2,  4170,
+ 9472,  4607,  5376,     1,   714,  5269,     1,  3838,  1074,     1,
+ 3839,  1075,     1,  3837,  1073,     1,  3842,  1078,     1,  2679,
+25872,     1,  3840,  1076,     1,  3841,  1077,     1,  1300, 13313,
+    1,  1301, 13314,     1,  1302, 13315,     1,  1303, 13316,     1,
+ 1304, 13317,     1,  1305, 13318,     1,  3833,  1058,     1,  3834,
+ 1059,     1,  3831,  1056,     1,  3832,  1057,     1,  2678, 25856,
+    1,  3835,  1060,     1,  3836,  1061,     2,  2034,  1364,  4442,
+ 4112,     2,  2035,  1365,  3136,   277,     1,  2036,  1366,     3,
+ 2030,  1360,  3125,  1040,  3135,   272,     2,  1214, 38720,  2031,
+ 1361,     1,  2032,  1362,     1,  2033,  1363,     1,  2677, 25840,
+    1,  1215, 38729,     1,  1217, 38741,     1,  3134,   261,     1,
+ 1218, 38742,     3,  1216, 38737,  3133,   256,  4439,  4100,     1,
+ 4440,  4102,     1,  4441,  4106,     1,  1220, 38745,     1,  1219,
+38744,     2,  1226, 38757,  2823,  5381,     1,  1225, 38756,     2,
+ 1228, 38759,  2824,  5383,     1,  1227, 38758,     2,  1222, 38753,
+ 2820,  5377,     1,  1221, 38752,     2,  1224, 38755,  2822,  5379,
+    2,  1223, 38754,  2821,  5378,     1,  2827,  5389,     1,  2826,
+ 5388,     1,  2676, 25808,     2,  1230, 38761,  1914,  1280,     2,
+ 1229, 38760,  2825,  5384,     1,  1915,  1282,     1,  3127,  1060,
+    1,  3128,  1062,     5,  1232, 38769,  2038,  1376,  2828,  5393,
+ 3126,  1056,  3137,   288,     1,  1231, 38768,     1,  2039,  1378,
+    2,  1233, 38770,  2829,  5394,     1,  2675, 25792,     3,    26,
+ 5392,  2026,  1301,  2494,  1281,     2,    27,  5393,  2493,  1280,
+    1,    28,  5394,     1,   716,  5384,     1,  1191, 38657,     2,
+ 1514,  5424,  2025,  1299,     3,  1515,  5425,  2024,  1298,  2953,
+ 1312,     1,    29,  5402,     1,   715,  5376,     1,  2027,  1304,
+    1,  2028,  1306,     2,    24,  5376,  1510,  5414,     2,  1192,
+38677,  1511,  5415,     1,  1193, 38678,     2,  1194, 38679,  1509,
+ 5413,     1,    25,  5380,     1,  2022,  1280,     1,  2674, 25760,
+    2,   717,  5392,  1195, 38680,     2,   718,  5393,  1196, 38681,
+    1,  1512,  5416,     2,  1513,  5417,  2023,  1290,     1,  1201,
+38692,     2,  1202, 38693,  1507,  5399,     1,  1203, 38694,     2,
+ 1204, 38695,  1506,  5397,     2,  1197, 38688,  1504,  5394,     2,
+ 1198, 38689,  1505,  5395,     1,  1199, 38690,     2,  1200, 38691,
+ 2948,  1280,     1,  2673, 25744,     1,   719,  5408,     2,   720,
+ 5409,  1205, 38697,     1,  1508,  5400,     1,  1208, 38708,     2,
+ 1209, 38709,  2952,  1302,     1,  1210, 38710,     2,  1211, 38711,
+ 2951,  1300,     2,  2029,  1312,  2950,  1298,     1,  1206, 38706,
+    2,  1207, 38707,  2949,  1296,     2,   721,  5424,  1212, 38712,
+    2,   722,  5425,  1213, 38713,     2,  3180,  1296,  3204,  1280,
+    1,  2672, 25712,     2,  3179,  1280,  3205,  1296,     2,  2247,
+42820,  2671, 25696,     1,  3206,  1312,     1,  2670, 25680,     1,
+ 2669, 25664,     1,  3234,  1280,     1,  2668, 25648,     1,  3862,
+ 1298,     1,  2037,  1434,     1,  3860,  1296,     1,  3861,  1297,
+    1,  3231,  1280,     1,  3858,  1288,     1,  3859,  1289,     1,
+ 3856,  1286,     2,  2667, 25632,  3857,  1287,     1,  3854,  1284,
+    1,  3855,  1285,     1,  3852,  1282,     1,  3853,  1283,     1,
+ 3851,  1281,     1,  2666, 25616,     1,  2245, 42801,     1,  2244,
+42800,     1,  2246, 42802,     1,  2665, 25600,     2,   226, 37977,
+ 1118, 37961,     2,   225, 37976,  1851, 38008,     1,  1115, 37953,
+    1,  1114, 37952,     1,  1116, 37954,     1,  1850, 38004,     1,
+ 1117, 37959,     1,  1119, 37969,     1,  1120, 37970,     1,  1121,
+37973,     1,  1123, 37975,     1,  1122, 37974,     1,  1132, 37993,
+    2,  1131, 37992,  1367, 37968,     1,  1368, 37971,     1,  1124,
+37985,     1,  1126, 37987,     1,  1125, 37986,     1,  1128, 37989,
+    2,  1127, 37988,  1849, 37972,     1,  1130, 37991,     1,  1129,
+37990,     1,  1134, 38001,     2,   227, 37984,  1133, 38000,     2,
+ 1136, 38003,  1845, 37955,     1,  1135, 38002,     1,  1847, 37957,
+    2,  1137, 38004,  1846, 37956,     1,  1139, 38007,     2,  1138,
+38006,  1848, 37958,     2,   723,  5632,  2236, 42131,     1,  2235,
+42130,     2,   724,  5634,  2234, 42129,     1,   725,  5636,     1,
+ 2238, 42134,     1,   726,  5638,     1,  2237, 42132,     2,   224,
+37904,   727,  5640,     2,  1087, 37889,  2042,  1552,     1,  1088,
+37890,     2,  1089, 37891,  2043,  1554,     1,  1090, 37892,     1,
+ 1091, 37893,     1,  1092, 37894,     1,  1093, 37895,     1,   728,
+ 5648,     1,  1366, 37921,     1,   729,  5650,     1,  1094, 37904,
+    1,  2040,  1536,     2,  1095, 37906,  1844, 37922,     1,  2041,
+ 1538,     1,    30,  5632,     1,  1096, 37911,     2,   730,  5664,
+ 1103, 37928,     1,  1104, 37929,     1,   731,  5666,     1,   732,
+ 5667,     1,   733,  5668,     1,  1097, 37920,     2,  1841, 37905,
+ 2955,  1538,     2,  1098, 37923,  2954,  1536,     1,  1099, 37924,
+    2,  1100, 37925,  1842, 37909,     2,  1101, 37926,  1843, 37910,
+    2,  1102, 37927,  2956,  1540,     1,  1112, 37944,     2,   296,
+37937,  1113, 37945,     1,  1105, 37936,     1,  2044,  1568,     1,
+ 1106, 37938,     1,  1107, 37939,     1,  1108, 37940,     1,  1109,
+37941,     1,  1110, 37942,     1,  1111, 37943,     1,  2045,  1786,
+    1,  2232, 41987,     1,  2231, 41986,     1,  2233, 41988,     2,
+ 1169, 38217,  1695,  1840,     1,  1168, 38216,     1,  1165, 38213,
+    1,  1164, 38212,     1,  1167, 38215,     1,  1166, 38214,     2,
+ 1161, 38209,  3139,   784,     1,  1163, 38211,     1,  1162, 38210,
+    2,  1179, 38233,  1692,  1824,     2,  1178, 38232,  1693,  1825,
+    2,  1694,  1826,  2049,  1866,     1,  1175, 38229,     2,  1174,
+38228,  3138,   773,     1,  1177, 38231,     1,  1176, 38230,     1,
+ 1171, 38225,     1,  1170, 38224,     1,  1173, 38227,     1,  1172,
+38226,     1,  1691,  1808,     1,  1688,  1792,     1,  1689,  1793,
+    1,  1690,  1794,     1,   736,  5892,     2,   737,  5894,  1371,
+38198,     2,   734,  5888,  1143, 38152,     1,  1144, 38153,     1,
+  735,  5890,     1,  2046,  1818,     2,  1140, 38148,  4443,    16,
+    1,  1141, 38150,     2,  1142, 38151,  1859, 38199,     1,   738,
+ 5896,     2,   739,  5904,  1151, 38168,     1,  1152, 38169,     1,
+  740,  5906,     1,  1147, 38164,     1,  1148, 38165,     1,  1149,
+38166,     1,  1150, 38167,     2,  1145, 38160,  1858, 38176,     2,
+ 1146, 38161,  1370, 38185,     2,   741,  5920,  1157, 38184,     1,
+ 2048,  1850,     1,  1153, 38180,     2,  1154, 38181,  2961,  1798,
+    2,  1155, 38182,  2960,  1797,     2,  1156, 38183,  2959,  1796,
+    1,  1369, 38168,     1,  2958,  1794,     1,  2957,  1792,     1,
+ 1160, 38200,     1,  1696,  1856,     2,  2047,  1834,  2967,  1816,
+    2,  2966,  1815,  4444,    32,     2,  1855, 38149,  2965,  1814,
+    1,  1856, 38150,     2,  1857, 38151,  2964,  1812,     1,  1158,
+38192,     3,  1159, 38193,  1852, 38145,  2963,  1810,     1,  1853,
+38146,     2,  1854, 38147,  2962,  1808,     2,  4146,  9744,  4353,
+ 9728,     2,  4172,  9744,  4379,  9728,     2,  4198,  9744,  4405,
+ 9728,     2,  4224,  9744,  4431,  9728,     2,  4042,  9744,  4249,
+ 9728,     2,  4068,  9744,  4275,  9728,     2,  4094,  9744,  4301,
+ 9728,     2,  4120,  9744,  4327,  9728,     2,  4145,  9728,  4354,
+ 9744,     2,  2239, 42244,  2693, 26144,     2,  4171,  9728,  4380,
+ 9744,     2,  4197,  9728,  4406,  9744,     2,  4223,  9728,  4432,
+ 9744,     2,  4041,  9728,  4250,  9744,     2,  4067,  9728,  4276,
+ 9744,     2,  4093,  9728,  4302,  9744,     2,  4119,  9728,  4328,
+ 9744,     1,  2692, 26128,     1,  2240, 42277,     2,  1701,  2072,
+ 2830,  6145,     1,  2832,  6147,     1,  2831,  6146,     1,  2834,
+ 6149,     1,  2833,  6148,     1,  2836,  6151,     1,  2835,  6150,
+    1,  1697,  2064,     1,  2837,  6152,     1,  1698,  2066,     1,
+ 1699,  2067,     1,  1700,  2068,     1,  2255, 56077,     1,  2254,
+56076,     1,  2253, 56075,     1,  2252, 56071,     1,  2251, 56070,
+    1,  2250, 56064,     1,  2256, 56179,     1,   742,  6144,     1,
+  743,  6145,     1,   744,  6146,     1,   745,  6147,     1,  2052,
+ 2282,     1,  2051,  2266,     1,  2050,  2264,     1,  2841,  6405,
+    1,  2840,  6404,     1,  2842,  6407,     1,  2838,  6401,     1,
+ 2839,  6403,     1,  2053,  2552,     3,  4466,  2048,  4492,  2050,
+ 4519,  2052,     1,  4493,  2051,     3,  4467,  2050,  4491,  2048,
+ 4544,  2052,     1,  4468,  2051,     3,  4469,  2052,  4516,  2048,
+ 4542,  2050,     1,  4543,  2051,     3,  4494,  2052,  4517,  2050,
+ 4541,  2048,     1,  4518,  2051,     4,  3122,  2310,  4566,  2048,
+ 4592,  2050,  4619,  2052,     1,  4593,  2051,     4,  3121,  2308,
+ 4567,  2050,  4591,  2048,  4644,  2052,     1,  4568,  2051,     3,
+ 4569,  2052,  4616,  2048,  4642,  2050,     1,  4643,  2051,     3,
+ 4594,  2052,  4617,  2050,  4641,  2048,     1,  4618,  2051,     3,
+ 4666,  2048,  4692,  2050,  4719,  2052,     1,  4693,  2051,     3,
+ 4667,  2050,  4691,  2048,  4744,  2052,     1,  4668,  2051,     3,
+ 4669,  2052,  4716,  2048,  4742,  2050,     1,  4743,  2051,     3,
+ 4694,  2052,  4717,  2050,  4741,  2048,     1,  4718,  2051,     3,
+ 4766,  2048,  4792,  2050,  4819,  2052,     1,  4793,  2051,     3,
+ 4767,  2050,  4791,  2048,  4844,  2052,     1,  4768,  2051,     4,
+ 3124,  2322,  4769,  2052,  4816,  2048,  4842,  2050,     1,  4843,
+ 2051,     4,  3123,  2320,  4794,  2052,  4817,  2050,  4841,  2048,
+    1,  4818,  2051,     1,  1702,  2562,     1,  1703,  2564,     1,
+ 2843,  6657,     1,  2844,  6659,     1,  2846,  6661,     1,  2845,
+ 6660,     1,  1247, 38928,     1,  1240, 38920,     1,  1241, 38921,
+    1,  1242, 38923,     1,  1243, 38924,     1,  1244, 38925,     1,
+ 1245, 38926,     1,  1246, 38927,     1,  1234, 38913,     1,  1235,
+38915,     1,  1236, 38916,     1,  1237, 38917,     1,  1238, 38918,
+    1,  1239, 38919,     1,  2248, 43410,     1,  4862,    16,     1,
+ 4861,     9,     1,  4860,     8,     1,  4864,    48,     1,  1831,
+32736,     1,  4863,    32,     1,  4865,    64,     1,  4870,    64,
+    1,  4017,     1,     1,  4869,    48,     1,  4868,    32,     1,
+ 4866,    16,     1,  4867,    17,     1,  4875, 57565,     1,  4873,
+57344,     1,  4874, 57357,
 };
 
-unsigned short DictKeyHashTable[] = {
- 4096,  4097,  4100,  4096,  4103,  4096,  4106,  4096,  4096,  4109,
- 4112,  4115,  4118,  4096,  4096,  4096,  4121,  4124,  4127,  4130,
- 4133,  4138,  4141,  4096,  4144,  4096,  4096,  4149,  4152,  4155,
- 4096,  4160,  4163,  4168,  4096,  4171,  4096,  4174,  4096,  4177,
- 4182,  4187,  4190,  4096,  4195,  4096,  4096,  4198,  4096,  4203,
- 4208,  4096,  4215,  4218,  4223,  4228,  4096,  4231,  4096,  4234,
- 4237,  4096,  4096,  4240,  4096,  4096,  4096,  4243,  4246,  4251,
- 4096,  4254,  4257,  4260,  4265,  4096,  4268,  4273,  4276,  4096,
- 4096,  4096,  4096,  4096,  4096,  4283,  4096,  4286,  4297,  4096,
- 4096,  4300,  4305,  4096,  4096,  4308,  4096,  4311,  4096,  4096,
- 4096,  4316,  4319,  4322,  4096,  4325,  4328,  4337,  4342,  4345,
- 4352,  4357,  4364,  4369,  4376,  4379,  4386,  4389,  4394,  4397,
- 4400,  4407,  4410,  4417,  4422,  4431,  4438,  4441,  4444,  4096,
- 4096,  4449,  4096,  4456,  4459,  4464,  4469,  4096,  4096,  4096,
- 4096,  4096,  4472,  4479,  4096,  4096,  4482,  4491,  4494,  4096,
- 4096,  4499,  4502,  4507,  4514,  4519,  4522,  4096,  4529,  4096,
- 4532,  4537,  4542,  4545,  4548,  4096,  4096,  4096,  4553,  4096,
- 4096,  4096,  4556,  4565,  4096,  4568,  4571,  4096,  4576,  4581,
- 4096,  4096,  4096,  4584,  4096,  4096,  4096,  4589,  4592,  4096,
- 4096,  4601,  4096,  4604,  4607,  4610,  4615,  4096,  4096,  4096,
- 4618,  4621,  4624,  4627,  4632,  4635,  4644,  4096,  4649,  4096,
- 4096,  4652,  4096,  4096,  4655,  4658,  4096,  4661,  4096,  4096,
- 4666,  4669,  4096,  4096,  4674,  4679,  4684,  4687,  4696,  4703,
- 4710,  4717,  4722,  4729,  4734,  4739,  4096,  4096,  4746,  4753,
- 4096,  4756,  4761,  4096,  4764,  4096,  4767,  4772,  4777,  4784,
- 4791,  4796,  4805,  4812,  4821,  4096,  4096,  4096,  4824,  4829,
- 4096,  4832,  4837,  4096,  4096,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096,  4840,  4096,  4096,  4843,  4846,  4853,  4860,  4096,
- 4863,  4096,  4868,  4096,  4096,  4871,  4096,  4874,  4877,  4880,
- 4096,  4096,  4883,  4888,  4897,  4900,  4905,  4910,  4915,  4922,
- 4931,  4936,  4939,  4944,  4947,  4096,  4950,  4953,  4096,  4956,
- 4959,  4966,  4969,  4096,  4974,  4977,  4980,  4985,  4990,  4997,
- 5002,  5007,  5014,  5021,  5030,  5035,  5042,  4096,  4096,  4096,
- 5047,  5050,  5053,  5058,  5061,  4096,  5064,  5069,  4096,  5072,
- 4096,  5075,  5078,  5081,  4096,  5088,  4096,  4096,  4096,  4096,
- 5091,  4096,  5098,  5101,  5108,  5111,  5114,  5117,  4096,  5122,
- 5125,  4096,  5128,  4096,  5131,  4096,  5136,  5141,  5146,  5149,
- 5152,  5157,  5164,  4096,  5167,  4096,  5170,  5173,  4096,  5176,
- 5179,  5186,  4096,  5189,  4096,  5194,  4096,  4096,  5197,  5202,
- 4096,  5205,  5208,  4096,  5215,  4096,  5218,  5223,  4096,  5226,
- 5229,  5234,  4096,  5239,  5244,  5247,  4096,  5250,  5255,  4096,
- 5258,  5263,  4096,  5266,  4096,  4096,  4096,  5275,  5280,  5285,
- 5292,  5295,  5300,  5309,  5312,  5315,  5318,  5321,  5324,  5329,
- 5332,  5337,  5342,  4096,  5345,  4096,  4096,  5348,  4096,  5351,
- 4096,  5354,  5359,  4096,  5362,  4096,  5367,  5372,  4096,  5377,
- 5380,  5385,  5390,  4096,  4096,  5397,  5400,  5405,  5410,  5417,
- 5420,  5425,  5430,  5433,  4096,  5436,  4096,  5439,  5446,  5449,
- 4096,  4096,  4096,  4096,  4096,  4096,  4096,  4096,  5452,  5455,
- 5462,  5469,  5476,  5481,  5484,  4096,  5491,  4096,  4096,  5494,
- 5497,  4096,  4096,  5500,  5503,  5508,  5511,  4096,  4096,  5514,
- 4096,  5517,  4096,  5522,  5527,  5530,  4096,  5533,  5538,  5543,
- 4096,  5548,  5553,  4096,  5556,  5561,  4096,  5566,  5569,  4096,
- 5572,  5575,  5580,  5585,  5590,  5595,  5602,  5607,  5614,  5621,
- 5626,  5633,  5638,  5647,  5652,  5657,  5660,  5663,  4096,  4096,
- 5666,  5675,  5680,  5683,  5688,  5691,  4096,  5696,  5699,  4096,
- 5702,  4096,  5705,  5708,  5711,  5718,  5727,  5734,  5739,  5742,
- 5747,  5750,  4096,  5757,  5762,  4096,  5767,  5770,  5773,  5778,
- 5781,  5784,  5793,  5800,  5807,  5812,  4096,  5815,  4096,  4096,
- 5820,  5823,  4096,  5826,  4096,  4096,  5833,  5836,  4096,  5839,
- 5842,  5845,  5850,  4096,  5853,  5856,  5859,  5862,  4096,  5867,
- 4096,  4096,  5870,  4096,  4096,  5875,  4096,  5878,  5881,  5884,
- 5887,  5890,  5893,  4096,  5896,  5901,  4096,  4096,  4096,  4096,
- 5908,  4096,  5915,  4096,  5918,  5923,  5926,  4096,  5929,  5936,
- 5941,  5944,  5949,  5954,  5959,  5962,  5969,  4096,  4096,  5974,
- 5977,  5980,  4096,  5983,  5986,  4096,  5991,  4096,  4096,  5994,
- 4096,  4096,  5999,  6004,  4096,  6007,  6012,  4096,  6015,  4096,
- 6018,  6021,  6026,  4096,  6033,  6036,  4096,  6039,  6042,  4096,
- 6047,  4096,  6050,  4096,  6053,  6056,  6063,  6066,  4096,  4096,
- 6069,  4096,  4096,  6072,  6075,  4096,  6078,  6085,  6088,  6091,
- 6096,  4096,  6099,  6104,  6107,  6110,  6115,  6118,  4096,  4096,
- 6121,  6126,  6129,  6132,  6137,  6140,  4096,  4096,  6145,  4096,
- 6150,  6153,  4096,  6156,  4096,  6161,  4096,  4096,  6164,  4096,
- 6169,  6174,  4096,  6177,  4096,  4096,  4096,  6182,  4096,  6185,
- 6190,  4096,  4096,  6193,  6196,  6203,  6206,  6221,  6224,  6229,
- 6234,  6245,  6250,  6255,  6258,  6263,  6270,  4096,  6275,  6280,
- 6283,  4096,  6286,  4096,  4096,  4096,  6289,  6292,  6295,  4096,
- 6298,  6303,  6306,  6309,  6314,  6319,  4096,  4096,  6324,  4096,
- 4096,  6329,  4096,  4096,  4096,  4096,  6332,  4096,  6339,  6346,
- 4096,  4096,  4096,  6349,  4096,  6354,  6359,  6366,  6369,  6374,
- 6377,  6380,  4096,  6385,  6388,  6393,  6396,  6403,  4096,  4096,
- 6406,  6413,  4096,  4096,  4096,  4096,  4096,  6418,  4096,  4096,
- 6421,  6424,  4096,  4096,  4096,  4096,  6427,  4096,  4096,  4096,
- 6430,  6433,  6438,  4096,  4096,  6441,  4096,  6444,  6449,  6454,
- 6457,  6460,  6463,  6466,  6471,  6474,  6477,  6480,  6483,  6486,
- 6491,  6496,  6501,  6504,  4096,  6507,  6510,  6517,  6520,  4096,
- 6523,  6526,  6531,  4096,  4096,  6534,  4096,  4096,  4096,  4096,
- 6541,  6546,  4096,  4096,  6549,  4096,  4096,  6552,  4096,  4096,
- 6555,  6560,  6565,  4096,  6568,  6573,  6576,  6581,  6592,  6595,
- 6600,  6603,  4096,  6606,  4096,  4096,  6609,  4096,  4096,  4096,
- 4096,  6614,  4096,  4096,  6621,  6624,  6627,  6630,  6633,  6638,
- 6641,  4096,  4096,  6644,  4096,  6647,  6650,  6655,  4096,  6658,
- 4096,  6663,  6666,  4096,  6671,  4096,  6678,  4096,  4096,  6683,
- 4096,  4096,  4096,  4096,  6690,  6693,  6696,  4096,  6699,  6702,
- 4096,  6707,  6710,  6717,  4096,  6720,  6723,  4096,  6726,  6733,
- 6736,  4096,  6739,  6744,  6749,  6752,  6759,  6764,  6767,  6776,
- 6779,  6782,  6787,  6794,  6801,  6804,  6811,  4096,  6814,  6817,
- 6820,  6827,  6832,  4096,  4096,  6839,  6842,  6847,  6852,  6857,
- 6862,  6865,  6874,  4096,  4096,  6879,  4096,  6882,  4096,  6885,
- 6888,  6891,  6894,  4096,  6897,  6900,  6905,  6908,  6911,  4096,
- 6914,  6919,  6922,  4096,  6925,  4096,  6932,  6939,  6948,  6951,
- 6954,  6957,  6960,  6963,  6968,  6975,  6980,  6987,  6992,  6995,
- 4096,  6998,  7009,  4096,  4096,  7012,  7015,  7020,  7023,  7026,
- 7029,  7034,  7037,  7040,  7043,  4096,  7046,  7051,  7054,  7057,
- 7062,  7069,  7072,  4096,  7075,  7080,  7085,  4096,  4096,  7088,
- 7093,  7096,  4096,  7103,  7108,  7111,  4096,  4096,  4096,  7118,
- 4096,  4096,  4096,  4096,  7123,  7126,  4096,  7131,  7142,  4096,
- 4096,  7145,  4096,  4096,  4096,  4096,  7150,  7159,  7166,  7169,
- 7176,  7181,  7186,  7189,  4096,  4096,  7194,  7197,  7200,  7203,
- 7206,  7209,  4096,  4096,  4096,  7212,  7215,  7218,  4096,  7223,
- 4096,  4096,  7228,  4096,  7231,  7236,  7239,  7242,  7245,  4096,
- 4096,  7248,  4096,  7257,  7262,  7265,  7268,  4096,  7271,  7274,
- 4096,  4096,  4096,  4096,  7277,  4096,  7280,  7283,  7290,  4096,
- 7293,  7304,  7309,  7316,  7319,  7322,  7327,  7332,  7335,  7338,
- 7343,  7346,  7349,  4096,  7352,  7361,  7364,  7367,  7370,  7373,
- 7378,  7381,  7386,  4096,  7389,  4096,  4096,  4096,  7392,  7395,
- 7398,  4096,  7407,  7412,  4096,  7419,  7426,  7433,  7438,  7447,
- 7450,  7453,  4096,  7458,  4096,  7465,  4096,  7468,  7471,  4096,
- 7474,  4096,  7481,  7488,  7491,  7498,  4096,  7501,  4096,  7506,
- 4096,  4096,  7509,  7512,  4096,  7517,  7520,  7523,  4096,  7526,
- 7531,  4096,  4096,  4096,  7534,  7537,  7540,  4096,  7543,  4096,
- 7546,  4096,  7549,  7554,  7557,  7560,  4096,  7565,  4096,  7568,
- 4096,  4096,  4096,  7575,  7580,  7583,  7586,  4096,  7589,  7592,
- 7597,  7602,  7607,  7614,  7619,  7624,  7633,  7638,  7645,  7650,
- 7659,  4096,  4096,  4096,  7666,  7671,  7678,  7685,  7690,  7703,
- 7708,  7713,  4096,  4096,  7716,  7721,  7724,  7727,  7730,  7733,
- 7736,  4096,  4096,  4096,  7739,  7742,  7745,  7748,  4096,  7751,
- 4096,  7754,  7761,  7764,  4096,  4096,  4096,  7769,  7772,  4096,
- 7777,  7784,  7787,  7790,  7797,  7804,  4096,  4096,  4096,  7807,
- 7810,  4096,  4096,  4096,  7815,  7820,  7823,  7828,  7831,  4096,
- 4096,  7834,  7837,  7840,  4096,  7843,  7846,  4096,  4096,  7851,
- 7854,  7857,  7866,  7873,  7876,  7881,  7886,  7889,  7898,  4096,
- 4096,  7903,  7906,  7909,  7912,  7915,  7918,  7921,  4096,  7924,
- 7927,  7930,  4096,  7937,  4096,  7942,  7945,  7950,  7953,  7960,
- 7965,  7972,  7975,  7980,  7985,  7990,  7995,  8000,  4096,  4096,
- 8003,  4096,  8010,  8013,  8016,  8019,  8024,  8031,  8036,  4096,
- 4096,  4096,  4096,  8039,  8042,  4096,  8045,  4096,  4096,  8048,
- 8055,  4096,  4096,  4096,  8062,  8065,  8068,  8071,  8076,  4096,
- 4096,  8083,  8086,  8091,  8094,  4096,  8099,  4096,  8102,  8107,
- 8110,  4096,  8113,  8116,  8121,  8124,  8127,  8134,  4096,  8139,
- 8142,  4096,  8145,  8150,  8155,  8158,  8161,  4096,  8166,  8169,
- 8172,  4096,  8175,  4096,  8178,  8183,  8186,  8189,  4096,  8192,
- 8195,  8198,  8203,  8206,  4096,  8209,  4096,  8216,  8219,  4096,
- 8222,  8229,  8234,  8237,  8244,  8249,  8252,  4096,  8257,  8260,
- 8265,  8268,  4096,  4096,  8273,  8278,  8281,  4096,  8284,  8289,
- 4096,  4096,  8292,  8297,  8300,  8309,  8314,  8317,  8320,  8323,
- 4096,  8326,  8331,  8334,  4096,  8339,  8344,  4096,  4096,  8347,
- 8350,  8353,  8356,  8359,  8362,  8367,  8374,  8377,  8382,  4096,
- 8385,  4096,  8388,  8391,  4096,  4096,  4096,  4096,  8394,  8397,
- 8402,  8405,  4096,  8408,  8413,  8416,  8421,  8426,  4096,  8433,
- 8436,  4096,  4096,  8439,  4096,  8442,  4096,  8449,  8456,  8463,
- 8466,  8471,  8474,  8479,  8486,  8489,  8498,  8503,  8512,  8515,
- 8526,  8533,  8538,  8541,  8546,  8549,  8552,  8555,  4096,  8558,
- 4096,  4096,  8561,  4096,  8564,  8571,  8576,  8581,  8584,  8587,
- 8590,  8593,  8596,  8599,  4096,  8608,  8611,  4096,  4096,  8614,
- 8617,  4096,  4096,  8620,  8625,  8630,  4096,  8633,  8636,  8643,
- 8650,  8653,  4096,  4096,  4096,  8656,  4096,  8659,  8662,  8667,
- 8672,  8677,  4096,  4096,  8684,  8691,  8694,  8697,  4096,  8700,
- 8703,  8708,  8715,  8722,  8725,  8728,  8735,  4096,  8738,  4096,
- 8741,  4096,  8744,  4096,  8747,  8752,  8757,  8760,  4096,  8763,
- 8770,  8773,  8776,  8781,  8788,  8791,  8796,  8801,  8812,  8815,
- 8824,  4096,  4096,  4096,  4096,  8829,  8838,  4096,  8845,  8848,
- 8853,  8856,  8859,  4096,  8864,  8867,  8872,  8875,  8878,  8881,
- 4096,  8884,  8889,  8896,  4096,  4096,  8899,  8902,  8905,  8908,
- 8911,  4096,  8914,  8917,  8920,  8923,  4096,  8926,  8929,  4096,
- 8932,  8935,  4096,  4096,  8938,  8941,  8946,  8949,  8954,  8957,
- 8960,  8963,  8966,  8971,  4096,  4096,  8976,  4096,  8979,  4096,
- 8982,  8985,  4096,  4096,  8988,  8997,  9000,  9003,  9006,  9011,
- 9014,  9019,  9024,  4096,  9027,  4096,  9030,  9033,  9036,  9039,
- 9046,  9055,  9058,  4096,  4096,  4096,  9063,  9066,  4096,  9071,
- 9074,  9079,  9082,  9085,  9088,  9095,  9098,  9101,  9104,  9107,
- 4096,  9110,  4096,  4096,  9113,  9116,  4096,  9119,  9122,  9127,
- 9130,  9133,  9138,  9141,  9144,  9153,  9156,  4096,  4096,  9159,
- 9162,  9165,  9168,  9173,  9178,  9181,  9192,  9197,  4096,  9202,
- 9205,  9208,  9215,  9218,  9225,  9230,  9233,  4096,  4096,  4096,
- 4096,  9236,  9239,  9246,  9251,  9254,  4096,  9259,  9264,  9267,
- 9270,  9275,  9278,  9281,  9286,  9289,  9294,  4096,  9299,  4096,
- 9302,  4096,  9305,  4096,  9310,  9313,  4096,  9318,  9321,  9326,
- 9331,  4096,  9336,  4096,  9341,  4096,  9346,  9351,  4096,  9358,
- 9361,  9364,  4096,  4096,  9369,  9372,  9375,  9384,  9387,  9392,
- 9395,  9398,  4096,  9401,  9406,  9411,  9416,  9419,  9428,  9433,
- 9442,  9449,  9458,  9465,  9472,  9477,  9480,  9483,  9488,  9491,
- 9494,  9499,  9504,  9511,  9518,  9527,  9532,  9539,  9542,  9549,
- 4096,  9552,  9557,  4096,  9560,  4096,  4096,  4096,  9565,  4096,
- 4096,  9572,  4096,  9575,  9584,  9589,  4096,  4096,  4096,  9594,
- 4096,  9599,  9606,  4096,  4096,  9611,  9614,  9617,  9622,  9625,
- 9628,  9631,  9636,  9639,  4096,  4096,  9644,  9647,  9652,  4096,
- 4096,  4096,  9655,  9658,  9663,  9666,  9669,  9672,  9677,  9680,
- 9683,  4096,  9686,  9691,  9694,  4096,  4096,  9701,  4096,  4096,
- 4096,  9706,  9709,  9714,  4096,  9717,  4096,  4096,  4096,  9722,
- 4096,  4096,  9725,  4096,  4096,  4096,  9728,  9731,  9734,  9737,
- 9740,  4096,  4096,  9743,  4096,  4096,  4096,  9748,  4096,  9751,
- 9754,  4096,  9757,  9762,  9767,  9774,  9779,  9788,  9795,  9798,
- 9803,  9806,  9813,  4096,  9816,  9819,  9824,  4096,  4096,  9827,
- 9836,  9839,  9842,  9845,  9848,  9853,  9862,  9865,  9870,  9873,
- 9878,  9881,  9884,  9889,  4096,  4096,  9892,  4096,  4096,  4096,
- 4096,  4096,  9897,  9902,  9905,  9908,  9911,  4096,  9914,  9919,
- 4096,  9922,  9925,  4096,  4096,  4096,  4096,  4096,  9930,  4096,
- 4096,  9933,  9936,  9939,  9944,  9947,  9952,  9957,  9960,  4096,
- 9963,  4096,  4096,  9966,  9969,  9972,  4096,  9975,  9978,  9989,
- 9992,  9997, 10002, 10007, 10012, 10019, 10024, 10031, 10034, 10037,
-10042, 10053, 10056, 10061,  4096, 10064,  4096,  4096, 10067,  4096,
-10070, 10073, 10078, 10085, 10092, 10095, 10098, 10101, 10108, 10111,
- 4096,  4096, 10116,  4096,  4096, 10119, 10122, 10125, 10130, 10133,
-10136, 10141,  4096,  4096,  4096, 10146, 10149, 10152, 10155,  4096,
- 4096,  4096,  4096, 10162, 10167,  4096, 10174, 10179, 10184, 10189,
- 4096, 10194, 10197,  4096, 10204, 10207, 10210,  4096, 10217, 10224,
-10227, 10230, 10237, 10240, 10243, 10250, 10257,  4096,  4096, 10260,
-10265, 10272,  4096, 10277, 10280, 10285, 10288, 10295,  4096, 10300,
-10307, 10310, 10313,  4096,  4096,  4096, 10316, 10321, 10324, 10327,
- 4096, 10334, 10337, 10340, 10343, 10348,  4096, 10355, 10358,  4096,
-10361, 10364, 10371, 10374, 10381, 10384, 10389, 10392, 10397, 10400,
-10407,  4096,  4096, 10410, 10413, 10416, 10423,  4096,  4096, 10426,
-10431, 10438,  4096, 10441, 10446, 10449, 10454,  4096, 10461, 10464,
- 4096, 10467, 10470, 10475, 10480, 10487, 10490, 10493, 10496, 10503,
- 4096, 10508, 10515, 10518,  4096, 10521, 10524,  4096, 10529, 10534,
-10539,  4096,  4096, 10544,  4096, 10547,  4096, 10552, 10555,  4096,
-10558, 10561, 10566, 10569, 10576, 10581, 10588,  4096, 10593,  4096,
-10596,  4096, 10603, 10606,  4096,  4096,  4096, 10609, 10616,  4096,
- 4096, 10619, 10624, 10627,  4096, 10630,  4096,  4096, 10635,  4096,
- 4096,  4096,  4096, 10638, 10641, 10644, 10647, 10650, 10653, 10656,
- 4096, 10659, 10662, 10665,  4096, 10672,  4096, 10675, 10678, 10683,
-10688, 10691, 10696, 10699, 10704, 10707,  4096, 10716,  4096, 10721,
- 4096,  4096, 10724, 10729,  4096, 10732, 10739, 10742, 10747,  4096,
- 4096,  4096,  4096, 10754,  4096, 10757, 10768, 10773, 10780,  4096,
-10785,  4096,  4096, 10788,  4096, 10791, 10796, 10799,  4096, 10802,
- 4096, 10805,  4096, 10808, 10813, 10816, 10821,  4096, 10826, 10829,
-10832, 10835, 10844, 10847, 10850, 10855, 10858, 10865, 10874, 10877,
-10882, 10887, 10890, 10893, 10896,  4096,  4096,  4096, 10899,  4096,
-10902, 10905,  4096, 10910,  4096, 10915, 10918,  4096,  4096,  4096,
-10925,  4096, 10928, 10933,  4096, 10938,  4096, 10943,  4096, 10946,
-10951,  4096, 10954, 10957, 10962, 10975, 10980, 10985, 10992, 10997,
-11000, 11007, 11012, 11015, 11020, 11025, 11028,  4096, 11031, 11040,
-11043, 11048, 11051, 11054, 11059, 11062, 11065, 11068, 11071, 11076,
-11081, 11086, 11089, 11094, 11097,  4096, 11100,  4096,  4096, 11105,
-11110, 11113,  4096, 11118, 11121,  4096, 11124, 11129, 11132,  4096,
-11135, 11142, 11149, 11154, 11159, 11166, 11173, 11180, 11185, 11192,
-11195, 11198, 11203,  4096, 11206,  4096, 11209, 11212, 11215, 11218,
-11227, 11234, 11237, 11242, 11245, 11248,  4096, 11253, 11258, 11261,
- 4096, 11264, 11267, 11272, 11275, 11280, 11283, 11290, 11293, 11298,
-11303, 11308, 11313, 11316, 11323, 11328, 11331, 11338, 11341, 11346,
- 4096, 11351, 11358, 11361, 11368, 11371, 11376, 11383, 11390,  4096,
-11395,  4096, 11398, 11407, 11412, 11415, 11418, 11421, 11426, 11429,
- 4096,  4096, 11434, 11437, 11440, 11443, 11452, 11455, 11458, 11469,
-11474, 11477,  4096, 11482, 11485,  4096, 11490,  4096, 11495,  4096,
-11500, 11503,  4096, 11508,  4096, 11511,  4096,  4096, 11516, 11519,
-11522,  4096, 11525, 11528,  4096, 11533, 11536, 11543, 11546,  4096,
-11549, 11552,  4096,  4096, 11557,  4096,  4096, 11562, 11565, 11568,
-11575, 11584, 11587, 11590,  4096, 11595, 11604, 11607, 11612, 11617,
-11620, 11623, 11626,  4096,  4096, 11631,  4096, 11634, 11643,  4096,
- 4096,  4096, 11648, 11653,  4096,  4096, 11656, 11659, 11662, 11665,
- 4096,  4096, 11668, 11673, 11676,  4096, 11683, 11690,  4096, 11695,
- 4096,  4096,  4096,  4096, 11698, 11707,  4096,  4096,  4096, 11714,
- 4096, 11719,  4096, 11722, 11725, 11728,  4096, 11731,  4096,  4096,
-11734, 11737, 11740,  4096, 11745,  4096, 11750,  4096, 11753,  4096,
- 4096,  4096,  4096, 11756, 11761,  4096,  4096,  4096, 11764, 11767,
-11770,  4096,  4096, 11773, 11776,  4096, 11781,  4096,  4096, 11784,
- 4096, 11789,  4096, 11794, 11797, 11802, 11807, 11814, 11817, 11820,
-11825, 11828,  4096, 11833, 11836,  4096,  4096,  4096, 11839,  4096,
-11846,  4096,  4096,  4096,  4096,  4096, 11857,  4096, 11866,  4096,
-11871, 11874, 11877,  4096,  4096,  4096, 11880, 11885, 11890, 11893,
-11896, 11899, 11902,  4096,  4096,  4096, 11907,  4096, 11910, 11915,
-11918, 11921,  4096,  4096,  4096,  4096, 11924, 11927,  4096, 11930,
-11933,  4096,  4096, 11940, 11947, 11952,  4096, 11957,  4096,  4096,
-11960, 11965,  4096,  4096,  4096, 11968, 11971, 11974, 11979, 11982,
-11985, 11988, 11991, 11994,  4096,  4096, 11997, 12000,  4096,  4096,
-12003, 12010, 12013,  4096,  4096,  4096,  4096, 12018, 12023,  4096,
-12026, 12029, 12034, 12037, 12046, 12053, 12056,  4096,  4096, 12063,
- 4096, 12068,  4096, 12071, 12074,  4096, 12079,  4096, 12084,  4096,
-12087,  4096,  4096,  4096, 12092, 12095,  4096, 12100, 12103, 12110,
-12115, 12118, 12125,  4096,  4096, 12132, 12137, 12140, 12147, 12150,
-12155, 12158, 12161, 12166, 12171, 12174,  4096, 12177, 12180, 12183,
- 4096, 12186, 12191,  4096, 12194,  4096, 12201, 12204,  4096, 12207,
-12218, 12227, 12230, 12237, 12240, 12247, 12250, 12253,  4096, 12258,
-12265, 12268, 12271, 12278,  4096, 12281, 12284, 12287, 12290,  4096,
-12293, 12296, 12299, 12304, 12311, 12314, 12319, 12324, 12331, 12338,
-12343, 12348, 12353, 12358,  4096, 12361,  4096, 12364, 12369,  4096,
- 4096,  4096, 12374,  4096,  4096, 12377, 12384, 12387, 12392, 12395,
- 4096, 12398,  4096, 12403, 12408, 12411, 12418, 12421,  4096, 12426,
-12429, 12432, 12435, 12440, 12445, 12448, 12451, 12454, 12459,  4096,
- 4096,  4096, 12462, 12469,  4096, 12472,  4096, 12475,  4096, 12480,
-12485, 12488,  4096, 12493, 12500, 12509,  4096, 12512,  4096, 12515,
- 4096, 12518, 12521, 12528, 12531,  4096,  4096, 12534, 12537, 12542,
-12547, 12552, 12557, 12560, 12563, 12568,  4096, 12573, 12578, 12585,
-12592, 12597, 12602, 12611, 12618, 12625, 12636,  4096, 12639, 12642,
- 4096,  4096,  4096,  4096,  4096, 12645, 12648, 12651, 12656,  4096,
-12663, 12666, 12669, 12674, 12677,  4096, 12682, 12689,  4096, 12692,
-12697, 12700, 12705, 12708, 12711, 12714, 12725, 12732, 12741, 12746,
-12753, 12758, 12765, 12770, 12777, 12780, 12785,  4096, 12788,  4096,
-12793,  4096, 12796, 12805, 12814,  4096, 12819,  4096, 12826, 12829,
-12832, 12835, 12840, 12843, 12848,  4096,  4096,  4096, 12855,  4096,
- 4096,  4096, 12858, 12861, 12864, 12869, 12874, 12883,  4096,  4096,
-12886, 12889, 12892, 12897,  4096,  4096,  4096, 12900, 12907, 12910,
-12915, 12918, 12921, 12928, 12931, 12938, 12941, 12946, 12949, 12952,
-12955, 12960, 12965, 12970,  4096,  4096,  4096,  4096, 12973, 12976,
- 4096, 12979, 12982, 12987,  4096, 12994, 12999, 13004,  4096, 13009,
- 4096, 13012, 13017, 13020, 13023, 13030, 13033,  4096,  4096,  4096,
- 4096,  4096, 13036, 13039, 13046,  4096, 13051, 13054, 13057, 13060,
-13063, 13068, 13073, 13076,  4096, 13081, 13086, 13091, 13094, 13099,
-13102, 13105, 13110, 13115, 13120, 13125,  4096, 13132,  4096, 13135,
-13142, 13147, 13152, 13159, 13168,  4096, 13173, 13176, 13181,  4096,
- 4096, 13186, 13189, 13192,  4096, 13197, 13202, 13205, 13212, 13215,
-13220, 13227, 13234, 13237, 13240, 13245,  4096, 13248, 13251,  4096,
-13256,  4096,  4096, 13259, 13264,  4096, 13271, 13276, 13281, 13286,
-13291, 13296, 13301, 13304,  4096,  4096,  4096,  4096, 13307, 13310,
-13315, 13320, 13323, 13326, 13331,  4096, 13336,  4096, 13345, 13348,
- 4096,  4096,  4096, 13353,  4096,  4096, 13356, 13359,  4096,  4096,
- 4096,  4096, 13362, 13367, 13370,  4096, 13375, 13378, 13381, 13384,
-13389, 13392,  4096, 13397, 13400, 13407, 13412, 13415,  4096, 13422,
- 4096, 13425,  4096, 13428, 13433,  4096, 13436, 13445, 13448,  4096,
-13451,  4096,  4096, 13458, 13463, 13468, 13471,  4096, 13474, 13479,
-13484, 13489, 13494, 13499, 13504,  4096, 13509,  4096,  4096, 13512,
- 4096, 13519, 13524, 13527,  4096, 13530, 13533,  4096,  4096, 13536,
- 4096, 13541, 13544,  4096, 13547,  4096,  4096,  4096, 13550,  4096,
- 4096, 13555,  4096, 13560,  4096,  4096, 13563,  4096, 13566, 13569,
-13576, 13583, 13588, 13595, 13598, 13607,  4096,  4096,  4096, 13610,
-13615, 13624, 13629,  4096, 13634, 13639, 13644, 13651, 13654, 13657,
-13660, 13665, 13670, 13675,  4096,  4096, 13678, 13681, 13684,  4096,
- 4096, 13687,  4096, 13690,  4096, 13697,  4096, 13700, 13703,  4096,
- 4096,  4096,  4096, 13706,  4096,  4096, 13713, 13718, 13725, 13730,
-13739, 13742, 13749, 13752, 13757,  4096, 13762,  4096, 13767, 13772,
-13775, 13780,  4096,  4096, 13783, 13788,  4096, 13791,  4096,  4096,
-13794,  4096,  4096,  4096, 13797,  4096,  4096,  4096,  4096,  4096,
-13804, 13807, 13810, 13813, 13816,  4096, 13819,  4096, 13824, 13827,
-13832, 13835,  4096, 13838, 13841, 13846, 13849, 13856, 13859, 13866,
-13869,  4096, 13872, 13875,  4096, 13880, 13883, 13886, 13891,  4096,
- 4096,  4096,  4096, 13894, 13899, 13902,  4096,  4096,  4096,  4096,
-13907,  4096,  4096, 13910, 13913, 13916, 13923, 13928, 13933,  4096,
- 4096,  4096,  4096, 13938,  4096, 13941, 13948, 13955, 13958, 13963,
-13970, 13975, 13978, 13983, 13986, 13991, 13994,  4096, 13997,  4096,
- 4096,  4096,  4096, 14004,  4096, 14007,  4096, 14012, 14015, 14018,
-14021, 14028, 14033,  4096, 14036, 14041, 14044, 14049, 14054,  4096,
-14059, 14062,  4096, 14065,  4096, 14068,  4096,  4096,  4096, 14071,
-14074, 14077, 14080, 14085, 14088, 14091, 14094,  4096, 14099, 14102,
-14105,  4096, 14108, 14111, 14116,  4096,  4096, 14121, 14124, 14127,
- 4096, 14130, 14135,  4096,  4096,  4096, 14138, 14141,  4096,  4096,
- 4096,  4096,  4096, 14144, 14153, 14156,  4096, 14163, 14168,  4096,
- 4096, 14173, 14178, 14181, 14184,  4096, 14189, 14192, 14197, 14202,
-14207, 14210,  4096, 14213, 14216, 14219,  4096, 14224, 14231, 14236,
-14241, 14244, 14251, 14254, 14261,  4096, 14266,  4096, 14273,  4096,
-14276, 14279, 14284,  4096, 14287,  4096, 14294, 14297, 14300,  4096,
-14303,  4096,  4096, 14308, 14311, 14316, 14319,  4096, 14322,  4096,
- 4096,  4096, 14325, 14332, 14337, 14340,  4096, 14347, 14350,  4096,
- 4096, 14353, 14360,  4096, 14367, 14370,  4096, 14375,  4096, 14378,
-14383, 14388,  4096, 14393, 14398, 14405, 14408, 14415, 14420, 14425,
-14430, 14433,  4096,  4096, 14440, 14445,  4096,  4096, 14450, 14453,
-14460,  4096, 14465,  4096, 14472, 14475, 14478, 14481, 14488, 14493,
-14496,  4096, 14499,  4096, 14502,  4096, 14505, 14510, 14513,  4096,
- 4096, 14516, 14519, 14526,  4096,  4096,  4096,  4096,  4096, 14529,
-14532, 14537, 14542, 14545, 14554, 14559, 14564, 14571, 14578, 14585,
-14590, 14593, 14596,  4096,  4096, 14601, 14604, 14607, 14610, 14613,
-14618,  4096,  4096, 14623, 14626,  4096, 14633, 14638, 14643,  4096,
- 4096, 14648, 14651, 14656, 14659, 14668, 14675, 14682, 14685, 14688,
-14693,  4096, 14696, 14699, 14702, 14705, 14708, 14711, 14714, 14717,
-14722, 14733, 14740, 14747, 14756, 14759, 14762,  4096, 14765, 14768,
-14771,  4096, 14776, 14783,  4096, 14786, 14791,  4096, 14794,  4096,
-14799, 14802, 14807, 14810, 14815, 14818,  4096,  4096,  4096,  4096,
-14821, 14824,  4096,  4096, 14827, 14832,  4096, 14835, 14840, 14843,
-14846, 14851,  4096, 14856,  4096, 14861, 14868,  4096, 14873, 14878,
- 4096, 14881, 14884, 14887, 14890, 14897, 14902, 14909, 14912, 14917,
-14924, 14927,  4096, 14930, 14935,  4096,  4096,  4096, 14940, 14945,
-14952, 14957, 14964, 14971, 14976, 14979, 14986,  4096,  4096, 14989,
-14992, 14995,  4096, 14998,  4096, 15001, 15004, 15007, 15016, 15021,
-15026, 15029, 15034,  4096, 15037,  4096, 15040, 15049, 15052, 15057,
- 4096,  4096,  4096,  4096, 15060,  4096, 15063,  4096, 15068, 15071,
- 4096,  4096,  4096, 15076, 15083, 15086, 15091, 15094, 15097, 15100,
-15103, 15106,  4096,  4096,  4096, 15111, 15114, 15119,  4096, 15122,
-15125, 15128, 15135, 15140,  4096, 15147, 15150, 15155, 15160, 15167,
-15170, 15177, 15182, 15187,  4096,  4096, 15196, 15199, 15202,  4096,
-15205, 15208,  4096,  4096,  4096, 15213, 15216, 15219, 15224, 15227,
-15230,  4096, 15233,  4096, 15236, 15245, 15248,  4096, 15251,  4096,
-15256, 15261,  4096, 15266,  4096, 15269,  4096, 15274,  4096, 15277,
- 4096,  4096, 15280, 15285,  4096, 15288, 15291,  4096, 15298,  4096,
- 4096,  4096,  4096, 15301, 15304, 15311, 15316, 15325, 15332, 15343,
-15348, 15357, 15360,  4096, 15365, 15374,  4096, 15379, 15388,  4096,
- 4096, 15391,  4096,  4096, 15396,  4096,  4096,  4096,  4096,  4096,
- 4096,  4096, 15399,  4096, 15402, 15407, 15410,  4096, 15415, 15420,
-15429, 15436,  4096, 15443, 15448,  4096,  4096, 15453,  4096, 15458,
-15463, 15466, 15469,  4096, 15472,  4096,  4096, 15477, 15480, 15483,
- 4096, 15488, 15493, 15496,  4096,  4096,  4096, 15499, 15502,  4096,
-15505,  4096,  4096, 15508, 15511, 15514, 15519, 15522, 15525, 15528,
-15531, 15534,  4096,  4096,  4096,  4096, 15537, 15542, 15545, 15550,
- 4096, 15555, 15560, 15567, 15572, 15579, 15586, 15589, 15594, 15599,
-15602,  4096, 15605,  4096, 15608, 15613, 15616, 15619,  4096,  4096,
-15622, 15627, 15632,  4096,  4096,  4096, 15635, 15640, 15647, 15650,
-15653, 15658, 15661,  4096, 15666,  4096, 15671,  4096,  4096,  4096,
-15674, 15677,  4096, 15680, 15683, 15686, 15691, 15694, 15697,  4096,
-15702,  4096,  4096, 15705,  4096, 15708, 15711, 15716, 15723, 15726,
-15739, 15742, 15747, 15752, 15759, 15762, 15767, 15772, 15781, 15790,
- 4096,  4096,  4096, 15793,  4096, 15798, 15801, 15804, 15807,  4096,
- 4096, 15810, 15813,  4096,  4096,  4096,  4096,  4096, 15816, 15819,
- 4096, 15824, 15829, 15832, 15835, 15838, 15841, 15848, 15853, 15858,
-15863, 15868,  4096,  4096,  4096, 15873,  4096,  4096, 15876,  4096,
- 4096, 15881,  4096,  4096,  4096, 15884,  4096, 15887, 15892, 15897,
-15900, 15903,  4096, 15906, 15909, 15912,  4096, 15921, 15924, 15927,
-15930, 15937, 15940, 15945, 15950,  4096, 15953, 15956, 15961,  4096,
-15964, 15969,  4096, 15972,  4096,  4096, 15975, 15978,  4096,  4096,
- 4096, 15981, 15984, 15987, 15994, 16001,  4096,  4096, 16004, 16007,
-16012, 16021, 16028, 16031, 16034, 16037, 16042,  4096,  4096,  4096,
- 4096, 16045,  4096, 16050, 16053,  4096, 16058,  4096, 16063, 16068,
-16071,  4096, 16074, 16079, 16082, 16087, 16090, 16095, 16098, 16103,
-16106, 16111,  4096,  4096, 16114,  4096, 16119,  4096, 16126, 16135,
-16140, 16145, 16152, 16157, 16160, 16163, 16166, 16169, 16172, 16175,
-16180, 16185, 16190, 16195, 16200, 16203, 16210, 16217, 16220, 16231,
-16236,  4096, 16239, 16242, 16249, 16254, 16261, 16266, 16271,  4096,
-16274,  4096, 16277,  4096, 16280, 16287, 16294,  4096, 16297, 16302,
-16309,  4096, 16312, 16315, 16318,  4096,  4096, 16321, 16324, 16327,
- 4096,  4096,  4096,  4096, 16334, 16341,  4096, 16344, 16347, 16352,
-16355, 16358,  4096, 16361,  4096, 16364, 16367,  4096,  4096, 16370,
-16375, 16378, 16381, 16384, 16387, 16392, 16395, 16400, 16403,  4096,
-16408,  4096, 16411,  4096,  4096, 16414,     0,     1,   510,  8621,
-    1,   643, 60856,     1,   938, 12549,     1,  3541,  2910,     1,
- 2866, 39925,     1,   620, 62074,     1,  2332, 28221,     1,   829,
-46293,     1,  3255, 56632,     1,  2315, 49074,     1,  2018, 59737,
-    1,  1025, 10411,     2,  1850, 43325,  3162, 36851,     1,  3547,
-26552,     1,  1619,  6093,     2,   291, 62685,  1742, 11249,     1,
- 2105,  8987,     1,  1997, 11294,     2,   448, 44554,  3123, 20788,
-    1,    52, 24850,     2,   368, 34819,  2073, 37979,     1,  3482,
-57855,     1,  1425,  3049,     1,  2218, 55510,     2,  2318, 15723,
- 3163, 44945,     2,   851, 58597,  1570, 36070,     1,   125, 13698,
-    2,   277, 53997,  2369, 55031,     1,   582, 37910,     2,  2797,
-65354,  3070,  2453,     2,  2924,  9862,  2971,  5240,     3,   587,
-22080,  2663, 20467,  3826, 12015,     1,  4335, 28030,     2,   466,
-57619,  3890, 46154,     2,   376, 34969,  2030,  5353,     1,   377,
-34969,     1,   106, 21934,     1,  1638,  5258,     1,  2596, 22156,
-    1,  1985, 11349,     1,  3897, 33411,     2,  1715, 52977,  1764,
-29829,     1,  1000,  4783,     1,  3585, 49539,     1,  1377, 36198,
-    2,   242, 35245,  1875, 18852,     1,  3551, 35726,     2,   148,
-46517,  2817, 13198,     1,  1549, 20494,     3,   913, 53203,  2260,
-42382,  3811, 31469,     1,  1986, 24768,     5,   105, 15505,   225,
-44635,   470, 24345,   664, 19012,  2547, 47072,     1,  1831, 11004,
-    2,   313, 42146,  4333, 63423,     1,  1613, 40187,     1,  3574,
-22412,     2,   806, 44063,  3276, 42722,     1,   693, 12262,     1,
- 1199, 60025,     1,  1020, 44543,     1,  4378, 63644,     4,   586,
-28932,   756, 62878,  1759, 11073,  4403, 63644,     2,   940, 11950,
- 4428, 63644,     1,  4453, 63644,     3,   290, 10466,   631, 35285,
- 4478, 63644,     2,  3196, 36801,  4503, 63644,     3,  1904, 41086,
- 4528, 63644,  4579, 14274,     2,  4553, 63644,  4604, 14274,     3,
-  969, 49574,  2361, 40152,  4629, 14274,     1,  4654, 14274,     3,
- 2322, 24341,  3772, 21252,  4679, 14274,     1,  4704, 14274,     2,
-  349, 61257,  4729, 14274,     1,  3221, 40573,     1,  1788, 40209,
-    3,  1050, 52961,  1669, 15014,  3387, 40265,     1,  4387, 40309,
-    3,  2252, 60233,  2437, 54457,  4412, 40309,     2,  1062, 30366,
- 4437, 40309,     4,   610,  6544,  2245, 31976,  3169, 29647,  4462,
-40309,     3,  2736, 51298,  2811, 11901,  4487, 40309,     1,  4512,
-40309,     1,  4537, 40309,     2,  3427,  6339,  4562, 40309,     3,
- 1349, 52410,  2461, 63753,  2501,  5182,     1,  3329, 61675,     2,
- 1256, 55360,  1796, 59431,     2,  3134, 37852,  3248, 58724,     1,
- 3069, 29157,     3,   387, 32842,  1616, 30594,  2023, 14646,     1,
- 3848, 30918,     4,    76, 40351,  1441, 11656,  1662, 31564,  2459,
-21395,     1,  1580, 10672,     2,  3023, 17865,  3442, 63522,     1,
- 2363, 63959,     2,    27, 51816,  2771,  8159,     3,  1786, 44711,
- 2152, 43425,  2764, 51260,     2,  2755, 17997,  2786, 50244,     1,
- 1751, 47453,     3,   107, 43648,  1143,  8060,  3615,  8464,     1,
- 3319, 61344,     2,  1158, 49812,  4347, 37379,     2,   151, 41372,
- 1784, 47768,     1,   221, 56676,     1,  2029, 49744,     2,   964,
-48620,  2529, 19985,     1,  4359, 38867,     4,   945, 64135,  3137,
-18801,  3419, 63330,  3506, 28960,     1,  3764, 24133,     1,  2399,
-48575,     2,  1594, 62632,  3472, 58465,     2,  1811, 37210,  3171,
-51283,     1,  1631,  4237,     2,  2048,  1975,  3907, 14692,     1,
- 2408,  9769,     4,   319, 46683,   546, 57055,  2200, 11799,  3812,
-18875,     1,  2186, 15357,     1,  3226, 16660,     1,   930, 32652,
-    2,  1434, 40759,  3407, 64437,     1,  1016, 58285,     1,  3524,
-21862,     1,  2450, 30424,     1,  3467, 49193,     2,   523, 42162,
- 1951,   607,     1,  1620,  5955,     4,    70,  1636,  2248, 50620,
- 3262, 57409,  4355, 53994,     2,   505,   118,  2818, 50901,     1,
- 3570, 46929,     1,  2852, 65309,     1,   488, 61057,     1,  1449,
- 1171,     2,    26,  5383,  2330,  7959,     1,   867, 21498,     2,
- 1644, 57277,  3110,  8451,     2,   625, 13269,  4321, 37872,     2,
- 2872, 35422,  3520, 54517,     1,  4369, 35615,     4,   890, 48155,
- 1222, 32759,  3286, 49421,  4394, 35615,     3,  2328, 13492,  3679,
- 5811,  4419, 35615,     3,   190,  6787,  1709,  5438,  4444, 35615,
-    3,  1185, 61510,  4320, 51487,  4469, 35615,     2,   555,   745,
- 4494, 35615,     3,  1429, 64738,  3340,  3744,  4519, 35615,     2,
- 1236, 20482,  4544, 35615,     2,  1528, 19151,  2892, 46008,     3,
- 2136, 17998,  3102, 20331,  3475, 21491,     3,    83, 57075,   928,
-20964,  1407, 49831,     1,  2712, 20026,     2,   521, 42731,  2469,
-18144,     1,  3203, 16632,     1,   581, 10750,     2,   670, 13850,
- 3096, 17930,     2,  1436, 47159,  4134, 19574,     3,  2654, 19029,
- 4141,  8853,  4160, 19574,     3,  2649, 48192,  4167,  8853,  4186,
-19574,     2,  4193,  8853,  4212, 19574,     4,  2660, 40280,  2873,
-62710,  4219,  8853,  4238, 19574,     3,  3634, 57922,  4245,  8853,
- 4264, 19574,     4,  2329, 38658,  2466,  5225,  4271,  8853,  4290,
-19574,     1,  4297,  8853,     2,   637,  1484,   780, 25404,     1,
- 2947, 34695,     2,   205, 30501,  2155, 53707,     1,  2453, 39411,
-    1,  3663, 45485,     1,  2930, 43792,     3,   272, 60715,  2517,
-  704,  3818, 62351,     3,   639, 10801,  1217,   956,  2104, 26202,
-    1,  1412, 35738,     2,  2491, 12644,  3341, 30214,     1,  3593,
-55788,     1,   286, 42062,     1,  3519,  7245,     1,   253, 27183,
-    1,  2988,  4306,     2,    32, 11748,  4586,  6213,     4,   227,
-60963,   260, 22514,  4316, 16499,  4611,  6213,     1,  4636,  6213,
-    2,  2255, 50439,  4661,  6213,     2,  2432,   496,  4686,  6213,
-    2,  4584, 55488,  4711,  6213,     3,  2965, 62290,  4609, 55488,
- 4736,  6213,     4,   367, 26288,  3386, 27124,  3684, 30177,  4634,
-55488,     2,  1186, 12160,  4659, 55488,     1,  4684, 55488,     2,
-  828, 62131,  4709, 55488,     1,  4734, 55488,     1,  3431,  2540,
-    1,  1996, 59198,     1,  2334, 33068,     1,  2505, 58064,     3,
-  933, 60450,  1491, 24965,  3565, 46256,     1,  1605, 48656,     2,
- 1164, 41014,  2737, 35236,     1,  3851,  7127,     1,  1326, 34878,
-    2,  1524, 62471,  2064,  3340,     2,  1167,  9979,  1795, 40147,
-    3,  2053,  6420,  2060, 36952,  3861,  1318,     2,  3928,  1598,
- 4365, 44049,     2,  3954,  1598,  4390, 44049,     3,  2556, 35812,
- 3980,  1598,  4415, 44049,     3,  1200, 33016,  4006,  1598,  4440,
-44049,     4,  3209, 40839,  3623, 60753,  4032,  1598,  4465, 44049,
-    2,  4058,  1598,  4490, 44049,     3,  3381,  9286,  4084,  1598,
- 4515, 44049,     2,  4110,  1598,  4540, 44049,     1,  2549,  7571,
-    1,   635, 51295,     2,   821, 21991,  3505, 23956,     1,   567,
-29873,     1,  1065, 20705,     2,   757, 35182,  1515,  3029,     1,
-  214, 33622,     1,   280,  8435,     1,  2623, 15256,     1,  1288,
-61370,     3,   415,   451,  2731, 17439,  3116,  1336,     1,   429,
-60073,     3,   866, 48859,  1331, 18073,  3737, 13914,     1,   425,
-52993,     3,  2132, 30972,  3571,  8767,  3879, 53668,     1,  1292,
-32838,     1,   503,  8529,     1,  2968, 54845,     2,  1413, 25133,
- 3653, 18165,     1,   322, 16285,     1,   566, 51570,     1,   691,
-10546,     2,  1496, 40966,  3847, 27968,     2,  2144, 62063,  2966,
-49902,     2,   486, 17117,  4341, 14122,     1,   426, 54009,     1,
- 1133, 57083,     2,  2410, 25490,  2945, 33524,     3,  2740, 57773,
- 3176, 16073,  3498,  1675,     1,  1055, 24405,     1,    81,  4512,
-    1,  2224, 61099,     1,  2007, 48648,     1,  2015, 28022,     3,
-  697, 57038,  2494, 11168,  4752, 18451,     1,   879, 26484,     2,
- 1807, 49566,  2723, 47967,     1,   826, 47107,     2,  2880, 23041,
- 3923, 44013,     1,  1854, 39122,     1,  3292, 24815,     3,    49,
-44013,  3000,   865,  4314,  8579,     1,  2310, 51212,     2,  1627,
-23331,  3922, 47097,     1,  1131, 21696,     1,  3138, 55538,     2,
-  992, 39560,  3637, 23903,     2,  3545, 11038,  3726, 57499,     2,
-   64, 61386,  2605, 30329,     1,  2931, 14002,     1,  3005, 10990,
-    2,  3189, 44381,  3216, 57369,     1,  1630, 32276,     2,  3059,
-40523,  3692, 28681,     1,  4343, 63295,     4,   901, 32175,  1077,
-11499,  3412, 43920,  3659, 41356,     2,   961, 35237,  1464, 35329,
-    2,  2472, 11102,  4588, 29565,     3,   219, 33531,   808, 28695,
- 4613, 29565,     1,  4638, 29565,     2,  2347, 20620,  4663, 29565,
-    4,   650, 16712,   906, 59149,  1431, 19799,  4688, 29565,     1,
- 4713, 29565,     1,  4738, 29565,     1,   381, 38661,     1,  2506,
-25574,     1,  2470, 39468,     2,   435, 38215,  1318,  6328,     1,
-  436, 38215,     2,   694, 48994,  3759, 31034,     2,  2977, 54704,
- 3214, 33153,     1,  3717, 39102,     1,   988,  7490,     1,  1569,
-12537,     1,  3619, 21172,     2,  3152, 43431,  3553, 19782,     1,
-  335,   660,     2,    44, 18941,  1321, 48528,     2,  2061, 24192,
- 2707, 62543,     2,  1927, 22771,  2725, 62826,     1,  4751, 63261,
-    2,  2826,  4493,  3297, 56801,     2,   389, 58663,  2135, 53526,
-    3,  2468, 31092,  3097, 50456,  3434, 46868,     1,  4381, 54087,
-    2,  3346,  4813,  4406, 54087,     2,  2202, 19430,  4431, 54087,
-    3,   602, 54625,  1829, 62962,  4456, 54087,     1,  4481, 54087,
-    2,  1097, 44520,  4506, 54087,     2,  2100, 20703,  4531, 54087,
-    1,  4556, 54087,     1,   575, 37052,     1,  2172, 63035,     3,
-  728, 56350,  2158, 16029,  3050, 64340,     1,   191, 64246,     1,
-  208,   947,     1,  3296, 16378,     3,  1379,  5820,  2871, 15219,
- 3344, 57051,     3,   688, 52360,  1492, 54256,  3260, 12659,     3,
-  819, 61303,  2863, 58357,  3357, 30767,     2,  3239, 42053,  3800,
-42173,     1,  2959, 18330,     3,  1013, 62437,  1160, 52854,  2975,
-26311,     1,  3306, 28045,     1,  2983, 60301,     1,    34, 16521,
-    1,  2070, 34104,     2,  1975, 40343,  3546,  6774,     1,    98,
-41809,     1,  2214, 14867,     1,  2856, 43015,     2,   557,   392,
-  893, 65353,     2,  1458, 26142,  3363, 21101,     1,  2532, 43695,
-    1,   948, 33119,     2,   411, 17258,  3647,  7259,     2,   514,
-56684,  3741, 52237,     2,   974, 62521,  1842,  8355,     2,   989,
-30243,  2348, 58552,     1,   482, 43092,     2,  1169, 31419,  1949,
-31168,     2,   782, 43779,  3402, 45949,     1,  3773, 49823,     1,
-  506, 32106,     1,  2897, 54908,     2,  3261, 33551,  4140, 44372,
-    2,  3091, 47233,  4166, 44372,     2,  2929, 48061,  4192, 44372,
-    2,   803, 44420,  4218, 44372,     3,  1610, 45208,  2161, 22229,
- 4244, 44372,     2,  4270, 44372,  4589, 44243,     3,  1826, 11645,
- 4296, 44372,  4614, 44243,     3,  1924, 63733,  4138, 16876,  4639,
-44243,     2,  4164, 16876,  4664, 44243,     3,  3011, 41504,  4190,
-16876,  4689, 44243,     2,  4216, 16876,  4714, 44243,     4,  1192,
-17096,  4242, 16876,  4739, 44243,  4753, 51313,     2,   723, 22294,
- 4268, 16876,     2,  1140, 39748,  4294, 16876,     1,   207, 41678,
-    1,  3220, 23067,     1,  1400,  3379,     4,   672,  9740,  1012,
-54312,  2802, 11583,  3724, 18588,     2,    28, 41136,  3350, 49541,
-    1,  1993, 23463,     2,   656, 49969,  3349,   479,     1,  1005,
-57871,     2,   904, 59277,  3497, 12078,     1,   649, 49699,     1,
- 3813,  5384,     1,  1780, 18116,     1,  3723, 47543,     1,  3500,
-22952,     3,   816, 46352,  1634, 40460,  3941, 37180,     4,   422,
- 3078,  1190, 17926,  2828, 53502,  3967, 37180,     3,   299, 43279,
- 3765, 40077,  3993, 37180,     2,  2380, 48188,  4019, 37180,     1,
- 4045, 37180,     2,  3006, 47968,  4071, 37180,     1,  4097, 37180,
-    3,   304, 16849,  3844, 42853,  4123, 37180,     2,   413,  6949,
-  993, 41456,     2,   735, 42119,  3885, 32781,     1,  3949, 10640,
-    1,  3975, 10640,     2,    10, 51927,  4001, 10640,     1,  4027,
-10640,     1,  4053, 10640,     4,   730,  6196,  1142, 23817,  2891,
-37142,  4079, 10640,     3,  1258, 52357,  2169, 62694,  4105, 10640,
-    3,   308,  7681,  1188, 11060,  4131, 10640,     2,  1480, 53815,
- 1861, 33705,     1,  3339, 49832,     2,   317, 60940,  3103, 51409,
-    1,  2209, 20758,     1,  3718, 33192,     3,   172, 29426,  1688,
-19665,  2358, 15507,     1,  3608,  3155,     1,  3791, 21515,     1,
- 2282, 48303,     1,  3155, 59436,     2,  2626, 13322,  2661, 51090,
-    1,  2615, 50060,     1,  1234, 62045,     1,  2191, 25451,     1,
- 2498, 62992,     2,  2386, 20821,  2761, 48602,     1,  2002, 43530,
-    2,   653, 26886,  3107, 19847,     1,  1572, 21078,     1,  2373,
-51422,     1,   244, 17898,     1,  2331, 60067,     1,  2103, 39379,
-    1,  3104, 14149,     1,  2722, 41081,     2,   843, 58431,  1037,
-33602,     3,    96, 35667,  3614, 64701,  4319, 13541,     3,   181,
-61426,  2076, 53567,  3088, 55066,     1,  2360, 42968,     2,   495,
- 5180,  4755, 29595,     1,  3020, 23416,     1,  1066, 17931,     3,
- 2684, 34781,  3557, 31105,  3752, 53367,     2,  2078, 21521,  4386,
- 4160,     1,  4411,  4160,     2,  1264, 23981,  4436,  4160,     2,
- 3014, 62178,  4461,  4160,     2,  3729, 43162,  4486,  4160,     1,
- 4511,  4160,     3,    22, 30305,   270,  4714,  4536,  4160,     2,
- 2036, 21557,  4561,  4160,     1,   513, 57802,     1,  3316, 38423,
-    1,   418, 62774,     1,  2806, 38592,     2,  1260, 24514,  2952,
-31076,     1,  3721, 34297,     2,  1856, 32844,  3145,  9366,     2,
- 1070, 24098,  3655,  6955,     1,  3280,  5017,     2,  1308,  9759,
- 1737, 23906,     1,  1388, 37159,     1,  1002, 30297,     1,  3597,
-15725,     2,   966, 60439,  1897, 59055,     3,   995, 17639,  1282,
- 5170,  3763,  6314,     1,  2145, 50338,     1,   289, 15516,     1,
- 1521,  1108,     2,  2998,  8280,  3657, 30530,     1,  2287, 57538,
-    1,  3449, 56945,     1,  4346, 23011,     3,  1280, 17261,  1540,
- 7350,  3433, 42800,     1,   529, 11593,     1,   690, 49169,     1,
-  741, 55151,     1,  3865, 51077,     1,  2443, 56461,     3,  2444,
-59961,  2981, 45482,  3444, 59598,     1,  3064, 27091,     1,  2021,
-46461,     2,  1702, 16628,  2679, 47047,     1,  1962, 23929,     2,
-  141, 36340,  3696, 26517,     1,   157, 50018,     1,  3625, 50158,
-    2,   665, 26601,  1750,   962,     1,  2455, 58356,     1,  2024,
-17603,     2,  2188, 37723,  2997,  4378,     1,  1338,  8838,     1,
- 1345, 64024,     2,  3406, 43043,  4334, 49101,     1,  2682, 57856,
-    2,   563, 30775,  2306, 32501,     2,  1042,  5824,  2393, 13945,
-    1,  3463, 27184,     1,  1938,  5625,     2,   849,  2405,  2631,
-21960,     1,  3558, 31960,     2,  1214, 27858,  3477, 54611,     2,
-   92, 15170,  1127,  5121,     1,   831,  4397,     2,  1287,  3195,
- 3353, 17244,     1,  3710, 57985,     2,  2738, 49754,  3327, 31960,
-    1,  1178, 61958,     1,  4382, 13759,     3,  2111, 58474,  3703,
-42484,  4407, 13759,     1,  4432, 13759,     7,   276, 49585,   889,
-50028,  1210, 31055,  2033, 32528,  2765, 41529,  3314, 65008,  4457,
-13759,     1,  4482, 13759,     2,   743, 65127,  4507, 13759,     2,
- 4532, 13759,  4583, 29925,     5,  2309,  4426,  2957, 39349,  3075,
- 9913,  4557, 13759,  4608, 29925,     2,  3351, 21817,  4633, 29925,
-    2,  3526, 52684,  4658, 29925,     1,  4683, 29925,     2,  1545,
-55409,  4708, 29925,     3,  2413,   390,  3671, 39266,  4733, 29925,
-    2,    15, 65322,  2735, 47992,     2,   585, 49021,  1860, 40744,
-    1,  1289, 25536,     1,  1755, 14257,     1,  1607, 44004,     1,
- 1255, 30834,     1,  4356, 61217,     1,   232, 28572,     2,  2253,
-41222,  3915, 17014,     1,   601, 63102,     1,  1141, 37611,     2,
- 2364, 34094,  3563, 61119,     2,  1708, 59664,  2676, 18123,     2,
- 2194, 27442,  2790,  9012,     2,   525,  5251,  2247, 36394,     1,
- 3887, 37965,     3,   119,  3800,  1837,  9998,  2785,  2131,     3,
-  386, 19569,  2066, 19418,  2624, 33378,     1,  3430, 57893,     2,
- 1394, 32794,  3715, 12861,     2,   316,  9922,  2680, 25878,     3,
- 1876, 12806,  2882, 38052,  2962, 42347,     1,  2658, 53577,     2,
-  905, 34466,  1559, 64468,     1,  2807, 52650,     1,  3049, 47232,
-    2,  1535, 26817,  3279, 43442,     1,  2296, 59609,     2,  2093,
-32194,  3884, 59602,     1,  1531, 45935,     3,   619, 29460,  1777,
-54797,  2972,  8980,     1,  1246, 62491,     3,   549, 12151,  2382,
-37452,  3880, 57494,     2,  1244, 12046,  2343, 18752,     1,  2861,
-18908,     1,   161,  4772,     1,  3016, 40440,     1,  2246, 49495,
-    1,  1995, 20454,     2,  1739, 24572,  3527,  5370,     1,  3683,
-25303,     1,   883, 31306,     2,   531, 49273,   758, 27881,     2,
- 1568,  2987,  2502, 59811,     1,  1758, 31647,     1,  3948, 46876,
-    1,  3974, 46876,     1,  4000, 46876,     2,  2308,  7662,  4026,
-46876,     1,  4052, 46876,     1,  4078, 46876,     1,  4104, 46876,
-    1,  4130, 46876,     1,  2921, 58873,     2,  3201, 42687,  3578,
-20277,     2,   770, 46069,  3673, 23342,     2,   771, 46069,  2428,
-26515,     1,  2837, 16517,     1,  3264, 27973,     1,  1495, 13664,
-    3,   847, 33602,  1024,  4170,  2350, 48923,     1,  2396, 49392,
-    1,  1113, 39442,     1,  3136, 29597,     2,   522,  4069,  1462,
-15255,     1,  1979, 58319,     3,   833, 36113,  1427,  7485,  3039,
-29090,     2,  1907, 17612,  3510,  3241,     1,  2125, 60525,     1,
- 2652, 31799,     1,  1240, 37783,     2,   721, 56284,  1598, 28849,
-    2,  1863, 31376,  4362, 42926,     1,  3875, 39577,     2,   668,
-52322,  2109, 25355,     1,  4154, 14108,     2,  1368, 31932,  4180,
-14108,     5,  2840, 24587,  3321,  4682,  3902, 39767,  4206, 14108,
- 4340, 21194,     1,  4232, 14108,     2,  3650, 43416,  4258, 14108,
-    1,  4284, 14108,     1,  4310, 14108,     1,  1793, 14863,     2,
- 1971,  2318,  3062, 28190,     3,   982, 33526,  1772, 26397,  2394,
-19548,     1,   226, 20005,     1,  3058, 20633,     1,  3550, 41812,
-    1,    31,  5027,     2,   245, 23803,  1329, 35085,     1,  1103,
-53733,     1,  3639, 34093,     1,  2994, 14618,     1,  2085, 18626,
-    2,  1211, 23388,  2648, 11862,     1,  1319, 51926,     2,    36,
-25674,  2043, 34040,     1,  1067, 58455,     2,  1011, 26460,  1687,
- 9859,     3,   997,   179,  3021, 39969,  3391, 52683,     2,   121,
- 9955,  1235, 47114,     3,  2114, 14279,  2573, 27085,  3562, 50115,
-    1,  1551, 47881,     1,  1313,  3533,     1,  1812, 18793,     1,
- 3849, 30395,     2,  1041, 11205,  1665, 41251,     1,  3908, 15813,
-    3,   863, 29737,   973, 31721,  3077, 17977,     1,   630, 65267,
-    1,  3317, 36459,     1,  1146, 11917,     3,   152, 24762,  3026,
- 3413,  3577, 24043,     1,  2632,  6414,     1,  2877, 53266,     2,
- 3268, 37320,  4137,  1877,     2,  2922, 42463,  4163,  1877,     1,
- 4189,  1877,     3,   493, 25426,  2721, 49440,  4215,  1877,     2,
- 2850, 37379,  4241,  1877,     1,  4267,  1877,     4,  2422, 41178,
- 2800, 54304,  3441, 61149,  4293,  1877,     1,  3924, 12838,     1,
- 3950, 12838,     2,  3490, 46308,  3976, 12838,     3,  1033, 19397,
- 3259,  3829,  4002, 12838,     3,  1719, 24609,  3713, 39562,  4028,
-12838,     1,  4054, 12838,     3,   814,  3205,  2249, 22686,  4080,
-12838,     1,  4106, 12838,     1,  2427, 48658,     1,  3845, 42660,
-    3,   674, 38769,  1663,  8837,  3742, 31967,     2,  2537, 62005,
- 3423,  1008,     3,   182, 54398,   775, 15977,  3186, 42346,     1,
- 3944, 35064,     2,  3451, 51635,  3970, 35064,     2,  1900, 44383,
- 3996, 35064,     2,  3786,  5708,  4022, 35064,     2,  3484,  4875,
- 4048, 35064,     1,  4074, 35064,     4,   372, 44464,  1014, 30817,
- 1558, 26715,  4100, 35064,     2,  3425, 32125,  4126, 35064,     1,
- 3586, 50276,     1,  1578, 32517,     1,  1914, 24663,     1,  1798,
-30693,     1,  2175, 36578,     1,   761, 27140,     1,  2242, 53755,
-    2,    39, 13658,  2203, 38732,     1,  1713,  6881,     1,   909,
-16279,     1,  2232, 64670,     2,  1498, 35223,  3689,  4825,     1,
- 1224, 59741,     1,  3294, 20097,     3,   327, 47051,  3466, 13993,
- 3743, 52384,     3,  1980,  2730,  2336, 29641,  3393, 29959,     4,
- 1060,  6400,  3042, 32118,  3739, 44824,  3840, 64213,     1,   944,
- 5142,     1,  2515, 50821,     1,  3926, 30382,     1,  3952, 30382,
-    1,  3978, 30382,     2,  2340, 51994,  4004, 30382,     3,   937,
-15790,  1994,  2381,  4030, 30382,     2,   778, 48558,  4056, 30382,
-    3,   428,  1529,   975, 29729,  4082, 30382,     2,  1373, 54466,
- 4108, 30382,     1,   897, 26208,     1,  3699,  8168,     5,   960,
-48030,  1396, 23865,  2566, 20151,  3231, 62713,  3405, 51729,     1,
-  908, 63499,     1,  2550,  4179,     2,   140, 30206,  2576, 14516,
-    1,   248, 18700,     1,  1123, 50097,     1,   830, 52419,     2,
-  114, 20773,  2708, 23925,     1,  3037,  1662,     1,  3315, 59621,
-    1,  3548, 12017,     1,  3891, 26247,     2,  2035,  4474,  2195,
-24421,     1,  3589, 32402,     1,  1514, 29647,     2,  1059, 20609,
- 2327, 62876,     3,   962, 36969,  1125, 50983,  4754, 39848,     1,
- 3528, 18623,     1,  2919, 15195,     2,   527, 40520,   996, 19247,
-    2,  3352, 23829,  3512, 34823,     1,   405, 37776,     2,  1410,
-33231,  1707, 55360,     1,  2656, 58942,     3,   594, 36433,  2686,
-41475,  3361, 57855,     2,   971, 24798,  3002, 64212,     1,   872,
-27480,     3,   158,  5157,  2295,  9479,  2302, 63466,     2,  1469,
-48703,  1932, 29966,     1,  1195, 50814,     2,  1284, 56536,  2915,
-31521,     5,   946, 27979,  1588, 51913,  2542, 10878,  2920,  4391,
- 3809, 42803,     1,  2283, 27978,     2,  1445, 59258,  1749, 13700,
-    4,  1536, 25960,  1656,  2745,  3324, 19484,  3947, 51942,     3,
- 2518, 17510,  2843, 47738,  3973, 51942,     1,  3999, 51942,     3,
- 1541, 16272,  1827, 51384,  4025, 51942,     2,  1272,   392,  4051,
-51942,     2,  1171, 36135,  4077, 51942,     1,  4103, 51942,     2,
- 1671, 41022,  4129, 51942,     1,  1731, 42610,     1,   476, 31758,
-    1,  2878, 29425,     1,   379, 29798,     1,   380, 29798,     1,
-  537, 24099,     1,   657, 22542,     1,   716, 60765,     2,  1226,
-20330,  2565, 23007,     2,  1261, 62318,  3537,  9391,     1,  3295,
-35288,     2,  1301, 60893,  2590, 25793,     1,  3065, 12412,     1,
- 1390,  5536,     1,  3776, 57729,     1,   859, 53689,     4,  1422,
-52188,  3514, 50995,  3843,  5886,  4364, 59438,     2,   401, 15402,
- 2065, 24950,     1,  1838, 36530,     1,  2075, 43858,     1,  3627,
-27406,     1,  2939,  5419,     1,   548, 31503,     1,  3323, 60703,
-    1,  3178,  2048,     3,   252, 61166,  1822, 12252,  1959, 34645,
-    1,  1867, 21699,     5,   616, 28300,  1529, 56155,  1670, 53142,
- 3060,  4952,  4379, 42137,     2,   259,  8450,  4404, 42137,     3,
-  356,  8874,  3085, 55420,  4429, 42137,     1,  4454, 42137,     1,
- 4479, 42137,     2,   678, 43855,  4504, 42137,     2,  2221, 35584,
- 4529, 42137,     1,  4554, 42137,     1,  1096, 37347,     2,    99,
- 6073,  3712, 25552,     1,  2171,  7210,     1,  2445,  3068,     1,
- 3012, 57393,     4,    91, 65064,  1889,   136,  2471,  9650,  3017,
- 6668,     1,   408, 47761,     1,   237, 49357,     1,   409, 47761,
-    1,  2633, 27868,     2,  1193, 59069,  3291, 30062,     1,  3591,
-49992,     2,  2808, 49346,  3866, 10948,     1,  3377, 41907,     1,
- 1733, 42985,     1,  3761, 60345,     1,  2207, 29888,     4,   163,
-10120,   766, 10258,  1664, 49691,  1845, 53209,     2,   633, 14413,
- 1109, 10714,     3,  1039,  8618,  1493, 19161,  3384, 40520,     3,
-  162, 20527,  4147, 20195,  4348,  9757,     3,  2585, 38715,  2646,
-20133,  4173, 20195,     2,   433,  6221,  4199, 20195,     4,  1676,
-43858,  3779, 13668,  3871, 26949,  4225, 20195,     1,  4251, 20195,
-    1,  4277, 20195,     2,   496,  9457,  4303, 20195,     3,   573,
-20884,  2052,  3779,  3666,  6456,     1,  2108, 61894,     1,  2881,
-43137,     1,   321, 38115,     3,  1397, 23873,  2454, 24854,  3631,
- 3963,     3,  2355, 33033,  2441, 39857,  2481, 11642,     1,   153,
- 7834,     3,   149, 31091,   416, 59886,  1879, 33259,     1,  1474,
-54252,     2,  1299, 32066,  3829, 51343,     1,  1463, 24348,     1,
- 1432, 59923,     2,   767, 10258,  2611, 46497,     1,  2148, 62516,
-    1,  3473,  3384,     1,   351, 10684,     2,  2589, 13392,  3828,
-54007,     1,  1047, 17711,     1,  2460,  1724,     1,  1168, 51802,
-    1,  3311, 22099,     1,  1364, 47398,     1,  1276, 27884,     2,
- 1215, 39103,  1504, 57292,     1,  2588, 20135,     1,   118,  2050,
-    2,   179, 60554,  2256, 53036,     1,    77, 36166,     3,  1399,
-38680,  2196, 11736,  3561, 35356,     2,  2819, 16483,  3474, 57055,
-    1,  2995, 14218,     1,  2644,  5984,     1,  3462, 58445,     1,
- 1348, 49698,     2,  1046, 24723,  1499, 41600,     2,  2525, 48096,
- 3837,  1715,     2,  1203, 58624,  1508, 59085,     3,  2522, 36867,
- 2898, 26024,  3910, 13884,     2,  1360, 36993,  4144, 46721,     2,
- 1078, 56720,  4170, 46721,     4,  1119, 50235,  1512, 12322,  3864,
-11151,  4196, 46721,     2,  1790,  6474,  4222, 46721,     3,   455,
-63297,  1130, 13153,  4248, 46721,     2,   892, 53527,  4274, 46721,
-    4,   671, 52348,  1489, 38807,  2079, 49999,  4300, 46721,     3,
- 1330, 59133,  2895, 16451,  3857, 10640,     2,  3158, 52617,  4372,
-53860,     3,  2638, 34649,  2789, 32011,  4397, 53860,     3,     9,
-28902,   477, 19875,  4422, 53860,     2,  2213, 57095,  4447, 53860,
-    6,   471, 25423,  1668, 52305,  1887, 55045,  2703, 26425,  2902,
-31483,  4472, 53860,     2,  2225, 36037,  4497, 53860,     2,  2402,
-23314,  4522, 53860,     1,  4547, 53860,     2,  1502, 11857,  2153,
- 7784,     1,  1433, 20669,     1,  2133, 58793,     1,  3784, 53208,
-    1,  1418, 39563,     1,   168,  2601,     1,  1277, 26968,     1,
-  266, 31308,     1,   203,  3502,     1,    89, 15725,     1,  3205,
- 2127,     1,  1101, 36073,     3,  3177, 22486,  3302, 47886,  3868,
-42143,     1,    41, 20221,     2,   459, 28331,  3370, 20531,     1,
-  681, 33156,     2,   941, 43496,  2269, 50119,     3,   288, 39597,
- 1238, 36400,  3900, 12836,     1,  3378,  9231,     1,  3921, 57180,
-    3,  1577, 32355,  1658, 10686,  3485, 46492,     3,  1281, 61757,
- 1901, 36078,  3304, 63075,     1,  2467, 11960,     1,  1337,  3618,
-    2,   297, 48827,  3638, 17262,     2,   772, 15241,  1769,  6388,
-    1,   773, 15241,     2,   143,  5275,  2643, 56998,     1,   685,
-60130,     1,  2642, 26508,     1,   394,  3140,     1,  3277, 32477,
-    1,   558, 31638,     1,  3833, 32360,     2,  1334, 51849,  3215,
-13877,     1,  1353, 55141,     1,  1724, 63757,     4,   705, 30736,
- 1134, 41014,  2489,  6788,  4373, 59846,     3,  2742, 49033,  2798,
-57580,  4398, 59846,     1,  4423, 59846,     2,  2769, 64351,  4448,
-59846,     2,   502, 57537,  4473, 59846,     1,  4498, 59846,     4,
- 2634, 18709,  2729, 11069,  3347, 50761,  4523, 59846,     2,   936,
-57375,  4548, 59846,     1,  2514, 30964,     1,   320, 57334,     1,
- 3770,  9021,     1,   560, 26692,     1,  1952, 19807,     1,   745,
-28596,     1,  2667, 26857,     1,  2400, 10784,     1,  2423, 21224,
-    3,   512, 53587,  1557, 31890,  2228,  1271,     2,  1290, 10930,
- 3606,  8184,     1,  4368, 57122,     2,  3004, 39258,  4393, 57122,
-    1,  4418, 57122,     3,  1157, 53342,  1821, 10185,  4443, 57122,
-    2,  1191, 41828,  4468, 57122,     3,   898, 12281,  3601, 33611,
- 4493, 57122,     1,  4518, 57122,     2,   128, 56913,  4543, 57122,
-    2,  2430, 62235,  3032, 12882,     2,  1727, 31502,  1878,  5594,
-    2,  2118, 31234,  2435, 41423,     2,   953,  3589,  3598, 16048,
-    1,   318, 52106,     3,   325,  9807,  1339, 13503,  3373, 36393,
-    1,   541,  5041,     1,   234,  4278,     1,  3552,  4983,     2,
-  896, 38965,  2553, 13356,     3,   229, 11602,  1447, 50802,  3794,
-37975,     2,  2140, 51264,  3895,   857,     1,  2088, 30205,     1,
- 2704, 56181,     1,   264, 21533,     1,   888, 31853,     3,   877,
- 9771,  1903,  4572,  3092, 50618,     3,  2117, 11622,  3056, 23665,
- 3338, 57577,     1,  1851, 10841,     1,   858, 23387,     1,   210,
-40461,     2,  3007, 26170,  4353, 43633,     3,  1652, 24854,  2267,
-39677,  2493, 49243,     1,  3265, 39960,     2,  1471, 31297,  3030,
-31235,     1,    82, 11735,     2,    12, 58971,  3149, 59089,     1,
-  524, 55999,     2,   393, 61013,  1286, 57216,     1,  2893,  1881,
-    1,   509,  4316,     1,    60, 52612,     2,  1711, 23585,  1978,
-52044,     1,  2409, 50726,     1,  2054,  1513,     3,  2574, 50022,
- 2743, 57757,  3041,   980,     2,  1001, 45832,  1465, 62842,     1,
-  102, 22765,     1,  3808, 59991,     2,  1342, 58633,  3414,  9578,
-    2,    95, 22961,   873, 32809,     1,   916, 44751,     1,   970,
-49024,     2,   611, 30732,  1868, 16694,     1,   796, 65131,     1,
- 2804, 53992,     1,  1270, 42453,     1,  2419, 37491,     2,  1533,
-51925,  2582, 54304,     1,  1478, 26319,     1,  1818, 10573,     1,
- 2612, 23628,     1,  1973, 19350,     1,  3913,   620,     2,  2538,
- 6259,  3459, 36681,     1,   727, 37900,     1,  3874,  8122,     3,
-  565, 27047,  2012, 14524,  2210, 50411,     1,   848,  8618,     1,
-  230,   928,     3,    38, 17788,  1653, 51034,  2561, 36875,     2,
-  935, 40317,  1079,  7911,     1,  1406, 31032,     3,  2597, 24984,
- 2964, 16021,  3749, 35964,     2,   194, 64022,  1853, 53812,     1,
- 2783, 21123,     2,   454, 24026,  1510, 61935,     1,  3581, 53203,
-    2,    69, 11652,  2885,  7687,     1,  2160, 33613,     2,  1207,
-34431,  2516, 21740,     2,   740, 64043,  1073, 60546,     1,  2226,
-14619,     1,  1423, 14230,     2,  3187, 33269,  3382, 51360,     1,
- 3624, 17353,     2,   281,  8393,  3872, 55224,     1,   192, 46716,
-    4,   314, 36554,   914, 41352,  1579, 33615,  2087, 50574,     2,
- 1518,  1474,  2985,  6226,     1,  3594, 43604,     1,  3858, 10627,
-    1,  1320, 42985,     1,  3257, 33401,     2,   592, 55163,   918,
-23624,     1,  3569,  7373,     2,  1984, 55571,  3218, 41015,     2,
- 3538, 51428,  3825, 51563,     1,  3535, 42312,     1,  2063, 39305,
-    1,  4367, 42399,     1,  4392, 42399,     1,  4417, 42399,     1,
- 4442, 42399,     2,  3461, 32507,  4467, 42399,     3,  1315, 23932,
- 3436, 37659,  4492, 42399,     1,  4517, 42399,     2,  1128, 56194,
- 4542, 42399,     1,   920, 15950,     1,  3454, 28137,     1,  1048,
-28256,     1,   695, 32344,     1,  2005, 15310,     2,  1922, 59925,
- 2362, 51881,     1,  3376,  9180,     1,  2205,  4121,     2,  2862,
-45394,  3287, 18597,     1,  2603, 64212,     2,  2006, 50078,  3633,
- 6837,     2,  3052, 10667,  3701, 65531,     3,  1367, 56372,  2782,
- 2382,  3086, 38498,     1,  1843, 28876,     1,  2456, 56453,     1,
- 3098, 29119,     3,   130, 44684,  1753, 58199,  3566, 22990,     3,
- 2677, 34179,  2717, 49025,  3217,  2398,     3,  2014, 54240,  2184,
-25526,  4384, 37428,     1,  4409, 37428,     2,  2894, 55182,  4434,
-37428,     1,  4459, 37428,     2,  3082, 21145,  4484, 37428,     3,
-  279, 34671,  3539, 19948,  4509, 37428,     1,  4534, 37428,     4,
- 2591, 46305,  3389, 61106,  3930, 34272,  4559, 37428,     2,   535,
-27881,  3956, 34272,     4,     5, 24899,   662, 36623,  3982, 34272,
- 4361, 55732,     1,  4008, 34272,     5,  1179, 37500,  3491,  8366,
- 3694,  6842,  3775, 17221,  4034, 34272,     3,   870, 64033,  1626,
-64522,  4060, 34272,     2,  2858, 56536,  4086, 34272,     1,  4112,
-34272,     2,  1314, 65066,  3785, 29407,     1,  3284, 14515,     1,
- 3873, 53767,     1,  3604,  8243,     1,   797, 48068,     1,   815,
- 6670,     1,  1242, 44690,     3,   543, 24673,  1312, 57657,  3939,
-20471,     2,   407, 60390,  3965, 20471,     2,  3448, 28711,  3991,
-20471,     1,  4017, 20471,     1,  4043, 20471,     1,  4069, 20471,
-    1,  4095, 20471,     1,  4121, 20471,     1,  1700, 28257,     4,
-  209, 64296,  1554, 17244,  2483,  2099,  2619,  3496,     1,  2510,
-26913,     1,   759, 22224,     1,  3705, 55000,     1,  3691, 33537,
-    2,  3105, 64168,  3760, 16012,     2,   706, 19661,  2690, 21454,
-    1,   124, 60087,     1,  3530, 49194,     3,   267, 59165,  2899,
-52867,  3720, 38568,     3,  1204, 42832,  1752, 29140,  1930, 23040,
-    1,   187, 19872,     1,  1612, 43949,     1,  3483, 43460,     1,
-  355, 40472,     2,    55, 60951,  1187,  1772,     2,   534,  2584,
-  561, 20723,     2,   751, 13656,  1311, 31204,     3,   606, 13471,
- 2592, 43395,  3114, 15598,     3,  1815, 59009,  2317, 42204,  3636,
-23431,     1,   799, 64927,     1,  2577, 11745,     1,   465, 14479,
-    1,  4570, 47091,     2,  1848, 36094,  4595, 47091,     3,  1785,
-52412,  2044, 24497,  4620, 47091,     3,  1027, 53982,  2263, 64607,
- 4645, 47091,     1,  4670, 47091,     1,  4695, 47091,     3,  2143,
-47234,  2150, 45452,  4720, 47091,     1,  3790, 56320,     1,  2923,
-28235,     1,  2001, 27398,     1,   507, 38521,     2,  2809, 18812,
- 3181, 51992,     2,  2452,  2219,  2775, 44084,     1,  2211,   354,
-    1,   839, 43854,     3,   840, 35849,  1604, 61825,  2451, 38211,
-    1,  2243, 17863,     1,  3607, 65176,     2,   441,  8791,  3057,
-15298,     3,   442,  8791,   659,  2864,  2378, 50537,     1,  4146,
-23087,     2,  2531, 62926,  4172, 23087,     2,  3722, 15305,  4198,
-23087,     5,   184, 50447,  1380, 16592,  1457, 35413,  3518, 56124,
- 4224, 23087,     1,  4250, 23087,     4,   202,  4871,   220, 34671,
- 2190, 24415,  4276, 23087,     2,  1166, 34981,  4302, 23087,     4,
-  338, 39877,  1486, 56993,  2182, 14258,  3839, 13480,     3,  2335,
-36765,  2940, 13730,  3660, 53648,     1,  2178,  8331,     2,   358,
-41233,  2278, 33524,     1,  3805,  3585,     1,  1477, 30239,     2,
-  651, 63901,  1636, 48256,     1,  1647, 47250,     2,   292, 54392,
- 2637, 14110,     1,   499, 23819,     1,  1877, 40475,     1,  1956,
-19570,     1,  3246, 22053,     2,   211, 53242,  1666,  3958,     3,
- 2094,  4655,  3348, 32352,  3360, 49972,     1,  2040, 13421,     1,
- 2449, 22471,     1,  2500, 50124,     1,   734, 22068,     1,  1964,
-22476,     1,   434,  8886,     1,  1472, 10110,     1,  2478, 40983,
-    1,  2071, 61262,     1,  3755,  3921,     1,  3886, 16949,     1,
- 2699, 40615,     1,  1717, 41960,     1,  3048, 47038,     1,   661,
- 9667,     2,   794, 52415,  2949, 49767,     1,  4354, 17164,     2,
- 2463, 43056,  3249, 36085,     1,  2359, 37590,     1,   764, 49235,
-    1,  3801, 29943,     1,  1915,  4261,     2,  1147, 59313,  2084,
- 5725,     2,    25, 18807,  1566, 24059,     1,  2223, 20291,     1,
- 2559, 46502,     1,   216, 25805,     1,  3810, 20481,     4,  1555,
-49315,  1654, 50003,  2208, 59103,  3368, 25738,     1,  2333, 39134,
-    1,  1112, 62960,     1,  1775, 29133,     2,  2092, 36075,  2767,
-57674,     1,  1683, 14532,     2,  2980, 24570,  3702, 31336,     2,
- 1608, 36844,  2647, 37532,     1,  3285,  3472,     1,  1100, 51830,
-    1,  1871, 60427,     1,  2281, 45766,     1,  1615, 24763,     3,
-  467, 46733,  1004, 47568,  3502, 30027,     4,   556, 62726,  1230,
-65304,  3031, 23608,  3782, 62771,     1,   542, 53647,     2,   765,
-49235,  2799, 34314,     1,  2752, 32903,     2,  2567, 64671,  3478,
-28997,     1,  1265, 13141,     2,  3511, 42598,  3680, 53867,     1,
- 1251, 45574,     1,  3646, 62391,     1,  1419, 18132,     3,  1581,
-54126,  2272, 20521,  2914, 12816,     1,   569,  7601,     1,  2527,
-40420,     1,  2492, 11625,     1,   166, 49484,     1,  1361,  5774,
-    1,  2010, 55961,     1,   437, 45567,     1,  2536, 15232,     1,
- 4376, 43632,     2,  2259, 56853,  4401, 43632,     1,  4426, 43632,
-    1,  4451, 43632,     2,  3450,  8172,  4476, 43632,     1,  4501,
-43632,     1,  4526, 43632,     4,  1448,  3086,  1802, 46396,  3390,
- 2208,  4551, 43632,     1,  3605,  5622,     1,  3300, 15334,     1,
- 4349, 56406,     1,  3931, 43911,     1,  3957, 43911,     2,  2650,
-37849,  3983, 43911,     2,  1617, 21082,  4009, 43911,     1,  4035,
-43911,     5,   501, 45970,  1547, 42678,  2199, 63519,  4061, 43911,
- 4338, 11743,     2,  2385, 32593,  4087, 43911,     2,  2674, 48952,
- 4113, 43911,     1,   910, 59441,     1,  4577, 46703,     3,  1542,
-12478,  3270,  8213,  4602, 46703,     1,  4627, 46703,     3,  2341,
-15183,  3365, 63297,  4652, 46703,     2,  2097, 43585,  4677, 46703,
-    1,  4702, 46703,     1,  4727, 46703,     1,  3860, 57715,     3,
-  342, 20679,  2314, 33576,  3229,  3467,     2,   111, 54960,  2601,
-62908,     1,   261,  6342,     2,  1705, 53020,  3236, 48673,     2,
- 1538, 60837,  3789, 16512,     1,  3658, 64254,     1,   959, 54540,
-    2,   370, 54753,  3507, 15348,     1,  3029,  3189,     1,  3471,
-54059,     2,  1220,  6973,  1539, 36791,     1,   265,  4190,     2,
-  223, 30590,  1633, 53383,     2,  2239, 28218,  3420, 50461,     1,
- 1488,  1052,     1,  2479, 17624,     2,  2796, 39993,  3040, 21416,
-    1,  2059,  3982,     2,  1038, 23685,  2081, 37318,     1,  1847,
-51662,     2,  2165, 18365,  3559, 45267,     2,  1081,  5993,  3143,
-27723,     2,   795, 64545,  1354, 59884,     2,  2116,  4429,  2297,
-28932,     2,  2055, 51623,  2687, 41613,     2,   339, 46067,  3669,
-38424,     3,  3272, 46717,  3288, 47873,  3424,   571,     1,  3175,
-45099,     1,  3896, 48116,     2,   180, 54947,  1316,  8609,     1,
- 4574, 19359,     1,  4599, 19359,     4,   293, 58227,   395, 41629,
- 1685, 44342,  4624, 19359,     1,  4649, 19359,     2,  1090, 13084,
- 4674, 19359,     1,  4699, 19359,     1,  4724, 19359,     1,   832,
- 7104,     2,   146, 11387,  1139, 38977,     2,  1765, 64539,  3010,
-26205,     2,  3192, 29903,  3787, 10989,     1,  1814, 14115,     4,
-  382, 55682,  1366,  8221,  1446,  1228,  3942,  5895,     2,  2713,
-51250,  3968,  5895,     4,  1159, 19448,  2357,  2549,  3630, 48663,
- 3994,  5895,     3,  1247, 44293,  3045, 30856,  4020,  5895,     4,
-  868, 22696,  2130, 59669,  3769, 62955,  4046,  5895,     3,  1761,
-32873,  3394, 38573,  4072,  5895,     3,   576, 33697,  3240, 31260,
- 4098,  5895,     2,  3748, 58342,  4124,  5895,     1,  2875, 50664,
-    1,   715,  4606,     2,  2289, 31310,  3945, 41419,     1,  3971,
-41419,     1,  3997, 41419,     2,  3396,  6371,  4023, 41419,     2,
- 1725, 36994,  4049, 41419,     3,  1690, 42748,  4075, 41419,  4371,
-38472,     3,  2235, 36207,  4101, 41419,  4396, 38472,     4,  2004,
-16531,  2137, 61512,  4127, 41419,  4421, 38472,     2,  1582, 56096,
- 4446, 38472,     3,     1, 48137,  1075, 17590,  4471, 38472,     1,
- 4496, 38472,     3,   683, 40683,  1767, 36736,  4521, 38472,     1,
- 4546, 38472,     2,  1905,  5907,  3590, 62772,     1,    47, 25514,
-    2,  1632, 14334,  2614, 24053,     3,  1490, 15230,  2887,  1967,
- 3731, 17587,     1,  2636, 24361,     4,     7,  1918,   398, 26948,
- 1714, 47858,  2562, 22177,     2,  2292, 46868,  3197, 18200,     2,
- 1121, 23196,  2389,  5117,     2,    66, 38570,  3487, 36425,     3,
- 2026, 17416,  2082, 31153,  2580, 44582,     2,  1296, 60614,  3335,
-41952,     1,  3124, 45766,     1,  1983, 25273,     2,   122, 13428,
- 3343,  7944,     1,   660, 55786,     1,  3687, 65124,     1,  2539,
-33764,     2,  1414,  5512,  1880, 28055,     1,  3055, 12440,     2,
- 2688,  2740,  3142, 54903,     1,  2770, 25562,     2,  2776, 26745,
- 3867, 30115,     1,   885, 48012,     1,  3053, 43448,     2,   494,
-45886,   583, 27797,     1,   115, 48129,     1,  3549, 27910,     1,
- 1035, 56754,     2,  1372, 16267,  1609, 33506,     1,  1804, 11591,
-    1,  3730, 30091,     1,   692, 21547,     2,   269, 53389,  2673,
- 2142,     1,   201, 19254,     3,   103, 53695,  1649, 30262,  1886,
- 6857,     2,   952, 49113,  1694,  3456,     1,  1507, 55988,     2,
- 1051,  8822,  1442, 62300,     1,  3033,  3580,     2,  1173,  4965,
- 3440, 37110,     1,  1645, 24550,     1,  2978, 40700,     1,  2420,
-30490,     1,  3200, 18573,     1,  2618, 36062,     1,   680, 40123,
-    1,  3001, 26117,     2,  3446, 18216,  3632, 42809,     1,  3881,
-52927,     1,  2436, 50744,     1,  3219,  4806,     2,  1546,  3685,
- 2671, 30577,     2,  3157, 45806,  4149, 47296,     3,  1202, 39999,
- 2868, 25567,  4175, 47296,     2,  3415, 50890,  4201, 47296,     4,
- 2523, 61588,  3051, 17393,  3774, 51927,  4227, 47296,     3,   638,
-20552,  2697, 62125,  4253, 47296,     1,  4279, 47296,     2,  1124,
-11676,  4305, 47296,     1,  3797, 47344,     3,   231, 23991,  1639,
-25670,  2593, 44340,     1,  2823, 57719,     1,  2222,  5006,     2,
- 1057,  5237,  3600,   644,     1,  2185, 35922,     4,  1832, 11146,
- 2168, 59776,  2284, 58501,  2635, 18372,     1,  3943, 23945,     1,
- 3969, 23945,     1,  3995, 23945,     1,  4021, 23945,     2,   820,
-28024,  4047, 23945,     4,    40, 33038,  1122, 12972,  1564, 45099,
- 4073, 23945,     1,  4099, 23945,     2,  2311, 57088,  4125, 23945,
-    1,  2440, 63799,     2,   519, 36226,  3445, 57741,     1,  1657,
-16177,     1,  3326, 59842,     2,  3707, 54821,  4350, 27077,     1,
- 1911, 61191,     2,  1989, 60810,  2034, 22592,     2,  2954,  4503,
- 4345, 19180,     1,  2772, 27337,     1,  3644, 39426,     1,  3708,
-48871,     1,  3676, 30697,     2,  1110, 30525,  3686, 64561,     1,
- 2507,  6188,     1,   334, 23845,     2,  2953,  8809,  3258, 29734,
-    1,  3711, 24933,     1,  2119, 64323,     1,  4150, 63477,     2,
- 1017, 41615,  4176, 63477,     1,  4202, 63477,     2,   609, 39900,
- 4228, 63477,     2,  3588, 28028,  4254, 63477,     1,  4280, 63477,
-    1,  4306, 63477,     1,   213, 12834,     1,  3267, 36872,     1,
- 2123,  2916,     1,  1899, 18171,     1,   717, 63995,     5,  1293,
-50415,  1623, 26886,  2351, 24087,  2842, 46392,  4573,  8848,     1,
- 4598,  8848,     2,  3179, 45290,  4623,  8848,     2,   817, 49083,
- 4648,  8848,     2,  2932,  3131,  4673,  8848,     2,  3933, 26085,
- 4698,  8848,     3,   855, 37670,  3959, 26085,  4723,  8848,     2,
- 3661, 17068,  3985, 26085,     3,  1520, 61144,  3135, 60891,  4011,
-26085,     1,  4037, 26085,     1,  4063, 26085,     2,   752, 37657,
- 4089, 26085,     5,   444, 38326,   468, 31546,   900,  6913,  3230,
-54793,  4115, 26085,     1,   469, 31546,     2,   461, 31546,  4741,
-19242,     1,  3223,  8484,     1,  3690, 14725,     1,   193,  2394,
-    1,  2816, 47606,     2,   917,  8868,  2763, 21976,     3,  1006,
-63089,  1359, 12311,  3946, 34188,     3,   354, 34958,  2371, 35894,
- 3972, 34188,     1,  3998, 34188,     1,  4024, 34188,     1,  4050,
-34188,     3,  1021, 40442,  3395, 50434,  4076, 34188,     1,  4102,
-34188,     2,  1250, 31150,  4128, 34188,     1,    93, 19959,     1,
- 1896, 39849,     1,  3409, 57178,     2,   331, 62397,  3736, 25261,
-    1,    46, 26313,     1,   876, 23839,     2,   483, 51223,   846,
-55652,     2,   884,  9102,  3582, 34061,     1,  1943, 60734,     1,
- 1782, 13080,     1,   235, 65087,     3,   344, 40242,   887, 60379,
- 3555, 27734,     2,  1456,  6071,  2238, 37872,     3,  1768,  4399,
- 2274, 22842,  2584,  5571,     2,   533, 52498,  1071, 12995,     2,
-  954, 39587,  1369, 16230,     2,  1720,  8662,  2365,  2684,     2,
- 2695, 16708,  3645, 26502,     1,  2625, 36121,     3,   391, 20497,
-  861, 42321,   911, 37568,     1,   160, 46167,     1,   249, 11984,
-    3,   850, 40346,  1269, 47910,  1918, 31350,     3,  3127, 23164,
- 3153, 23084,  3935, 52618,     1,  3961, 52618,     1,  3987, 52618,
-    3,  1912, 51547,  2874, 14338,  4013, 52618,     1,  4039, 52618,
-    1,  4065, 52618,     3,  1426, 40727,  2477, 21870,  4091, 52618,
-    3,  2099, 12730,  2986, 55334,  4117, 52618,     1,    18, 52003,
-    2,  1506, 61754,  2032, 42341,     3,   298, 20825,  2270, 55375,
- 2779, 23737,     2,  1402, 63752,  4336, 25365,     1,  3820, 60334,
-    2,   739, 15830,  1305, 32042,     1,  1151, 36810,     3,   171,
- 9374,  1152, 36810,  2138, 44321,     2,  1153, 36810,  3148, 10465,
-    3,   251, 29685,  1094,  7310,  2425, 43320,     1,  3281, 15943,
-    1,  3651, 49654,     1,  1648, 51604,     2,   605, 29883,   732,
-57990,     1,  1174, 55332,     1,    67, 50637,     3,  1099,  2051,
- 1184, 22054,  3101, 58494,     1,   841, 26965,     1,  3035, 46073,
-    1,   842, 18960,     2,  1031,  4878,  3568, 20159,     3,  1371,
- 9608,  1384, 59915,  1500, 57852,     1,  3336, 54613,     1,  4325,
-60935,     1,  3817,  4469,     3,  2319,  6396,  2448, 50987,  3934,
-63084,     1,  3960, 63084,     3,  2847, 41874,  3754, 43791,  3986,
-63084,     1,  4012, 63084,     2,  1517, 60631,  4038, 63084,     1,
- 4064, 63084,     2,  1833, 44483,  4090, 63084,     1,  4116, 63084,
-    3,  1149, 11417,  1154, 36810,  3269, 61765,     1,  1155, 36810,
-    1,  1068,  6114,     1,  2867, 14973,     3,   212, 55853,  2062,
-51876,  3126, 56305,     1,   845, 10711,     2,  1341, 25011,  3289,
-62949,     3,  2201, 12767,  2307, 45570,  2595, 10376,     1,  2744,
-28562,     2,  2037, 21224,  3804,  8540,     1,  2102, 65162,     2,
-  871, 52922,  4324, 25934,     3,   371,  7574,  1105, 58553,  3777,
-38993,     1,   577, 15290,     1,  3509, 21043,     1,  3266, 64707,
-    2,  2694, 61521,  4383, 10836,     2,  1560, 20895,  4408, 10836,
-    3,  1052, 40973,  2499, 61158,  4433, 10836,     1,  4458, 10836,
-    1,  4483, 10836,     1,  4508, 10836,     3,  2548, 21447,  3054,
-44195,  4533, 10836,     2,  3488, 45632,  4558, 10836,     3,   189,
- 1478,  1376, 57051,  3853, 20584,     1,  2261,  3225,     1,  1156,
-36810,     1,  2424, 50155,     2,  1735, 45886,  2552, 43202,     2,
- 1864, 19916,  3740, 39939,     2,  1881, 17947,  2258, 32491,     2,
-  484,  1159,   579, 56196,     1,  1216,  2410,     2,  1129, 45125,
- 2535, 28572,     1,  2883, 59084,     1,  3531, 36937,     1,  3889,
-38712,     2,  1813, 39734,  2984,  1017,     1,  2406,  5691,     3,
- 1437, 59363,  1835, 24892,  3916,  4150,     2,   755, 26484,  2368,
- 2826,     3,   241, 30636,  2841, 35487,  3883, 45352,     2,  2107,
-61425,  3649, 19409,     1,  2503, 36887,     3,  2457, 43976,  3172,
-10290,  3322, 24159,     1,  1175, 13086,     1,  3855, 45877,     3,
-  315, 41925,  1556, 52511,  2323, 42347,     1,  2691, 49513,     2,
- 1263, 55200,  2215, 61086,     1,  3629, 26600,     1,   481, 61284,
-    2,   324, 54190,  3204, 59971,     1,  1503, 14272,     1,  3337,
-15711,     1,   571, 43886,     1,  1116,  3560,     1,  3464, 16534,
-    1,  2989, 27830,     1,  3704, 25046,     1,  3046, 55598,     1,
- 1628, 26677,     1,  3263, 54146,     3,   427, 11988,  1606, 35271,
- 3738, 23943,     1,  2095, 25198,     1,  1061, 22251,     2,   137,
-35996,  1138, 54734,     2,  2346, 32479,  4133,  2197,     1,  4159,
- 2197,     2,  1988, 32421,  4185,  2197,     1,  4211,  2197,     2,
- 2829, 16099,  4237,  2197,     1,  4263,  2197,     4,   129, 18788,
-  295, 55340,  1385, 64616,  4289,  2197,     2,   446, 38313,  3579,
-55222,     1,  2337, 46896,     2,  1102, 49389,  2219, 11139,     1,
- 3662, 16509,     3,   779, 20534,  3489, 40116,  3622,  9636,     1,
-  400,  5300,     2,   452, 24827,   474, 58935,     3,   451,  7102,
- 1114, 12586,  2956, 35391,     1,    56, 44155,     5,  1026,  9463,
- 1955, 22848,  3456, 55478,  3767, 42010,  3836, 62817,     2,   798,
-61033,  1600, 49545,     3,  1228,   229,  1673, 40583,  3496, 37315,
-    2,  1118,  8852,  2129, 51674,     1,  2526, 32883,     1,  1601,
-31074,     2,   663,  7682,   760, 50767,     1,  2372, 45706,     1,
-  540, 23831,     1,  2416,  2298,     1,  1787, 15160,     2,   350,
- 8612,  1748, 48746,     1,   724, 50380,     2,    61, 55617,   622,
-22342,     2,  2609, 27136,  2859, 12345,     1,  1327, 10832,     1,
-  931, 35176,     1,   737, 14113,     4,   753, 18173,  2415, 24212,
- 2581,  5558,  3447, 50755,     1,  1942, 23988,     1,  2911, 58761,
-    2,  1481, 54623,  3517,  8876,     1,  4151,  3768,     3,   783,
-52072,  3241, 15197,  4177,  3768,     4,   144,  3386,  1172, 17467,
- 3009, 30697,  4203,  3768,     1,  4229,  3768,     2,  3256, 15927,
- 4255,  3768,     2,  2072, 54521,  4281,  3768,     1,  4307,  3768,
-    1,  1562, 63565,     1,   804, 21408,     1,  3435, 12567,     1,
- 3744,  9649,     1,   750, 28412,     2,  1778, 14606,  4339, 46848,
-    2,  2291,  5510,  2864,  1466,     1,    51, 19083,     3,    45,
-24707,   965, 20866,  1455, 12378,     1,   164, 30858,     2,   239,
-11547,  3416, 34063,     2,    74,  4780,  1516,   861,     2,  2702,
-62914,  3100, 44525,     1,  3089, 42123,     2,  1830, 63104,  2377,
-33073,     1,  3417, 24256,     1,  4153, 56121,     2,  3367, 43364,
- 4179, 56121,     6,   597, 39642,  2151,  9640,  2244, 13082,  2936,
-36394,  3222, 60381,  4205, 56121,     2,  2050, 12410,  4231, 56121,
-    2,  3140, 58080,  4257, 56121,     3,  1858, 40648,  2442, 47547,
- 4283, 56121,     2,  3852, 19328,  4309, 56121,     1,  4157, 23444,
-    3,  1828,  5298,  2545, 56114,  4183, 23444,     2,  1082,  7510,
- 4209, 23444,     1,  4235, 23444,     2,  2392,  1335,  4261, 23444,
-    2,   326, 61004,  4287, 23444,     1,  4313, 23444,     1,   312,
-46660,     4,   550, 30709,   726, 61350,   811, 13314,  2057, 44601,
-    1,  2791, 59178,     2,  2031, 46078,  2857, 55687,     1,   951,
- 3283,     1,  3504, 21102,     2,   487, 19054,  3746,  6411,     1,
- 2854,  4870,     1,  2572, 40733,     1,  2407, 28536,     1,  1817,
-18914,     2,   925, 55552,  3243, 49564,     2,   978, 17868,  3677,
- 6304,     2,  1416, 55466,  3325, 36756,     1,   101, 17546,     2,
- 1104, 29691,  2917, 58594,     1,  1233, 54000,     1,   600, 52957,
-    2,     8, 36679,  3675, 56955,     2,  3165, 26806,  3392, 10083,
-    1,  2275, 10492,     2,  1420, 34217,  3095, 19098,     1,   240,
-  923,     1,  3364, 21243,     2,   133,  8519,  2990, 17426,     1,
-  595, 11283,     1,  2482,  4300,     3,  1098,  2521,  4136, 52736,
- 4565, 11827,     3,  3118, 47122,  4162, 52736,  4590, 11827,     2,
- 4188, 52736,  4615, 11827,     2,  4214, 52736,  4640, 11827,     3,
- 3080, 19575,  4240, 52736,  4665, 11827,     3,  1347,  9723,  4266,
-52736,  4690, 11827,     3,  1913, 62865,  4292, 52736,  4715, 11827,
-    2,   793, 25768,  2934, 45132,     3,   528, 15741,  2313, 57132,
- 3516, 19778,     1,  3421, 31319,     1,  2541, 11405,     2,  2824,
-19175,  4323, 55082,     1,  2401,  6109,     1,  2678,  2693,     1,
- 1762, 16572,     1,   669, 19760,     1,   275, 55939,     4,  1706,
-60224,  1925, 63875,  2835, 61866,  2963, 19958,     3,  1439, 27237,
- 2338, 21316,  2778, 25725,     1,  2273, 26371,     2,   131, 24943,
-  200, 44118,     1,  3432, 55394,     1,  3714, 64610,     2,   615,
- 6465,  3628, 26659,     2,  2784, 15270,  2996, 43119,     1,  2120,
-45515,     1,  4357, 12332,     1,   303,  3436,     2,   768, 45467,
- 1108, 18562,     1,  2583, 37445,     2,  1660, 31035,  3560, 52621,
-    1,  1223,  1367,     3,  1640, 32965,  1774, 23340,  3132, 52320,
-    1,  1701,  1382,     2,   822,  7733,   927,  1335,     2,  1991,
-13892,  3878, 20205,     2,   126, 51386,  1362, 64281,     2,  1089,
-50377,  1987,  5865,     1,  2121, 28874,     3,    62, 41330,  2391,
-63359,  4143, 32474,     2,  1611, 43367,  4169, 32474,     1,  4195,
-32474,     3,   421,  3220,  2533, 11021,  4221, 32474,     1,  4247,
-32474,     2,  3120, 47440,  4273, 32474,     2,   812,  6387,  4299,
-32474,     3,  3083, 61022,  3452, 35968,  4742, 35567,     1,  2607,
-24122,     3,   702, 63843,   746, 40328,  2271, 61255,     1,  2815,
-19043,     2,   233, 13498,  2279, 65473,     3,   682, 33160,   792,
-59593,  3066, 22511,     3,   224, 47690,  1675,  5127,  2999, 51830,
-    2,  1064, 34673,  3534, 17310,     1,  1243, 65152,     4,   874,
-17211,   958, 29496,  1509, 41146,  2486, 47012,     2,  2020,  8967,
- 2558, 24344,     1,  3428, 57726,     1,  1862, 33847,     1,  1044,
-28533,     2,   520, 28941,  2473, 45750,     1,   886, 48078,     2,
- 2091, 45499,  2575, 55994,     1,  1894, 38808,     1,  1693, 28786,
-    1,   590, 45466,     4,   307, 65044,   895, 10619,  2011, 42492,
- 4155, 10158,     1,  4181, 10158,     1,  4207, 10158,     5,  2546,
-28423,  2941, 61831,  3458, 55537,  3792, 21657,  4233, 10158,     2,
- 2666, 26710,  4259, 10158,     1,  4285, 10158,     2,  2629,  8985,
- 4311, 10158,     1,  2689, 61080,     2,  2741, 15674,  2851,  8281,
-    2,    14, 31121,  2112, 43730,     2,   754, 29529,  1294, 52402,
-    1,  3906, 31755,     2,  1526, 54603,  2528, 47645,     1,  1198,
-44176,     2,  3147, 49454,  3543, 38543,     1,  1438,  8268,     1,
- 3331, 44374,     1,  3735, 23744,     1,   921,  3250,     2,   934,
- 7495,  2134, 41426,     1,   498, 25327,     3,    29, 55180,  1957,
-61185,  3667, 25830,     1,   439,  9083,     1,  1950,   464,     1,
- 1374, 46786,     2,   915, 56983,  3418, 24227,     2,   302, 54417,
- 3621,   268,     1,  4571, 24406,     1,  4596, 24406,     3,   301,
-48639,  2685, 34923,  4621, 24406,     4,   856, 62321,  3298, 61214,
- 4646, 24406,  4750,  9940,     1,  4671, 24406,     1,  4696, 24406,
-    2,  2187, 55263,  4721, 24406,     4,  1285, 27166,  1597, 57802,
- 1629, 29797,  3937, 36921,     1,  3963, 36921,     2,   403, 30233,
- 3989, 36921,     2,   744, 60768,  4015, 36921,     1,  4041, 36921,
-    1,  4067, 36921,     1,  4093, 36921,     2,   262, 26823,  4119,
-36921,     1,  3893, 24644,     4,   104, 45106,  1003, 58122,  2938,
-49562,  3112, 47552,     2,   538, 23671,  2236, 35765,     2,   173,
-12248,  1703, 24050,     1,  2356, 57371,     1,   899, 25730,     1,
- 2918, 22924,     1,   116, 10592,     1,  2587, 62130,     2,  2433,
-43380,  2705, 59620,     1,  2240, 59123,     3,   536, 20421,  1523,
-18211,  2758,  6940,     3,  1734, 63992,  3503,  8683,  4327, 16169,
-    2,   196, 45668,  1585, 57266,     1,  2512, 11635,     4,   343,
-29110,  1072, 27055,  1710, 38532,  1968, 50561,     3,   215, 58908,
- 1387, 25167,  2384, 33025,     2,  1840, 65518,  2293, 53273,     1,
- 3429, 32392,     1,   785,  4911,     1,   532, 20557,     1,  2266,
-19945,     1,   979, 53702,     1,  2146, 65080,     1,   607, 15112,
-    2,  1201, 64079,  3154, 61848,     2,   714,  7083,   852, 34444,
-    1,  3388, 11018,     1,  2241, 51657,     2,  2353, 36974,  4332,
- 8420,     1,  2508, 44381,     1,  2803, 65003,     1,  1317, 39362,
-    1,  2848, 37472,     1,  1681, 47899,     2,  1976,  4905,  3596,
-32655,     1,    63, 17228,     2,   942, 17372,  3278, 26577,     2,
-  174, 20583,  2753, 23174,     1,  2834, 37642,     2,  2276,  9946,
- 2993,   232,     2,   596, 33602,   713,  2693,     3,   359,  8813,
- 1209, 45420,  1680, 10589,     1,  1356, 40950,     1,  1939, 40404,
-    2,   449, 44361,  1534, 55540,     1,  3156,  7039,     2,   617,
- 2981,  2157, 53021,     1,  3151, 26372,     1,  1298, 25787,     3,
- 1674, 41500,  3210,  5203,  3859, 33749,     5,  1182, 28144,  1274,
-  725,  1346, 26564,  2578, 30696,  3380,  9143,     4,    59,   643,
- 1355, 61242,  1882,    48,  1977, 53681,     2,  1150, 31271,  2715,
-21677,     1,  3282, 60733,     1,  2751, 57107,     1,  3899, 15588,
-    2,   504, 21921,  1791, 32255,     2,  1902, 29154,  2458, 22210,
-    1,   136,  4792,     1,  2300, 56410,     1,  2370, 49149,     1,
- 2544, 54117,     2,  3342, 19283,  4749,  9940,     1,  1126, 24403,
-    2,  2447, 65460,  2693, 36328,     1,  2564, 28465,     1,  3253,
-30248,     1,  1225, 14069,     1,  3532, 63504,     1,  2013, 14922,
-    1,  2599, 29832,     3,  1575, 40438,  2604, 42815,  3328, 36028,
-    3,  1137,  4955,  1197,  9419,  2147, 27733,     2,  1249, 21168,
- 2810, 42014,     2,  1088, 57668,  2077, 43773,     1,  2916, 65123,
-    2,   346, 51902,  3356, 45576,     1,  1766, 44263,     1,  3411,
-28847,     1,  3648,  4017,     2,  1548, 65335,  2889, 33060,     1,
- 1961, 60567,     1,   612, 44791,     1,  3245, 38976,     1,  1404,
-14240,     1,   599, 54399,     1,  3228, 30080,     1,   363, 39060,
-    1,  1074, 12613,     3,  1117, 25613,  1527, 34195,  1661, 10225,
-    1,  2000, 32457,     2,  2227, 53494,  2888, 31017,     2,  1022,
-25292,  1586, 61106,     1,  3022, 24164,     1,  4132, 30445,     2,
- 2417, 22605,  4158, 30445,     1,  4184, 30445,     4,    21, 64258,
-  559, 22994,  4210, 30445,  4746,  7130,     3,   891,  3624,  1145,
-49466,  4236, 30445,     1,  4262, 30445,     3,  3355,  8194,  3920,
-12951,  4288, 30445,     2,  2345, 34663,  2627,  1035,     1,   769,
-62020,     1,   562, 43459,     2,   199, 58580,  1954, 34804,     2,
- 3068, 32927,  3180, 29376,     1,  1589, 62975,     2,  1162, 23589,
- 1745, 50362,     1,  3572, 29346,     2,    88, 13885,  1440, 20182,
-    1,  3439,  2764,     3,  2280,  2984,  2813, 52082,  3237, 41087,
-    2,   950, 62489,  1092, 32866,     1,   145, 47468,     3,     3,
-28480,  3233, 48618,  3771, 23331,     3,  1974, 38287,  2233, 13877,
- 3247,  6652,     2,  2429, 27356,  3892, 48247,     1,  4375, 41588,
-    3,  1424, 64894,  4330, 60955,  4400, 41588,     1,  4425, 41588,
-    2,  1278, 54663,  4450, 41588,     1,  4475, 41588,     1,  4500,
-41588,     2,  1435, 41095,  4525, 41588,     2,  1789, 62630,  4550,
-41588,     1,  1030, 11068,     1,  1383, 41529,     1,  2366, 61520,
-    1,  1325, 51469,     1,  3013, 39036,     2,  1295, 42309,  4740,
-37121,     1,   462, 61013,     3,   255, 62101,  1135,  7142,  3870,
-51716,     1,  1684, 55553,     1,   654, 57624,     5,  1336, 22501,
- 1468,  5061,  2304, 38056,  2876,  3857,  4380, 12331,     4,  1692,
-15085,  1888, 38912,  2598, 19831,  4405, 12331,     1,  4430, 12331,
-    3,  2777, 14067,  3354,  2025,  4455, 12331,     1,  4480, 12331,
-    3,   332, 30933,  1852, 38107,  4505, 12331,     1,  4530, 12331,
-    1,  4555, 12331,     2,  1084, 18589,  2793, 26183,     3,  1596,
-19675,  2845,  6962,  3521, 53464,     1,  3652, 63757,     1,  1254,
-64806,     3,  1086,  7079,  2189, 19307,  2321,  6646,     1,  1839,
-20170,     1,  1483,  7261,     1,  4344, 52713,     1,  2655, 31849,
-    1,  3495, 45652,     1,   109, 40063,     1,  1870, 32245,     2,
- 2162, 60657,  4581, 15402,     3,  3043, 56708,  3334, 28717,  4606,
-15402,     1,  4631, 15402,     2,  2206, 55810,  4656, 15402,     2,
- 3932, 64894,  4681, 15402,     3,   998, 31353,  3958, 64894,  4706,
-15402,     3,  2164, 25054,  3984, 64894,  4731, 15402,     2,   733,
-64470,  4010, 64894,     2,    37, 25816,  4036, 64894,     2,  1393,
-62764,  4062, 64894,     2,  1921, 27109,  4088, 64894,     1,  4114,
-64894,     1,  3835, 28440,     2,  1981, 49668,  3656, 19248,     2,
- 2042, 18363,  2403, 54539,     1,   328, 43059,     3,   805, 51008,
- 1801, 18340,  3333, 38187,     1,  1967, 29242,     2,  2520,  2318,
- 3642, 36163,     1,  3109, 13383,     1,  2727, 14566,     2,   684,
-38210,  2234,   431,     2,    65, 20767,  2557,  2619,     1,   976,
-58610,     3,   305,  5675,   807, 13797,  2257, 27821,     1,  1926,
-13500,     2,  1999, 14082,  3443, 18906,     1,    50, 39912,     1,
- 4568, 50028,     1,  4593, 50028,     2,  1781, 62207,  4618, 50028,
-    2,   641, 14201,  4643, 50028,     1,  4668, 50028,     1,  4693,
-50028,     1,  4718, 50028,     2,   159, 42174,   287, 42499,     1,
- 3131,  4881,     3,   310, 11600,   423, 46734,  1622, 15319,     1,
- 3244, 62626,     1,  2750, 37601,     2,  1642, 12981,  2488, 12143,
-    2,  2973, 18026,  3780, 41776,     1,   652,  2991,     2,   985,
- 7333,  2869, 43601,     3,  2820, 32942,  3024, 62730,  3359, 43488,
-    4,  2628, 47564,  3028,  8282,  3492, 62222,  3709, 58464,     1,
- 2074, 58061,     1,  1689,  6586,     1,  3400, 41955,     1,  3034,
-11825,     3,  1163, 51292,  1300, 50382,  1485, 33442,     1,  2910,
-57877,     1,  3202, 28451,     1,  3940, 38155,     2,   365, 40480,
- 3966, 38155,     2,   823, 35090,  3992, 38155,     2,  3842, 20877,
- 4018, 38155,     2,   127, 15446,  4044, 38155,     1,  4070, 38155,
-    1,  4096, 38155,     2,   378, 46707,  4122, 38155,     2,   385,
-46707,  2286, 34942,     2,  1741,  4996,  3824, 50883,     3,  1283,
-31447,  2395, 49182,  3802,  9641,     3,   491, 63930,   882, 13348,
- 4156, 39586,     2,  1678, 64612,  4182, 39586,     2,  2167, 55313,
- 4208, 39586,     4,   361, 17383,  1358, 45661,  2411, 40399,  4234,
-39586,     3,  1618, 28748,  2748, 39002,  4260, 39586,     3,   206,
- 7605,   341, 34193,  4286, 39586,     5,   584, 26687,  2762, 11374,
- 2933, 24721,  3274, 59418,  4312, 39586,     1,  3150, 33521,     1,
- 3213, 44087,     1,   336, 27600,     1,   712, 61174,     1,  3814,
-43870,     2,   185, 29555,  2832, 65228,     3,  1637, 28090,  3093,
-44250,  3821, 28159,     1,  1382, 62228,     1,   369,  1030,     2,
- 1069, 62259,  2976, 55878,     1,  1177, 38395,     2,   285,  3501,
- 2027, 19533,     3,  2326, 55902,  2749, 26982,  2879, 54622,     1,
-  990, 19895,     2,  2173, 25010,  3672, 56871,     1,   748, 39262,
-    2,  2724, 57501,  3685, 10936,     1,  2814, 41761,     1,   991,
- 9655,     1,  4148, 13953,     5,   120, 61178,   450, 42206,  2089,
- 1556,  2484, 26497,  4174, 13953,     3,  1076, 33940,  3185, 61772,
- 4200, 13953,     4,  2668, 11210,  3036, 51863,  4226, 13953,  4388,
-40614,     2,  4252, 13953,  4413, 40614,     3,   963, 24134,  4278,
-13953,  4438, 40614,     2,  4304, 13953,  4463, 40614,     3,   112,
-20732,  1641, 39467,  4488, 40614,     2,  2320, 11750,  4513, 40614,
-    3,  1712, 30080,  3207, 34874,  4538, 40614,     1,  4563, 40614,
-    2,  1667,  8983,  2613, 52742,     1,  1928,  1408,     2,  1303,
-60558,  3293, 51575,     1,  2299, 11941,     4,  2069,   792,  2288,
-50225,  2344, 61696,  3362, 57997,     4,   340,  4155,  1056, 60806,
- 1307, 53321,  3146,  3921,     2,  2586,  4111,  3783, 21159,     3,
- 3027, 31309,  3106, 32025,  3823, 59702,     1,  2563, 15092,     1,
-  923, 14866,     1,  1691,  8177,     2,  1165, 54477,  2039, 63793,
-    1,  1180,  8336,     2,  1323,  8507,  3318, 12124,     3,   836,
-60530,  1409, 51308,  2250, 49710,     1,  3398, 25358,     1,   447,
-12386,     1,  1370, 36437,     2,   736, 35935,  3144,  9223,     2,
- 3508, 50119,  4351, 17209,     4,  1552, 43763,  2787, 30401,  2839,
-61593,  3170, 58729,     1,  3678, 33016,     1,  2049,  8457,     1,
- 3525, 26426,     2,  1398, 53679,  4745, 30283,     1,  1732, 31605,
-    3,  1722, 60143,  2176, 23331,  3242,  2279,     1,    11, 19010,
-    2,   294, 22575,  1375, 46126,     1,   977, 54388,     1,  2969,
-42094,     3,   588, 10789,  1744,  2833,  2662, 47857,     1,  1696,
-36041,     3,   263, 29735,  3564, 56112,  3863, 16573,     1,  3877,
-37354,     2,  1484, 17975,  3307, 64094,     1,   929, 43590,     1,
-  578, 56074,     1,  3071, 24547,     2,  1120,  2311,  2265, 62165,
-    2,  3399, 46271,  3408, 11341,     2,  1972, 61021,  2701, 60996,
-    1,  3090, 13222,     1,  4328, 28975,     1,  3008, 63185,     1,
-   33, 21793,     2,  1497, 52594,  2621, 15802,     3,  1797, 29640,
- 3465, 18007,  3587, 55801,     2,  3125, 35023,  3499, 30958,     2,
- 1743,  3302,  3232, 30969,     2,   667, 51536,  2390, 40065,     1,
- 2149, 14645,     2,  1273, 12486,  3139, 47948,     1,  3522, 48425,
-    1,  3494, 13672,     3,  2571, 50525,  2709, 12658,  3299, 59414,
-    1,  2710, 12658,     1,   865,  3339,     1,  2086, 46874,     3,
-    4, 23290,   138, 14645,  1947, 49038,     2,   274,  9293,  2019,
-63553,     1,  1405, 11781,     1,  4575, 61705,     1,  4600, 61705,
-    1,  4625, 61705,     2,  1248, 56551,  4650, 61705,     2,  2497,
- 6296,  4675, 61705,     1,  4700, 61705,     2,  2951, 44859,  4725,
-61705,     2,  2534, 19859,  3188, 25188,     2,   374, 38263,  2446,
-45551,     1,  3697, 48734,     2,  3816, 56996,  4385, 40787,     1,
- 4410, 40787,     1,  4435, 40787,     2,  1941,  3347,  4460, 40787,
-    2,  2113, 27536,  4485, 40787,     2,  2961, 44760,  4510, 40787,
-    2,  1212, 22662,  4535, 40787,     3,   827, 14008,  1049, 34923,
- 4560, 40787,     1,   500, 35888,     3,   912,  3273,   949, 21621,
- 3061, 53055,     2,  2890, 17896,  3479, 53292,     2,   388, 54648,
- 1115, 13271,     3,   333, 22494,   384, 27125,  2780, 20795,     4,
-  530, 13595,   986,  4043,  3167, 24970,  3641, 51532,     2,  2139,
-57004,  2928, 58500,     1,  1584, 24150,     2,   632, 40124,  2198,
-21151,     2,  2487, 60465,  2992, 24289,     1,   170, 47738,     1,
-  258, 37918,     2,  1859, 40601,  3856, 26818,     2,   410, 16290,
- 2142, 10967,     1,  2836, 32934,     3,    86, 15583,   360, 33506,
- 3929, 37789,     1,  3955, 37789,     2,   329, 41110,  3981, 37789,
-    3,  1565, 46511,  3251,  5560,  4007, 37789,     3,  2747, 37070,
- 4033, 37789,  4315, 57356,     1,  4059, 37789,     1,  4085, 37789,
-    2,   919, 63264,  4111, 37789,     1,  2180, 61490,     1,  2579,
-58081,     2,   167, 45627,  3164, 29995,     1,   608, 28622,     2,
- 1467,  3085,  3904, 60616,     3,   254, 57895,  1401, 54326,  3309,
-43001,     2,  2653, 44094,  4370, 43131,     2,  1213, 35859,  4395,
-43131,     2,  3617, 54409,  4420, 43131,     2,  3115, 60368,  4445,
-43131,     2,   722, 51396,  4470, 43131,     2,  3664, 57072,  4495,
-43131,     1,  4520, 43131,     1,  4545, 43131,     1,  1032, 15253,
-    2,  1034,  2901,  1916, 24065,     2,   375, 51918,   624, 49561,
-    1,  1677,  3822,     1,  4358, 53948,     2,   593, 25894,  3635,
-47162,     2,  1992, 39505,  4744, 30283,     4,   591, 50623,   707,
-15230,  1306, 57682,  2543, 44803,     1,  2387, 16006,     2,   169,
-20563,  1505, 50261,     1,  1271, 46107,     1,  2608, 28715,     1,
- 2774, 48914,     2,  1132, 61306,  1267, 58172,     1,   518, 27424,
-    2,   999, 29841,  4748,  9940,     1,   838, 44226,     1,  1747,
- 9481,     1,  3732, 56097,     2,  2047, 52307,  3733, 56097,     1,
-  825, 52445,     2,  1344, 48335,  3122, 26899,     1,  4352, 52158,
-    3,   117, 40869,  1036, 18137,  3129, 12756,     2,  3554, 37345,
- 3603, 62042,     1,  3556, 25476,     3,  2264, 19873,  2431, 30037,
- 2979, 47808,     1,  1218, 57949,     1,  2254, 49006,     2,   438,
-51061,  2913, 11002,     1,  1452, 59769,     4,   222, 43302,   718,
-52902,  3834, 18854,  3901, 10076,     1,  3184, 34748,     1,  3795,
-21583,     3,  2554, 37746,  3271,  9728,  3618, 11411,     2,   731,
- 7203,  2732, 44119,     2,  2290, 31149,  3166, 29226,     1,    58,
-10068,     1,   955, 13539,     2,   134, 15193,  4576, 63613,     2,
- 2946, 55896,  4601, 63613,     2,   139, 42791,  4626, 63613,     2,
- 2756, 26665,  4651, 63613,     2,  2665, 51496,  4676, 63613,     2,
-  490,  9810,  4701, 63613,     2,  1239, 39081,  4726, 63613,     1,
- 1891,  5846,     3,   903, 30332,  1963, 37055,  2068,  1998,     2,
-  337, 39179,  3320, 62520,     1,  1275, 59569,     1,  2426, 58006,
-    1,  1043, 29561,     1,  2513, 25054,     2,  1291, 12972,  2045,
-13558,     1,   598, 24146,     1,    72, 64772,     1,  3592, 24459,
-    2,  1392, 14279,  3640, 34192,     2,  1917, 54628,  2692, 47287,
-    1,  2670, 52385,     1,  2496, 41251,     1,  3173, 26759,     3,
-   75, 11204,  2925, 48574,  4567, 22922,     3,  1824,  7262,  1869,
-41111,  4592, 22922,     2,   390,  1788,  4617, 22922,     3,   396,
-14107,  2645,  5307,  4642, 22922,     1,  4667, 22922,     4,  1266,
-60170,  2216, 53580,  3575, 31271,  4692, 22922,     1,  4717, 22922,
-    2,   824,  9748,  1443, 53410,     4,   183, 54086,   984, 20974,
- 1756,   150,  2967, 59719,     2,   419, 62838,   894, 18911,     2,
-  864, 61943,  3831, 31620,     2,  2766,  4809,  3815, 54103,     2,
-  440, 26931,  4377, 17302,     3,  1953, 19949,  3854, 24510,  4402,
-17302,     1,  4427, 17302,     1,  4452, 17302,     1,  4477, 17302,
-    2,  3917, 28528,  4502, 17302,     2,  2630, 41437,  4527, 17302,
-    2,  2349, 58488,  4552, 17302,     1,  1106, 38133,     1,  1183,
-46791,     1,  3191, 45896,     1,  2912, 42257,     1,  3602, 33753,
-    3,  2757, 24873,  3161, 13149,  3806, 53644,     1,  2316,  2545,
-    1,  3208, 16806,     1,  3044, 29518,     3,  1650,  2467,  2003,
-61057,  3211, 26256,     2,  1746, 31346,  3523,  7540,     3,   686,
-60479,   802, 41505,  2926, 16409,     2,  2141, 51406,  4152, 43007,
-    4,    19, 50140,  1726, 60089,  3401, 32061,  4178, 43007,     1,
- 4204, 43007,     3,   749, 38505,  2008, 12807,  4230, 43007,     1,
- 4256, 43007,     2,    87, 44325,  4282, 43007,     2,   679, 55254,
- 4308, 43007,     2,  2944, 47335,  3301, 50881,     2,   545, 14159,
- 1136, 50768,     1,  3544,  6358,     2,   902, 63562,  3573, 27863,
-    1,  3515, 59776,     2,   700, 30948,  2277, 62207,     1,   629,
-19144,     1,   123, 31011,     1,  2519, 58203,     3,   217, 20775,
-  742, 15070,  3273, 49985,     1,  1357, 26940,     1,  1045,  4756,
-    1,  3019, 25034,     1,  2943, 38467,     1,   554,  4047,     2,
- 1087, 24467,  2754, 40545,     1,   623,  7740,     2,  1389, 20984,
- 2127, 45507,     1,  2905, 43751,     1,   572, 49570,     1,    35,
-36192,     2,    20, 30554,  2991, 29328,     1,  1232, 38827,     3,
- 1083,   109,  2640, 35683,  3595, 64582,     1,  1063, 61225,     3,
- 2230, 60079,  3113, 27739,  3803, 52349,     1,   406, 14914,     1,
- 2900, 57031,     1,  3174, 21682,     2,   666, 47233,  1310, 39271,
-    1,  1365,  3055,     1,  3283, 56550,     2,   397, 11321,  2870,
-43284,     1,  3862, 31050,     2,   300, 37995,  2812, 62810,     1,
- 3493, 48544,     2,   939, 36715,  2970, 22430,     1,   402, 29352,
-    1,  1885, 61844,     1,  1501, 41564,     3,   424, 23340,   458,
-25646,  2398,  7027,     2,  2159, 51142,  2960, 48111,     2,  1919,
-64772,  2801,  1792,     2,   818, 16013,  3611, 56467,     1,  2948,
-62355,     3,   147, 46216,   323, 12234,  3938, 60277,     3,   186,
-42759,  2838, 57292,  3964, 60277,     1,  3990, 60277,     2,  3626,
- 6858,  4016, 60277,     3,  1809, 51603,  3716, 49697,  4042, 60277,
-    2,   655, 63854,  4068, 60277,     1,  4094, 60277,     2,  3751,
- 7709,  4120, 60277,     1,  3725,  9183,     2,  1825, 25460,  3882,
-58070,     1,  2849, 16352,     1,  3038, 21591,     3,   197, 24868,
-  813,  5649,  3909, 57200,     1,   445,  7123,     2,   676, 43285,
- 1909, 48230,     1,   204, 47477,     1,  1697, 23463,     1,  1453,
-21574,     3,  2339, 52874,  2683, 42027,  3753, 26797,     2,    30,
-17980,   968, 42152,     1,  2570, 36905,     2,  1944, 61204,  2462,
-24085,     1,  1181, 43168,     2,  2262, 54528,  3542,  8171,     2,
- 1511, 45132,  2163, 29181,     2,   810, 38976,  2438, 49013,     1,
-  383, 61050,     1,  3914, 15057,     1,   364, 61189,     1,   932,
-12792,     1,  3536, 63814,     1,  1923, 60067,     1,  2906,  4244,
-    2,  1686, 30976,  2383, 15569,     1,  1587, 47449,     1,  2700,
-58473,     1,   922,  4403,     2,  1095,  1089,  1237, 56483,     1,
- 1053,  9036,     1,  2495, 41310,     1,   273, 61748,     1,  1820,
-22523,     2,    24, 13785,  2375, 14804,     2,  1229, 59424,  3576,
-46397,     1,  2617, 55736,     1,  2620, 52277,     1,  1721, 40287,
-    2,   854, 45805,  3194, 23340,     1,  2083, 18345,     1,  1614,
-35687,     1,  3303,  6915,     4,   636, 64979,  2193, 55180,  2540,
- 6033,  2855, 53089,     1,  1009, 15122,     3,  1343, 50818,  2251,
-40256,  3799, 54052,     2,   516, 16288,  1378, 25559,     2,   150,
- 4276,  1007, 44949,     2,    23, 63719,  2028, 62873,     1,  1819,
-31227,     1,   738, 15953,     2,   869, 61057,  1279, 33621,     1,
- 3374, 55600,     2,   453, 49225,  2711, 40417,     2,  2773, 44392,
- 4326,  5555,     2,  1934, 46289,  3480,    45,     1,  1363, 59128,
-    1,  2907, 11942,     1,  1866, 21556,     1,   218, 12718,     2,
-  489, 37296,  3838, 43919,     3,   362,  4767,  2046, 27877,  4569,
-61184,     2,   719, 56203,  4594, 61184,     2,  3918, 24893,  4619,
-61184,     1,  4644, 61184,     3,  1196, 32757,  3018, 53608,  4669,
-61184,     1,  4694, 61184,     3,  1590, 59233,  4317, 36838,  4719,
-61184,     2,   675, 13264,   981, 22156,     3,   404,  1515,  1391,
-26505,  1718, 41758,     1,  1176, 55205,     1,    97, 16928,     2,
- 2154, 63181,  3750, 17754,     1,  2903, 55088,     3,  2904, 63661,
- 3290, 29919,  4342,  1284,     1,     2, 46303,     1,  3830, 40322,
-    1,  1335, 17934,     2,  1262, 36416,  3025, 38499,     1,   784,
-27178,     2,   788, 27178,  3310, 23273,     1,  1844, 53066,     1,
-  539,  6688,     1,   432, 49439,     3,    85, 22351,  2067, 62572,
- 3584, 42915,     2,  1695, 59650,  3778, 13525,     1,   511, 47231,
-    3,   284, 49598,  1221, 51902,  2476, 51379,     1,  2126, 48268,
-    1,   165, 27361,     3,    17,  9911,  2884, 39141,  3111, 37955,
-    3,  1395,  3737,  1479, 48315,  1890, 65505,     1,  1621, 37404,
-    2,  1757, 57907,  2594, 20917,     1,  3613, 49321,     2,  1770,
-41462,  2016, 63697,     2,   352, 29281,  1091, 29875,     2,   296,
-52408,  3250, 36122,     2,  1771, 55858,  2090, 60188,     3,  2639,
-53820,  3168, 29538,  3513, 20955,     1,  2719, 31271,     3,   786,
-27178,  2439, 13341,  3599,  2275,     2,   790, 27178,  1704, 42444,
-    2,  1655, 17995,  1910, 53052,     2,  1386, 43602,  2530, 12496,
-    1,  4360, 38968,     3,   853, 45205,  1470, 53751,  3693, 45427,
-    2,  1936, 20093,  3670, 45471,     2,  2935, 38045,  3781,   803,
-    1,  2974, 22489,     3,  2760,  8615,  3706,  9335,  3912, 59418,
-    2,  2716, 51871,  3076,  6443,     3,  2560, 10321,  2718, 36643,
- 3079, 62501,     1,   640, 10307,     1,  1093, 44072,     1,  1970,
-12131,     3,   420, 52765,  1763, 13251,  3047, 64099,     2,  2312,
-20388,  3385, 27154,     1,   246, 19544,     1,  1908, 47068,     1,
- 3063, 21278,     1,  1929, 20085,     2,  1736, 35504,  1799, 38016,
-    1,  1189, 52146,     1,  1573, 26528,     1,  2781, 56075,     3,
-   73, 16808,  1302, 28321,  2388, 43356,     1,   881, 63913,     1,
- 3366, 18304,     2,   568, 47726,  4578,  3100,     2,  1906, 65509,
- 4603,  3100,     1,  4628,  3100,     4,  1459, 65125,  2017, 41987,
- 2465, 58793,  4653,  3100,     2,  1297, 25283,  4678,  3100,     2,
-  357, 13237,  4703,  3100,     3,  1672, 32983,  3159, 29606,  4728,
- 3100,     3,   698, 20914,  1730, 38716,  2298, 18374,     3,   347,
-57571,  1679,  4476,  1816, 14290,     2,  1487, 36728,  2354, 27170,
-    1,  1417, 46443,     1,   642, 52596,     2,   809, 43998,  3198,
-23343,     1,  1544, 33445,     1,  1451, 64325,     1,   309, 19773,
-    1,  2475, 56990,     2,  2115, 58398,  2156, 62719,     2,   100,
- 1686,  3846, 24994,     1,  2728, 17403,     3,  3369, 28535,  3476,
-42834,  3674, 61636,     2,  3682, 36320,  4743, 30283,     2,   646,
-62446,  2955, 55543,     2,   417, 54197,  2675, 53805,     1,  2865,
-32340,     2,  2830, 42752,  3936, 64965,     1,  3962, 64965,     4,
- 1324, 51003,  1351, 15771,  3468,  9702,  3988, 64965,     3,   787,
-36741,  2376, 18920,  4014, 64965,     3,  2098, 56963,  3128, 17244,
- 4040, 64965,     1,  4066, 64965,     1,  4092, 64965,     2,  1935,
-32163,  4118, 64965,     1,   460, 18233,     1,  3305, 65298,     1,
-  132, 41224,     1,  3688, 63308,     1,  1740, 52245,     1,  3905,
-27147,     1,  4139,  7284,     1,  4165,  7284,     2,  4191,  7284,
- 4374, 26403,     5,   480, 23382,  1567, 10044,  2303, 26611,  4217,
- 7284,  4399, 26403,     3,  2418, 30441,  4243,  7284,  4424, 26403,
-    3,  1948, 49054,  4269,  7284,  4449, 26403,     4,  2268,  3266,
- 2367, 31313,  4295,  7284,  4474, 26403,     1,  4499, 26403,     1,
- 4524, 26403,     1,  4549, 26403,     1,  3224, 51354,     1,  2192,
-18075,     2,  1170, 52299,  3119, 38609,     3,   282, 30908,   613,
-35753,  1080,  6490,     1,  2651, 17394,     2,  2324, 11548,  4337,
- 9968,     1,  3540, 13315,     2,  2664, 42294,  3793,  1457,     1,
- 1018, 35960,     2,   696, 64438,  3252, 52082,     1,  2229,  4335,
-    2,  2788, 31147,  2846, 17728,     1,  1015,  6091,     1,   515,
-18957,     1,  2381, 35625,     1,   366, 23318,     2,  2106,  4859,
- 2170,  6090,     1,  3903, 42849,     2,   177,  5789,   580, 57616,
-    1,  1646, 39174,     1,  1525, 31339,     2,   472,   998,  1998,
-28246,     2,  1231, 59183,  3665, 60563,     2,  1874,  4666,  1969,
-59916,     3,  1738, 11316,  1794, 23744,  2606, 52173,     2,  2511,
-42717,  3117, 40602,     2,  2657,  5447,  3067, 18212,     1,  1054,
-55599,     1,  2325, 28869,     1,  2412,   729,     1,  3312, 45682,
-    3,  2051, 64259,  3275, 19355,  3927,  4852,     2,  2124, 23045,
- 3953,  4852,     3,  1857, 34409,  3073,  4772,  3979,  4852,     1,
- 4005,  4852,     2,  1450, 31809,  4031,  4852,     3,   862, 36885,
- 3643, 35008,  4057,  4852,     1,  4083,  4852,     1,  4109,  4852,
-    2,   551, 48463,  1322, 11720,     2,   835, 19139,  2720, 17570,
-    2,  2181, 25363,  2706, 17551,     3,  1576, 26701,  2524, 59626,
- 4135, 29072,     2,  3003, 61654,  4161, 29072,     3,   228, 11459,
- 1635, 45990,  4187, 29072,     3,  1823, 32049,  2982, 50692,  4213,
-29072,     2,  1460, 28532,  4239, 29072,     1,  4265, 29072,     3,
- 2901, 55050,  3698, 28545,  4291, 29072,     1,  1241, 16611,     1,
- 1473, 62248,     1,  3141, 28607,     1,  2128, 56504,     1,  2745,
-17720,     1,  4389, 60918,     1,  4414, 60918,     4,   430, 60835,
- 1206, 55850,  3130, 37699,  4439, 60918,     2,   243, 42267,  4464,
-60918,     2,   747, 18788,  4489, 60918,     1,  4514, 60918,     2,
- 2937, 55036,  4539, 60918,     1,  4564, 60918,     1,   345, 28619,
-    4,   844, 34051,  2096, 18184,  2696, 50966,  3160, 54996,     1,
- 1219, 65372,     2,   704, 22428,   729, 27195,     1,   980, 42939,
-    1,  1960, 24156,     2,  1841, 34929,  3788, 11131,     1,  2056,
-30795,     2,  1023, 49258,  1381, 52017,     3,   725, 26652,  2220,
-64626,  3345, 43235,     1,  3453, 51457,     2,   553,  5400,  2485,
- 7437,     1,   154, 64626,     1,  3094,  8283,     1,  1659,  4704,
-    1,  3481, 10434,     1,  2844,  5616,     2,  1430, 20272,  3455,
-63270,     1,  1268, 42310,     2,  2166, 43816,  3254,  9806,     1,
-  626, 15049,     1,  2397, 40571,     1,  3766, 64549,     3,    57,
-26587,    94, 45178,   155, 63908,     2,  2294, 60879,  3728, 15367,
-    3,    54, 25656,  1958, 23018,  2726, 39060,     1,  1599, 29068,
-    2,     6, 59391,  3925, 55672,     2,   994, 35517,  3951, 55672,
-    3,  2464, 33961,  2860, 45068,  3977, 55672,     1,  4003, 55672,
-    3,   113, 31354,  2080,  2194,  4029, 55672,     2,  1895, 35328,
- 4055, 55672,     2,   497, 25021,  4081, 55672,     4,  3199, 10477,
- 3413, 20501,  3911, 64668,  4107, 55672,     1,  2616, 43725,     1,
- 3227, 40192,     1,  3457, 29566,     1,  1010, 23421,     2,  2896,
-24522,  3330, 57981,     1,  3719, 62596,     1,  4322, 40740,     2,
- 1461, 59275,  2669,  3105,     1,  2041, 62521,     1,  2480, 62607,
-    1,  1982, 17489,     1,  2204, 27516,     4,   188, 43003,   473,
-51618,  1810, 45477,  2179,  7602,     1,   604, 62223,     1,  3182,
-58496,     2,   464, 31537,   774, 64063,     2,   926, 19922,  1805,
-10811,     2,   238, 22594,   278, 23948,     1,  1792, 43025,     2,
- 1553, 31176,  4318, 26662,     1,  3313, 15004,     1,  1252, 37099,
-    2,  1898,  1100,  2551, 50931,     1,  1333, 39439,     1,  1571,
-11029,     3,   878, 36491,  1428, 22888,  3758, 55486,     1,  2659,
-13849,     1,  1990, 44757,     3,  3206, 48476,  3438,  3880,  4582,
-60836,     2,   257, 32233,  4607, 60836,     4,  1028,  1302,  3183,
-32014,  4580, 13728,  4632, 60836,     3,  2183, 31071,  4605, 13728,
- 4657, 60836,     5,  1591, 51390,  2734, 24152,  3238, 39063,  4630,
-13728,  4682, 60836,     2,  4655, 13728,  4707, 60836,     4,   414,
-53447,   781,  5000,  4680, 13728,  4732, 60836,     1,  4705, 13728,
-    2,  1945, 41262,  4730, 13728,     4,    16, 52539,   479, 54702,
-  644, 59975,  3193, 49315,     2,  1475, 65093,  3375,  9037,     4,
-  399, 46021,  2831,  8437,  3084, 57941,  3734, 55304,     1,  1931,
-34669,     2,  2434,  7880,  3332,  5094,     1,    68,   175,     1,
-  198, 27005,     2,  2942, 15447,  3372, 58789,     1,  2197, 55426,
-    2,  2174, 26297,  3807,  7633,     2,  1257, 39980,  1532, 21480,
-    4,   791, 57289,  1332,  1474,  1682, 45965,  2217,  9345,     3,
- 1723, 11105,  2821, 27933,  2853,  2093,     3,    43, 27621,  3798,
-47486,  3850, 33390,     2,  3612,  6036,  3700, 52041,     2,    80,
-24260,  1208, 44765,     2,   526, 22684,  3841, 39687,     2,  2101,
-31628,  3015, 48448,     1,   777, 62825,     1,   176, 35084,     1,
-  789, 55116,     2,  3827, 13184,  3876, 16959,     1,  1352, 45275,
-    1,  3681,  3744,     2,  3099, 20169,  3747, 11488,     2,   348,
-61388,  1776, 61025,     1,  1592, 16615,     1,  1561, 51326,     1,
- 4329, 59443,     1,  3074,  6834,     1,  1085, 52437,     1,    78,
-36106,     1,   621, 40150,     2,  1602, 42586,  4331, 58506,     1,
-   79, 24488,     1,  2110, 25566,     1,  3745,  6115,     1,   943,
-32283,     1,  1040, 13266,     1,  1625, 61175,     2,   589, 65534,
- 2833, 55405,     1,  1408, 28357,     2,   478, 60018,  2827, 24195,
-    2,  1161, 65310,  4363, 60808,     2,   834, 31658,  1920, 21856,
-    3,  2509, 37355,  2681,  3214,  4142, 50172,     2,    48, 60808,
- 4168, 50172,     3,   673, 15085,  2602, 36351,  4194, 50172,     3,
- 2414, 13492,  2759, 32181,  4220, 50172,     1,  4246, 50172,     2,
- 1808, 54846,  4272, 50172,     2,  1893, 61478,  4298, 50172,     1,
- 2795, 30805,     1,  1595, 61432,     1,   762, 49302,     2,   907,
-59459,  3078,  3325,     1,   603, 62231,     1,  2237,  9064,     1,
- 1519, 44223,     2,   142, 49255,   552,  6251,     2,  1328, 26821,
- 2342, 20087,     1,  2212, 16575,     2,  3768,  1430,  3819,   411,
-    3,    13, 57660,  1144, 57838,  3486,  8105,     1,  3410, 25582,
-    1,  1482, 63800,     2,   268, 64728,  2555, 60876,     1,  3695,
-10542,     2,  2908, 13568,  3610,  6135,     2,   857, 42151,  3437,
-55601,     1,   956, 58539,     1,  2025,  8092,     1,   392, 18430,
-    1,  1530, 11343,     1,   457, 11988,     2,   763, 49302,  2131,
-47401,     1,   547, 37451,     1,   983, 26558,     2,   618, 38885,
-  972, 58177,     1,  1933, 16423,     1,  1883, 36825,     1,  1728,
- 1062,     2,  3379, 57949,  4145, 38764,     3,   837, 17890,  1194,
- 6398,  4171, 38764,     1,  4197, 38764,     6,    53, 26455,  1205,
-38217,  1729, 39122,  3501, 40942,  3654, 57750,  4223, 38764,     1,
- 4249, 38764,     2,  1513,  4048,  4275, 38764,     2,  1543,  9729,
- 4301, 38764,     3,  1107, 41572,  1444, 34190,  4572,  7917,     1,
- 4597,  7917,     2,  3898, 36135,  4622,  7917,     2,  3072, 17234,
- 4647,  7917,     4,   306, 36444,   648, 16610,  1803,  6420,  4672,
- 7917,     4,   709, 48056,  1806,  3362,  3234, 19045,  4697,  7917,
-    1,  4722,  7917,     2,   271, 29701,  3756, 27087,     1,  2622,
-49557,     1,   456, 17896,     1,  3832, 26703,     1,   508, 47018,
-    1,  3469, 31596,     1,  3404, 52352,     1,  3894, 64092,     2,
- 2672, 11534,  2714, 43291,     2,   175, 12513,  3919,  7212,     1,
- 3470, 64240,     1,   311, 59172,     1,   677, 45227,     1,  2058,
-55543,     3,  2022, 46038,  3121, 50731,  3460, 19208,     2,  1873,
-  622,  2822, 46988,     2,   353, 16232,  1849, 64423,     2,   800,
-44392,  3567,  5275,     2,   645, 47045,  2421, 45414,     2,   875,
-55222,   880, 21013,     1,  1754,  5848,     2,  1029, 27280,  2739,
-39677,     1,  1253, 12991,     1,    71,  4988,     2,  2305, 65362,
- 2886, 44622,     2,   564, 10615,  1415, 14601,     1,  2374, 27846,
-    1,  1466, 58506,     1,  1760, 23081,     1,  2521, 61438,     1,
-   84, 36249,     4,   108, 59717,  1476, 58589,  2698, 64582,  3195,
-23340,     1,   634, 43560,     1,  3133, 54198,     1,  1583, 19933,
-    3,  1550, 53755,  3081, 30822,  3580,   535,     1,   544, 16900,
-    2,   699,  4512,  2038, 57860,     2,   178,  5986,  3620, 23999,
-    1,  2301, 12837,     1,  1940, 49970,     2,   628,  1140,  3108,
-28019,     1,  1834, 44625,     2,  2927,  7885,  3426, 54010,     1,
- 2405, 58703,     1,  2490, 45704,     1,  2177, 11209,     1,  1494,
-30780,     1,  1946, 52507,     1,   658, 18283,     3,   492, 18862,
-  947, 16776,  2285, 38215,     3,   687, 59921,  1872, 14696,  2610,
-42866,     1,   283, 64742,     1,  3668,   780,     2,  2641, 55178,
- 4366,  7276,     4,   110, 40205,  1698, 16758,  2568, 61555,  4391,
- 7276,     3,   708,  7829,  3212, 11696,  4416,  7276,     1,  4441,
- 7276,     1,  4466,  7276,     1,  4491,  7276,     2,  3869, 33796,
- 4516,  7276,     1,  4541,  7276,     2,   710, 44158,  2746,  5490,
-    1,  1454,  6904,     2,    90, 41933,   250, 44713,     2,   570,
-12175,   860, 42920,     2,   801, 63355,  1403,  9183,     1,  1865,
-20058,     1,  1884, 52675,     2,  1019, 49337,  3727, 36661,     1,
- 1855, 18019,     2,  1624, 50063,  2352, 39761,     1,   195, 37349,
-    2,  1800, 57327,  1966,  5877,     1,  2009, 20522,     2,   627,
-40693,  3533, 46354,     1,  2474, 63403,     2,  3235, 48530,  3403,
-46473,     1,     0,  7644,     2,  1716,  3207,  1836, 25034,     3,
- 1350, 60379,  1421,  1549,  1699, 17276,     4,  1340, 33519,  1593,
-42321,  3422,  2900,  4587, 19477,     2,  2987, 20001,  4612, 19477,
-    2,  1783, 44422,  4637, 19477,     3,  2504, 26159,  2805, 47425,
- 4662, 19477,     2,   703, 15833,  4687, 19477,     1,  4712, 19477,
-    1,  4737, 19477,     1,   463, 25647,     1,  4566, 43531,     1,
- 4591, 43531,     1,  4616, 43531,     2,   957, 38259,  4641, 43531,
-    2,   475, 14563,  4666, 43531,     2,  1227, 47174,  4691, 43531,
-    2,  1846, 51519,  4716, 43531,     2,   443,   566,  3371, 14509,
-    1,  3583, 26647,     3,   517, 35819,   967, 46840,  2730,  2935,
-    3,  1259, 35606,  1643, 54555,  3190, 61208,     1,  1304, 62771,
-    5,   135, 17129,   247, 47768,   330, 19697,   373, 55050,   987,
- 5079,     2,   924, 60229,  2231, 26786,     1,  2958,  9911,     1,
- 1148, 33108,     3,   689,  9387,  3529,  7993,  3822, 26112,     2,
- 2950, 27341,  3383, 33841,     3,   156, 53073,  2794, 21033,  3609,
- 6194,     2,   614, 24074,  3888, 40674,     2,  2733, 18922,  3796,
-16310,     1,  3762, 24843,     1,  1892, 10913,     1,  3397, 38989,
-    3,   574, 27824,  2768, 14947,  2792, 44312,     3,   701, 40146,
- 2404,  9678,  2909, 64474,     1,    42, 24074,     2,   412, 32566,
- 2600,  8269,     3,  1574, 21282,  3225, 53760,  4747, 26805,     1,
- 1603, 41117,     1,   647, 32733,     1,   485, 61418,     1,  1773,
-29620,     1,  2122, 26927,     1,  1111, 13636,     3,  1937, 57413,
- 3616,  8404,  3757, 37244,     3,   431, 37813,  1008, 28955,  3308,
-24389,     1,   720,  8994,     1,   776,  4843,     2,  1779, 57942,
- 1965, 21275,     1,  1651, 57245,     1,  1563,  1041,     1,  3087,
-38438,     1,   256,  2928,     1,   711, 58359,     1,  2379, 49169,
-    2,  1245, 46678,  2569, 63238,     1,  1058, 29764,     1,  4585,
-35274,     1,  4610, 35274,     1,  4635, 35274,     2,  2825,  1727,
- 4660, 35274,     1,  4685, 35274,     2,  1522, 49889,  4710, 35274,
-    1,  4735, 35274,     2,  1537,  3087,  3358, 56148,     1,  1411,
-47683,     1,   236,  7144,     1,  1309, 63534,
+const unsigned short DictKeyHashTable[] = {
+ 4096,  4097,  4100,  4096,  4103,  4096,  4106,  4096,  4109,  4112,
+ 4115,  4118,  4121,  4096,  4096,  4096,  4124,  4127,  4130,  4133,
+ 4136,  4141,  4144,  4096,  4147,  4096,  4096,  4152,  4155,  4158,
+ 4096,  4163,  4166,  4171,  4096,  4174,  4096,  4177,  4096,  4180,
+ 4185,  4190,  4193,  4096,  4198,  4096,  4096,  4201,  4096,  4208,
+ 4213,  4096,  4220,  4223,  4228,  4233,  4096,  4236,  4096,  4239,
+ 4242,  4096,  4096,  4245,  4096,  4096,  4248,  4251,  4254,  4259,
+ 4096,  4262,  4267,  4270,  4275,  4096,  4278,  4283,  4286,  4096,
+ 4096,  4096,  4096,  4096,  4096,  4293,  4096,  4296,  4307,  4096,
+ 4096,  4310,  4315,  4096,  4096,  4318,  4096,  4321,  4096,  4326,
+ 4096,  4329,  4332,  4335,  4096,  4338,  4341,  4350,  4355,  4358,
+ 4365,  4370,  4377,  4382,  4389,  4392,  4399,  4402,  4407,  4410,
+ 4413,  4420,  4423,  4430,  4435,  4444,  4451,  4454,  4457,  4096,
+ 4096,  4462,  4096,  4469,  4472,  4477,  4482,  4096,  4096,  4096,
+ 4096,  4096,  4485,  4492,  4096,  4096,  4495,  4504,  4507,  4096,
+ 4096,  4512,  4515,  4520,  4527,  4532,  4535,  4096,  4542,  4096,
+ 4545,  4550,  4557,  4560,  4563,  4096,  4096,  4096,  4568,  4096,
+ 4096,  4096,  4571,  4580,  4096,  4583,  4586,  4096,  4591,  4596,
+ 4096,  4096,  4096,  4599,  4096,  4096,  4096,  4604,  4607,  4096,
+ 4096,  4616,  4096,  4619,  4622,  4625,  4630,  4096,  4096,  4096,
+ 4633,  4636,  4639,  4642,  4647,  4650,  4659,  4096,  4664,  4096,
+ 4096,  4667,  4096,  4096,  4670,  4673,  4096,  4676,  4096,  4096,
+ 4681,  4684,  4096,  4096,  4689,  4694,  4699,  4702,  4711,  4718,
+ 4725,  4732,  4737,  4744,  4749,  4754,  4096,  4096,  4761,  4768,
+ 4096,  4771,  4776,  4096,  4779,  4096,  4782,  4787,  4792,  4799,
+ 4806,  4811,  4820,  4827,  4836,  4096,  4096,  4096,  4841,  4848,
+ 4096,  4851,  4856,  4859,  4096,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096,  4862,  4096,  4096,  4865,  4868,  4875,  4882,  4885,
+ 4888,  4096,  4893,  4096,  4096,  4896,  4096,  4899,  4902,  4905,
+ 4096,  4096,  4908,  4913,  4922,  4925,  4930,  4935,  4940,  4947,
+ 4956,  4961,  4964,  4969,  4972,  4096,  4975,  4978,  4096,  4981,
+ 4984,  4991,  4994,  4096,  4999,  5002,  5005,  5010,  5015,  5022,
+ 5027,  5032,  5039,  5046,  5057,  5062,  5069,  4096,  4096,  4096,
+ 5074,  5077,  5080,  5085,  5088,  4096,  5091,  5096,  4096,  5099,
+ 4096,  5102,  5105,  5108,  4096,  5115,  4096,  4096,  4096,  4096,
+ 5118,  4096,  5125,  5128,  5135,  5138,  5143,  5146,  4096,  5151,
+ 5154,  4096,  5157,  5160,  5163,  4096,  5170,  5175,  5180,  5183,
+ 5186,  5191,  5198,  4096,  5201,  4096,  5204,  5207,  4096,  5210,
+ 5213,  5220,  4096,  5223,  4096,  5228,  4096,  4096,  5231,  5236,
+ 4096,  5239,  5242,  4096,  5249,  4096,  5252,  5257,  4096,  5260,
+ 5263,  5268,  4096,  5273,  5278,  5281,  5284,  5287,  5292,  4096,
+ 5295,  5302,  4096,  5305,  4096,  4096,  5314,  5317,  5322,  5327,
+ 5334,  5337,  5342,  5351,  5354,  5357,  5360,  5363,  5366,  5371,
+ 5374,  5379,  5384,  4096,  5387,  4096,  5390,  5393,  4096,  5396,
+ 4096,  5399,  5404,  4096,  5407,  4096,  5412,  5417,  4096,  5422,
+ 5425,  5430,  5435,  4096,  4096,  5442,  5445,  5450,  5455,  5462,
+ 5465,  5470,  5475,  5478,  4096,  5481,  4096,  5484,  5491,  5494,
+ 4096,  4096,  4096,  4096,  4096,  4096,  5497,  4096,  5500,  5503,
+ 5510,  5517,  5524,  5529,  5532,  4096,  5539,  4096,  4096,  5542,
+ 5545,  4096,  4096,  5548,  5551,  5556,  5559,  4096,  4096,  5562,
+ 4096,  5565,  4096,  5570,  5575,  5578,  4096,  5581,  5586,  5591,
+ 4096,  5596,  5601,  4096,  5604,  5609,  4096,  5614,  5617,  4096,
+ 5620,  5623,  5628,  5633,  5638,  5643,  5650,  5655,  5662,  5669,
+ 5674,  5681,  5686,  5695,  5700,  5705,  5708,  5711,  4096,  4096,
+ 5714,  5723,  5728,  5731,  5736,  5739,  4096,  5744,  5747,  5750,
+ 5753,  4096,  5756,  5759,  5762,  5769,  5778,  5785,  5790,  5793,
+ 5798,  5801,  4096,  5808,  5813,  5818,  5821,  5824,  5829,  5834,
+ 5837,  5840,  5849,  5856,  5863,  5868,  4096,  5871,  4096,  4096,
+ 5876,  5879,  4096,  5882,  4096,  5889,  5892,  5895,  4096,  5898,
+ 5901,  5904,  5909,  4096,  5912,  5915,  5918,  5921,  4096,  5926,
+ 4096,  4096,  5929,  4096,  4096,  5934,  4096,  5937,  5940,  5943,
+ 5946,  5949,  5952,  4096,  5955,  5960,  4096,  4096,  4096,  4096,
+ 5967,  4096,  5974,  4096,  5977,  5982,  5985,  4096,  5988,  5995,
+ 6000,  6003,  6008,  6013,  6018,  6021,  6028,  4096,  4096,  6033,
+ 6036,  6039,  4096,  6042,  6045,  4096,  6050,  4096,  4096,  6053,
+ 4096,  4096,  6058,  6063,  4096,  6066,  6071,  4096,  6076,  4096,
+ 6081,  6084,  6089,  4096,  6096,  6099,  4096,  6102,  6107,  6112,
+ 6115,  4096,  6118,  4096,  6121,  6124,  6131,  6134,  4096,  4096,
+ 6137,  4096,  4096,  6140,  6143,  4096,  6146,  6153,  6156,  6159,
+ 6164,  4096,  6167,  6172,  6175,  6178,  6183,  6186,  4096,  4096,
+ 6189,  6194,  6197,  6200,  6205,  6208,  4096,  4096,  6213,  4096,
+ 6218,  6221,  4096,  6224,  4096,  6229,  4096,  4096,  6234,  4096,
+ 6239,  6244,  4096,  6247,  4096,  4096,  4096,  6252,  4096,  6255,
+ 6260,  4096,  4096,  6263,  6266,  6273,  6276,  6291,  6294,  6299,
+ 6304,  6315,  6320,  6325,  6328,  6333,  6340,  4096,  6345,  6350,
+ 6353,  4096,  6356,  4096,  4096,  4096,  6359,  6362,  6365,  4096,
+ 6368,  6373,  6376,  6381,  6386,  6393,  4096,  4096,  6398,  4096,
+ 4096,  6403,  4096,  4096,  4096,  4096,  6406,  4096,  6413,  6420,
+ 4096,  4096,  4096,  6423,  4096,  6428,  6433,  6440,  6443,  6448,
+ 6451,  6454,  4096,  6459,  6462,  6467,  6470,  6477,  4096,  4096,
+ 6480,  6487,  6492,  4096,  4096,  4096,  4096,  6495,  4096,  4096,
+ 6498,  6501,  4096,  4096,  4096,  4096,  6504,  4096,  4096,  4096,
+ 6507,  6510,  6515,  4096,  4096,  6518,  4096,  6521,  6526,  6531,
+ 6534,  6537,  6540,  6543,  6548,  6551,  6554,  6557,  6560,  6563,
+ 6568,  6573,  6578,  6581,  4096,  6584,  6587,  6594,  6597,  4096,
+ 6600,  6603,  6608,  4096,  4096,  6611,  4096,  4096,  4096,  4096,
+ 6618,  6623,  4096,  4096,  6628,  4096,  4096,  6631,  4096,  4096,
+ 6634,  6639,  6644,  4096,  6647,  6652,  6655,  6660,  6671,  6674,
+ 6679,  6682,  4096,  6685,  4096,  4096,  6688,  4096,  4096,  4096,
+ 6693,  6696,  4096,  4096,  6703,  6706,  6709,  6712,  6715,  6720,
+ 6723,  4096,  4096,  6726,  4096,  6729,  6732,  6737,  4096,  6740,
+ 4096,  6745,  6750,  4096,  6755,  4096,  6762,  4096,  4096,  6767,
+ 4096,  4096,  4096,  4096,  6774,  6777,  6780,  4096,  6783,  6786,
+ 4096,  6791,  6794,  6803,  4096,  6806,  6809,  4096,  6812,  6819,
+ 6822,  4096,  6825,  6830,  6835,  6838,  6845,  6850,  6855,  6864,
+ 6867,  6870,  6875,  6882,  6889,  6892,  6899,  4096,  6902,  6905,
+ 6908,  6915,  6920,  4096,  4096,  6927,  6930,  6935,  6940,  6945,
+ 6950,  6953,  6962,  4096,  4096,  6967,  4096,  6970,  4096,  6973,
+ 6976,  6979,  6982,  4096,  6985,  6988,  6995,  6998,  7001,  4096,
+ 7004,  7009,  7012,  7015,  7018,  4096,  7025,  7032,  7041,  7044,
+ 7047,  7050,  7053,  7056,  7061,  7068,  7073,  7080,  7085,  7088,
+ 4096,  7091,  7102,  7105,  4096,  7108,  7111,  7116,  7119,  7122,
+ 7127,  7132,  7135,  7138,  7141,  4096,  7144,  7149,  7152,  7155,
+ 7160,  7167,  7170,  4096,  7173,  7178,  7183,  4096,  4096,  7186,
+ 7191,  7194,  4096,  7201,  7206,  7209,  4096,  4096,  4096,  7216,
+ 4096,  4096,  4096,  4096,  7221,  7224,  4096,  7229,  7240,  4096,
+ 4096,  7245,  4096,  4096,  4096,  4096,  7250,  7259,  7266,  7271,
+ 7278,  7283,  7288,  7291,  4096,  4096,  7296,  7299,  7302,  7305,
+ 7308,  7311,  4096,  4096,  4096,  7314,  7317,  7320,  4096,  7325,
+ 4096,  4096,  7330,  4096,  7333,  7338,  7341,  7344,  7347,  4096,
+ 4096,  7350,  4096,  7359,  7364,  7367,  7370,  4096,  7375,  7378,
+ 4096,  4096,  4096,  4096,  7381,  4096,  7384,  7387,  7394,  4096,
+ 7397,  7408,  7413,  7420,  7423,  7426,  7431,  7436,  7439,  7442,
+ 7447,  7450,  7453,  4096,  7456,  7465,  7468,  7471,  7474,  7477,
+ 7482,  7485,  7490,  4096,  7493,  4096,  4096,  4096,  7496,  7499,
+ 7502,  4096,  7511,  7516,  4096,  7523,  7530,  7537,  7542,  7551,
+ 7554,  7557,  4096,  7562,  7569,  7572,  4096,  7577,  7580,  4096,
+ 7583,  4096,  7590,  7597,  7600,  7607,  4096,  7610,  4096,  7615,
+ 4096,  4096,  7618,  7621,  4096,  7626,  7629,  7632,  4096,  7635,
+ 7640,  4096,  4096,  4096,  7643,  7646,  7649,  4096,  7652,  4096,
+ 7655,  4096,  7658,  7663,  7666,  7669,  4096,  7674,  4096,  7677,
+ 4096,  4096,  4096,  7684,  7689,  7692,  7695,  4096,  7698,  7701,
+ 7706,  7711,  7716,  7723,  7728,  7733,  7742,  7747,  7754,  7759,
+ 7768,  4096,  4096,  4096,  7775,  7780,  7787,  7794,  7799,  7812,
+ 7817,  7822,  4096,  4096,  7825,  7830,  7833,  7836,  7839,  7842,
+ 7845,  4096,  4096,  4096,  7848,  7851,  7854,  7857,  4096,  7860,
+ 4096,  7863,  7870,  7873,  4096,  4096,  4096,  7878,  7881,  4096,
+ 7888,  7895,  7898,  7901,  7908,  7915,  4096,  4096,  4096,  7918,
+ 7921,  4096,  4096,  4096,  7926,  7931,  7934,  7939,  7942,  4096,
+ 4096,  7945,  7948,  7951,  4096,  7954,  7957,  4096,  4096,  7962,
+ 7965,  7968,  7977,  7984,  7989,  7994,  7999,  8002,  8013,  4096,
+ 4096,  8018,  8021,  8024,  8027,  8030,  8033,  8036,  4096,  8041,
+ 8046,  8049,  4096,  8056,  4096,  8061,  8064,  8069,  8072,  8079,
+ 8084,  8091,  8094,  8099,  8104,  8109,  8114,  8119,  4096,  4096,
+ 8122,  4096,  8129,  8132,  8135,  8138,  8143,  8150,  8155,  4096,
+ 4096,  4096,  4096,  8158,  8161,  4096,  8164,  4096,  4096,  8167,
+ 8174,  8181,  4096,  4096,  8184,  8187,  8190,  8193,  8198,  4096,
+ 4096,  8205,  8208,  8213,  8216,  4096,  8221,  4096,  8224,  8229,
+ 8232,  4096,  8235,  8238,  8243,  8246,  8249,  8256,  4096,  8261,
+ 8264,  4096,  8267,  8272,  8277,  8282,  8285,  4096,  8290,  8293,
+ 8296,  4096,  8299,  8302,  8307,  8312,  8315,  8318,  4096,  8321,
+ 8324,  8327,  8332,  8335,  4096,  8338,  4096,  8345,  8348,  4096,
+ 8351,  8360,  8365,  8368,  8375,  8380,  8383,  4096,  8388,  8391,
+ 8396,  8399,  4096,  4096,  8404,  8409,  8412,  4096,  8415,  8420,
+ 4096,  4096,  8423,  8428,  8431,  8440,  8445,  8448,  8451,  8454,
+ 4096,  8457,  8462,  8465,  4096,  8470,  8475,  4096,  8478,  8481,
+ 8484,  8487,  8490,  8493,  8496,  8501,  8508,  8511,  8516,  4096,
+ 8519,  4096,  8522,  8525,  4096,  4096,  4096,  4096,  8528,  8531,
+ 8536,  8539,  4096,  8542,  8547,  8550,  8555,  8560,  4096,  8567,
+ 8570,  4096,  4096,  8573,  4096,  8576,  4096,  8583,  8590,  8597,
+ 8600,  8605,  8608,  8613,  8622,  8625,  8634,  8639,  8648,  8651,
+ 8662,  8669,  8674,  8677,  8682,  8685,  8688,  8691,  4096,  8694,
+ 4096,  4096,  8697,  4096,  8700,  8707,  8712,  8717,  8720,  8723,
+ 8726,  8729,  8732,  8735,  4096,  8744,  8747,  4096,  4096,  8750,
+ 8753,  4096,  4096,  8756,  8761,  8766,  4096,  8769,  8772,  8779,
+ 8786,  8789,  4096,  4096,  4096,  8792,  4096,  8795,  8798,  8803,
+ 8808,  8815,  4096,  4096,  8822,  8829,  8832,  8835,  4096,  8838,
+ 8841,  8846,  8853,  8860,  8863,  8866,  8873,  4096,  8876,  4096,
+ 8879,  4096,  8882,  4096,  8885,  8890,  8895,  8898,  4096,  8901,
+ 8908,  8913,  8916,  8921,  8930,  8933,  8938,  8943,  8954,  8957,
+ 8966,  4096,  4096,  8971,  4096,  8974,  8983,  4096,  8990,  8993,
+ 8998,  9001,  9004,  4096,  9009,  9012,  9017,  9020,  9023,  9026,
+ 4096,  9029,  9034,  9041,  4096,  4096,  9044,  9047,  9050,  9053,
+ 9056,  4096,  9059,  9062,  9065,  9068,  4096,  9071,  9074,  4096,
+ 9077,  9080,  4096,  4096,  9083,  9086,  9091,  9094,  9099,  9102,
+ 9105,  9108,  9111,  9116,  4096,  4096,  9121,  4096,  9124,  9127,
+ 9130,  9133,  4096,  4096,  9136,  9145,  9148,  9151,  9154,  9159,
+ 9162,  9167,  9172,  4096,  9175,  4096,  9178,  9181,  9184,  9187,
+ 9194,  9203,  9206,  4096,  4096,  4096,  9211,  9214,  4096,  9219,
+ 9222,  9227,  9230,  9233,  9236,  9243,  9246,  9249,  9252,  9255,
+ 4096,  9258,  4096,  4096,  9261,  9264,  4096,  9267,  9270,  9275,
+ 9278,  9281,  9286,  9289,  9292,  9301,  9304,  4096,  4096,  9307,
+ 9310,  9313,  9316,  9321,  9326,  9329,  9340,  9345,  4096,  9350,
+ 9353,  9356,  9363,  9366,  9373,  9378,  9381,  4096,  4096,  4096,
+ 4096,  9384,  9387,  9394,  9399,  9402,  4096,  9407,  9412,  9415,
+ 9418,  9423,  9426,  9429,  9434,  9437,  9442,  4096,  9447,  4096,
+ 9450,  4096,  9453,  4096,  9458,  9461,  4096,  9466,  9469,  9474,
+ 9479,  4096,  9484,  4096,  9489,  4096,  9494,  9499,  4096,  9506,
+ 9509,  9512,  4096,  4096,  9517,  9520,  9523,  9532,  9535,  9540,
+ 9543,  9546,  4096,  9549,  9554,  9559,  9564,  9567,  9576,  9581,
+ 9590,  9597,  9606,  9613,  9620,  9625,  9628,  9631,  9636,  9639,
+ 9642,  9647,  9652,  9659,  9668,  9677,  9682,  9689,  9692,  9699,
+ 4096,  9702,  9707,  4096,  9710,  4096,  4096,  4096,  9715,  4096,
+ 4096,  9722,  4096,  9725,  9734,  9739,  4096,  9746,  4096,  9749,
+ 4096,  9754,  9761,  4096,  4096,  9766,  9769,  9772,  9777,  9780,
+ 9783,  9786,  9793,  9796,  4096,  4096,  9801,  9804,  9809,  4096,
+ 9812,  4096,  9815,  9818,  9825,  9828,  9831,  9834,  9839,  9842,
+ 9845,  4096,  9848,  9853,  9856,  4096,  4096,  9863,  4096,  4096,
+ 4096,  9870,  9873,  9878,  4096,  9881,  4096,  4096,  4096,  9886,
+ 4096,  4096,  9889,  4096,  4096,  4096,  9892,  9895,  9898,  9901,
+ 9904,  4096,  4096,  9907,  4096,  4096,  4096,  9912,  4096,  9915,
+ 9918,  4096,  9921,  9928,  9933,  9940,  9945,  9954,  9961,  9964,
+ 9969,  9972,  9979,  4096,  9982,  9985,  9990,  4096,  4096,  9993,
+10002, 10005, 10008, 10011, 10014, 10019, 10028, 10031, 10036, 10039,
+10044, 10047, 10050, 10055,  4096,  4096, 10058,  4096,  4096,  4096,
+ 4096,  4096, 10063, 10068, 10071, 10074, 10077,  4096, 10080, 10085,
+ 4096, 10088, 10091,  4096,  4096,  4096,  4096,  4096, 10098,  4096,
+ 4096, 10101, 10104, 10107, 10112, 10115, 10120, 10125, 10128,  4096,
+10131,  4096,  4096, 10134, 10137, 10140,  4096, 10143, 10146, 10157,
+10160, 10165, 10170, 10175, 10180, 10187, 10192, 10199, 10202, 10205,
+10210, 10221, 10224, 10229,  4096, 10232,  4096,  4096, 10235,  4096,
+10238, 10241, 10246, 10253, 10260, 10263, 10266, 10269, 10278, 10281,
+ 4096,  4096, 10286,  4096,  4096, 10289, 10292, 10295, 10300, 10303,
+10306, 10311,  4096,  4096,  4096, 10316, 10319, 10322, 10325,  4096,
+ 4096,  4096,  4096, 10332, 10337,  4096, 10344, 10349, 10354, 10359,
+ 4096, 10364, 10367,  4096, 10374, 10377, 10380,  4096, 10387, 10394,
+10397, 10400, 10407, 10410, 10413, 10420, 10427,  4096,  4096, 10430,
+10435, 10442,  4096, 10447, 10450, 10455, 10458, 10465,  4096, 10470,
+10477, 10480, 10483,  4096,  4096, 10486, 10489, 10494, 10497, 10500,
+ 4096, 10507, 10510, 10513, 10516, 10521,  4096, 10528, 10531,  4096,
+10534, 10537, 10544, 10547, 10554, 10557, 10562, 10565, 10570, 10573,
+10580,  4096,  4096, 10583, 10586, 10589, 10596,  4096,  4096, 10599,
+10604, 10611,  4096, 10614, 10619, 10622, 10627,  4096, 10634, 10637,
+ 4096, 10640, 10643, 10648, 10653, 10660, 10663, 10666, 10669, 10676,
+ 4096, 10681, 10688, 10691,  4096, 10694, 10697,  4096, 10702, 10707,
+10712,  4096,  4096, 10717,  4096, 10720,  4096, 10725, 10728,  4096,
+10731, 10734, 10739, 10742, 10749, 10754, 10761,  4096, 10766,  4096,
+10769,  4096, 10776, 10779,  4096,  4096,  4096, 10782, 10789,  4096,
+ 4096, 10792, 10797, 10800,  4096, 10803, 10808,  4096, 10811,  4096,
+ 4096,  4096,  4096, 10814, 10817, 10820, 10823, 10826, 10829, 10832,
+ 4096, 10835, 10838, 10841,  4096, 10848,  4096, 10851, 10854, 10859,
+10864, 10867, 10872, 10875, 10880, 10883,  4096, 10892,  4096, 10897,
+ 4096,  4096, 10900, 10905,  4096, 10908, 10915, 10918, 10923,  4096,
+10930,  4096,  4096, 10933,  4096, 10936, 10947, 10952, 10959,  4096,
+10964,  4096,  4096, 10967,  4096, 10970, 10975, 10978,  4096, 10981,
+ 4096, 10984,  4096, 10987, 10992, 10995, 11000,  4096, 11005, 11008,
+11011, 11014, 11023, 11026, 11029, 11034, 11037, 11044, 11053, 11056,
+11063, 11068, 11071, 11076, 11079,  4096,  4096,  4096, 11082,  4096,
+11085, 11088,  4096, 11093,  4096, 11098, 11101,  4096,  4096,  4096,
+11108,  4096, 11111, 11116,  4096, 11121,  4096, 11126,  4096, 11129,
+11134,  4096, 11137, 11140, 11145, 11158, 11163, 11168, 11175, 11180,
+11183, 11192, 11197, 11200, 11205, 11210, 11213,  4096, 11216, 11225,
+11228, 11233, 11236, 11239, 11244, 11247, 11250, 11255, 11258, 11263,
+11268, 11273, 11276, 11281, 11284,  4096, 11289,  4096,  4096, 11294,
+11299, 11302,  4096, 11307, 11310,  4096, 11313, 11318, 11321,  4096,
+11324, 11331, 11338, 11343, 11348, 11355, 11364, 11371, 11376, 11383,
+11386, 11389, 11394,  4096, 11397,  4096, 11400, 11403, 11406, 11409,
+11418, 11425, 11428, 11433, 11436, 11439,  4096, 11444, 11449, 11452,
+ 4096, 11455, 11458, 11463, 11466, 11471, 11474, 11481, 11484, 11489,
+11494, 11499, 11504, 11507, 11514, 11519, 11522, 11529, 11532, 11537,
+ 4096, 11542, 11549, 11552, 11559, 11562, 11567, 11574, 11581,  4096,
+11586,  4096, 11589, 11598, 11603, 11606, 11609, 11612, 11617, 11622,
+ 4096,  4096, 11627, 11630, 11633, 11636, 11645, 11648, 11651, 11662,
+11667, 11670,  4096, 11675, 11678,  4096, 11683,  4096, 11688,  4096,
+11693, 11696,  4096, 11701,  4096, 11704,  4096,  4096, 11709, 11714,
+11717,  4096, 11722, 11725,  4096, 11730, 11733, 11740, 11743,  4096,
+11746, 11749,  4096,  4096, 11754,  4096,  4096, 11759, 11762, 11765,
+11772, 11781, 11784, 11787, 11794, 11797, 11806, 11809, 11814, 11819,
+11822, 11825, 11828,  4096,  4096, 11833,  4096, 11836, 11845,  4096,
+ 4096,  4096, 11850, 11855,  4096,  4096, 11858, 11861, 11864, 11867,
+ 4096,  4096, 11870, 11875, 11878,  4096, 11885, 11892,  4096, 11897,
+11902,  4096,  4096,  4096, 11905, 11914,  4096,  4096,  4096, 11921,
+ 4096, 11926,  4096, 11929, 11932, 11935,  4096, 11938,  4096,  4096,
+11941, 11944, 11947,  4096, 11952,  4096, 11957,  4096, 11960,  4096,
+ 4096,  4096,  4096, 11963, 11968, 11971,  4096,  4096, 11974, 11977,
+11980,  4096,  4096, 11983, 11986,  4096, 11991,  4096,  4096, 11994,
+ 4096, 11999,  4096, 12004, 12007, 12012, 12017, 12024, 12027, 12030,
+12035, 12038,  4096, 12043, 12046,  4096,  4096,  4096, 12049,  4096,
+12056,  4096,  4096,  4096,  4096,  4096, 12067, 12076, 12079,  4096,
+12084, 12087, 12090,  4096,  4096,  4096, 12093, 12098, 12103, 12106,
+12109, 12112, 12117,  4096,  4096,  4096, 12122,  4096, 12125, 12130,
+12133, 12136,  4096,  4096,  4096,  4096, 12139, 12142,  4096, 12145,
+12148,  4096,  4096, 12155, 12162, 12167,  4096, 12172,  4096,  4096,
+12175, 12180,  4096,  4096,  4096, 12183, 12186, 12189, 12194, 12197,
+12200, 12203, 12206, 12209,  4096,  4096, 12212, 12215,  4096,  4096,
+12218, 12225, 12228,  4096,  4096,  4096,  4096, 12233, 12238,  4096,
+12241, 12244, 12249, 12252, 12261, 12268, 12271,  4096,  4096, 12278,
+ 4096, 12283,  4096, 12286, 12289,  4096, 12294,  4096, 12299,  4096,
+12302,  4096,  4096,  4096, 12307, 12310,  4096, 12315, 12318, 12325,
+12330, 12333, 12340,  4096,  4096, 12347, 12352, 12355, 12362, 12367,
+12372, 12375, 12378, 12383, 12388, 12391,  4096, 12394, 12399, 12402,
+ 4096, 12405, 12410,  4096, 12413,  4096, 12420, 12423,  4096, 12426,
+12437, 12446, 12449, 12456, 12459, 12466, 12469, 12472,  4096, 12477,
+12484, 12487, 12490, 12497,  4096, 12500, 12503, 12506, 12509,  4096,
+12512, 12515, 12518, 12523, 12530, 12533, 12538, 12545, 12552, 12559,
+12564, 12569, 12574, 12579,  4096, 12582,  4096, 12585, 12590,  4096,
+ 4096,  4096, 12595,  4096,  4096, 12598, 12605, 12608, 12613, 12616,
+ 4096, 12619,  4096, 12624, 12629, 12632, 12639, 12642,  4096, 12647,
+12650, 12653, 12656, 12661, 12666, 12669, 12672, 12675, 12680, 12683,
+ 4096,  4096, 12686, 12693,  4096, 12696,  4096, 12699,  4096, 12704,
+12709, 12712,  4096, 12717, 12724, 12733,  4096, 12736,  4096, 12739,
+ 4096, 12742, 12745, 12752, 12755,  4096,  4096, 12758, 12761, 12766,
+12771, 12776, 12781, 12784, 12787, 12792,  4096, 12797, 12802, 12809,
+12816, 12821, 12826, 12835, 12842, 12849, 12860,  4096, 12863, 12866,
+ 4096,  4096, 12869,  4096,  4096, 12872, 12875, 12878, 12883,  4096,
+12890, 12893, 12896, 12901, 12904,  4096, 12909, 12916,  4096, 12919,
+12924, 12927, 12932, 12935, 12938, 12941, 12952, 12959, 12968, 12973,
+12980, 12985, 12992, 12997, 13004, 13007, 13012,  4096, 13015,  4096,
+13022,  4096, 13025, 13034, 13043,  4096, 13048,  4096, 13057, 13062,
+13065, 13068, 13073, 13076, 13081,  4096,  4096,  4096, 13088,  4096,
+ 4096,  4096, 13091, 13094, 13097, 13102, 13107, 13116,  4096,  4096,
+13119, 13122, 13125, 13130,  4096,  4096,  4096, 13133, 13140, 13143,
+13148, 13151, 13154, 13161, 13164, 13171, 13174, 13179, 13182, 13185,
+13188, 13193, 13198, 13203,  4096,  4096,  4096,  4096, 13206, 13209,
+ 4096, 13212, 13215, 13220,  4096, 13229, 13234, 13239,  4096, 13244,
+ 4096, 13247, 13252, 13255, 13258, 13267, 13270,  4096,  4096,  4096,
+ 4096,  4096, 13273, 13276, 13283,  4096, 13288, 13291, 13294, 13297,
+13300, 13305, 13310, 13313,  4096, 13318, 13323, 13328, 13331, 13336,
+13339, 13342, 13347, 13352, 13357, 13362,  4096, 13369,  4096, 13372,
+13379, 13386, 13391, 13398, 13407,  4096, 13412, 13415, 13420,  4096,
+ 4096, 13425, 13428, 13431,  4096, 13436, 13441, 13444, 13451, 13454,
+13459, 13466, 13473, 13476, 13479, 13484,  4096, 13487, 13490,  4096,
+13495,  4096,  4096, 13498, 13503,  4096, 13510, 13515, 13520, 13525,
+13530, 13535, 13540, 13543,  4096,  4096,  4096,  4096, 13546, 13549,
+13554, 13559, 13562, 13565, 13570,  4096, 13575,  4096, 13584, 13589,
+ 4096,  4096,  4096, 13594,  4096,  4096, 13597,  4096,  4096,  4096,
+ 4096,  4096, 13600, 13605, 13608,  4096, 13613, 13616, 13619, 13622,
+13627, 13630,  4096, 13635, 13638, 13645, 13650, 13653,  4096, 13660,
+ 4096, 13663,  4096, 13666, 13671,  4096, 13674, 13683, 13686,  4096,
+13689,  4096,  4096, 13696, 13701, 13706, 13709,  4096, 13712, 13717,
+13722, 13727, 13732, 13737, 13742,  4096, 13747,  4096,  4096, 13750,
+ 4096, 13757, 13762, 13765,  4096, 13768, 13771,  4096,  4096, 13774,
+ 4096, 13779, 13782,  4096, 13785,  4096,  4096,  4096, 13788,  4096,
+ 4096, 13793,  4096, 13798, 13801,  4096, 13804,  4096, 13807, 13810,
+13817, 13824, 13829, 13836, 13839, 13848,  4096,  4096,  4096, 13853,
+13858, 13867, 13872,  4096, 13877, 13882, 13887, 13894, 13897, 13900,
+13903, 13908, 13913, 13918,  4096,  4096, 13921, 13924, 13927,  4096,
+ 4096, 13930,  4096, 13933,  4096, 13940,  4096, 13943, 13946,  4096,
+ 4096,  4096,  4096, 13949,  4096,  4096, 13956, 13961, 13968, 13973,
+13982, 13985, 13992, 13995, 14000,  4096, 14005,  4096, 14010,  4096,
+14015, 14020,  4096,  4096, 14023, 14028,  4096, 14031,  4096,  4096,
+14034,  4096,  4096,  4096, 14037,  4096,  4096,  4096,  4096,  4096,
+14044, 14047, 14052, 14055, 14058,  4096, 14061,  4096, 14066, 14069,
+14074, 14077,  4096, 14080, 14083, 14088, 14091, 14098, 14101, 14108,
+14111,  4096, 14114, 14117,  4096, 14122, 14125, 14128, 14133,  4096,
+ 4096,  4096,  4096, 14136, 14141, 14144,  4096,  4096,  4096,  4096,
+14149,  4096,  4096, 14152, 14155, 14158, 14165, 14170, 14175,  4096,
+ 4096,  4096,  4096, 14180,  4096, 14183, 14190, 14197, 14200, 14205,
+14212, 14217, 14220, 14225, 14228, 14233, 14236, 14239, 14242,  4096,
+ 4096,  4096,  4096, 14249,  4096, 14252,  4096, 14257, 14260, 14263,
+14266, 14273, 14278,  4096, 14281, 14286, 14289, 14294, 14299,  4096,
+14304, 14307,  4096, 14310,  4096, 14313,  4096,  4096,  4096, 14316,
+14319, 14322, 14325, 14330, 14333, 14336, 14339,  4096, 14344, 14347,
+14350,  4096, 14353, 14356, 14361,  4096,  4096, 14366, 14369, 14372,
+ 4096, 14375, 14380,  4096,  4096,  4096, 14383, 14386,  4096,  4096,
+ 4096,  4096,  4096, 14389, 14398, 14401,  4096, 14408, 14413,  4096,
+ 4096, 14418, 14423, 14426, 14429,  4096, 14434, 14437, 14442, 14445,
+14450, 14453,  4096, 14456, 14459, 14462,  4096, 14467, 14476, 14481,
+14486, 14489, 14496, 14499, 14506,  4096, 14511, 14518, 14521,  4096,
+14524, 14527, 14532,  4096, 14535,  4096, 14542, 14545, 14548,  4096,
+14551,  4096,  4096, 14556, 14559, 14564, 14567,  4096, 14570, 14573,
+ 4096,  4096, 14576, 14583, 14588, 14591,  4096, 14598, 14601,  4096,
+ 4096, 14604, 14611,  4096, 14618, 14621,  4096, 14626,  4096, 14629,
+14634, 14639,  4096, 14644, 14649, 14656, 14659, 14666, 14671, 14676,
+14681, 14684,  4096,  4096, 14691, 14698,  4096,  4096, 14703, 14706,
+14713,  4096, 14718,  4096, 14725, 14728, 14731, 14734, 14741, 14746,
+14749,  4096, 14752,  4096, 14755,  4096, 14758, 14763, 14766,  4096,
+ 4096, 14769, 14772, 14779, 14782,  4096,  4096,  4096,  4096, 14785,
+14788, 14793, 14798, 14801, 14810, 14815, 14820, 14829, 14836, 14843,
+14848, 14851, 14854,  4096, 14859, 14862, 14865, 14868, 14871, 14874,
+14879,  4096,  4096, 14884, 14887,  4096, 14894, 14899, 14904,  4096,
+ 4096, 14909, 14912, 14917, 14920, 14929, 14936, 14943, 14946, 14949,
+14954,  4096, 14957, 14960, 14963, 14966, 14971, 14974, 14977, 14980,
+14985, 14996, 15003, 15010, 15019, 15022, 15025,  4096, 15028, 15031,
+15034,  4096, 15039, 15046,  4096, 15049, 15054,  4096, 15057,  4096,
+15062, 15065, 15070, 15073, 15078, 15081,  4096,  4096,  4096,  4096,
+15084, 15087,  4096,  4096, 15090, 15095,  4096, 15098, 15103, 15106,
+15109, 15114,  4096, 15119,  4096, 15124, 15131,  4096, 15136, 15141,
+ 4096, 15144, 15147, 15150, 15153, 15162, 15167, 15174, 15177, 15182,
+15189, 15192,  4096, 15195, 15200,  4096,  4096,  4096, 15205, 15210,
+15217, 15222, 15229, 15236, 15241, 15244, 15251,  4096,  4096, 15254,
+15257, 15260,  4096, 15263,  4096, 15266, 15269, 15272, 15281, 15286,
+15291, 15294, 15299,  4096, 15302,  4096, 15305, 15314, 15317, 15322,
+ 4096,  4096,  4096,  4096, 15325,  4096, 15328,  4096, 15333, 15336,
+ 4096,  4096,  4096, 15341, 15348, 15351, 15356, 15359, 15362, 15365,
+15368, 15371, 15376,  4096,  4096, 15379, 15382, 15387,  4096, 15390,
+15393, 15396, 15403, 15408,  4096, 15415, 15418, 15423, 15428, 15435,
+15438, 15445, 15450, 15455,  4096,  4096, 15464, 15467, 15470,  4096,
+15473, 15476,  4096,  4096,  4096, 15481, 15484, 15487, 15492, 15495,
+15498,  4096, 15501,  4096, 15504, 15513, 15518,  4096, 15521,  4096,
+15526, 15531,  4096, 15536,  4096, 15539,  4096, 15544,  4096, 15547,
+ 4096,  4096, 15550, 15555,  4096, 15558, 15561,  4096, 15568,  4096,
+ 4096,  4096,  4096, 15571, 15574, 15581, 15586, 15595, 15602, 15613,
+15618, 15627, 15630,  4096, 15635, 15644,  4096, 15649, 15658,  4096,
+ 4096, 15661,  4096,  4096, 15666,  4096,  4096,  4096,  4096,  4096,
+ 4096,  4096, 15669,  4096, 15672, 15677, 15680,  4096, 15685, 15690,
+15699, 15706,  4096, 15713, 15718,  4096,  4096, 15723,  4096, 15728,
+15733, 15736, 15739,  4096, 15742,  4096,  4096, 15747, 15750, 15753,
+ 4096, 15758, 15763, 15766,  4096,  4096,  4096, 15769, 15772,  4096,
+15775,  4096,  4096, 15778, 15781, 15784, 15789, 15792, 15795, 15798,
+15801, 15804,  4096,  4096,  4096,  4096, 15807, 15812, 15815, 15820,
+ 4096, 15825, 15830, 15837, 15842, 15849, 15856, 15859, 15864, 15869,
+15872,  4096, 15875,  4096, 15878, 15883, 15886, 15889,  4096,  4096,
+15892, 15897, 15902, 15905,  4096,  4096, 15908, 15913, 15920, 15923,
+15926, 15931, 15934,  4096, 15939,  4096, 15944,  4096,  4096,  4096,
+15947, 15950,  4096, 15953, 15956, 15959, 15964, 15967, 15970,  4096,
+15975,  4096,  4096, 15978,  4096, 15981, 15984, 15989, 15996, 15999,
+16012, 16015, 16020, 16025, 16032, 16035, 16040, 16045, 16054, 16063,
+ 4096,  4096,  4096, 16066,  4096, 16071, 16074, 16077, 16080,  4096,
+ 4096, 16083, 16086,  4096, 16089,  4096,  4096,  4096, 16092, 16095,
+ 4096, 16100, 16105, 16108, 16111, 16114, 16117, 16124, 16129, 16134,
+16139, 16144,  4096,  4096,  4096, 16149,  4096,  4096, 16152,  4096,
+ 4096, 16157,  4096,  4096,  4096, 16160,  4096, 16163, 16168, 16173,
+16176, 16179,  4096, 16182, 16185, 16188,  4096, 16197, 16200, 16203,
+16206, 16213, 16216, 16221, 16226,  4096, 16229, 16232, 16237,  4096,
+16240, 16245,  4096, 16248,  4096,  4096, 16251, 16254,  4096,  4096,
+ 4096, 16257, 16260, 16263, 16270, 16277,  4096,  4096, 16280, 16283,
+16288, 16297, 16304, 16307, 16310, 16313, 16318,  4096,  4096,  4096,
+ 4096, 16321,  4096, 16326, 16329,  4096, 16336,  4096, 16341, 16346,
+16349,  4096, 16352, 16357, 16360, 16365, 16368, 16373, 16376, 16381,
+16384, 16389,  4096,  4096, 16392,  4096, 16397,  4096, 16404, 16413,
+16418, 16423, 16430, 16435, 16438, 16441, 16444, 16447, 16450, 16453,
+16458, 16463, 16468, 16473, 16478, 16481, 16488, 16495, 16498, 16509,
+16514,  4096, 16517, 16520, 16527, 16532, 16539, 16544, 16549,  4096,
+16552,  4096, 16555,  4096, 16558, 16565, 16572,  4096, 16575, 16580,
+16587,  4096, 16590, 16593, 16596,  4096,  4096, 16601, 16604, 16607,
+ 4096,  4096,  4096,  4096, 16614, 16621,  4096, 16624, 16627, 16632,
+16635, 16638,  4096, 16641,  4096, 16644, 16647,  4096,  4096, 16650,
+16655, 16658, 16661, 16664, 16667, 16672, 16675, 16680, 16683,  4096,
+16688,  4096, 16691,  4096,  4096, 16694,     0,     1,   538,  8621,
+    1,   671, 60856,     1,   968, 12549,     1,  3638,  2910,     1,
+ 2877, 20684,     1,  2923, 39925,     1,   648, 62074,     1,  2373,
+28221,     1,   859, 46293,     1,  3349, 56632,     1,  2356, 49074,
+    1,  2052, 59737,     1,  1055, 10411,     2,  1884, 43325,  3256,
+36851,     1,  3644, 26552,     1,  1653,  6093,     2,   310, 62685,
+ 1776, 11249,     1,  2146,  8987,     1,  2031, 11294,     2,   476,
+44554,  3217, 20788,     1,    52, 24850,     2,   396, 34819,  2107,
+37979,     1,  3579, 57855,     1,  1459,  3049,     1,  2259, 55510,
+    2,  2359, 15723,  3257, 44945,     2,   881, 58597,  1604, 36070,
+    1,   129, 13698,     2,   296, 53997,  2410, 55031,     1,   610,
+37910,     3,  2841, 65354,  3164,  2453,  3858, 13852,     2,  2981,
+ 9862,  3042,  5240,     3,   615, 22080,  2706, 20467,  3946, 12015,
+    1,  4455, 28030,     2,   494, 57619,  4010, 46154,     2,   404,
+34969,  2064,  5353,     1,   405, 34969,     1,   110, 21934,     1,
+ 1672,  5258,     1,  2639, 22156,     1,  2019, 11349,     1,  2126,
+11629,     1,  4017, 33411,     2,  1749, 52977,  1798, 29829,     1,
+ 1030,  4783,     2,   252, 39503,  3688, 49539,     1,  1411, 36198,
+    2,   261, 35245,  1909, 18852,     1,  3648, 35726,     2,   152,
+46517,  2861, 13198,     1,  1583, 20494,     3,   943, 53203,  2301,
+42382,  3931, 31469,     1,  2020, 24768,     5,   109, 15505,   230,
+44635,   498, 24345,   694, 19012,  2590, 47072,     1,  1865, 11004,
+    2,   341, 42146,  4453, 63423,     1,  1647, 40187,     1,  3677,
+22412,     2,   836, 44063,  3370, 42722,     1,  3100, 18054,     1,
+  723, 12262,     1,  1233, 60025,     1,  1050, 44543,     1,  4498,
+63644,     4,   614, 28932,   786, 62878,  1793, 11073,  4523, 63644,
+    2,   970, 11950,  4548, 63644,     1,  4573, 63644,     3,   309,
+10466,   659, 35285,  4598, 63644,     2,  3290, 36801,  4623, 63644,
+    3,  1938, 41086,  4648, 63644,  4699, 14274,     2,  4673, 63644,
+ 4724, 14274,     3,   999, 49574,  2402, 40152,  4749, 14274,     1,
+ 4774, 14274,     3,  2363, 24341,  3892, 21252,  4799, 14274,     1,
+ 4824, 14274,     2,   377, 61257,  4849, 14274,     1,  3315, 40573,
+    1,  1822, 40209,     3,  1080, 52961,  1703, 15014,  3481, 40265,
+    1,  4507, 40309,     3,  2293, 60233,  2478, 54457,  4532, 40309,
+    2,  1092, 30366,  4557, 40309,     4,   638,  6544,  2286, 31976,
+ 3263, 29647,  4582, 40309,     3,  2779, 51298,  2855, 11901,  4607,
+40309,     1,  4632, 40309,     1,  4657, 40309,     2,  3521,  6339,
+ 4682, 40309,     3,  1383, 52410,  2502, 63753,  2542,  5182,     1,
+ 3423, 61675,     2,  1290, 55360,  1830, 59431,     2,  3228, 37852,
+ 3342, 58724,     1,  3163, 29157,     3,   415, 32842,  1650, 30594,
+ 2057, 14646,     1,  3968, 30918,     4,    77, 40351,  1475, 11656,
+ 1696, 31564,  2500, 21395,     1,  1614, 10672,     2,  3094, 17865,
+ 3539, 63522,     1,  2404, 63959,     2,    27, 51816,  2815,  8159,
+    3,  1820, 44711,  2193, 43425,  2808, 51260,     2,  2799, 17997,
+ 2830, 50244,     1,  1785, 47453,     3,   111, 43648,  1173,  8060,
+ 3718,  8464,     1,  3413, 61344,     2,  1192, 49812,  4467, 37379,
+    3,   155, 41372,  1818, 47768,  3658, 55874,     1,   226, 56676,
+    1,  2063, 49744,     2,   994, 48620,  2572, 19985,     1,  4479,
+38867,     4,   975, 64135,  3231, 18801,  3513, 63330,  3603, 28960,
+    1,  3884, 24133,     1,  2440, 48575,     2,  1628, 62632,  3569,
+58465,     2,  1845, 37210,  3265, 51283,     1,  1665,  4237,     2,
+ 2082,  1975,  4027, 14692,     1,  2449,  9769,     4,   347, 46683,
+  574, 57055,  2241, 11799,  3932, 18875,     1,  2227, 15357,     1,
+ 3320, 16660,     1,   960, 32652,     2,  1468, 40759,  3501, 64437,
+    1,  1046, 58285,     1,  3621, 21862,     1,  2491, 30424,     1,
+ 3564, 49193,     2,   551, 42162,  1985,   607,     1,  1654,  5955,
+    4,    71,  1636,  2289, 50620,  3356, 57409,  4475, 53994,     2,
+  533,   118,  2862, 50901,     1,  3673, 46929,     1,  2909, 65309,
+    1,   516, 61057,     1,  1483,  1171,     2,    26,  5383,  2371,
+ 7959,     1,   897, 21498,     2,  1678, 57277,  3204,  8451,     2,
+  653, 13269,  4441, 37872,     2,  2929, 35422,  3617, 54517,     1,
+ 4489, 35615,     4,   920, 48155,  1256, 32759,  3380, 49421,  4514,
+35615,     3,  2369, 13492,  3783,  5811,  4539, 35615,     3,   195,
+ 6787,  1743,  5438,  4564, 35615,     3,  1219, 61510,  4440, 51487,
+ 4589, 35615,     2,   583,   745,  4614, 35615,     3,  1463, 64738,
+ 3434,  3744,  4639, 35615,     2,  1270, 20482,  4664, 35615,     2,
+ 1562, 19151,  2949, 46008,     3,  2177, 17998,  3196, 20331,  3572,
+21491,     3,    84, 57075,   958, 20964,  1441, 49831,     1,  2755,
+20026,     2,   549, 42731,  2510, 18144,     1,  3297, 16632,     1,
+  609, 10750,     2,   700, 13850,  3190, 17930,     2,  1470, 47159,
+ 4254, 19574,     3,  2697, 19029,  4261,  8853,  4280, 19574,     3,
+ 2692, 48192,  4287,  8853,  4306, 19574,     2,  4313,  8853,  4332,
+19574,     4,  2703, 40280,  2930, 62710,  4339,  8853,  4358, 19574,
+    3,  3737, 57922,  4365,  8853,  4384, 19574,     4,  2370, 38658,
+ 2507,  5225,  4391,  8853,  4410, 19574,     2,  1189, 42935,  4417,
+ 8853,     3,   665,  1484,   810, 25404,  3037, 33435,     1,  3004,
+34695,     2,   210, 30501,  2196, 53707,     1,  2494, 39411,     1,
+ 3538, 18058,     1,  3767, 45485,     1,  2987, 43792,     3,   291,
+60715,  2560,   704,  3938, 62351,     3,   667, 10801,  1251,   956,
+ 2145, 26202,     1,  1446, 35738,     1,  3031, 28587,     2,  2532,
+12644,  3435, 30214,     1,  3696, 55788,     1,   305, 42062,     1,
+ 3616,  7245,     1,   272, 27183,     1,  3059,  4306,     2,    32,
+11748,  4706,  6213,     4,   232, 60963,   279, 22514,  4436, 16499,
+ 4731,  6213,     1,  4756,  6213,     2,  2296, 50439,  4781,  6213,
+    2,  2473,   496,  4806,  6213,     2,  4704, 55488,  4831,  6213,
+    3,  3022, 62290,  4729, 55488,  4856,  6213,     4,   395, 26288,
+ 3480, 27124,  3788, 30177,  4754, 55488,     2,  1220, 12160,  4779,
+55488,     1,  4804, 55488,     2,   858, 62131,  4829, 55488,     1,
+ 4854, 55488,     1,  3525,  2540,     1,  2030, 59198,     1,  2375,
+33068,     1,  2546, 58064,     3,   963, 60450,  1525, 24965,  3668,
+46256,     1,  1639, 48656,     2,  1198, 41014,  2780, 35236,     1,
+ 3971,  7127,     1,  1360, 34878,     2,  1558, 62471,  2098,  3340,
+    2,  1201,  9979,  1829, 40147,     3,  2087,  6420,  2094, 36952,
+ 3981,  1318,     2,  4048,  1598,  4485, 44049,     2,  4074,  1598,
+ 4510, 44049,     3,  2599, 35812,  4100,  1598,  4535, 44049,     3,
+ 1234, 33016,  4126,  1598,  4560, 44049,     5,   249, 32605,  3303,
+40839,  3726, 60753,  4152,  1598,  4585, 44049,     2,  4178,  1598,
+ 4610, 44049,     3,  3475,  9286,  4204,  1598,  4635, 44049,     2,
+ 4230,  1598,  4660, 44049,     1,  2592,  7571,     1,   663, 51295,
+    2,   851, 21991,  3602, 23956,     1,   595, 29873,     1,  1095,
+20705,     2,   787, 35182,  1549,  3029,     1,   219, 33622,     1,
+  299,  8435,     1,  2666, 15256,     1,  1322, 61370,     3,   443,
+  451,  2774, 17439,  3210,  1336,     1,   457, 60073,     3,   896,
+48859,  1365, 18073,  3845, 13914,     1,   453, 52993,     3,  2173,
+30972,  3674,  8767,  3999, 53668,     1,  1326, 32838,     2,   531,
+ 8529,  3115, 29778,     1,  3025, 54845,     2,  1447, 25133,  3756,
+18165,     1,   350, 16285,     1,   594, 51570,     1,   721, 10546,
+    1,  3111, 15927,     3,  1530, 40966,  3113, 24897,  3967, 27968,
+    2,  2185, 62063,  3023, 49902,     2,   514, 17117,  4461, 14122,
+    1,   454, 54009,     1,  1163, 57083,     2,  2451, 25490,  3002,
+33524,     3,  2783, 57773,  3270, 16073,  3595,  1675,     1,  1085,
+24405,     1,    82,  4512,     1,  2265, 61099,     1,  2041, 48648,
+    1,  2049, 28022,     3,   727, 57038,  2535, 11168,  4872, 18451,
+    1,   909, 26484,     2,  1841, 49566,  2766, 47967,     1,   856,
+47107,     2,  2937, 23041,  4043, 44013,     1,  1888, 39122,     1,
+ 3386, 24815,     3,    49, 44013,  3071,   865,  4434,  8579,     1,
+ 2351, 51212,     2,  1661, 23331,  4042, 47097,     1,  1161, 21696,
+    1,  3232, 55538,     2,  1022, 39560,  3740, 23903,     2,  3642,
+11038,  3834, 57499,     2,    64, 61386,  2648, 30329,     1,  2988,
+14002,     1,  3076, 10990,     1,   333,  9319,     2,  3283, 44381,
+ 3310, 57369,     1,  1664, 32276,     3,   106, 54694,  3153, 40523,
+ 3797, 28681,     1,  4463, 63295,     4,   931, 32175,  1107, 11499,
+ 3506, 43920,  3762, 41356,     1,   235, 14887,     2,   991, 35237,
+ 1498, 35329,     2,  2513, 11102,  4708, 29565,     3,   224, 33531,
+  838, 28695,  4733, 29565,     1,  4758, 29565,     2,  2388, 20620,
+ 4783, 29565,     4,   678, 16712,   936, 59149,  1465, 19799,  4808,
+29565,     1,  4833, 29565,     1,  4858, 29565,     1,   409, 38661,
+    1,  2549, 25574,     1,  2511, 39468,     2,   463, 38215,  1352,
+ 6328,     1,   464, 38215,     2,   724, 48994,  3879, 31034,     2,
+ 3048, 54704,  3308, 33153,     1,  3825, 39102,     1,  1018,  7490,
+    1,   250, 53674,     1,  1603, 12537,     1,  3722, 21172,     2,
+ 3246, 43431,  3650, 19782,     1,   363,   660,     2,    44, 18941,
+ 1355, 48528,     2,  2095, 24192,  2750, 62543,     2,  1961, 22771,
+ 2768, 62826,     1,  4871, 63261,     2,  2870,  4493,  3391, 56801,
+    2,   417, 58663,  2176, 53526,     3,  2509, 31092,  3191, 50456,
+ 3528, 46868,     1,  4501, 54087,     2,  3440,  4813,  4526, 54087,
+    2,  2243, 19430,  4551, 54087,     3,   630, 54625,  1863, 62962,
+ 4576, 54087,     1,  4601, 54087,     2,  1127, 44520,  4626, 54087,
+    2,  2141, 20703,  4651, 54087,     1,  4676, 54087,     1,   603,
+37052,     1,  2213, 63035,     3,   758, 56350,  2199, 16029,  3144,
+64340,     1,   196, 64246,     1,   213,   947,     1,   108, 30471,
+    1,  3390, 16378,     3,  1413,  5820,  2928, 15219,  3438, 57051,
+    3,   718, 52360,  1526, 54256,  3354, 12659,     3,   849, 61303,
+ 2920, 58357,  3451, 30767,     2,  3333, 42053,  3920, 42173,     1,
+ 3016, 18330,     3,  1043, 62437,  1194, 52854,  3046, 26311,     1,
+ 3400, 28045,     1,  3054, 60301,     1,    34, 16521,     1,  2104,
+34104,     2,  2009, 40343,  3643,  6774,     1,    99, 41809,     1,
+ 2255, 14867,     1,  2913, 43015,     2,   585,   392,   923, 65353,
+    2,  1492, 26142,  3457, 21101,     1,  2575, 43695,     1,   978,
+33119,     2,   439, 17258,  3750,  7259,     2,   542, 56684,  3849,
+52237,     2,  1004, 62521,  1876,  8355,     2,  1019, 30243,  2389,
+58552,     1,   510, 43092,     2,  1203, 31419,  1983, 31168,     2,
+  812, 43779,  3496, 45949,     1,  3893, 49823,     1,   534, 32106,
+    1,  2954, 54908,     2,  3355, 33551,  4260, 44372,     2,  3185,
+47233,  4286, 44372,     2,  2986, 48061,  4312, 44372,     2,   833,
+44420,  4338, 44372,     3,  1644, 45208,  2202, 22229,  4364, 44372,
+    2,  4390, 44372,  4709, 44243,     3,  1860, 11645,  4416, 44372,
+ 4734, 44243,     3,  1958, 63733,  4258, 16876,  4759, 44243,     2,
+ 4284, 16876,  4784, 44243,     3,  3082, 41504,  4310, 16876,  4809,
+44243,     2,  4336, 16876,  4834, 44243,     4,  1226, 17096,  4362,
+16876,  4859, 44243,  4873, 51313,     2,   753, 22294,  4388, 16876,
+    2,  1170, 39748,  4414, 16876,     1,   212, 41678,     1,  3314,
+23067,     1,  1434,  3379,     4,   702,  9740,  1042, 54312,  2846,
+11583,  3832, 18588,     2,    28, 41136,  3444, 49541,     1,  2027,
+23463,     2,   684, 49969,  3443,   479,     1,  1035, 57871,     2,
+  934, 59277,  3594, 12078,     1,   677, 49699,     1,  3933,  5384,
+    1,  2547, 14481,     1,  1814, 18116,     1,  3831, 47543,     1,
+ 3597, 22952,     3,   846, 46352,  1668, 40460,  4061, 37180,     4,
+  450,  3078,  1224, 17926,  2872, 53502,  4087, 37180,     3,   318,
+43279,  3885, 40077,  4113, 37180,     2,  2421, 48188,  4139, 37180,
+    1,  4165, 37180,     2,  3077, 47968,  4191, 37180,     1,  4217,
+37180,     3,   323, 16849,  3964, 42853,  4243, 37180,     2,   441,
+ 6949,  1023, 41456,     2,   765, 42119,  4005, 32781,     1,   688,
+46591,     1,  4069, 10640,     2,   336, 27607,  4095, 10640,     2,
+   10, 51927,  4121, 10640,     1,  4147, 10640,     1,  4173, 10640,
+    4,   760,  6196,  1172, 23817,  2948, 37142,  4199, 10640,     3,
+ 1292, 52357,  2210, 62694,  4225, 10640,     3,   327,  7681,  1222,
+11060,  4251, 10640,     2,  1514, 53815,  1895, 33705,     1,  3433,
+49832,     2,   345, 60940,  3197, 51409,     1,  2250, 20758,     1,
+ 3826, 33192,     3,   177, 29426,  1722, 19665,  2399, 15507,     1,
+ 3816,  5552,     1,  3711,  3155,     1,  3911, 21515,     1,  2323,
+48303,     1,  3249, 59436,     2,  2669, 13322,  2704, 51090,     1,
+ 2658, 50060,     1,  1268, 62045,     1,  2232, 25451,     1,  2539,
+62992,     2,  2427, 20821,  2805, 48602,     1,  2036, 43530,     2,
+  681, 26886,  3201, 19847,     1,  1606, 21078,     1,  2414, 51422,
+    1,   263, 17898,     1,  2372, 60067,     1,  2144, 39379,     1,
+ 3198, 14149,     1,  2765, 41081,     2,   873, 58431,  1067, 33602,
+    3,    97, 35667,  3717, 64701,  4439, 13541,     3,   186, 61426,
+ 2110, 53567,  3182, 55066,     1,  2401, 42968,     2,   523,  5180,
+ 4875, 29595,     1,  3091, 23416,     1,  1096, 17931,     3,  2727,
+34781,  3660, 31105,  3872, 53367,     2,  2112, 21521,  4506,  4160,
+    1,  4531,  4160,     2,  1298, 23981,  4556,  4160,     2,  3085,
+62178,  4581,  4160,     2,  3837, 43162,  4606,  4160,     1,  4631,
+ 4160,     3,    22, 30305,   289,  4714,  4656,  4160,     2,  2070,
+21557,  4681,  4160,     1,   541, 57802,     1,  3410, 38423,     1,
+  446, 62774,     1,  2850, 38592,     2,  1294, 24514,  3009, 31076,
+    1,  3829, 34297,     2,  1890, 32844,  3239,  9366,     2,  1100,
+24098,  3758,  6955,     1,  3374,  5017,     2,  1342,  9759,  1771,
+23906,     2,   339, 22154,  1422, 37159,     2,  1032, 30297,  1188,
+39391,     1,  3700, 15725,     2,   996, 60439,  1931, 59055,     3,
+ 1025, 17639,  1316,  5170,  3883,  6314,     1,  2186, 50338,     1,
+  308, 15516,     2,   233, 25686,  1555,  1108,     2,  3069,  8280,
+ 3760, 30530,     1,   334,  8277,     1,  2328, 57538,     1,  3546,
+56945,     1,  4466, 23011,     3,  1314, 17261,  1574,  7350,  3527,
+42800,     1,   557, 11593,     1,   720, 49169,     1,   771, 55151,
+    1,  3985, 51077,     1,  2484, 56461,     3,  2485, 59961,  3052,
+45482,  3541, 59598,     1,  3158, 27091,     1,  2055, 46461,     2,
+ 1736, 16628,  2722, 47047,     1,  1996, 23929,     2,   145, 36340,
+ 3801, 26517,     1,   161, 50018,     1,  3728, 50158,     2,   695,
+26601,  1784,   962,     1,  2496, 58356,     1,  2058, 17603,     2,
+ 2229, 37723,  3068,  4378,     1,  1372,  8838,     1,  1379, 64024,
+    2,  3500, 43043,  4454, 49101,     1,  2725, 57856,     2,   591,
+30775,  2347, 32501,     2,  1072,  5824,  2434, 13945,     1,  3560,
+27184,     1,  1972,  5625,     2,   879,  2405,  2674, 21960,     2,
+ 3661, 31960,  3854,  7404,     2,  1248, 27858,  3574, 54611,     2,
+   93, 15170,  1157,  5121,     1,   861,  4397,     2,  1321,  3195,
+ 3447, 17244,     1,  3818, 57985,     2,  2781, 49754,  3421, 31960,
+    1,  1212, 61958,     1,  4502, 13759,     3,  2152, 58474,  3808,
+42484,  4527, 13759,     1,  4552, 13759,     7,   295, 49585,   919,
+50028,  1244, 31055,  2067, 32528,  2809, 41529,  3408, 65008,  4577,
+13759,     1,  4602, 13759,     2,   773, 65127,  4627, 13759,     2,
+ 4652, 13759,  4703, 29925,     5,  2350,  4426,  3014, 39349,  3169,
+ 9913,  4677, 13759,  4728, 29925,     2,  3445, 21817,  4753, 29925,
+    2,  3623, 52684,  4778, 29925,     1,  4803, 29925,     2,  1579,
+55409,  4828, 29925,     3,  2454,   390,  3775, 39266,  4853, 29925,
+    2,    15, 65322,  2778, 47992,     2,   613, 49021,  1894, 40744,
+    1,  1323, 25536,     1,  1789, 14257,     1,  1641, 44004,     1,
+ 1289, 30834,     1,  4476, 61217,     1,   243, 28572,     2,  2294,
+41222,  4035, 17014,     1,   629, 63102,     2,   247, 25966,  1171,
+37611,     2,  2405, 34094,  3666, 61119,     3,  1742, 59664,  2719,
+18123,  3861,  5715,     2,  2235, 27442,  2834,  9012,     2,   553,
+ 5251,  2288, 36394,     1,  4007, 37965,     3,   123,  3800,  1871,
+ 9998,  2829,  2131,     3,   414, 19569,  2100, 19418,  2667, 33378,
+    1,  3524, 57893,     2,  1428, 32794,  3823, 12861,     2,   344,
+ 9922,  2723, 25878,     3,  1910, 12806,  2939, 38052,  3019, 42347,
+    1,  2701, 53577,     2,   935, 34466,  1593, 64468,     1,  2851,
+52650,     1,  3143, 47232,     2,  1569, 26817,  3373, 43442,     1,
+ 2337, 59609,     2,  2132, 32194,  4004, 59602,     1,  1565, 45935,
+    3,   647, 29460,  1811, 54797,  3043,  8980,     1,  1280, 62491,
+    3,   577, 12151,  2423, 37452,  4000, 57494,     2,  1278, 12046,
+ 2384, 18752,     1,   338, 58831,     1,  2918, 18908,     1,   166,
+ 4772,     1,  3087, 40440,     1,  2287, 49495,     1,  2029, 20454,
+    2,  1773, 24572,  3624,  5370,     1,  3787, 25303,     1,   913,
+31306,     2,   559, 49273,   788, 27881,     2,  1602,  2987,  2543,
+59811,     1,  1792, 31647,     1,  4068, 46876,     1,  4094, 46876,
+    1,  4120, 46876,     2,  2349,  7662,  4146, 46876,     1,  4172,
+46876,     1,  4198, 46876,     1,  4224, 46876,     1,  4250, 46876,
+    1,  2978, 58873,     2,  3295, 42687,  3681, 20277,     2,   800,
+46069,  3777, 23342,     2,   801, 46069,  2469, 26515,     1,  2890,
+16517,     1,  3358, 27973,     1,  1529, 13664,     3,   877, 33602,
+ 1054,  4170,  2391, 48923,     1,  2437, 49392,     1,  1143, 39442,
+    1,  3230, 29597,     2,   550,  4069,  1496, 15255,     1,  2013,
+58319,     3,   863, 36113,  1461,  7485,  3133, 29090,     2,  1941,
+17612,  3607,  3241,     2,  2166, 60525,  3655, 52742,     1,  2695,
+31799,     1,  1274, 37783,     2,   751, 56284,  1632, 28849,     2,
+ 1897, 31376,  4482, 42926,     1,  3995, 39577,     2,   698, 52322,
+ 2150, 25355,     1,  4274, 14108,     2,  1402, 31932,  4300, 14108,
+    5,  2896, 24587,  3415,  4682,  4022, 39767,  4326, 14108,  4460,
+21194,     1,  4352, 14108,     2,  3753, 43416,  4378, 14108,     1,
+ 4404, 14108,     1,  4430, 14108,     1,  1827, 14863,     2,  2005,
+ 2318,  3156, 28190,     1,   107, 65526,     3,  1012, 33526,  1806,
+26397,  2435, 19548,     1,   231, 20005,     1,  3152, 20633,     1,
+ 3647, 41812,     1,    31,  5027,     2,   264, 23803,  1363, 35085,
+    1,  1133, 53733,     1,  3742, 34093,     1,  3065, 14618,     1,
+ 2119, 18626,     2,  1245, 23388,  2691, 11862,     1,  1353, 51926,
+    2,    36, 25674,  2077, 34040,     2,    65, 19431,  1097, 58455,
+    2,  1041, 26460,  1721,  9859,     3,  1027,   179,  3092, 39969,
+ 3485, 52683,     2,   125,  9955,  1269, 47114,     3,  2155, 14279,
+ 2616, 27085,  3665, 50115,     1,  1585, 47881,     1,  1347,  3533,
+    1,  1846, 18793,     1,  3969, 30395,     2,  1071, 11205,  1699,
+41251,     1,  4028, 15813,     4,   893, 29737,  1003, 31721,  2887,
+ 2791,  3171, 17977,     1,   658, 65267,     1,  3411, 36459,     1,
+ 1176, 11917,     3,   156, 24762,  3120,  3413,  3680, 24043,     1,
+ 2675,  6414,     1,  2934, 53266,     2,  3362, 37320,  4257,  1877,
+    2,  2979, 42463,  4283,  1877,     1,  4309,  1877,     3,   521,
+25426,  2764, 49440,  4335,  1877,     2,  2907, 37379,  4361,  1877,
+    2,   240, 53007,  4387,  1877,     4,  2463, 41178,  2844, 54304,
+ 3535, 61149,  4413,  1877,     1,  4044, 12838,     1,  4070, 12838,
+    2,  3587, 46308,  4096, 12838,     3,  1063, 19397,  3353,  3829,
+ 4122, 12838,     3,  1753, 24609,  3821, 39562,  4148, 12838,     1,
+ 4174, 12838,     3,   844,  3205,  2290, 22686,  4200, 12838,     1,
+ 4226, 12838,     1,  2468, 48658,     1,  3965, 42660,     3,   704,
+38769,  1697,  8837,  3850, 31967,     2,  2580, 62005,  3517,  1008,
+    3,   187, 54398,   805, 15977,  3280, 42346,     1,  4064, 35064,
+    2,  3548, 51635,  4090, 35064,     2,  1934, 44383,  4116, 35064,
+    2,  3906,  5708,  4142, 35064,     2,  3581,  4875,  4168, 35064,
+    1,  4194, 35064,     4,   400, 44464,  1044, 30817,  1592, 26715,
+ 4220, 35064,     2,  3519, 32125,  4246, 35064,     1,  3689, 50276,
+    1,  1612, 32517,     1,  1948, 24663,     1,  1832, 30693,     1,
+ 2216, 36578,     1,   791, 27140,     1,  2283, 53755,     3,    39,
+13658,  2244, 38732,  3859, 39828,     1,  1747,  6881,     1,   939,
+16279,     1,  2273, 64670,     2,  1532, 35223,  3793,  4825,     1,
+ 1258, 59741,     1,  3388, 20097,     1,  3109, 54956,     3,   355,
+47051,  3563, 13993,  3863, 52384,     3,  2014,  2730,  2377, 29641,
+ 3487, 29959,     4,  1090,  6400,  3136, 32118,  3847, 44824,  3960,
+64213,     1,   974,  5142,     1,  2558, 50821,     1,  4046, 30382,
+    1,  4072, 30382,     1,  4098, 30382,     2,  2381, 51994,  4124,
+30382,     3,   967, 15790,  2028,  2381,  4150, 30382,     2,   808,
+48558,  4176, 30382,     3,   456,  1529,  1005, 29729,  4202, 30382,
+    2,  1407, 54466,  4228, 30382,     1,   927, 26208,     1,  3804,
+ 8168,     5,   990, 48030,  1430, 23865,  2609, 20151,  3325, 62713,
+ 3499, 51729,     1,   938, 63499,     1,   337, 15808,     1,  2593,
+ 4179,     2,   144, 30206,  2619, 14516,     1,   267, 18700,     1,
+ 1153, 50097,     2,   860, 52419,  2879,  5612,     2,   118, 20773,
+ 2751, 23925,     1,  3131,  1662,     1,  3409, 59621,     1,  3645,
+12017,     1,  4011, 26247,     2,  2069,  4474,  2236, 24421,     1,
+ 3692, 32402,     1,  1548, 29647,     2,  1089, 20609,  2368, 62876,
+    3,   992, 36969,  1155, 50983,  4874, 39848,     1,  3625, 18623,
+    1,  2976, 15195,     2,   555, 40520,  1026, 19247,     2,  3446,
+23829,  3609, 34823,     1,   433, 37776,     2,  1444, 33231,  1741,
+55360,     1,  2699, 58942,     3,   622, 36433,  2729, 41475,  3455,
+57855,     2,  1001, 24798,  3073, 64212,     1,   902, 27480,     3,
+  162,  5157,  2336,  9479,  2343, 63466,     2,  1503, 48703,  1966,
+29966,     1,  1229, 50814,     2,  1318, 56536,  2972, 31521,     5,
+  976, 27979,  1622, 51913,  2585, 10878,  2977,  4391,  3929, 42803,
+    2,  2324, 27978,  3116, 17664,     2,  1479, 59258,  1783, 13700,
+    4,  1570, 25960,  1690,  2745,  3418, 19484,  4067, 51942,     3,
+ 2561, 17510,  2900, 47738,  4093, 51942,     2,  3814, 24199,  4119,
+51942,     3,  1575, 16272,  1861, 51384,  4145, 51942,     2,  1306,
+  392,  4171, 51942,     2,  1205, 36135,  4197, 51942,     1,  4223,
+51942,     2,  1705, 41022,  4249, 51942,     1,  1765, 42610,     1,
+  504, 31758,     1,  2935, 29425,     1,   407, 29798,     1,   408,
+29798,     1,   565, 24099,     1,   685, 22542,     1,   746, 60765,
+    2,  1260, 20330,  2608, 23007,     2,  1295, 62318,  3634,  9391,
+    1,  3389, 35288,     2,  1335, 60893,  2633, 25793,     1,  3159,
+12412,     1,  1424,  5536,     1,  3896, 57729,     1,   889, 53689,
+    4,  1456, 52188,  3611, 50995,  3963,  5886,  4484, 59438,     2,
+  429, 15402,  2099, 24950,     1,  1872, 36530,     1,  2109, 43858,
+    2,  3730, 27406,  3812, 16429,     1,  2996,  5419,     1,   576,
+31503,     1,  3417, 60703,     1,  3272,  2048,     3,   271, 61166,
+ 1856, 12252,  1993, 34645,     1,  1901, 21699,     5,   644, 28300,
+ 1563, 56155,  1704, 53142,  3154,  4952,  4499, 42137,     2,   278,
+ 8450,  4524, 42137,     3,   384,  8874,  3179, 55420,  4549, 42137,
+    1,  4574, 42137,     1,  4599, 42137,     2,   708, 43855,  4624,
+42137,     2,  2262, 35584,  4649, 42137,     1,  4674, 42137,     1,
+ 1126, 37347,     2,   100,  6073,  3820, 25552,     1,  2212,  7210,
+    1,  2486,  3068,     1,  3083, 57393,     4,    92, 65064,  1923,
+  136,  2512,  9650,  3088,  6668,     1,   436, 47761,     1,   256,
+49357,     1,   437, 47761,     1,  2676, 27868,     2,  1227, 59069,
+ 3385, 30062,     1,  3694, 49992,     2,  2852, 49346,  3986, 10948,
+    1,  3471, 41907,     1,  1767, 42985,     1,  3881, 60345,     1,
+ 2248, 29888,     4,   168, 10120,   796, 10258,  1698, 49691,  1879,
+53209,     2,   661, 14413,  1139, 10714,     3,  1069,  8618,  1527,
+19161,  3478, 40520,     3,   167, 20527,  4267, 20195,  4468,  9757,
+    3,  2628, 38715,  2689, 20133,  4293, 20195,     2,   461,  6221,
+ 4319, 20195,     4,  1710, 43858,  3899, 13668,  3991, 26949,  4345,
+20195,     1,  4371, 20195,     1,  4397, 20195,     2,   524,  9457,
+ 4423, 20195,     3,   601, 20884,  2086,  3779,  3770,  6456,     1,
+ 3112, 58961,     2,  2125, 62425,  2149, 61894,     1,  2938, 43137,
+    1,   349, 38115,     3,  1431, 23873,  2495, 24854,  3734,  3963,
+    3,  2396, 33033,  2482, 39857,  2522, 11642,     1,   157,  7834,
+    3,   153, 31091,   444, 59886,  1913, 33259,     1,  1508, 54252,
+    2,  1333, 32066,  3949, 51343,     1,  1497, 24348,     1,  1466,
+59923,     2,   797, 10258,  2654, 46497,     1,  2189, 62516,     1,
+ 3570,  3384,     1,   379, 10684,     2,  2632, 13392,  3948, 54007,
+    1,  1077, 17711,     1,  2501,  1724,     1,  1202, 51802,     1,
+ 3405, 22099,     1,  1398, 47398,     1,  1310, 27884,     2,  1249,
+39103,  1538, 57292,     1,  2631, 20135,     1,   122,  2050,     2,
+  184, 60554,  2297, 53036,     1,    78, 36166,     3,  1433, 38680,
+ 2237, 11736,  3664, 35356,     2,  2863, 16483,  3571, 57055,     1,
+ 3066, 14218,     1,  2687,  5984,     1,  3559, 58445,     1,  1382,
+49698,     2,  1076, 24723,  1533, 41600,     2,  2568, 48096,  3957,
+ 1715,     2,  1237, 58624,  1542, 59085,     3,  2565, 36867,  2955,
+26024,  4030, 13884,     2,  1394, 36993,  4264, 46721,     2,  1108,
+56720,  4290, 46721,     4,  1149, 50235,  1546, 12322,  3984, 11151,
+ 4316, 46721,     2,  1824,  6474,  4342, 46721,     3,   483, 63297,
+ 1160, 13153,  4368, 46721,     2,   922, 53527,  4394, 46721,     4,
+  701, 52348,  1523, 38807,  2113, 49999,  4420, 46721,     3,  1364,
+59133,  2952, 16451,  3977, 10640,     2,  3252, 52617,  4492, 53860,
+    3,  2681, 34649,  2833, 32011,  4517, 53860,     3,     9, 28902,
+  505, 19875,  4542, 53860,     2,  2254, 57095,  4567, 53860,     6,
+  499, 25423,  1702, 52305,  1921, 55045,  2746, 26425,  2959, 31483,
+ 4592, 53860,     2,  2266, 36037,  4617, 53860,     2,  2443, 23314,
+ 4642, 53860,     1,  4667, 53860,     2,  1536, 11857,  2194,  7784,
+    1,  1467, 20669,     1,  2174, 58793,     1,  3904, 53208,     1,
+ 1452, 39563,     1,   173,  2601,     1,  1311, 26968,     1,   285,
+31308,     1,   208,  3502,     1,    90, 15725,     1,  3299,  2127,
+    1,  1131, 36073,     3,  3271, 22486,  3396, 47886,  3988, 42143,
+    1,    41, 20221,     2,   487, 28331,  3464, 20531,     1,   711,
+33156,     3,   971, 43496,  2310, 50119,  2881, 25128,     3,   307,
+39597,  1272, 36400,  4020, 12836,     1,  3472,  9231,     1,  4041,
+57180,     3,  1611, 32355,  1692, 10686,  3582, 46492,     3,  1315,
+61757,  1935, 36078,  3398, 63075,     1,  2508, 11960,     1,  1371,
+ 3618,     2,   316, 48827,  3741, 17262,     2,   802, 15241,  1803,
+ 6388,     1,   803, 15241,     2,   147,  5275,  2686, 56998,     1,
+  715, 60130,     1,  2685, 26508,     1,   422,  3140,     1,  3371,
+32477,     1,   586, 31638,     1,  3953, 32360,     2,  1368, 51849,
+ 3309, 13877,     1,  1387, 55141,     1,  1758, 63757,     4,   735,
+30736,  1164, 41014,  2530,  6788,  4493, 59846,     3,  2786, 49033,
+ 2842, 57580,  4518, 59846,     2,  2875, 33198,  4543, 59846,     2,
+ 2813, 64351,  4568, 59846,     2,   530, 57537,  4593, 59846,     1,
+ 4618, 59846,     5,   164, 22512,  2677, 18709,  2772, 11069,  3441,
+50761,  4643, 59846,     2,   966, 57375,  4668, 59846,     1,  2557,
+30964,     1,   348, 57334,     1,  3890,  9021,     1,   588, 26692,
+    1,  1986, 19807,     1,   775, 28596,     2,  2710, 26857,  3537,
+34439,     2,  2441, 10784,  3536, 47158,     1,  2464, 21224,     3,
+  540, 53587,  1591, 31890,  2269,  1271,     2,  1324, 10930,  3709,
+ 8184,     1,  4488, 57122,     2,  3075, 39258,  4513, 57122,     1,
+ 4538, 57122,     3,  1191, 53342,  1855, 10185,  4563, 57122,     2,
+ 1225, 41828,  4588, 57122,     3,   928, 12281,  3704, 33611,  4613,
+57122,     1,  4638, 57122,     2,   132, 56913,  4663, 57122,     2,
+ 2471, 62235,  3126, 12882,     2,  1761, 31502,  1912,  5594,     2,
+ 2159, 31234,  2476, 41423,     2,   983,  3589,  3701, 16048,     1,
+  346, 52106,     3,   353,  9807,  1373, 13503,  3467, 36393,     1,
+  569,  5041,     1,   245,  4278,     1,  3649,  4983,     2,   926,
+38965,  2596, 13356,     3,   237, 11602,  1481, 50802,  3914, 37975,
+    2,  2181, 51264,  4015,   857,     1,  2127, 30205,     1,  2747,
+56181,     1,   283, 21533,     1,   918, 31853,     3,   907,  9771,
+ 1937,  4572,  3186, 50618,     3,  2158, 11622,  3150, 23665,  3432,
+57577,     1,  2122,  8407,     1,  1885, 10841,     1,   888, 23387,
+    1,   215, 40461,     2,  3078, 26170,  4473, 43633,     3,  1686,
+24854,  2308, 39677,  2534, 49243,     1,  3359, 39960,     2,  1505,
+31297,  3124, 31235,     1,    83, 11735,     2,    12, 58971,  3243,
+59089,     1,   552, 55999,     2,   421, 61013,  1320, 57216,     1,
+ 2950,  1881,     1,   537,  4316,     1,    60, 52612,     2,  1745,
+23585,  2012, 52044,     1,  2450, 50726,     1,  2088,  1513,     3,
+ 2617, 50022,  2787, 57757,  3135,   980,     2,  1031, 45832,  1499,
+62842,     1,   103, 22765,     1,  3928, 59991,     2,  1376, 58633,
+ 3508,  9578,     2,    96, 22961,   903, 32809,     2,   946, 44751,
+ 3034, 11611,     1,  1000, 49024,     2,   639, 30732,  1902, 16694,
+    1,   826, 65131,     1,  2848, 53992,     1,  1304, 42453,     1,
+ 2460, 37491,     2,  3107, 43267,  3656,  3129,     2,  1567, 51925,
+ 2625, 54304,     1,  1512, 26319,     1,  1852, 10573,     1,  2655,
+23628,     1,  2007, 19350,     1,  4033,   620,     2,  2581,  6259,
+ 3556, 36681,     1,   757, 37900,     1,  3994,  8122,     3,   593,
+27047,  2046, 14524,  2251, 50411,     1,   878,  8618,     1,   241,
+  928,     4,    38, 17788,  1687, 51034,  2604, 36875,  3794, 60130,
+    2,   965, 40317,  1109,  7911,     1,  1440, 31032,     3,  2640,
+24984,  3021, 16021,  3869, 35964,     2,   199, 64022,  1887, 53812,
+    1,  2827, 21123,     2,   482, 24026,  1544, 61935,     1,  3684,
+53203,     2,    70, 11652,  2942,  7687,     1,  2201, 33613,     2,
+ 1241, 34431,  2559, 21740,     2,   770, 64043,  1103, 60546,     1,
+ 2267, 14619,     1,  1457, 14230,     2,  3281, 33269,  3476, 51360,
+    1,  3727, 17353,     2,   300,  8393,  3992, 55224,     1,   197,
+46716,     4,   342, 36554,   944, 41352,  1613, 33615,  2121, 50574,
+    2,  1552,  1474,  3056,  6226,     1,  3697, 43604,     1,  3978,
+10627,     1,  1354, 42985,     1,  3351, 33401,     2,   620, 55163,
+  948, 23624,     1,  3672,  7373,     2,  2018, 55571,  3312, 41015,
+    2,  3635, 51428,  3945, 51563,     1,  3632, 42312,     1,   234,
+18914,     1,  2097, 39305,     1,  4487, 42399,     1,  4512, 42399,
+    1,  4537, 42399,     1,  4562, 42399,     2,  3558, 32507,  4587,
+42399,     3,  1349, 23932,  3530, 37659,  4612, 42399,     1,  4637,
+42399,     2,  1158, 56194,  4662, 42399,     1,   950, 15950,     1,
+ 3551, 28137,     1,  1078, 28256,     1,   725, 32344,     1,  2039,
+15310,     2,  1956, 59925,  2403, 51881,     1,  3470,  9180,     1,
+ 2246,  4121,     2,  2919, 45394,  3381, 18597,     1,  2646, 64212,
+    2,  2040, 50078,  3736,  6837,     2,  3146, 10667,  3806, 65531,
+    3,  1401, 56372,  2826,  2382,  3180, 38498,     1,  1877, 28876,
+    1,  2497, 56453,     1,  3192, 29119,     3,   134, 44684,  1787,
+58199,  3669, 22990,     3,  2720, 34179,  2760, 49025,  3311,  2398,
+    3,  2048, 54240,  2225, 25526,  4504, 37428,     1,  4529, 37428,
+    2,  2951, 55182,  4554, 37428,     1,  4579, 37428,     2,  3176,
+21145,  4604, 37428,     4,   298, 34671,  2123,  3991,  3636, 19948,
+ 4629, 37428,     1,  4654, 37428,     4,  2634, 46305,  3483, 61106,
+ 4050, 34272,  4679, 37428,     2,   563, 27881,  4076, 34272,     4,
+    5, 24899,   692, 36623,  4102, 34272,  4481, 55732,     1,  4128,
+34272,     5,  1213, 37500,  3588,  8366,  3799,  6842,  3895, 17221,
+ 4154, 34272,     3,   900, 64033,  1660, 64522,  4180, 34272,     2,
+ 2915, 56536,  4206, 34272,     1,  4232, 34272,     2,  1348, 65066,
+ 3905, 29407,     1,  3378, 14515,     1,  3993, 53767,     1,  3707,
+ 8243,     1,   827, 48068,     1,   845,  6670,     1,  1276, 44690,
+    3,   571, 24673,  1346, 57657,  4059, 20471,     2,   435, 60390,
+ 4085, 20471,     2,  3545, 28711,  4111, 20471,     1,  4137, 20471,
+    1,  4163, 20471,     1,  4189, 20471,     1,  4215, 20471,     1,
+ 4241, 20471,     1,  1734, 28257,     4,   214, 64296,  1588, 17244,
+ 2524,  2099,  2662,  3496,     1,  2553, 26913,     1,   789, 22224,
+    1,  3810, 55000,     1,  3796, 33537,     2,  3199, 64168,  3880,
+16012,     2,   736, 19661,  2733, 21454,     1,   128, 60087,     1,
+ 3627, 49194,     3,   286, 59165,  2956, 52867,  3828, 38568,     3,
+ 1238, 42832,  1786, 29140,  1964, 23040,     1,   192, 19872,     1,
+ 1646, 43949,     1,  3580, 43460,     1,   383, 40472,     2,    55,
+60951,  1221,  1772,     2,   562,  2584,   589, 20723,     3,   340,
+42986,   781, 13656,  1345, 31204,     3,   634, 13471,  2635, 43395,
+ 3208, 15598,     3,  1849, 59009,  2358, 42204,  3739, 23431,     1,
+  829, 64927,     1,  2620, 11745,     1,   493, 14479,     1,  4690,
+47091,     2,  1882, 36094,  4715, 47091,     3,  1819, 52412,  2078,
+24497,  4740, 47091,     3,  1057, 53982,  2304, 64607,  4765, 47091,
+    1,  4790, 47091,     1,  4815, 47091,     3,  2184, 47234,  2191,
+45452,  4840, 47091,     1,  3910, 56320,     1,  2980, 28235,     1,
+ 2035, 27398,     1,   535, 38521,     2,  2853, 18812,  3275, 51992,
+    2,  2493,  2219,  2819, 44084,     1,  2252,   354,     1,   869,
+43854,     3,   870, 35849,  1638, 61825,  2492, 38211,     2,  2284,
+17863,  2895, 44237,     1,  3710, 65176,     2,   469,  8791,  3151,
+15298,     4,   470,  8791,   689,  2864,  2419, 50537,  3040,  5494,
+    1,  4266, 23087,     2,  2574, 62926,  4292, 23087,     2,  3830,
+15305,  4318, 23087,     5,   189, 50447,  1414, 16592,  1491, 35413,
+ 3615, 56124,  4344, 23087,     1,  4370, 23087,     4,   207,  4871,
+  225, 34671,  2231, 24415,  4396, 23087,     2,  1200, 34981,  4422,
+23087,     1,   248, 30758,     4,   366, 39877,  1520, 56993,  2223,
+14258,  3959, 13480,     3,  2376, 36765,  2997, 13730,  3763, 53648,
+    1,  2219,  8331,     2,   386, 41233,  2319, 33524,     1,  3925,
+ 3585,     1,  1511, 30239,     2,   679, 63901,  1670, 48256,     1,
+ 1681, 47250,     2,   311, 54392,  2680, 14110,     1,   527, 23819,
+    1,  1911, 40475,     1,  1990, 19570,     1,  3340, 22053,     2,
+  216, 53242,  1700,  3958,     3,  2133,  4655,  3442, 32352,  3454,
+49972,     1,  2074, 13421,     1,  2490, 22471,     1,  2541, 50124,
+    1,   764, 22068,     1,  1998, 22476,     1,   462,  8886,     1,
+ 1506, 10110,     1,  2519, 40983,     1,  2105, 61262,     1,  3875,
+ 3921,     1,  4006, 16949,     1,  2742, 40615,     1,  1751, 41960,
+    1,  3142, 47038,     1,   691,  9667,     2,   824, 52415,  3006,
+49767,     1,  4474, 17164,     2,  2504, 43056,  3343, 36085,     1,
+ 2400, 37590,     1,   794, 49235,     1,  3921, 29943,     1,  1949,
+ 4261,     2,  1177, 59313,  2118,  5725,     2,    25, 18807,  1600,
+24059,     1,  2264, 20291,     1,  2602, 46502,     1,  3852, 56842,
+    1,   221, 25805,     1,  3930, 20481,     4,  1589, 49315,  1688,
+50003,  2249, 59103,  3462, 25738,     1,  2374, 39134,     1,  1142,
+62960,     1,  1809, 29133,     2,  2131, 36075,  2811, 57674,     1,
+ 1717, 14532,     2,  3051, 24570,  3807, 31336,     2,  1642, 36844,
+ 2690, 37532,     1,  3379,  3472,     1,  1130, 51830,     1,  1905,
+60427,     1,  2322, 45766,     1,  1649, 24763,     3,   495, 46733,
+ 1034, 47568,  3599, 30027,     4,   584, 62726,  1264, 65304,  3125,
+23608,  3902, 62771,     1,   570, 53647,     2,   795, 49235,  2843,
+34314,     1,  2796, 32903,     2,  2610, 64671,  3575, 28997,     1,
+ 1299, 13141,     2,  3608, 42598,  3784, 53867,     1,  1285, 45574,
+    1,  3749, 62391,     1,  1453, 18132,     3,  1615, 54126,  2313,
+20521,  2971, 12816,     1,   597,  7601,     1,  2570, 40420,     1,
+ 2533, 11625,     1,   171, 49484,     1,  1395,  5774,     1,  2044,
+55961,     1,   465, 45567,     1,  2579, 15232,     1,  4496, 43632,
+    2,  2300, 56853,  4521, 43632,     1,  4546, 43632,     1,  4571,
+43632,     2,  3547,  8172,  4596, 43632,     1,  4621, 43632,     1,
+ 4646, 43632,     4,  1482,  3086,  1836, 46396,  3484,  2208,  4671,
+43632,     1,  3708,  5622,     1,  3394, 15334,     1,  4469, 56406,
+    1,  4051, 43911,     1,  4077, 43911,     2,  2693, 37849,  4103,
+43911,     2,  1651, 21082,  4129, 43911,     1,  4155, 43911,     5,
+  529, 45970,  1581, 42678,  2240, 63519,  4181, 43911,  4458, 11743,
+    2,  2426, 32593,  4207, 43911,     2,  2717, 48952,  4233, 43911,
+    1,   940, 59441,     1,  4697, 46703,     3,  1576, 12478,  3364,
+ 8213,  4722, 46703,     1,  4747, 46703,     3,  2382, 15183,  3459,
+63297,  4772, 46703,     2,  2138, 43585,  4797, 46703,     1,  4822,
+46703,     1,  4847, 46703,     1,  3980, 57715,     3,   370, 20679,
+ 2355, 33576,  3323,  3467,     2,   115, 54960,  2644, 62908,     1,
+  280,  6342,     2,  1739, 53020,  3330, 48673,     2,  1572, 60837,
+ 3909, 16512,     1,  3761, 64254,     1,   989, 54540,     2,   398,
+54753,  3604, 15348,     1,  3123,  3189,     1,  3568, 54059,     2,
+ 1254,  6973,  1573, 36791,     1,   284,  4190,     2,   228, 30590,
+ 1667, 53383,     2,  2280, 28218,  3514, 50461,     1,  1522,  1052,
+    1,  2520, 17624,     2,  2840, 39993,  3134, 21416,     1,  2093,
+ 3982,     2,  1068, 23685,  2115, 37318,     1,  1881, 51662,     2,
+ 2206, 18365,  3662, 45267,     2,  1111,  5993,  3237, 27723,     2,
+  825, 64545,  1388, 59884,     2,  2157,  4429,  2338, 28932,     2,
+ 2089, 51623,  2730, 41613,     2,   367, 46067,  3773, 38424,     3,
+ 3366, 46717,  3382, 47873,  3518,   571,     1,  3269, 45099,     1,
+ 4016, 48116,     2,   185, 54947,  1350,  8609,     1,  4694, 19359,
+    1,  4719, 19359,     4,   312, 58227,   423, 41629,  1719, 44342,
+ 4744, 19359,     1,  4769, 19359,     2,  1120, 13084,  4794, 19359,
+    1,  4819, 19359,     1,  4844, 19359,     1,   862,  7104,     2,
+  150, 11387,  1169, 38977,     2,  1799, 64539,  3081, 26205,     2,
+ 3286, 29903,  3907, 10989,     1,  1848, 14115,     4,   410, 55682,
+ 1400,  8221,  1480,  1228,  4062,  5895,     2,  2756, 51250,  4088,
+ 5895,     4,  1193, 19448,  2398,  2549,  3733, 48663,  4114,  5895,
+    3,  1281, 44293,  3139, 30856,  4140,  5895,     4,   898, 22696,
+ 2171, 59669,  3889, 62955,  4166,  5895,     3,  1795, 32873,  3488,
+38573,  4192,  5895,     3,   604, 33697,  3334, 31260,  4218,  5895,
+    2,  3868, 58342,  4244,  5895,     1,  2932, 50664,     1,   745,
+ 4606,     2,  2330, 31310,  4065, 41419,     1,  4091, 41419,     1,
+ 4117, 41419,     2,  3490,  6371,  4143, 41419,     2,  1759, 36994,
+ 4169, 41419,     3,  1724, 42748,  4195, 41419,  4491, 38472,     4,
+ 2276, 36207,  3102, 10539,  4221, 41419,  4516, 38472,     4,  2038,
+16531,  2178, 61512,  4247, 41419,  4541, 38472,     2,  1616, 56096,
+ 4566, 38472,     3,     1, 48137,  1105, 17590,  4591, 38472,     1,
+ 4616, 38472,     3,   713, 40683,  1801, 36736,  4641, 38472,     1,
+ 4666, 38472,     2,  1939,  5907,  3693, 62772,     1,    47, 25514,
+    2,  1666, 14334,  2657, 24053,     3,  1524, 15230,  2944,  1967,
+ 3839, 17587,     1,  2679, 24361,     4,     7,  1918,   426, 26948,
+ 1748, 47858,  2605, 22177,     2,  2333, 46868,  3291, 18200,     3,
+ 1151, 23196,  1190,  8989,  2430,  5117,     1,  3035, 26919,     2,
+   67, 38570,  3584, 36425,     3,  2060, 17416,  2116, 31153,  2623,
+44582,     2,  1330, 60614,  3429, 41952,     1,  3218, 45766,     1,
+ 2017, 25273,     2,   126, 13428,  3437,  7944,     1,   690, 55786,
+    1,  3791, 65124,     1,  2582, 33764,     3,   332,  6580,  1448,
+ 5512,  1914, 28055,     1,  3149, 12440,     2,  2731,  2740,  3236,
+54903,     1,  2814, 25562,     2,  2820, 26745,  3987, 30115,     1,
+  915, 48012,     1,  3105, 17993,     1,  3147, 43448,     3,   522,
+45886,   611, 27797,  2135, 23107,     1,   119, 48129,     1,  3646,
+27910,     1,  1065, 56754,     2,  1406, 16267,  1643, 33506,     1,
+ 1838, 11591,     1,  3838, 30091,     1,   722, 21547,     2,   288,
+53389,  2716,  2142,     1,   206, 19254,     3,   104, 53695,  1683,
+30262,  1920,  6857,     3,   253, 20355,   982, 49113,  1728,  3456,
+    1,  1541, 55988,     2,  1081,  8822,  1476, 62300,     1,  3127,
+ 3580,     2,  1207,  4965,  3534, 37110,     1,  1679, 24550,     1,
+ 3049, 40700,     1,  2461, 30490,     1,  3294, 18573,     1,  2661,
+36062,     1,   710, 40123,     1,  3072, 26117,     2,  3543, 18216,
+ 3735, 42809,     1,  4001, 52927,     1,  2477, 50744,     1,  3313,
+ 4806,     3,  1580,  3685,  2714, 30577,  2883, 63346,     2,  3251,
+45806,  4269, 47296,     3,  1236, 39999,  2925, 25567,  4295, 47296,
+    2,  3509, 50890,  4321, 47296,     4,  2566, 61588,  3145, 17393,
+ 3894, 51927,  4347, 47296,     3,   666, 20552,  2740, 62125,  4373,
+47296,     1,  4399, 47296,     2,  1154, 11676,  4425, 47296,     1,
+ 3917, 47344,     3,   242, 23991,  1673, 25670,  2636, 44340,     1,
+ 2867, 57719,     1,  2263,  5006,     2,  1087,  5237,  3703,   644,
+    1,  2226, 35922,     4,  1866, 11146,  2209, 59776,  2325, 58501,
+ 2678, 18372,     1,  4063, 23945,     1,  4089, 23945,     1,  4115,
+23945,     1,  4141, 23945,     2,   850, 28024,  4167, 23945,     4,
+   40, 33038,  1152, 12972,  1598, 45099,  4193, 23945,     1,  4219,
+23945,     2,  2352, 57088,  4245, 23945,     1,  2481, 63799,     2,
+  547, 36226,  3542, 57741,     1,  1691, 16177,     1,  3420, 59842,
+    2,  3813, 54821,  4470, 27077,     1,  1945, 61191,     2,  2023,
+60810,  2068, 22592,     2,  3011,  4503,  4465, 19180,     1,  2816,
+27337,     1,  3747, 39426,     1,  3815, 48871,     1,  3780, 30697,
+    2,  1140, 30525,  3790, 64561,     1,  2550,  6188,     1,   362,
+23845,     3,  3010,  8809,  3104, 41922,  3352, 29734,     1,  3819,
+24933,     1,  2160, 64323,     1,  4270, 63477,     2,  1047, 41615,
+ 4296, 63477,     1,  4322, 63477,     2,   637, 39900,  4348, 63477,
+    2,  3691, 28028,  4374, 63477,     1,  4400, 63477,     1,  4426,
+63477,     1,   218, 12834,     1,  3361, 36872,     1,  2164,  2916,
+    1,  1933, 18171,     1,   747, 63995,     5,  1327, 50415,  1657,
+26886,  2392, 24087,  2899, 46392,  4693,  8848,     1,  4718,  8848,
+    2,  3273, 45290,  4743,  8848,     2,   847, 49083,  4768,  8848,
+    2,  2989,  3131,  4793,  8848,     2,  4053, 26085,  4818,  8848,
+    3,   885, 37670,  4079, 26085,  4843,  8848,     2,  3764, 17068,
+ 4105, 26085,     3,  1554, 61144,  3229, 60891,  4131, 26085,     1,
+ 4157, 26085,     1,  4183, 26085,     2,   782, 37657,  4209, 26085,
+    5,   472, 38326,   496, 31546,   930,  6913,  3324, 54793,  4235,
+26085,     1,   497, 31546,     2,   489, 31546,  4861, 19242,     1,
+ 3317,  8484,     1,  3795, 14725,     1,   198,  2394,     1,  2860,
+47606,     2,   947,  8868,  2807, 21976,     3,  1036, 63089,  1393,
+12311,  4066, 34188,     3,   382, 34958,  2412, 35894,  4092, 34188,
+    1,  4118, 34188,     1,  4144, 34188,     1,  4170, 34188,     4,
+  238,  3567,  1051, 40442,  3489, 50434,  4196, 34188,     1,  4222,
+34188,     2,  1284, 31150,  4248, 34188,     1,    94, 19959,     1,
+ 1930, 39849,     1,  3503, 57178,     2,   359, 62397,  3844, 25261,
+    1,    46, 26313,     1,   906, 23839,     2,   511, 51223,   876,
+55652,     2,   914,  9102,  3685, 34061,     1,  1977, 60734,     1,
+ 1816, 13080,     1,   246, 65087,     3,   372, 40242,   917, 60379,
+ 3652, 27734,     2,  1490,  6071,  2279, 37872,     3,  1802,  4399,
+ 2315, 22842,  2627,  5571,     2,   561, 52498,  1101, 12995,     2,
+  984, 39587,  1403, 16230,     2,  1754,  8662,  2406,  2684,     2,
+ 2738, 16708,  3748, 26502,     1,  2668, 36121,     3,   419, 20497,
+  891, 42321,   941, 37568,     1,   165, 46167,     1,   268, 11984,
+    3,   880, 40346,  1303, 47910,  1952, 31350,     3,  3221, 23164,
+ 3247, 23084,  4055, 52618,     1,  4081, 52618,     1,  4107, 52618,
+    3,  1946, 51547,  2931, 14338,  4133, 52618,     1,  4159, 52618,
+    1,  4185, 52618,     3,  1460, 40727,  2518, 21870,  4211, 52618,
+    3,  2140, 12730,  3057, 55334,  4237, 52618,     1,    18, 52003,
+    2,  1540, 61754,  2066, 42341,     3,   317, 20825,  2311, 55375,
+ 2823, 23737,     2,  1436, 63752,  4456, 25365,     1,  3940, 60334,
+    2,   769, 15830,  1339, 32042,     1,  1181, 36810,     3,   176,
+ 9374,  1182, 36810,  2179, 44321,     2,  1183, 36810,  3242, 10465,
+    3,   270, 29685,  1124,  7310,  2466, 43320,     1,  3375, 15943,
+    1,  3754, 49654,     1,  1682, 51604,     1,  3853, 33304,     2,
+  633, 29883,   762, 57990,     1,  1208, 55332,     1,    68, 50637,
+    3,  1129,  2051,  1218, 22054,  3195, 58494,     1,   871, 26965,
+    1,  3129, 46073,     1,   872, 18960,     2,  1061,  4878,  3671,
+20159,     3,  1405,  9608,  1418, 59915,  1534, 57852,     1,  3430,
+54613,     1,  4445, 60935,     1,  3937,  4469,     3,  2360,  6396,
+ 2489, 50987,  4054, 63084,     1,  4080, 63084,     3,  2904, 41874,
+ 3874, 43791,  4106, 63084,     1,  4132, 63084,     2,  1551, 60631,
+ 4158, 63084,     1,  4184, 63084,     2,  1867, 44483,  4210, 63084,
+    1,  4236, 63084,     3,  1179, 11417,  1184, 36810,  3363, 61765,
+    1,  1185, 36810,     1,  1098,  6114,     1,  2924, 14973,     3,
+  217, 55853,  2096, 51876,  3220, 56305,     1,   875, 10711,     2,
+ 1375, 25011,  3383, 62949,     3,  2242, 12767,  2348, 45570,  2638,
+10376,     1,  2788, 28562,     2,  2071, 21224,  3924,  8540,     1,
+ 2143, 65162,     2,   901, 52922,  4444, 25934,     3,   399,  7574,
+ 1135, 58553,  3897, 38993,     1,   605, 15290,     1,  3606, 21043,
+    1,  3360, 64707,     2,  2737, 61521,  4503, 10836,     2,  1594,
+20895,  4528, 10836,     3,  1082, 40973,  2540, 61158,  4553, 10836,
+    1,  4578, 10836,     1,  4603, 10836,     1,  4628, 10836,     3,
+ 2591, 21447,  3148, 44195,  4653, 10836,     2,  3585, 45632,  4678,
+10836,     3,   194,  1478,  1410, 57051,  3973, 20584,     1,  2302,
+ 3225,     1,  1186, 36810,     1,  2465, 50155,     2,  1769, 45886,
+ 2595, 43202,     2,  1898, 19916,  3848, 39939,     2,  1915, 17947,
+ 2299, 32491,     2,   512,  1159,   607, 56196,     1,  1250,  2410,
+    2,  1159, 45125,  2578, 28572,     1,  2940, 59084,     1,  3628,
+36937,     1,  4009, 38712,     2,  1847, 39734,  3055,  1017,     1,
+ 2447,  5691,     3,  1471, 59363,  1869, 24892,  4036,  4150,     2,
+  785, 26484,  2409,  2826,     3,   260, 30636,  2898, 35487,  4003,
+45352,     2,  2148, 61425,  3752, 19409,     1,  2544, 36887,     3,
+ 2498, 43976,  3266, 10290,  3416, 24159,     1,  1209, 13086,     1,
+ 3975, 45877,     3,   343, 41925,  1590, 52511,  2364, 42347,     1,
+ 2734, 49513,     2,  1297, 55200,  2256, 61086,     1,  3732, 26600,
+    1,   509, 61284,     2,   352, 54190,  3298, 59971,     1,  3653,
+35949,     1,  1537, 14272,     1,  3431, 15711,     1,   599, 43886,
+    1,  1146,  3560,     1,  3561, 16534,     1,  3060, 27830,     1,
+ 3809, 25046,     1,  3140, 55598,     1,  1662, 26677,     1,  3357,
+54146,     3,   455, 11988,  1640, 35271,  3846, 23943,     1,  2134,
+25198,     1,  1091, 22251,     2,   141, 35996,  1168, 54734,     2,
+ 2387, 32479,  4253,  2197,     1,  4279,  2197,     2,  2022, 32421,
+ 4305,  2197,     1,  4331,  2197,     2,  2873, 16099,  4357,  2197,
+    1,  4383,  2197,     4,   133, 18788,   314, 55340,  1419, 64616,
+ 4409,  2197,     2,   474, 38313,  3682, 55222,     1,  2378, 46896,
+    2,  1132, 49389,  2260, 11139,     1,  3765, 16509,     3,   809,
+20534,  3586, 40116,  3725,  9636,     1,   428,  5300,     2,   480,
+24827,   502, 58935,     3,   479,  7102,  1144, 12586,  3013, 35391,
+    1,  3038, 13914,     1,    56, 44155,     5,  1056,  9463,  1989,
+22848,  3553, 55478,  3887, 42010,  3956, 62817,     2,   828, 61033,
+ 1634, 49545,     3,  1262,   229,  1707, 40583,  3593, 37315,     2,
+ 1148,  8852,  2170, 51674,     1,  2569, 32883,     1,  1635, 31074,
+    2,   693,  7682,   790, 50767,     1,  2413, 45706,     1,   568,
+23831,     1,  2457,  2298,     1,  1821, 15160,     2,   378,  8612,
+ 1782, 48746,     1,   754, 50380,     2,    61, 55617,   650, 22342,
+    2,  2652, 27136,  2916, 12345,     1,  1361, 10832,     1,   961,
+35176,     1,   767, 14113,     4,   783, 18173,  2456, 24212,  2624,
+ 5558,  3544, 50755,     1,  1976, 23988,     1,  2968, 58761,     2,
+ 1515, 54623,  3614,  8876,     1,  4271,  3768,     3,   813, 52072,
+ 3335, 15197,  4297,  3768,     4,   148,  3386,  1206, 17467,  3080,
+30697,  4323,  3768,     1,  4349,  3768,     3,  3096,  1904,  3350,
+15927,  4375,  3768,     2,  2106, 54521,  4401,  3768,     1,  4427,
+ 3768,     2,  1596, 63565,  3114, 39015,     1,   834, 21408,     1,
+ 3529, 12567,     1,  3864,  9649,     1,   780, 28412,     2,  1812,
+14606,  4459, 46848,     2,  2332,  5510,  2921,  1466,     1,    51,
+19083,     3,    45, 24707,   995, 20866,  1489, 12378,     1,   169,
+30858,     2,   258, 11547,  3510, 34063,     2,    75,  4780,  1550,
+  861,     2,  2745, 62914,  3194, 44525,     1,  3183, 42123,     2,
+ 1864, 63104,  2418, 33073,     1,  3511, 24256,     1,  4273, 56121,
+    2,  3461, 43364,  4299, 56121,     6,   625, 39642,  2192,  9640,
+ 2285, 13082,  2993, 36394,  3316, 60381,  4325, 56121,     2,  2084,
+12410,  4351, 56121,     2,  3234, 58080,  4377, 56121,     3,  1892,
+40648,  2483, 47547,  4403, 56121,     2,  3972, 19328,  4429, 56121,
+    1,  4277, 23444,     4,  1862,  5298,  2588, 56114,  2889, 65501,
+ 4303, 23444,     2,  1112,  7510,  4329, 23444,     1,  4355, 23444,
+    2,  2433,  1335,  4381, 23444,     2,   354, 61004,  4407, 23444,
+    1,  4433, 23444,     1,   331, 46660,     4,   578, 30709,   756,
+61350,   841, 13314,  2091, 44601,     1,  2835, 59178,     2,  2065,
+46078,  2914, 55687,     1,   981,  3283,     1,  3601, 21102,     2,
+  515, 19054,  3866,  6411,     1,  2911,  4870,     1,  2615, 40733,
+    2,  2448, 28536,  3029, 10824,     1,  1851, 18914,     2,   955,
+55552,  3337, 49564,     2,  1008, 17868,  3781,  6304,     2,  1450,
+55466,  3419, 36756,     1,   102, 17546,     2,  1134, 29691,  2974,
+58594,     1,  1267, 54000,     2,   628, 52957,  2818,  4308,     2,
+    8, 36679,  3779, 56955,     2,  3259, 26806,  3486, 10083,     1,
+ 2316, 10492,     2,  1454, 34217,  3189, 19098,     1,   259,   923,
+    1,  3458, 21243,     2,   137,  8519,  3061, 17426,     1,   623,
+11283,     1,  2523,  4300,     3,  1128,  2521,  4256, 52736,  4685,
+11827,     3,  3212, 47122,  4282, 52736,  4710, 11827,     2,  4308,
+52736,  4735, 11827,     2,  4334, 52736,  4760, 11827,     3,  3174,
+19575,  4360, 52736,  4785, 11827,     4,  1381,  9723,  3098, 22343,
+ 4386, 52736,  4810, 11827,     3,  1947, 62865,  4412, 52736,  4835,
+11827,     2,   823, 25768,  2991, 45132,     3,   556, 15741,  2354,
+57132,  3613, 19778,     1,  3515, 31319,     1,  2584, 11405,     2,
+ 2868, 19175,  4443, 55082,     1,  2442,  6109,     1,  2721,  2693,
+    1,  1796, 16572,     1,   699, 19760,     1,   294, 55939,     4,
+ 1740, 60224,  1959, 63875,  2886, 61866,  3020, 19958,     3,  1473,
+27237,  2379, 21316,  2822, 25725,     1,  2314, 26371,     2,   135,
+24943,   205, 44118,     1,  3526, 55394,     1,  3822, 64610,     2,
+  643,  6465,  3731, 26659,     2,  2828, 15270,  3067, 43119,     1,
+ 2161, 45515,     1,  4477, 12332,     1,   322,  3436,     2,   798,
+45467,  1138, 18562,     1,  2626, 37445,     2,  1694, 31035,  3663,
+52621,     1,  1257,  1367,     3,  1674, 32965,  1808, 23340,  3226,
+52320,     1,  1735,  1382,     2,   852,  7733,   957,  1335,     2,
+ 2025, 13892,  3998, 20205,     2,   130, 51386,  1396, 64281,     2,
+ 1119, 50377,  2021,  5865,     1,  2162, 28874,     3,    62, 41330,
+ 2432, 63359,  4263, 32474,     2,  1645, 43367,  4289, 32474,     1,
+ 4315, 32474,     3,   449,  3220,  2576, 11021,  4341, 32474,     1,
+ 4367, 32474,     2,  3214, 47440,  4393, 32474,     2,   842,  6387,
+ 4419, 32474,     3,  3177, 61022,  3549, 35968,  4862, 35567,     1,
+ 2650, 24122,     3,   732, 63843,   776, 40328,  2312, 61255,     1,
+ 2859, 19043,     2,   244, 13498,  2320, 65473,     3,   712, 33160,
+  822, 59593,  3160, 22511,     3,   229, 47690,  1709,  5127,  3070,
+51830,     2,  1094, 34673,  3631, 17310,     1,  1277, 65152,     4,
+  904, 17211,   988, 29496,  1543, 41146,  2527, 47012,     2,  2054,
+ 8967,  2601, 24344,     1,  3522, 57726,     1,  1896, 33847,     1,
+ 1074, 28533,     2,   548, 28941,  2514, 45750,     2,   916, 48078,
+ 3030, 64423,     2,  2130, 45499,  2618, 55994,     1,  1928, 38808,
+    1,  1727, 28786,     1,   618, 45466,     4,   326, 65044,   925,
+10619,  2045, 42492,  4275, 10158,     1,  4301, 10158,     1,  4327,
+10158,     5,  2589, 28423,  2998, 61831,  3555, 55537,  3912, 21657,
+ 4353, 10158,     2,  2709, 26710,  4379, 10158,     1,  4405, 10158,
+    2,  2672,  8985,  4431, 10158,     1,  2732, 61080,     2,  2785,
+15674,  2908,  8281,     2,    14, 31121,  2153, 43730,     2,   784,
+29529,  1328, 52402,     1,  4026, 31755,     2,  1560, 54603,  2571,
+47645,     1,  1232, 44176,     2,  3241, 49454,  3640, 38543,     2,
+ 1187, 60132,  1472,  8268,     1,  3425, 44374,     2,  3843, 23744,
+ 3855, 60955,     1,   951,  3250,     2,   964,  7495,  2175, 41426,
+    1,   526, 25327,     3,    29, 55180,  1991, 61185,  3771, 25830,
+    1,   467,  9083,     1,  1984,   464,     1,  1408, 46786,     2,
+  945, 56983,  3512, 24227,     2,   321, 54417,  3724,   268,     1,
+ 4691, 24406,     1,  4716, 24406,     3,   320, 48639,  2728, 34923,
+ 4741, 24406,     4,   886, 62321,  3392, 61214,  4766, 24406,  4870,
+ 9940,     1,  4791, 24406,     1,  4816, 24406,     3,  2228, 55263,
+ 3033, 20225,  4841, 24406,     1,  3027,  4313,     4,  1319, 27166,
+ 1631, 57802,  1663, 29797,  4057, 36921,     1,  4083, 36921,     2,
+  431, 30233,  4109, 36921,     2,   774, 60768,  4135, 36921,     1,
+ 4161, 36921,     1,  4187, 36921,     1,  4213, 36921,     2,   281,
+26823,  4239, 36921,     1,  4013, 24644,     4,   105, 45106,  1033,
+58122,  2995, 49562,  3206, 47552,     2,   566, 23671,  2277, 35765,
+    2,   178, 12248,  1737, 24050,     1,  2397, 57371,     1,   929,
+25730,     1,  2975, 22924,     1,   120, 10592,     1,  2630, 62130,
+    2,  2474, 43380,  2748, 59620,     1,  2281, 59123,     3,   564,
+20421,  1557, 18211,  2802,  6940,     3,  1768, 63992,  3600,  8683,
+ 4447, 16169,     2,   201, 45668,  1619, 57266,     2,  2555, 11635,
+ 3028, 25744,     1,   335,  8419,     4,   371, 29110,  1102, 27055,
+ 1744, 38532,  2002, 50561,     3,   220, 58908,  1421, 25167,  2425,
+33025,     2,  1874, 65518,  2334, 53273,     1,  3523, 32392,     1,
+  815,  4911,     1,   560, 20557,     1,  2307, 19945,     1,  1009,
+53702,     1,  2187, 65080,     1,   635, 15112,     2,  1235, 64079,
+ 3248, 61848,     2,   744,  7083,   882, 34444,     1,  3482, 11018,
+    1,  2282, 51657,     2,  2394, 36974,  4452,  8420,     1,  2551,
+44381,     1,  3103, 22543,     1,  2847, 65003,     1,  1351, 39362,
+    1,  2905, 37472,     1,  1715, 47899,     2,  2010,  4905,  3699,
+32655,     1,    63, 17228,     2,   972, 17372,  3372, 26577,     2,
+  179, 20583,  2797, 23174,     1,  2884, 37642,     2,  2317,  9946,
+ 3064,   232,     2,   624, 33602,   743,  2693,     3,   387,  8813,
+ 1243, 45420,  1714, 10589,     1,  1390, 40950,     1,  1973, 40404,
+    2,   477, 44361,  1568, 55540,     1,  3250,  7039,     2,   645,
+ 2981,  2198, 53021,     1,  3245, 26372,     1,  1332, 25787,     3,
+ 1708, 41500,  3304,  5203,  3979, 33749,     5,  1216, 28144,  1308,
+  725,  1380, 26564,  2621, 30696,  3474,  9143,     4,    59,   643,
+ 1389, 61242,  1916,    48,  2011, 53681,     1,  2891, 25937,     2,
+ 1180, 31271,  2758, 21677,     1,  3376, 60733,     1,  2795, 57107,
+    1,  4019, 15588,     2,   532, 21921,  1825, 32255,     2,  1936,
+29154,  2499, 22210,     1,   140,  4792,     1,  2341, 56410,     1,
+ 2411, 49149,     2,  2587, 54117,  2885, 29165,     2,  3436, 19283,
+ 4869,  9940,     1,  1156, 24403,     2,  2488, 65460,  2736, 36328,
+    1,  2607, 28465,     1,  3347, 30248,     1,  1259, 14069,     1,
+ 3629, 63504,     1,  2047, 14922,     1,  2642, 29832,     3,  1609,
+40438,  2647, 42815,  3422, 36028,     3,  1167,  4955,  1231,  9419,
+ 2188, 27733,     2,  1283, 21168,  2854, 42014,     2,  1118, 57668,
+ 2111, 43773,     1,  2973, 65123,     2,   374, 51902,  3450, 45576,
+    1,  1800, 44263,     1,  3505, 28847,     1,  3751,  4017,     2,
+ 1582, 65335,  2946, 33060,     1,  1995, 60567,     1,   640, 44791,
+    1,  3339, 38976,     1,  1438, 14240,     1,   627, 54399,     1,
+ 3322, 30080,     1,   391, 39060,     1,  1104, 12613,     3,  1147,
+25613,  1561, 34195,  1695, 10225,     1,  2034, 32457,     2,  2268,
+53494,  2945, 31017,     2,  1052, 25292,  1620, 61106,     1,  3093,
+24164,     1,  4252, 30445,     2,  2458, 22605,  4278, 30445,     1,
+ 4304, 30445,     4,    21, 64258,   587, 22994,  4330, 30445,  4866,
+ 7130,     3,   921,  3624,  1175, 49466,  4356, 30445,     1,  4382,
+30445,     3,  3449,  8194,  4040, 12951,  4408, 30445,     2,  2386,
+34663,  2670,  1035,     1,   799, 62020,     1,   590, 43459,     2,
+  204, 58580,  1988, 34804,     2,  3162, 32927,  3274, 29376,     1,
+ 1623, 62975,     2,  1196, 23589,  1779, 50362,     1,  3675, 29346,
+    2,    89, 13885,  1474, 20182,     1,  3533,  2764,     3,  2321,
+ 2984,  2857, 52082,  3331, 41087,     2,   980, 62489,  1122, 32866,
+    1,   149, 47468,     3,     3, 28480,  3327, 48618,  3891, 23331,
+    3,  2008, 38287,  2274, 13877,  3341,  6652,     2,  2470, 27356,
+ 4012, 48247,     1,  4495, 41588,     3,  1458, 64894,  4450, 60955,
+ 4520, 41588,     2,   254, 19402,  4545, 41588,     2,  1312, 54663,
+ 4570, 41588,     1,  4595, 41588,     1,  4620, 41588,     2,  1469,
+41095,  4645, 41588,     2,  1823, 62630,  4670, 41588,     1,  1060,
+11068,     1,  1417, 41529,     2,   251, 20495,  2407, 61520,     1,
+ 1359, 51469,     1,  3084, 39036,     2,  1329, 42309,  4860, 37121,
+    1,   490, 61013,     3,   274, 62101,  1165,  7142,  3990, 51716,
+    1,  1718, 55553,     1,   682, 57624,     5,  1370, 22501,  1502,
+ 5061,  2345, 38056,  2933,  3857,  4500, 12331,     4,  1726, 15085,
+ 1922, 38912,  2641, 19831,  4525, 12331,     1,  4550, 12331,     3,
+ 2821, 14067,  3448,  2025,  4575, 12331,     1,  4600, 12331,     3,
+  360, 30933,  1886, 38107,  4625, 12331,     1,  4650, 12331,     1,
+ 4675, 12331,     2,  1114, 18589,  2837, 26183,     3,  1630, 19675,
+ 2902,  6962,  3618, 53464,     1,  3755, 63757,     1,  1288, 64806,
+    3,  1116,  7079,  2230, 19307,  2362,  6646,     1,  1873, 20170,
+    1,  1517,  7261,     1,  4464, 52713,     1,  2698, 31849,     1,
+ 3592, 45652,     1,   113, 40063,     1,  1904, 32245,     2,  2203,
+60657,  4701, 15402,     3,  3137, 56708,  3428, 28717,  4726, 15402,
+    1,  4751, 15402,     2,  2247, 55810,  4776, 15402,     3,  2548,
+19128,  4052, 64894,  4801, 15402,     3,  1028, 31353,  4078, 64894,
+ 4826, 15402,     3,  2205, 25054,  4104, 64894,  4851, 15402,     2,
+  763, 64470,  4130, 64894,     2,    37, 25816,  4156, 64894,     2,
+ 1427, 62764,  4182, 64894,     2,  1955, 27109,  4208, 64894,     1,
+ 4234, 64894,     1,  3955, 28440,     2,  2015, 49668,  3759, 19248,
+    2,  2076, 18363,  2444, 54539,     1,   356, 43059,     3,   835,
+51008,  1835, 18340,  3427, 38187,     1,  2001, 29242,     2,  2563,
+ 2318,  3745, 36163,     1,  3203, 13383,     1,  2770, 14566,     2,
+  714, 38210,  2275,   431,     2,    66, 20767,  2600,  2619,     1,
+ 1006, 58610,     3,   324,  5675,   837, 13797,  2298, 27821,     1,
+ 1960, 13500,     2,  2033, 14082,  3540, 18906,     1,    50, 39912,
+    1,  4688, 50028,     1,  4713, 50028,     2,  1815, 62207,  4738,
+50028,     2,   669, 14201,  4763, 50028,     1,  4788, 50028,     1,
+ 4813, 50028,     1,  4838, 50028,     2,   163, 42174,   306, 42499,
+    1,  3225,  4881,     1,  3857, 28400,     3,   329, 11600,   451,
+46734,  1656, 15319,     1,  3338, 62626,     1,  2794, 37601,     2,
+ 1676, 12981,  2529, 12143,     2,  3044, 18026,  3900, 41776,     1,
+  680,  2991,     2,  1015,  7333,  2926, 43601,     3,  2864, 32942,
+ 3118, 62730,  3453, 43488,     4,  2671, 47564,  3122,  8282,  3589,
+62222,  3817, 58464,     1,  2108, 58061,     1,  1723,  6586,     1,
+ 3494, 41955,     1,  3128, 11825,     3,  1197, 51292,  1334, 50382,
+ 1519, 33442,     1,  2967, 57877,     1,  3296, 28451,     1,  4060,
+38155,     2,   393, 40480,  4086, 38155,     2,   853, 35090,  4112,
+38155,     2,  3962, 20877,  4138, 38155,     2,   131, 15446,  4164,
+38155,     1,  4190, 38155,     1,  4216, 38155,     2,   406, 46707,
+ 4242, 38155,     2,   413, 46707,  2327, 34942,     2,  1775,  4996,
+ 3944, 50883,     3,  1317, 31447,  2436, 49182,  3922,  9641,     3,
+  519, 63930,   912, 13348,  4276, 39586,     2,  1712, 64612,  4302,
+39586,     2,  2208, 55313,  4328, 39586,     4,   389, 17383,  1392,
+45661,  2452, 40399,  4354, 39586,     3,  1652, 28748,  2792, 39002,
+ 4380, 39586,     3,   211,  7605,   369, 34193,  4406, 39586,     5,
+  612, 26687,  2806, 11374,  2990, 24721,  3368, 59418,  4432, 39586,
+    1,  3244, 33521,     1,  3307, 44087,     1,   364, 27600,     1,
+ 3032,  9830,     1,   742, 61174,     1,  3934, 43870,     2,   190,
+29555,  2880, 65228,     3,  1671, 28090,  3187, 44250,  3941, 28159,
+    1,  1416, 62228,     1,   397,  1030,     2,  1099, 62259,  3047,
+55878,     1,  1211, 38395,     2,   304,  3501,  2061, 19533,     3,
+ 2367, 55902,  2793, 26982,  2936, 54622,     1,  1020, 19895,     2,
+ 2214, 25010,  3776, 56871,     1,   778, 39262,     2,  2767, 57501,
+ 3789, 10936,     1,  2858, 41761,     1,  1021,  9655,     1,  4268,
+13953,     5,   124, 61178,   478, 42206,  2128,  1556,  2525, 26497,
+ 4294, 13953,     3,  1106, 33940,  3279, 61772,  4320, 13953,     4,
+ 2711, 11210,  3130, 51863,  4346, 13953,  4508, 40614,     2,  4372,
+13953,  4533, 40614,     3,   993, 24134,  4398, 13953,  4558, 40614,
+    2,  4424, 13953,  4583, 40614,     3,   116, 20732,  1675, 39467,
+ 4608, 40614,     2,  2361, 11750,  4633, 40614,     3,  1746, 30080,
+ 3301, 34874,  4658, 40614,     1,  4683, 40614,     2,  1701,  8983,
+ 2656, 52742,     1,  1962,  1408,     3,  1337, 60558,  2897, 55137,
+ 3387, 51575,     1,  2340, 11941,     4,  2103,   792,  2329, 50225,
+ 2385, 61696,  3456, 57997,     4,   368,  4155,  1086, 60806,  1341,
+53321,  3240,  3921,     2,  2629,  4111,  3903, 21159,     4,  3121,
+31309,  3200, 32025,  3856, 60027,  3943, 59702,     2,  2606, 15092,
+ 3862, 47678,     1,   953, 14866,     1,  1725,  8177,     2,  1199,
+54477,  2073, 63793,     1,  1214,  8336,     2,  1357,  8507,  3412,
+12124,     3,   866, 60530,  1443, 51308,  2291, 49710,     1,  3492,
+25358,     1,   475, 12386,     1,  1404, 36437,     2,   766, 35935,
+ 3238,  9223,     2,  3605, 50119,  4471, 17209,     4,  1586, 43763,
+ 2831, 30401,  2894, 61593,  3264, 58729,     1,  3782, 33016,     1,
+ 2083,  8457,     1,  3622, 26426,     2,  1432, 53679,  4865, 30283,
+    1,  1766, 31605,     3,  1756, 60143,  2217, 23331,  3336,  2279,
+    1,    11, 19010,     2,   313, 22575,  1409, 46126,     1,  1007,
+54388,     1,  3026, 42094,     3,   616, 10789,  1778,  2833,  2705,
+47857,     1,  1730, 36041,     3,   282, 29735,  3667, 56112,  3983,
+16573,     1,  3997, 37354,     2,  1518, 17975,  3401, 64094,     1,
+  959, 43590,     1,   606, 56074,     1,  3165, 24547,     2,  1150,
+ 2311,  2306, 62165,     2,  3493, 46271,  3502, 11341,     2,  2006,
+61021,  2744, 60996,     1,  3184, 13222,     1,  4448, 28975,     1,
+ 3079, 63185,     1,    33, 21793,     2,  1531, 52594,  2664, 15802,
+    4,  1831, 29640,  3562, 18007,  3690, 55801,  3860, 33859,     2,
+ 3219, 35023,  3596, 30958,     2,  1777,  3302,  3326, 30969,     2,
+  697, 51536,  2431, 40065,     1,  2190, 14645,     2,  1307, 12486,
+ 3233, 47948,     1,  3619, 48425,     1,  3591, 13672,     4,  2614,
+50525,  2752, 12658,  2893, 38183,  3393, 59414,     1,  2753, 12658,
+    1,   895,  3339,     1,  2120, 46874,     3,     4, 23290,   142,
+14645,  1981, 49038,     2,   293,  9293,  2053, 63553,     1,  1439,
+11781,     1,  4695, 61705,     1,  4720, 61705,     1,  4745, 61705,
+    2,  1282, 56551,  4770, 61705,     2,  2538,  6296,  4795, 61705,
+    1,  4820, 61705,     2,  3008, 44859,  4845, 61705,     2,  2577,
+19859,  3282, 25188,     2,   402, 38263,  2487, 45551,     1,  3802,
+48734,     2,  3936, 56996,  4505, 40787,     1,  4530, 40787,     1,
+ 4555, 40787,     2,  1975,  3347,  4580, 40787,     2,  2154, 27536,
+ 4605, 40787,     2,  3018, 44760,  4630, 40787,     2,  1246, 22662,
+ 4655, 40787,     3,   857, 14008,  1079, 34923,  4680, 40787,     1,
+  528, 35888,     3,   942,  3273,   979, 21621,  3155, 53055,     3,
+  239, 62560,  2947, 17896,  3576, 53292,     2,   416, 54648,  1145,
+13271,     3,   361, 22494,   412, 27125,  2824, 20795,     4,   558,
+13595,  1016,  4043,  3261, 24970,  3744, 51532,     2,  2180, 57004,
+ 2985, 58500,     1,  1618, 24150,     2,   660, 40124,  2239, 21151,
+    2,  2528, 60465,  3063, 24289,     1,   175, 47738,     1,   277,
+37918,     2,  1893, 40601,  3976, 26818,     2,   438, 16290,  2183,
+10967,     1,  2888, 32934,     3,    87, 15583,   388, 33506,  4049,
+37789,     1,  4075, 37789,     2,   357, 41110,  4101, 37789,     3,
+ 1599, 46511,  3345,  5560,  4127, 37789,     3,  2791, 37070,  4153,
+37789,  4435, 57356,     1,  4179, 37789,     1,  4205, 37789,     2,
+  949, 63264,  4231, 37789,     1,  2221, 61490,     1,  2622, 58081,
+    2,   172, 45627,  3258, 29995,     1,   636, 28622,     2,  1501,
+ 3085,  4024, 60616,     3,   273, 57895,  1435, 54326,  3403, 43001,
+    2,  2696, 44094,  4490, 43131,     2,  1247, 35859,  4515, 43131,
+    2,  3720, 54409,  4540, 43131,     2,  3209, 60368,  4565, 43131,
+    2,   752, 51396,  4590, 43131,     2,  3768, 57072,  4615, 43131,
+    1,  4640, 43131,     1,  4665, 43131,     1,  1062, 15253,     2,
+ 1064,  2901,  1950, 24065,     2,   403, 51918,   652, 49561,     1,
+ 1711,  3822,     1,  4478, 53948,     2,   621, 25894,  3738, 47162,
+    2,  2026, 39505,  4864, 30283,     4,   619, 50623,   737, 15230,
+ 1340, 57682,  2586, 44803,     2,  2428, 16006,  3099, 43030,     2,
+  174, 20563,  1539, 50261,     1,  1305, 46107,     1,  2651, 28715,
+    2,  1162, 61306,  1301, 58172,     1,   546, 27424,     2,  1029,
+29841,  4868,  9940,     1,   868, 44226,     1,  1781,  9481,     1,
+ 3840, 56097,     2,  2081, 52307,  3841, 56097,     1,   855, 52445,
+    2,  1378, 48335,  3216, 26899,     1,  4472, 52158,     3,   121,
+40869,  1066, 18137,  3223, 12756,     2,  3651, 37345,  3706, 62042,
+    1,  3659, 25476,     3,  2305, 19873,  2472, 30037,  3050, 47808,
+    1,  1252, 57949,     1,  2295, 49006,     2,   466, 51061,  2970,
+11002,     1,  1486, 59769,     4,   227, 43302,   748, 52902,  3954,
+18854,  4021, 10076,     1,  3278, 34748,     1,  3915, 21583,     3,
+ 2597, 37746,  3365,  9728,  3721, 11411,     2,   761,  7203,  2775,
+44119,     2,  2331, 31149,  3260, 29226,     1,    58, 10068,     1,
+  985, 13539,     2,   138, 15193,  4696, 63613,     2,  3003, 55896,
+ 4721, 63613,     2,   143, 42791,  4746, 63613,     2,  2800, 26665,
+ 4771, 63613,     2,  2708, 51496,  4796, 63613,     2,   518,  9810,
+ 4821, 63613,     2,  1273, 39081,  4846, 63613,     1,  1925,  5846,
+    3,   933, 30332,  1997, 37055,  2102,  1998,     2,   365, 39179,
+ 3414, 62520,     1,  1309, 59569,     1,  2467, 58006,     1,  1073,
+29561,     1,  2556, 25054,     2,  1325, 12972,  2079, 13558,     1,
+  626, 24146,     1,    73, 64772,     1,  3695, 24459,     2,  1426,
+14279,  3743, 34192,     2,  1951, 54628,  2735, 47287,     1,  2713,
+52385,     1,  3036, 18019,     1,  2537, 41251,     1,  3267, 26759,
+    3,    76, 11204,  2982, 48574,  4687, 22922,     3,  1858,  7262,
+ 1903, 41111,  4712, 22922,     2,   418,  1788,  4737, 22922,     3,
+  424, 14107,  2688,  5307,  4762, 22922,     1,  4787, 22922,     4,
+ 1300, 60170,  2257, 53580,  3678, 31271,  4812, 22922,     2,  2874,
+30506,  4837, 22922,     2,   854,  9748,  1477, 53410,     4,   188,
+54086,  1014, 20974,  1790,   150,  3024, 59719,     2,   447, 62838,
+  924, 18911,     2,   894, 61943,  3951, 31620,     2,  2810,  4809,
+ 3935, 54103,     2,   468, 26931,  4497, 17302,     3,  1987, 19949,
+ 3974, 24510,  4522, 17302,     1,  4547, 17302,     1,  4572, 17302,
+    1,  4597, 17302,     2,  4037, 28528,  4622, 17302,     2,  2673,
+41437,  4647, 17302,     2,  2390, 58488,  4672, 17302,     1,  1136,
+38133,     1,  1217, 46791,     1,  3285, 45896,     1,  2969, 42257,
+    1,  3705, 33753,     3,  2801, 24873,  3255, 13149,  3926, 53644,
+    1,  2357,  2545,     1,  3302, 16806,     1,  3138, 29518,     3,
+ 1684,  2467,  2037, 61057,  3305, 26256,     2,  1780, 31346,  3620,
+ 7540,     3,   716, 60479,   832, 41505,  2983, 16409,     2,  2182,
+51406,  4272, 43007,     4,    19, 50140,  1760, 60089,  3495, 32061,
+ 4298, 43007,     1,  4324, 43007,     3,   779, 38505,  2042, 12807,
+ 4350, 43007,     1,  4376, 43007,     2,    88, 44325,  4402, 43007,
+    2,   709, 55254,  4428, 43007,     2,  3001, 47335,  3395, 50881,
+    2,   573, 14159,  1166, 50768,     2,   932, 63562,  3676, 27863,
+    1,  3612, 59776,     2,   730, 30948,  2318, 62207,     1,   657,
+19144,     1,   127, 31011,     1,  2562, 58203,     3,   222, 20775,
+  772, 15070,  3367, 49985,     1,  1391, 26940,     2,  1075,  4756,
+ 2817, 56888,     1,  3090, 25034,     1,  3000, 38467,     1,   582,
+ 4047,     2,  1117, 24467,  2798, 40545,     1,   651,  7740,     2,
+ 1423, 20984,  2168, 45507,     1,  2962, 43751,     1,   600, 49570,
+    1,    35, 36192,     2,    20, 30554,  3062, 29328,     1,  1266,
+38827,     3,  1113,   109,  2683, 35683,  3698, 64582,     1,  1093,
+61225,     3,  2271, 60079,  3207, 27739,  3923, 52349,     1,   434,
+14914,     1,  2957, 57031,     1,  3268, 21682,     2,   696, 47233,
+ 1344, 39271,     1,  1399,  3055,     1,  3377, 56550,     2,   425,
+11321,  2927, 43284,     1,  3982, 31050,     2,   319, 37995,  2856,
+62810,     1,  3590, 48544,     2,   969, 36715,  3041, 22430,     1,
+  430, 29352,     1,  1919, 61844,     1,  1535, 41564,     3,   452,
+23340,   486, 25646,  2439,  7027,     2,  2200, 51142,  3017, 48111,
+    2,  1953, 64772,  2845,  1792,     2,   848, 16013,  3714, 56467,
+    1,  3005, 62355,     3,   151, 46216,   351, 12234,  4058, 60277,
+    3,   191, 42759,  2892, 57292,  4084, 60277,     1,  4110, 60277,
+    2,  3729,  6858,  4136, 60277,     3,  1843, 51603,  3824, 49697,
+ 4162, 60277,     2,   683, 63854,  4188, 60277,     1,  4214, 60277,
+    2,  3871,  7709,  4240, 60277,     1,  3833,  9183,     2,  1859,
+25460,  4002, 58070,     1,  2906, 16352,     1,  3132, 21591,     1,
+ 3110, 58840,     3,   202, 24868,   843,  5649,  4029, 57200,     1,
+  473,  7123,     2,   706, 43285,  1943, 48230,     1,   209, 47477,
+    1,  1731, 23463,     1,  1487, 21574,     3,  2380, 52874,  2726,
+42027,  3873, 26797,     2,    30, 17980,   998, 42152,     1,  2613,
+36905,     2,  1978, 61204,  2503, 24085,     1,  1215, 43168,     2,
+ 2303, 54528,  3639,  8171,     2,  1545, 45132,  2204, 29181,     2,
+  840, 38976,  2479, 49013,     1,   411, 61050,     1,  4034, 15057,
+    1,   392, 61189,     1,   962, 12792,     1,  3633, 63814,     1,
+ 1957, 60067,     1,  2963,  4244,     2,  1720, 30976,  2424, 15569,
+    1,  1621, 47449,     1,  2743, 58473,     1,   952,  4403,     2,
+ 1125,  1089,  1271, 56483,     1,  1083,  9036,     1,  2536, 41310,
+    1,   292, 61748,     1,  1854, 22523,     2,    24, 13785,  2416,
+14804,     2,  1263, 59424,  3679, 46397,     1,  2660, 55736,     1,
+ 2663, 52277,     1,  1755, 40287,     2,   884, 45805,  3288, 23340,
+    1,  2117, 18345,     1,  1648, 35687,     1,  3397,  6915,     4,
+  664, 64979,  2234, 55180,  2583,  6033,  2912, 53089,     1,  1039,
+15122,     3,  1377, 50818,  2292, 40256,  3919, 54052,     2,   544,
+16288,  1412, 25559,     2,   154,  4276,  1037, 44949,     2,    23,
+63719,  2062, 62873,     1,  1853, 31227,     1,   768, 15953,     2,
+  899, 61057,  1313, 33621,     1,  3468, 55600,     2,   481, 49225,
+ 2754, 40417,     1,  4446,  5555,     2,  1968, 46289,  3577,    45,
+    1,  1397, 59128,     1,  2964, 11942,     1,  1900, 21556,     1,
+  223, 12718,     2,   517, 37296,  3958, 43919,     4,   390,  4767,
+ 2080, 27877,  3851,  7767,  4689, 61184,     2,   749, 56203,  4714,
+61184,     2,  4038, 24893,  4739, 61184,     1,  4764, 61184,     3,
+ 1230, 32757,  3089, 53608,  4789, 61184,     1,  4814, 61184,     3,
+ 1624, 59233,  4437, 36838,  4839, 61184,     2,   705, 13264,  1011,
+22156,     3,   432,  1515,  1425, 26505,  1752, 41758,     1,  2136,
+37278,     1,  1210, 55205,     1,    98, 16928,     2,  2195, 63181,
+ 3870, 17754,     1,  2960, 55088,     3,  2961, 63661,  3384, 29919,
+ 4462,  1284,     1,     2, 46303,     1,  3950, 40322,     1,  1369,
+17934,     2,  1296, 36416,  3119, 38499,     1,   814, 27178,     2,
+  818, 27178,  3404, 23273,     1,  1878, 53066,     1,   567,  6688,
+    1,   460, 49439,     1,   687, 41966,     3,    86, 22351,  2101,
+62572,  3687, 42915,     2,  1729, 59650,  3898, 13525,     1,   539,
+47231,     3,   303, 49598,  1255, 51902,  2517, 51379,     1,  2167,
+48268,     1,   170, 27361,     3,    17,  9911,  2941, 39141,  3205,
+37955,     3,  1429,  3737,  1513, 48315,  1924, 65505,     1,  1655,
+37404,     2,  1791, 57907,  2637, 20917,     1,  3716, 49321,     2,
+ 1804, 41462,  2050, 63697,     2,   380, 29281,  1121, 29875,     2,
+  315, 52408,  3344, 36122,     2,  1805, 55858,  2129, 60188,     3,
+ 2682, 53820,  3262, 29538,  3610, 20955,     1,  2762, 31271,     3,
+  816, 27178,  2480, 13341,  3702,  2275,     2,   820, 27178,  1738,
+42444,     2,  1689, 17995,  1944, 53052,     2,  1420, 43602,  2573,
+12496,     1,  4480, 38968,     3,   883, 45205,  1504, 53751,  3798,
+45427,     3,  1970, 20093,  3101, 10969,  3774, 45471,     2,  2992,
+38045,  3901,   803,     1,  3045, 22489,     3,  2804,  8615,  3811,
+ 9335,  4032, 59418,     2,  2759, 51871,  3170,  6443,     3,  2603,
+10321,  2761, 36643,  3173, 62501,     1,   668, 10307,     1,  1123,
+44072,     1,  2004, 12131,     3,   448, 52765,  1797, 13251,  3141,
+64099,     2,  2353, 20388,  3479, 27154,     1,   265, 19544,     1,
+ 1942, 47068,     1,  3157, 21278,     1,  1963, 20085,     2,  1770,
+35504,  1833, 38016,     1,  1223, 52146,     1,  1607, 26528,     1,
+ 2825, 56075,     3,    74, 16808,  1336, 28321,  2429, 43356,     1,
+  911, 63913,     1,  3657, 39007,     1,  3460, 18304,     2,   596,
+47726,  4698,  3100,     2,  1940, 65509,  4723,  3100,     1,  4748,
+ 3100,     4,  1493, 65125,  2051, 41987,  2506, 58793,  4773,  3100,
+    2,  1331, 25283,  4798,  3100,     2,   385, 13237,  4823,  3100,
+    4,  1706, 32983,  3253, 29606,  3654, 41797,  4848,  3100,     3,
+  728, 20914,  1764, 38716,  2339, 18374,     3,   375, 57571,  1713,
+ 4476,  1850, 14290,     2,  1521, 36728,  2395, 27170,     1,  1451,
+46443,     1,   670, 52596,     2,   839, 43998,  3292, 23343,     1,
+ 3117, 14812,     1,  1578, 33445,     1,  1485, 64325,     1,   328,
+19773,     1,  2516, 56990,     2,  2156, 58398,  2197, 62719,     2,
+  101,  1686,  3966, 24994,     1,  2771, 17403,     3,  3463, 28535,
+ 3573, 42834,  3778, 61636,     2,  3786, 36320,  4863, 30283,     2,
+  674, 62446,  3012, 55543,     2,   445, 54197,  2718, 53805,     1,
+ 2922, 32340,     2,  2876, 42752,  4056, 64965,     1,  4082, 64965,
+    4,  1358, 51003,  1385, 15771,  3565,  9702,  4108, 64965,     3,
+  817, 36741,  2417, 18920,  4134, 64965,     3,  2139, 56963,  3222,
+17244,  4160, 64965,     1,  4186, 64965,     1,  4212, 64965,     2,
+ 1969, 32163,  4238, 64965,     1,   488, 18233,     1,  3399, 65298,
+    1,   136, 41224,     1,  3792, 63308,     2,  1774, 52245,  2124,
+20325,     1,  4025, 27147,     1,  4259,  7284,     1,  4285,  7284,
+    2,  4311,  7284,  4494, 26403,     5,   508, 23382,  1601, 10044,
+ 2344, 26611,  4337,  7284,  4519, 26403,     3,  2459, 30441,  4363,
+ 7284,  4544, 26403,     3,  1982, 49054,  4389,  7284,  4569, 26403,
+    4,  2309,  3266,  2408, 31313,  4415,  7284,  4594, 26403,     1,
+ 4619, 26403,     1,  4644, 26403,     1,  4669, 26403,     1,  3318,
+51354,     1,  2233, 18075,     2,  1204, 52299,  3213, 38609,     3,
+  301, 30908,   641, 35753,  1110,  6490,     1,  2694, 17394,     2,
+ 2365, 11548,  4457,  9968,     1,  3637, 13315,     2,  2707, 42294,
+ 3913,  1457,     1,  1048, 35960,     2,   726, 64438,  3346, 52082,
+    1,  2270,  4335,     2,  2832, 31147,  2903, 17728,     1,  1045,
+ 6091,     1,   543, 18957,     1,  2422, 35625,     1,   394, 23318,
+    2,  2147,  4859,  2211,  6090,     1,  4023, 42849,     2,   182,
+ 5789,   608, 57616,     1,  1680, 39174,     1,  1559, 31339,     2,
+  500,   998,  2032, 28246,     2,  1265, 59183,  3769, 60563,     2,
+ 1908,  4666,  2003, 59916,     3,  1772, 11316,  1828, 23744,  2649,
+52173,     2,  2554, 42717,  3211, 40602,     2,  2700,  5447,  3161,
+18212,     1,  1084, 55599,     1,  2366, 28869,     1,  2453,   729,
+    1,  3406, 45682,     4,  2085, 64259,  3097, 37473,  3369, 19355,
+ 4047,  4852,     2,  2165, 23045,  4073,  4852,     3,  1891, 34409,
+ 3167,  4772,  4099,  4852,     1,  4125,  4852,     2,  1484, 31809,
+ 4151,  4852,     3,   892, 36885,  3746, 35008,  4177,  4852,     1,
+ 4203,  4852,     1,  4229,  4852,     2,   579, 48463,  1356, 11720,
+    2,   865, 19139,  2763, 17570,     2,  2222, 25363,  2749, 17551,
+    3,  1610, 26701,  2567, 59626,  4255, 29072,     2,  3074, 61654,
+ 4281, 29072,     3,   236, 11459,  1669, 45990,  4307, 29072,     3,
+ 1857, 32049,  3053, 50692,  4333, 29072,     2,  1494, 28532,  4359,
+29072,     1,  4385, 29072,     3,  2958, 55050,  3803, 28545,  4411,
+29072,     1,  1275, 16611,     1,  1507, 62248,     1,  3235, 28607,
+    1,  2169, 56504,     1,  2789, 17720,     1,  4509, 60918,     1,
+ 4534, 60918,     4,   458, 60835,  1240, 55850,  3224, 37699,  4559,
+60918,     2,   262, 42267,  4584, 60918,     2,   777, 18788,  4609,
+60918,     1,  4634, 60918,     2,  2994, 55036,  4659, 60918,     1,
+ 4684, 60918,     1,   373, 28619,     4,   874, 34051,  2137, 18184,
+ 2739, 50966,  3254, 54996,     1,  1253, 65372,     2,   734, 22428,
+  759, 27195,     1,  1010, 42939,     1,  1994, 24156,     2,  1875,
+34929,  3908, 11131,     1,  2090, 30795,     2,  1053, 49258,  1415,
+52017,     3,   755, 26652,  2261, 64626,  3439, 43235,     1,  3550,
+51457,     2,   581,  5400,  2526,  7437,     1,   158, 64626,     1,
+ 3188,  8283,     1,  1693,  4704,     1,  3578, 10434,     1,  2901,
+ 5616,     2,  1464, 20272,  3552, 63270,     1,  3106, 28313,     1,
+ 1302, 42310,     2,  2207, 43816,  3348,  9806,     1,   654, 15049,
+    1,  2438, 40571,     1,  3886, 64549,     3,    57, 26587,    95,
+45178,   159, 63908,     2,  2335, 60879,  3836, 15367,     3,    54,
+25656,  1992, 23018,  2769, 39060,     1,  1633, 29068,     2,     6,
+59391,  4045, 55672,     2,  1024, 35517,  4071, 55672,     3,  2505,
+33961,  2917, 45068,  4097, 55672,     1,  4123, 55672,     3,   117,
+31354,  2114,  2194,  4149, 55672,     2,  1929, 35328,  4175, 55672,
+    2,   525, 25021,  4201, 55672,     4,  3293, 10477,  3507, 20501,
+ 4031, 64668,  4227, 55672,     1,  2659, 43725,     1,  3321, 40192,
+    1,  3554, 29566,     1,  1040, 23421,     2,  2953, 24522,  3424,
+57981,     1,  3827, 62596,     1,  4442, 40740,     2,  1495, 59275,
+ 2712,  3105,     1,  2075, 62521,     1,  2521, 62607,     1,  2016,
+17489,     1,  2245, 27516,     4,   193, 43003,   501, 51618,  1844,
+45477,  2220,  7602,     2,   632, 62223,  2784, 35943,     1,  3276,
+58496,     2,   492, 31537,   804, 64063,     2,   956, 19922,  1839,
+10811,     2,   257, 22594,   297, 23948,     1,  1826, 43025,     2,
+ 1587, 31176,  4438, 26662,     1,  3407, 15004,     1,  1286, 37099,
+    2,  1932,  1100,  2594, 50931,     1,  1367, 39439,     1,  1605,
+11029,     3,   908, 36491,  1462, 22888,  3878, 55486,     1,  2702,
+13849,     1,  2024, 44757,     3,  3300, 48476,  3532,  3880,  4702,
+60836,     2,   276, 32233,  4727, 60836,     4,  1058,  1302,  3277,
+32014,  4700, 13728,  4752, 60836,     3,  2224, 31071,  4725, 13728,
+ 4777, 60836,     5,  1625, 51390,  2777, 24152,  3332, 39063,  4750,
+13728,  4802, 60836,     2,  4775, 13728,  4827, 60836,     4,   442,
+53447,   811,  5000,  4800, 13728,  4852, 60836,     1,  4825, 13728,
+    2,  1979, 41262,  4850, 13728,     4,    16, 52539,   507, 54702,
+  672, 59975,  3287, 49315,     2,  1509, 65093,  3469,  9037,     4,
+  427, 46021,  2878,  8437,  3178, 57941,  3842, 55304,     1,  1965,
+34669,     2,  2475,  7880,  3426,  5094,     1,    69,   175,     1,
+  203, 27005,     2,  2999, 15447,  3466, 58789,     1,  2238, 55426,
+    2,  2215, 26297,  3927,  7633,     2,  1291, 39980,  1566, 21480,
+    4,   821, 57289,  1366,  1474,  1716, 45965,  2258,  9345,     3,
+ 1757, 11105,  2865, 27933,  2910,  2093,     3,    43, 27621,  3918,
+47486,  3970, 33390,     2,  3715,  6036,  3805, 52041,     2,    81,
+24260,  1242, 44765,     2,   554, 22684,  3961, 39687,     2,  2142,
+31628,  3086, 48448,     1,   807, 62825,     1,   181, 35084,     1,
+  819, 55116,     2,  3947, 13184,  3996, 16959,     1,  1386, 45275,
+    1,  3785,  3744,     2,  3193, 20169,  3867, 11488,     2,   376,
+61388,  1810, 61025,     1,  1626, 16615,     1,  1595, 51326,     1,
+ 4449, 59443,     1,  3168,  6834,     1,  1115, 52437,     1,    79,
+36106,     1,   649, 40150,     2,  1636, 42586,  4451, 58506,     1,
+   80, 24488,     1,  2151, 25566,     1,  3865,  6115,     1,   973,
+32283,     1,  1070, 13266,     1,  1659, 61175,     2,   617, 65534,
+ 2882, 55405,     1,  1442, 28357,     2,   506, 60018,  2871, 24195,
+    2,  1195, 65310,  4483, 60808,     2,   864, 31658,  1954, 21856,
+    3,  2552, 37355,  2724,  3214,  4262, 50172,     2,    48, 60808,
+ 4288, 50172,     3,   703, 15085,  2645, 36351,  4314, 50172,     3,
+ 2455, 13492,  2803, 32181,  4340, 50172,     1,  4366, 50172,     2,
+ 1842, 54846,  4392, 50172,     2,  1927, 61478,  4418, 50172,     1,
+ 2839, 30805,     1,  1629, 61432,     1,   792, 49302,     2,   937,
+59459,  3172,  3325,     1,   631, 62231,     1,  2278,  9064,     1,
+ 1553, 44223,     2,   146, 49255,   580,  6251,     2,  1362, 26821,
+ 2383, 20087,     1,  2253, 16575,     1,  3095, 19705,     2,  3888,
+ 1430,  3939,   411,     3,    13, 57660,  1174, 57838,  3583,  8105,
+    1,  3504, 25582,     1,  1516, 63800,     2,   287, 64728,  2598,
+60876,     1,  3800, 10542,     2,  2965, 13568,  3713,  6135,     2,
+  887, 42151,  3531, 55601,     1,   986, 58539,     1,  2059,  8092,
+    1,   420, 18430,     1,  1564, 11343,     1,   485, 11988,     2,
+  793, 49302,  2172, 47401,     1,   575, 37451,     1,  1013, 26558,
+    2,   646, 38885,  1002, 58177,     1,  1967, 16423,     1,  1917,
+36825,     1,  1762,  1062,     2,  3473, 57949,  4265, 38764,     3,
+  867, 17890,  1228,  6398,  4291, 38764,     1,  4317, 38764,     6,
+   53, 26455,  1239, 38217,  1763, 39122,  3598, 40942,  3757, 57750,
+ 4343, 38764,     1,  4369, 38764,     2,  1547,  4048,  4395, 38764,
+    2,  1577,  9729,  4421, 38764,     3,  1137, 41572,  1478, 34190,
+ 4692,  7917,     1,  4717,  7917,     2,  4018, 36135,  4742,  7917,
+    2,  3166, 17234,  4767,  7917,     4,   325, 36444,   676, 16610,
+ 1837,  6420,  4792,  7917,     4,   739, 48056,  1840,  3362,  3328,
+19045,  4817,  7917,     1,  4842,  7917,     2,   290, 29701,  3876,
+27087,     1,  2665, 49557,     1,   484, 17896,     1,  3952, 26703,
+    1,   536, 47018,     1,  3566, 31596,     1,  3498, 52352,     1,
+ 3039, 64998,     1,  4014, 64092,     2,  2715, 11534,  2757, 43291,
+    2,   180, 12513,  4039,  7212,     1,  3567, 64240,     1,   330,
+59172,     1,   707, 45227,     1,  2092, 55543,     3,  2056, 46038,
+ 3215, 50731,  3557, 19208,     2,  1907,   622,  2866, 46988,     2,
+  381, 16232,  1883, 64423,     2,   830, 44392,  3670,  5275,     2,
+  673, 47045,  2462, 45414,     2,   905, 55222,   910, 21013,     1,
+ 1788,  5848,     2,  1059, 27280,  2782, 39677,     1,  1287, 12991,
+    1,    72,  4988,     2,  2346, 65362,  2943, 44622,     2,   592,
+10615,  1449, 14601,     1,  2415, 27846,     1,  1500, 58506,     1,
+ 1794, 23081,     1,  2564, 61438,     1,    85, 36249,     4,   112,
+59717,  1510, 58589,  2741, 64582,  3289, 23340,     1,   662, 43560,
+    1,  3227, 54198,     1,  1617, 19933,     3,  1584, 53755,  3175,
+30822,  3683,   535,     1,   572, 16900,     2,   729,  4512,  2072,
+57860,     2,   183,  5986,  3723, 23999,     1,  2342, 12837,     1,
+ 1974, 49970,     2,   656,  1140,  3202, 28019,     1,  1868, 44625,
+    2,  2984,  7885,  3520, 54010,     1,  2446, 58703,     1,  2531,
+45704,     1,  2218, 11209,     1,  1528, 30780,     1,  1980, 52507,
+    1,   686, 18283,     3,   520, 18862,   977, 16776,  2326, 38215,
+    3,   717, 59921,  1906, 14696,  2653, 42866,     1,   302, 64742,
+    1,  3772,   780,     2,  2684, 55178,  4486,  7276,     4,   114,
+40205,  1732, 16758,  2611, 61555,  4511,  7276,     3,   738,  7829,
+ 3306, 11696,  4536,  7276,     1,  4561,  7276,     1,  4586,  7276,
+    1,  4611,  7276,     2,  3989, 33796,  4636,  7276,     1,  4661,
+ 7276,     2,   740, 44158,  2790,  5490,     1,  1488,  6904,     3,
+   91, 41933,   269, 44713,  3766, 19735,     2,   598, 12175,   890,
+42920,     2,   831, 63355,  1437,  9183,     1,  1899, 20058,     1,
+ 1918, 52675,     2,  1049, 49337,  3835, 36661,     1,  1889, 18019,
+    2,  1658, 50063,  2393, 39761,     1,   200, 37349,     2,  1834,
+57327,  2000,  5877,     1,  2043, 20522,     2,   655, 40693,  3630,
+46354,     1,  2515, 63403,     2,  3329, 48530,  3497, 46473,     1,
+    0,  7644,     2,  1750,  3207,  1870, 25034,     3,  1384, 60379,
+ 1455,  1549,  1733, 17276,     4,  1374, 33519,  1627, 42321,  3516,
+ 2900,  4707, 19477,     2,  3058, 20001,  4732, 19477,     2,  1817,
+44422,  4757, 19477,     3,  2545, 26159,  2849, 47425,  4782, 19477,
+    2,   733, 15833,  4807, 19477,     1,  4832, 19477,     1,  4857,
+19477,     1,   491, 25647,     1,  4686, 43531,     1,  4711, 43531,
+    1,  4736, 43531,     2,   987, 38259,  4761, 43531,     2,   503,
+14563,  4786, 43531,     2,  1261, 47174,  4811, 43531,     2,  1880,
+51519,  4836, 43531,     2,   471,   566,  3465, 14509,     1,  3686,
+26647,     3,   545, 35819,   997, 46840,  2773,  2935,     3,  1293,
+35606,  1677, 54555,  3284, 61208,     1,  1338, 62771,     5,   139,
+17129,   266, 47768,   358, 19697,   401, 55050,  1017,  5079,     2,
+  954, 60229,  2272, 26786,     1,  3015,  9911,     1,  1178, 33108,
+    3,   719,  9387,  3626,  7993,  3942, 26112,     2,  3007, 27341,
+ 3477, 33841,     3,   160, 53073,  2838, 21033,  3712,  6194,     2,
+  642, 24074,  4008, 40674,     2,  2776, 18922,  3916, 16310,     1,
+ 3882, 24843,     1,  1926, 10913,     1,  3491, 38989,     3,   602,
+27824,  2812, 14947,  2836, 44312,     3,   731, 40146,  2445,  9678,
+ 2966, 64474,     1,    42, 24074,     2,   440, 32566,  2643,  8269,
+    3,  1608, 21282,  3319, 53760,  4867, 26805,     1,  1637, 41117,
+    1,   675, 32733,     1,   513, 61418,     2,  1807, 29620,  3641,
+19100,     1,  2163, 26927,     1,  1141, 13636,     3,  1971, 57413,
+ 3719,  8404,  3877, 37244,     3,   459, 37813,  1038, 28955,  3402,
+24389,     1,   750,  8994,     1,   806,  4843,     2,  1813, 57942,
+ 1999, 21275,     1,  1685, 57245,     1,  1597,  1041,     1,  3181,
+38438,     1,   275,  2928,     1,   741, 58359,     1,  2420, 49169,
+    2,  1279, 46678,  2612, 63238,     1,  1088, 29764,     1,  4705,
+35274,     1,  4730, 35274,     1,  4755, 35274,     2,  2869,  1727,
+ 4780, 35274,     1,  4805, 35274,     2,  1556, 49889,  4830, 35274,
+    1,  4855, 35274,     2,  1571,  3087,  3452, 56148,     1,  1445,
+47683,     1,   255,  7144,     2,  1343, 63534,  3108,  4837,
 };
 
 } // end anonymous namespace
@@ -7928,7 +8102,7 @@ unsigned short DictKeyHashTable[] = {
 vtkDICOMDictionary::Dict vtkDICOMDictionary::DictData = {
 "DICOM",
 4096,
-4756,
+4876,
 DictTagHashTable,
 DictKeyHashTable,
 DictContents
diff --git a/Source/vtkDICOMDictHash.h b/Source/vtkDICOMDictHash.h
index b93a3b1..4cd75dd 100644
--- a/Source/vtkDICOMDictHash.h
+++ b/Source/vtkDICOMDictHash.h
@@ -74,6 +74,7 @@ IssuerOfAccessionNumberSequence         = 0x00080051, // SQ M1    0
 QueryRetrieveLevel                      = 0x00080052, // CS M1    0
 QueryRetrieveView                       = 0x00080053, // CS M1    0
 RetrieveAETitle                         = 0x00080054, // AE M1TN  0
+StationAETitle                          = 0x00080055, // AE M1    0
 InstanceAvailability                    = 0x00080056, // CS M1    0
 FailedSOPInstanceUIDList                = 0x00080058, // UI M1TN  0
 Modality                                = 0x00080060, // CS M1    0
@@ -114,6 +115,9 @@ MappingResourceUID                      = 0x00080118, // UI M1    0
 LongCodeValue                           = 0x00080119, // UC M1    0
 URNCodeValue                            = 0x00080120, // UR M1    0
 EquivalentCodeSequence                  = 0x00080121, // SQ M1    0
+MappingResourceName                     = 0x00080122, // LO M1    0
+ContextGroupIdentificationSequence      = 0x00080123, // SQ M1    0
+MappingResourceIdentificationSequence   = 0x00080124, // SQ M1    0
 TimezoneOffsetFromUTC                   = 0x00080201, // SH M1    0
 PrivateDataElementCharacteristicsSequence = 0x00080300, // SQ M1    0
 PrivateGroupReference                   = 0x00080301, // US M1    0
@@ -169,6 +173,7 @@ WarningReason                           = 0x00081196, // US M1    0
 FailureReason                           = 0x00081197, // US M1    0
 FailedSOPSequence                       = 0x00081198, // SQ M1    0
 ReferencedSOPSequence                   = 0x00081199, // SQ M1    0
+OtherFailuresSequence                   = 0x0008119A, // SQ M1    0
 StudiesContainingOtherReferencedInstancesSequence = 0x00081200, // SQ M1    0
 RelatedSeriesSequence                   = 0x00081250, // SQ M1    0
 LossyImageCompressionRetired            = 0x00082110, // CS M1    1
@@ -237,14 +242,28 @@ PatientID                               = 0x00100020, // LO M1    0
 IssuerOfPatientID                       = 0x00100021, // LO M1    0
 TypeOfPatientID                         = 0x00100022, // CS M1    0
 IssuerOfPatientIDQualifiersSequence     = 0x00100024, // SQ M1    0
+SourcePatientGroupIdentificationSequence = 0x00100026, // SQ M1    0
+GroupOfPatientsIdentificationSequence   = 0x00100027, // SQ M1    0
+SubjectRelativePositionInImage          = 0x00100028, // US M3    0
 PatientBirthDate                        = 0x00100030, // DA M1    0
 PatientBirthTime                        = 0x00100032, // TM M1    0
+PatientBirthDateInAlternativeCalendar   = 0x00100033, // LO M1    0
+PatientDeathDateInAlternativeCalendar   = 0x00100034, // LO M1    0
+PatientAlternativeCalendar              = 0x00100035, // CS M1    0
 PatientSex                              = 0x00100040, // CS M1    0
 PatientInsurancePlanCodeSequence        = 0x00100050, // SQ M1    0
 PatientPrimaryLanguageCodeSequence      = 0x00100101, // SQ M1    0
 PatientPrimaryLanguageModifierCodeSequence = 0x00100102, // SQ M1    0
 QualityControlSubject                   = 0x00100200, // CS M1    0
 QualityControlSubjectTypeCodeSequence   = 0x00100201, // SQ M1    0
+StrainDescription                       = 0x00100212, // UC M1    0
+StrainNomenclature                      = 0x00100213, // LO M1    0
+StrainStockNumber                       = 0x00100214, // LO M1    0
+StrainSourceRegistryCodeSequence        = 0x00100215, // SQ M1    0
+StrainStockSequence                     = 0x00100216, // SQ M1    0
+StrainSource                            = 0x00100217, // LO M1    0
+StrainAdditionalInformation             = 0x00100218, // UT M1    0
+StrainCodeSequence                      = 0x00100219, // SQ M1    0
 OtherPatientIDs                         = 0x00101000, // LO M1TN  0
 OtherPatientNames                       = 0x00101001, // PN M1TN  0
 OtherPatientIDsSequence                 = 0x00101002, // SQ M1    0
@@ -307,21 +326,30 @@ ClinicalTrialProtocolEthicsCommitteeApprovalNumber = 0x00120082, // LO M1    0
 ConsentForClinicalTrialUseSequence      = 0x00120083, // SQ M1    0
 DistributionType                        = 0x00120084, // CS M1    0
 ConsentForDistributionFlag              = 0x00120085, // CS M1    0
-CADFileFormat                           = 0x00140023, // ST M1TN  1
-ComponentReferenceSystem                = 0x00140024, // ST M1TN  1
-ComponentManufacturingProcedure         = 0x00140025, // ST M1TN  DICONDE
-ComponentManufacturer                   = 0x00140028, // ST M1TN  DICONDE
+CADFileFormat                           = 0x00140023, // ST M1    1
+ComponentReferenceSystem                = 0x00140024, // ST M1    1
+ComponentManufacturingProcedure         = 0x00140025, // ST M1    DICONDE
+ComponentManufacturer                   = 0x00140028, // ST M1    DICONDE
 MaterialThickness                       = 0x00140030, // DS M1TN  DICONDE
 MaterialPipeDiameter                    = 0x00140032, // DS M1TN  DICONDE
 MaterialIsolationDiameter               = 0x00140034, // DS M1TN  DICONDE
-MaterialGrade                           = 0x00140042, // ST M1TN  DICONDE
-MaterialPropertiesDescription           = 0x00140044, // ST M1TN  DICONDE
-MaterialPropertiesFileFormatRetired     = 0x00140045, // ST M1TN  1
+MaterialGrade                           = 0x00140042, // ST M1    DICONDE
+MaterialPropertiesDescription           = 0x00140044, // ST M1    DICONDE
+MaterialPropertiesFileFormatRetired     = 0x00140045, // ST M1    1
 MaterialNotes                           = 0x00140046, // LT M1    DICONDE
 ComponentShape                          = 0x00140050, // CS M1    DICONDE
 CurvatureType                           = 0x00140052, // CS M1    DICONDE
 OuterDiameter                           = 0x00140054, // DS M1    DICONDE
 InnerDiameter                           = 0x00140056, // DS M1    DICONDE
+ComponentWelderIDs                      = 0x00140100, // LO M1TN  DICONDE
+SecondaryApprovalStatus                 = 0x00140101, // CS M1    DICONDE
+SecondaryReviewDate                     = 0x00140102, // DA M1    DICONDE
+SecondaryReviewTime                     = 0x00140103, // TM M1    DICONDE
+SecondaryReviewerName                   = 0x00140104, // PN M1    DICONDE
+RepairID                                = 0x00140105, // ST M1    DICONDE
+MultipleComponentApprovalSequence       = 0x00140106, // SQ M1    DICONDE
+OtherApprovalStatus                     = 0x00140107, // CS M1TN  DICONDE
+OtherSecondaryApprovalStatus            = 0x00140108, // CS M1TN  DICONDE
 ActualEnvironmentalConditions           = 0x00141010, // ST M1    DICONDE
 ExpiryDate                              = 0x00141020, // DA M1    DICONDE
 EnvironmentalConditions                 = 0x00141040, // ST M1    DICONDE
@@ -668,6 +696,8 @@ ReceiveCoilName                         = 0x00181250, // SH M1    0
 TransmitCoilName                        = 0x00181251, // SH M1    0
 PlateType                               = 0x00181260, // SH M1    0
 PhosphorType                            = 0x00181261, // LO M1    0
+WaterEquivalentDiameter                 = 0x00181271, // FD M1    0
+WaterEquivalentDiameterCalculationMethodCodeSequence = 0x00181272, // SQ M1    0
 ScanVelocity                            = 0x00181300, // DS M1    0
 WholeBodyTechnique                      = 0x00181301, // CS M1TN  0
 ScanLength                              = 0x00181302, // IS M1    0
@@ -1166,6 +1196,10 @@ DiffusionBValueXZ                       = 0x00189604, // FD M1    0
 DiffusionBValueYY                       = 0x00189605, // FD M1    0
 DiffusionBValueYZ                       = 0x00189606, // FD M1    0
 DiffusionBValueZZ                       = 0x00189607, // FD M1    0
+FunctionalMRSequence                    = 0x00189621, // SQ M1    0
+FunctionalSettlingPhaseFramesPresent    = 0x00189622, // CS M1    0
+FunctionalSyncPulse                     = 0x00189623, // DT M1    0
+SettlingPhaseFrame                      = 0x00189624, // CS M1    0
 DecayCorrectionDateTime                 = 0x00189701, // DT M1    0
 StartDensityThreshold                   = 0x00189715, // FD M1    0
 StartRelativeDensityDifferenceThreshold = 0x00189716, // FD M1    0
@@ -2097,6 +2131,11 @@ InputReadinessState                     = 0x00404041, // CS M1    0
 PerformedProcedureStepStartDateTime     = 0x00404050, // DT M1    0
 PerformedProcedureStepEndDateTime       = 0x00404051, // DT M1    0
 ProcedureStepCancellationDateTime       = 0x00404052, // DT M1    0
+OutputDestinationSequence               = 0x00404070, // SQ M1    0
+DICOMStorageSequence                    = 0x00404071, // SQ M1    0
+STOWRSStorageSequence                   = 0x00404072, // SQ M1    0
+StorageURL                              = 0x00404073, // UR M1    0
+XDSStorageSequence                      = 0x00404074, // SQ M1    0
 EntranceDoseInmGy                       = 0x00408302, // DS M1    0
 ParametricMapFrameTypeSequence          = 0x00409092, // SQ M1    0
 ReferencedImageRealWorldValueMappingSequence = 0x00409094, // SQ M1    0
@@ -2105,6 +2144,8 @@ PixelValueMappingCodeSequence           = 0x00409098, // SQ M1    0
 LUTLabel                                = 0x00409210, // SH M1    0
 RealWorldValueLastValueMapped           = 0x00409211, // XS M1    0
 RealWorldValueLUTData                   = 0x00409212, // FD M1TN  0
+DoubleFloatRealWorldValueLastValueMapped = 0x00409213, // FD M1    0
+DoubleFloatRealWorldValueFirstValueMapped = 0x00409214, // FD M1    0
 RealWorldValueFirstValueMapped          = 0x00409216, // XS M1    0
 QuantityDefinitionSequence              = 0x00409220, // SQ M1    0
 RealWorldValueIntercept                 = 0x00409224, // FD M1    0
@@ -2515,6 +2556,8 @@ SegmentedPropertyTypeCodeSequence       = 0x0062000F, // SQ M1    0
 SegmentationFractionalType              = 0x00620010, // CS M1    0
 SegmentedPropertyTypeModifierCodeSequence = 0x00620011, // SQ M1    0
 UsedSegmentsSequence                    = 0x00620012, // SQ M1    0
+TrackingID                              = 0x00620020, // UT M1    0
+TrackingUID                             = 0x00620021, // UI M1    0
 DeformableRegistrationSequence          = 0x00640002, // SQ M1    0
 SourceFrameOfReferenceUID               = 0x00640003, // UI M1    0
 DeformableRegistrationGridSequence      = 0x00640005, // SQ M1    0
@@ -2549,13 +2592,13 @@ NumberOfVectors                         = 0x0066001E, // UL M1    0
 VectorDimensionality                    = 0x0066001F, // US M1    0
 VectorAccuracy                          = 0x00660020, // FL M1TN  0
 VectorCoordinateData                    = 0x00660021, // OF M1    0
-TrianglePointIndexList                  = 0x00660023, // OW M1    0
-EdgePointIndexList                      = 0x00660024, // OW M1    0
-VertexPointIndexList                    = 0x00660025, // OW M1    0
+TrianglePointIndexList                  = 0x00660023, // OW M1    1
+EdgePointIndexList                      = 0x00660024, // OW M1    1
+VertexPointIndexList                    = 0x00660025, // OW M1    1
 TriangleStripSequence                   = 0x00660026, // SQ M1    0
 TriangleFanSequence                     = 0x00660027, // SQ M1    0
 LineSequence                            = 0x00660028, // SQ M1    0
-PrimitivePointIndexList                 = 0x00660029, // OW M1    0
+PrimitivePointIndexList                 = 0x00660029, // OW M1    1
 SurfaceCount                            = 0x0066002A, // UL M1    0
 ReferencedSurfaceSequence               = 0x0066002B, // SQ M1    0
 ReferencedSurfaceNumber                 = 0x0066002C, // UL M1    0
@@ -2570,10 +2613,10 @@ SurfaceProcessingAlgorithmIdentificationSequence = 0x00660035, // SQ M1    0
 AlgorithmName                           = 0x00660036, // LO M1    0
 RecommendedPointRadius                  = 0x00660037, // FL M1    0
 RecommendedLineThickness                = 0x00660038, // FL M1    0
-LongPrimitivePointIndexList             = 0x00660040, // UL M1TN  0
-LongTrianglePointIndexList              = 0x00660041, // UL M3T3N 0
-LongEdgePointIndexList                  = 0x00660042, // UL M2T2N 0
-LongVertexPointIndexList                = 0x00660043, // UL M1TN  0
+LongPrimitivePointIndexList             = 0x00660040, // OL M1    0
+LongTrianglePointIndexList              = 0x00660041, // OL M1    0
+LongEdgePointIndexList                  = 0x00660042, // OL M1    0
+LongVertexPointIndexList                = 0x00660043, // OL M1    0
 TrackSetSequence                        = 0x00660101, // SQ M1    0
 TrackSequence                           = 0x00660102, // SQ M1    0
 RecommendedDisplayCIELabValueList       = 0x00660103, // OW M1    0
@@ -2750,6 +2793,7 @@ ShapeType                               = 0x00700306, // CS M1    0
 RegistrationSequence                    = 0x00700308, // SQ M1    0
 MatrixRegistrationSequence              = 0x00700309, // SQ M1    0
 MatrixSequence                          = 0x0070030A, // SQ M1    0
+FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix = 0x0070030B, // FD M16   0
 FrameOfReferenceTransformationMatrixType = 0x0070030C, // CS M1    0
 RegistrationTypeCodeSequence            = 0x0070030D, // SQ M1    0
 FiducialDescription                     = 0x0070030F, // ST M1    0
@@ -2782,8 +2826,8 @@ VolumeCroppingSequence                  = 0x00701301, // SQ M1    0
 VolumeCroppingMethod                    = 0x00701302, // CS M1    0
 BoundingBoxCrop                         = 0x00701303, // FD M6    0
 ObliqueCroppingPlaneSequence            = 0x00701304, // SQ M1    0
-ObliqueCroppingPlane                    = 0x00701305, // FD M4    0
-ObliqueCroppingPlaneNormal              = 0x00701306, // FD M3    0
+Plane                                   = 0x00701305, // FD M4    0
+PlaneNormal                             = 0x00701306, // FD M3    0
 CroppingSpecificationNumber             = 0x00701309, // US M1    0
 MultiPlanarReconstructionStyle          = 0x00701501, // CS M1    0
 MPRThicknessType                        = 0x00701502, // CS M1    0
@@ -2839,17 +2883,30 @@ SelectorAttributeVR                     = 0x00720050, // CS M1    0
 SelectorSequencePointer                 = 0x00720052, // AT M1TN  0
 SelectorSequencePointerPrivateCreator   = 0x00720054, // LO M1TN  0
 SelectorAttributePrivateCreator         = 0x00720056, // LO M1    0
+SelectorAEValue                         = 0x0072005E, // AE M1TN  0
+SelectorASValue                         = 0x0072005F, // AS M1TN  0
 SelectorATValue                         = 0x00720060, // AT M1TN  0
+SelectorDAValue                         = 0x00720061, // DA M1TN  0
 SelectorCSValue                         = 0x00720062, // CS M1TN  0
+SelectorDTValue                         = 0x00720063, // DT M1TN  0
 SelectorISValue                         = 0x00720064, // IS M1TN  0
+SelectorOBValue                         = 0x00720065, // OB M1    0
 SelectorLOValue                         = 0x00720066, // LO M1TN  0
+SelectorOFValue                         = 0x00720067, // OF M1    0
 SelectorLTValue                         = 0x00720068, // LT M1    0
+SelectorOWValue                         = 0x00720069, // OW M1    0
 SelectorPNValue                         = 0x0072006A, // PN M1TN  0
+SelectorTMValue                         = 0x0072006B, // TM M1TN  0
 SelectorSHValue                         = 0x0072006C, // SH M1TN  0
+SelectorUNValue                         = 0x0072006D, // UN M1    0
 SelectorSTValue                         = 0x0072006E, // ST M1    0
+SelectorUCValue                         = 0x0072006F, // UC M1TN  0
 SelectorUTValue                         = 0x00720070, // UT M1    0
+SelectorURValue                         = 0x00720071, // UR M1    0
 SelectorDSValue                         = 0x00720072, // DS M1TN  0
+SelectorODValue                         = 0x00720073, // OD M1    0
 SelectorFDValue                         = 0x00720074, // FD M1TN  0
+SelectorOLValue                         = 0x00720075, // OL M1    0
 SelectorFLValue                         = 0x00720076, // FL M1TN  0
 SelectorULValue                         = 0x00720078, // UL M1TN  0
 SelectorUSValue                         = 0x0072007A, // US M1TN  0
@@ -2979,6 +3036,20 @@ UnifiedProcedureStepListStatus          = 0x00741246, // CS M1    0
 BeamOrderIndex                          = 0x00741324, // UL M1    0
 DoubleExposureMeterset                  = 0x00741338, // FD M1    0
 DoubleExposureFieldDelta                = 0x0074133A, // FD M4    0
+BrachyTaskSequence                      = 0x00741401, // SQ M1    0
+ContinuationStartTotalReferenceAirKerma = 0x00741402, // DS M1    0
+ContinuationEndTotalReferenceAirKerma   = 0x00741403, // DS M1    0
+ContinuationPulseNumber                 = 0x00741404, // IS M1    0
+ChannelDeliveryOrderSequence            = 0x00741405, // SQ M1    0
+ReferencedChannelNumber                 = 0x00741406, // IS M1    0
+StartCumulativeTimeWeight               = 0x00741407, // DS M1    0
+EndCumulativeTimeWeight                 = 0x00741408, // DS M1    0
+OmittedChannelSequence                  = 0x00741409, // SQ M1    0
+ReasonForChannelOmission                = 0x0074140A, // CS M1    0
+ReasonForChannelOmissionDescription     = 0x0074140B, // LO M1    0
+ChannelDeliveryOrderIndex               = 0x0074140C, // IS M1    0
+ChannelDeliveryContinuationSequence     = 0x0074140D, // SQ M1    0
+OmittedApplicationSetupSequence         = 0x0074140E, // SQ M1    0
 ImplantAssemblyTemplateName             = 0x00760001, // LO M1    0
 ImplantAssemblyTemplateIssuer           = 0x00760003, // LO M1    0
 ImplantAssemblyTemplateVersion          = 0x00760006, // LO M1    0
@@ -3033,6 +3104,29 @@ UValueData                              = 0x00800010, // OF M1TN  0
 VValueData                              = 0x00800011, // OF M1TN  0
 ReferencedTextureSequence               = 0x00800012, // SQ M1    0
 ReferencedSurfaceDataSequence           = 0x00800013, // SQ M1    0
+AssessmentSummary                       = 0x00820001, // CS M1    0
+AssessmentSummaryDescription            = 0x00820003, // UT M1    0
+AssessedSOPInstanceSequence             = 0x00820004, // SQ M1    0
+ReferencedComparisonSOPInstanceSequence = 0x00820005, // SQ M1    0
+NumberOfAssessmentObservations          = 0x00820006, // UL M1    0
+AssessmentObservationsSequence          = 0x00820007, // SQ M1    0
+ObservationSignificance                 = 0x00820008, // CS M1    0
+ObservationDescription                  = 0x0082000A, // UT M1    0
+StructuredContraintObservationSequence  = 0x0082000C, // SQ M1    0
+AssessedAttributeValueSequence          = 0x00820010, // SQ M1    0
+AssessmentSetID                         = 0x00820016, // LO M1    0
+AssessmentRequesterSequence             = 0x00820017, // SQ M1    0
+SelectorAttributeName                   = 0x00820018, // LO M1    0
+SelectorAttributeKeyword                = 0x00820019, // LO M1    0
+AssessmentTypeCodeSequence              = 0x00820021, // SQ M1    0
+ObservationBasisCodeSequence            = 0x00820022, // SQ M1    0
+AssessmentLabel                         = 0x00820023, // LO M1    0
+ConstraintType                          = 0x00820032, // CS M1    0
+SpecificationSelectionGuidance          = 0x00820033, // UT M1    0
+ConstraintValueSequence                 = 0x00820034, // SQ M1    0
+RecommendedDefaultValueSequence         = 0x00820035, // SQ M1    0
+ConstraintViolationSignificance         = 0x00820036, // CS M1    0
+ConstraintViolationCondition            = 0x00820037, // UT M1    0
 StorageMediaFileSetID                   = 0x00880130, // SH M1    0
 StorageMediaFileSetUID                  = 0x00880140, // UI M1    0
 IconImageSequence                       = 0x00880200, // SQ M1    0
@@ -3156,7 +3250,7 @@ ExecutionStatusInfo                     = 0x21000030, // CS M1    0
 CreationDate                            = 0x21000040, // DA M1    0
 CreationTime                            = 0x21000050, // TM M1    0
 Originator                              = 0x21000070, // AE M1    0
-DestinationAE                           = 0x21000140, // AE M1    1
+DestinationAE                           = 0x21000140, // AE M1    0
 OwnerID                                 = 0x21000160, // SH M1    0
 NumberOfFilms                           = 0x21000170, // IS M1    0
 ReferencedPrintJobSequencePullStoredPrint = 0x21000500, // SQ M1    1
@@ -3451,6 +3545,9 @@ BeamDoseVerificationControlPointSequence = 0x300A008C, // SQ M1    0
 AverageBeamDosePointDepth               = 0x300A008D, // FL M1    0
 AverageBeamDosePointEquivalentDepth     = 0x300A008E, // FL M1    0
 AverageBeamDosePointSSD                 = 0x300A008F, // FL M1    0
+BeamDoseType                            = 0x300A0090, // CS M1    0
+AlternateBeamDose                       = 0x300A0091, // DS M1    0
+AlternateBeamDoseType                   = 0x300A0092, // CS M1    0
 NumberOfBrachyApplicationSetups         = 0x300A00A0, // IS M1    0
 BrachyApplicationSetupDoseSpecificationPoint = 0x300A00A2, // DS M3    0
 BrachyApplicationSetupDose              = 0x300A00A4, // DS M1    0
@@ -3553,7 +3650,7 @@ TableTopLateralPosition                 = 0x300A012A, // DS M1    0
 IsocenterPosition                       = 0x300A012C, // DS M3    0
 SurfaceEntryPoint                       = 0x300A012E, // DS M3    0
 SourceToSurfaceDistance                 = 0x300A0130, // DS M1    0
-AverageBeamDosePointSourceToExternalContourSurfaceDistance = 0x300A0131, // FL M1    0
+AverageBeamDosePointSourceToExternalContourDistance = 0x300A0131, // FL M1    0
 SourceToExternalContourDistance         = 0x300A0132, // FL M1    0
 ExternalContourEntryPoint               = 0x300A0133, // FL M3    0
 CumulativeMetersetWeight                = 0x300A0134, // DS M1    0
@@ -3565,6 +3662,12 @@ HeadFixationAngle                       = 0x300A0148, // FL M1    0
 GantryPitchAngle                        = 0x300A014A, // FL M1    0
 GantryPitchRotationDirection            = 0x300A014C, // CS M1    0
 GantryPitchAngleTolerance               = 0x300A014E, // FL M1    0
+FixationEye                             = 0x300A0150, // CS M1    0
+ChairHeadFramePosition                  = 0x300A0151, // DS M1    0
+HeadFixationAngleTolerance              = 0x300A0152, // DS M1    0
+ChairHeadFramePositionTolerance         = 0x300A0153, // DS M1    0
+FixationLightAzimuthalAngleTolerance    = 0x300A0154, // DS M1    0
+FixationLightPolarAngleTolerance        = 0x300A0155, // DS M1    0
 PatientSetupSequence                    = 0x300A0180, // SQ M1    0
 PatientSetupNumber                      = 0x300A0182, // IS M1    0
 PatientSetupLabel                       = 0x300A0183, // LO M1    0
@@ -3672,6 +3775,7 @@ RadiationMassNumber                     = 0x300A0302, // IS M1    0
 RadiationAtomicNumber                   = 0x300A0304, // IS M1    0
 RadiationChargeState                    = 0x300A0306, // SS M1    0
 ScanMode                                = 0x300A0308, // CS M1    0
+ModulatedScanModeType                   = 0x300A0309, // CS M1    0
 VirtualSourceAxisDistances              = 0x300A030A, // FL M2    0
 SnoutSequence                           = 0x300A030C, // SQ M1    0
 SnoutPosition                           = 0x300A030D, // FL M1    0
@@ -3699,6 +3803,7 @@ BeamCurrentModulationID                 = 0x300A034C, // SH M1    0
 PatientSupportType                      = 0x300A0350, // CS M1    0
 PatientSupportID                        = 0x300A0352, // SH M1    0
 PatientSupportAccessoryCode             = 0x300A0354, // LO M1    0
+TrayAccessoryCode                       = 0x300A0355, // LO M1    0
 FixationLightAzimuthalAngle             = 0x300A0356, // FL M1    0
 FixationLightPolarAngle                 = 0x300A0358, // FL M1    0
 MetersetRate                            = 0x300A035A, // FL M1    0
@@ -3716,8 +3821,11 @@ RangeModulatorGatingStartWaterEquivalentThickness = 0x300A0386, // FL M1    0
 RangeModulatorGatingStopWaterEquivalentThickness = 0x300A0388, // FL M1    0
 IsocenterToRangeModulatorDistance       = 0x300A038A, // FL M1    0
 ScanSpotTuneID                          = 0x300A0390, // SH M1    0
+ScanSpotPrescribedIndices               = 0x300A0391, // IS M1TN  0
 NumberOfScanSpotPositions               = 0x300A0392, // IS M1    0
+ScanSpotReordered                       = 0x300A0393, // CS M1    0
 ScanSpotPositionMap                     = 0x300A0394, // FL M1TN  0
+ScanSpotReorderingAllowed               = 0x300A0395, // CS M1    0
 ScanSpotMetersetWeights                 = 0x300A0396, // FL M1TN  0
 ScanningSpotSize                        = 0x300A0398, // FL M2    0
 NumberOfPaintings                       = 0x300A039A, // IS M1    0
@@ -3752,6 +3860,18 @@ DeviceMotionControlSequence             = 0x300A0450, // SQ M1    0
 DeviceMotionExecutionMode               = 0x300A0451, // CS M1    0
 DeviceMotionObservationMode             = 0x300A0452, // CS M1    0
 DeviceMotionParameterCodeSequence       = 0x300A0453, // SQ M1    0
+DistalDepthFraction                     = 0x300A0501, // FL M1    0
+DistalDepth                             = 0x300A0502, // FL M1    0
+NominalRangeModulationFractions         = 0x300A0503, // FL M2    0
+NominalRangeModulatedRegionDepths       = 0x300A0504, // FL M2    0
+DepthDoseParametersSequence             = 0x300A0505, // SQ M1    0
+DeliveredDepthDoseParametersSequence    = 0x300A0506, // SQ M1    0
+DeliveredDistalDepthFraction            = 0x300A0507, // FL M1    0
+DeliveredDistalDepth                    = 0x300A0508, // FL M1    0
+DeliveredNominalRangeModulationFractions = 0x300A0509, // FL M2    0
+DeliveredNominalRangeModulatedRegionDepths = 0x300A0510, // FL M2    0
+DeliveredReferenceDoseDefinition        = 0x300A0511, // CS M1    0
+ReferenceDoseDefinition                 = 0x300A0512, // CS M1    0
 ReferencedRTPlanSequence                = 0x300C0002, // SQ M1    0
 ReferencedBeamSequence                  = 0x300C0004, // SQ M1    0
 ReferencedBeamNumber                    = 0x300C0006, // IS M1    0
diff --git a/Source/vtkDICOMDictPrivate.cxx b/Source/vtkDICOMDictPrivate.cxx
index e4ccc3d..4d42239 100644
--- a/Source/vtkDICOMDictPrivate.cxx
+++ b/Source/vtkDICOMDictPrivate.cxx
@@ -1,9 +1,9 @@
 /*=========================================================================
 This is an automatically generated file.  Include errata for any changes.
 
-This file was generated by parsetpl.py and makedict.py on Sep 28, 2015
+This file was generated by parsetpl.py and makedict.py on Jan 22, 2016
 from the following files in David Clunie's dicom3tools package,
-dicom3tools_1.00.snapshot.20150717110018/libsrc/standard/elmdict/
+dicom3tools_1.00.snapshot.20160610072711/libsrc/standard/elmdict/
 
 acuson.tpl     dicondep.tpl    hitachi.tpl     papyrus.tpl     siemens.tpl
 agfa.tpl       elscint.tpl     isg.tpl         philips.tpl     spi.tpl
@@ -11,22 +11,49 @@ camtron.tpl    gems.tpl        other.tpl       picker.tpl      toshiba.tpl
 
 Errata:
 
+AGFA
+-{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "Logarithmic PLT Full Scale" },
++{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "LogarithmicPLTFullScale" },
+AGFA PACS Archive Mirroring 1.0
+-{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "" },
+-{ 0x0031, 0x0001, 0, VR::UL, VM::M1, "" },
++{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "StudyStatus" },
++{ 0x0031, 0x0001, 0, VR::CS, VM::M1, "DateTimeVerified" },
+MITRA LINKED ATTRIBUTES 1.0
+-{ 0x0031, 0x0020, 0, VR::IS, VM::M1, "" },
++{ 0x0031, 0x0020, 0, VR::LO, VM::M1, "GlobalPatientID" },
+MITRA OBJECT UTF8 ATTRIBUTES 1.0
+-{ 0x0033, 0x0002, 0, VR::OB, VM::M1, "" },
+-{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "" },
+-{ 0x0033, 0x0006, 0, VR::OB, VM::M1, "" },
+-{ 0x0033, 0x0008, 0, VR::OB, VM::M1, "" },
+-{ 0x0033, 0x000a, 0, VR::OB, VM::M1, "" },
+-{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "" },
+-{ 0x0033, 0x000e, 0, VR::OB, VM::M1, "" },
++{ 0x0033, 0x0002, 0, VR::PN, VM::M1, "PatientNameUTF8Encoded" },
++{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "StudyDescriptionUTF8Encoded" },
++{ 0x0033, 0x0006, 0, VR::PN, VM::M1, "ReferringPhysicianNameUTF8Encoded" },
++{ 0x0033, 0x0008, 0, VR::PN, VM::M1, "RequestingPhysicianNameUTF8Encoded" },
++{ 0x0033, 0x000a, 0, VR::PN, VM::M1, "PerformingPhysicianNameUTF8Encoded" },
++{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "ReasonForStudyUTF8Encoded" },
++{ 0x0033, 0x000e, 0, VR::LO, VM::M1, "StudyCommentsUTF8Encoded" },
 SIEMENS MR HEADER
 -{ 0x0051, 0x000b, 0, VR::SH, VM::M1, "AcquisitionMatrixText" },
 +{ 0x0051, 0x000b, 0, VR::LO, VM::M1, "AcquisitionMatrixText" },
 Applicare/Centricity Radiology Web/Version 2.0
 -{ 0x4111, 0x0001, 0, VR::CS, VM::M1, "Secondary pineLabel" },
 +{ 0x4111, 0x0001, 0, VR::CS, VM::M1, "SecondarySpineLabel" },
-GEMS_PARM_01
--{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBH Coefficients" },
-+{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBHCoefficients" },
--{ 0x0043, 0x0064, 0, VR::CS, VM::M1TN, "ImageFilter" },
-+{ 0x0043, 0x0064, 0, VR::LO, VM::M1, "ReconFilter" },
+GEMS_ADWSoft_3D1
+-{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "Reconstruction Parameters Sequence" },
++{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "ReconstructionParametersSequence" },
 GEMS_DL_STUDY_01
 -{ 0x0015, 0x0080, 0, VR::DS, VM::M1, "Study Dose" },
 +{ 0x0015, 0x0080, 0, VR::DS, VM::M1, "StudyDose" },
 -{ 0x0015, 0x0083, 0, VR::IS, VM::M1, "Study luoroTime" },
 +{ 0x0015, 0x0083, 0, VR::IS, VM::M1, "StudyFluoroTime" },
+GEMS_DL_FRAME_01
+-{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "Table Lateral Position" },
++{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "TableLateralPosition" },
 Philips MR Imaging DD 004
 -{ 0x2005, 0x0083, 0, VR::CS, VM::M1TN, "Sort Attributes" },
 +{ 0x2005, 0x0083, 0, VR::CS, VM::M1TN, "SortAttributes" },
@@ -47,7 +74,6 @@ AMI Sequence AnnotElements_01
 GEMS_ACQU_01
 -{ 0x0019, 0x0014, 0, VR::SS, VM::M1, "End NumberForBaseline" },
 +{ 0x0019, 0x0014, 0, VR::SS, VM::M1, "EndNumberForBaseline" },
-GEMS_ACQU_01
 -{ 0x0019, 0x0087, 0, VR::DS, VM::M1, "CardiacRepetition Time" },
 +{ 0x0019, 0x0087, 0, VR::DS, VM::M1, "CardiacRepetitionTime" },
 Applicare/RadWorks/Version 5.0
@@ -59,9 +85,27 @@ AMI Sequence Annotations_01
 AMI ImageContext_01
 -{ 0x3109, 0x0090, 0, VR::CS, VM::M1, "Show mageOverlay" },
 +{ 0x3109, 0x0090, 0, VR::CS, VM::M1, "ShowImageOverlay" },
+AMI StudyExtensions_01
+-{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "Last Released Annot Label" },
++{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "LastReleasedAnnotLabel" },
+AMI ImageTransform_01
+-{ 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "Transformation Matrix" },
++{ 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "TransformationMatrix" },
 SIEMENS CSA REPORT
 -{ 0x0029, 0x0017, 0, VR::UI, VM::M1, "SCSOP InstanceUID" },
 +{ 0x0029, 0x0017, 0, VR::UI, VM::M1, "SCSOPInstanceUID" },
+GEMS_MR_RAW_01
++{ 0x7001, 0x1001, 0, VR::OB, VM::M1, "Rdb_hdr_rec" },
++{ 0x7001, 0x1002, 0, VR::OB, VM::M1, "Rdb_hdr_per_pass_tab" },
++{ 0x7001, 0x1003, 0, VR::OB, VM::M1, "Rdb_hdr_unlock_raw" },
++{ 0x7001, 0x1004, 0, VR::OB, VM::M1, "Rdb_hdr_data_acq_tab" },
++{ 0x7001, 0x1005, 0, VR::OB, VM::M1, "Rdb_hdr_nex_tab" },
++{ 0x7001, 0x1006, 0, VR::OB, VM::M1, "Rdb_hdr_nex_abort_tab" },
++{ 0x7001, 0x1007, 0, VR::OB, VM::M1, "Rdb_hdr_tool" },
++{ 0x7001, 0x1008, 0, VR::OB, VM::M1, "Rdb_raw_data" },
++{ 0x7001, 0x1009, 0, VR::OB, VM::M1, "SSPSave" },
++{ 0x7001, 0x100A, 0, VR::OB, VM::M1, "UDASave" },
++{ 0x7001, 0x100B, 0, VR::OB, VM::M1, "Rdb_chemsat_data" },
 GEMS_FUNCTOOL_01
 -{ 0x0051, 0x000c, 0, VR::SL, VM::M1, "WizardStateDataSize" },
 -{ 0x0051, 0x000d, 0, VR::OB, VM::M1, "WizardState" },
@@ -76,6 +120,10 @@ GEMS_0039
 GEMS_RELA_01
 +{ 0x0021, 0x0094, 0, VR::LO, VM::M1TN, "AnnotationStrings" },
 GEMS_PARM_01
+-{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBH Coefficients" },
++{ 0x0043, 0x0018, 0, VR::DS, VM::M3, "BBHCoefficients" },
+-{ 0x0043, 0x0064, 0, VR::CS, VM::M1TN, "ImageFilter" },
++{ 0x0043, 0x0064, 0, VR::LO, VM::M1, "ReconFilter" },
 +{ 0x0043, 0x009b, 0, VR::DS, VM::M1, "NPWFactor" },
 +{ 0x0043, 0x009c, 0, VR::OB, VM::M1, "ResearchTag1" },
 +{ 0x0043, 0x009d, 0, VR::OB, VM::M1, "ResearchTag2" },
@@ -119,6 +167,10 @@ GEMS_CT_CARDIAC_001
 +{ 0x0049, 0x0025, 0, VR::OW, VM::M1, "PreBlendedCycle2" },
 +{ 0x0049, 0x0026, 0, VR::CS, VM::M1, "CompressionAlg" },
 GEHC_CT_ADVAPP_001
+-{ 0x0053, 0x0064, 0, VR::IS, VM::M1, "" },
+-{ 0x0053, 0x0065, 0, VR::IS, VM::M1, "" },
+-{ 0x0053, 0x0066, 0, VR::LO, VM::M1, "" },
+-{ 0x0053, 0x0067, 0, VR::IS, VM::M1, "" },
 -{ 0x0053, 0x009D, 0, VR::LO, VM::M1, "" },
 +{ 0x0053, 0x0063, 0, VR::CS, VM::M1, "ImagePositionPatientSetting" },
 +{ 0x0053, 0x0064, 0, VR::IS, VM::M1, "ShutterMode" },
@@ -174,6 +226,96 @@ GEHC_CT_ADVAPP_001
 +{ 0x0053, 0x009D, 0, VR::LO, VM::M1, "MARsAnnotation" },
 +{ 0x0053, 0x009E, 0, VR::IS, VM::M1, "MultiEnergyNumNoiseRedPairs" },
 +{ 0x0053, 0x009F, 0, VR::LO, VM::M1TN, "MultiEnergyNoiseRedString" },
+BRAINWAVE: 1.2.840.113819.3
++{ 0x2001, 0x0010, 0, VR::UI, VM::M1, "DICOMImplementationUID" },
++{ 0x2001, 0x0011, 0, VR::SH, VM::M1, "DICOMImplementationVersion" },
++{ 0x2001, 0x0012, 0, VR::UI, VM::M1, "WithinDICOMImplementationSOPInstanceUID"
++{ 0x2001, 0x0013, 0, VR::SH, VM::M1, "ApplicationName" },
++{ 0x2001, 0x0014, 0, VR::SH, VM::M1, "ApplicationVersion" },
++{ 0x2001, 0x0015, 0, VR::SH, VM::M1, "CompatibilityVersion" },
++{ 0x2001, 0x0021, 0, VR::UI, VM::M1TN, "ReferencedSeriesUID" },
++{ 0x2001, 0x0031, 0, VR::US, VM::M1, "NumberOfObjectsAveraged" },
++{ 0x2001, 0x0041, 0, VR::US, VM::M1, "NumberOfExpectedTimePoints" },
++{ 0x2001, 0x0051, 0, VR::US, VM::M1, "NumberOfSlicesPerVolume" },
++{ 0x2001, 0x0060, 0, VR::US, VM::M1, "BWImageType" },
++{ 0x2001, 0x0061, 0, VR::US, VM::M1, "ExperimentType" },
++{ 0x2001, 0x0071, 0, VR::UI, VM::M1, "ParadigmUID" },
++{ 0x2001, 0x0072, 0, VR::LO, VM::M1, "ParadigmName" },
++{ 0x2001, 0x0073, 0, VR::ST, VM::M1, "ParadigmDescription" },
++{ 0x2001, 0x0080, 0, VR::OB, VM::M1, "Contrast" },
++{ 0x2001, 0x0081, 0, VR::FL, VM::M1TN, "RegressorValues" },
++{ 0x2001, 0x0086, 0, VR::US, VM::M1, "NumberOfDegreesOfFreedom" },
++{ 0x2001, 0x008A, 0, VR::FL, VM::M1, "ZThreshold" },
++{ 0x2001, 0x008B, 0, VR::FL, VM::M1, "PThreshold" },
++{ 0x2001, 0x0090, 0, VR::OB, VM::M1, "ProcessingParameters" },
++{ 0x2001, 0x0091, 0, VR::OB, VM::M1, "MotionPlot" },
++{ 0x2001, 0x0092, 0, VR::OB, VM::M1, "ROIs" },
++{ 0x2001, 0x0093, 0, VR::OB, VM::M1, "Tracts" },
++{ 0x2001, 0x0094, 0, VR::OB, VM::M1, "Report" },
++{ 0x2001, 0x0095, 0, VR::OB, VM::M1, "ResponseData" },
++{ 0x2001, 0x0096, 0, VR::OB, VM::M1, "DesignMatrix" },
++{ 0x2001, 0x0097, 0, VR::FL, VM::M1TN, "QualityMetrics" },
++{ 0x2001, 0x00A0, 0, VR::FL, VM::M1TN, "MotionParameters" },
++{ 0x2001, 0x00A1, 0, VR::FL, VM::M1TN, "RegistrationParameters" },
++{ 0x2001, 0x00A2, 0, VR::FL, VM::M1TN, "SubjectData" },
++{ 0x2001, 0x00B0, 0, VR::OB, VM::M1, "DTIParameters" },
++{ 0x2001, 0x00C0, 0, VR::OB, VM::M1, "ParadigmInfo" },
+INTELERAD MEDICAL SYSTEMS
+-{ 0x0029, 0x0010, 0, VR::CS, VM::M1, "" },
+-{ 0x0029, 0x0011, 0, VR::US, VM::M1, "" },
+-{ 0x0029, 0x0012, 0, VR::US, VM::M1, "" },
+-{ 0x0029, 0x0013, 0, VR::US, VM::M1, "" },
+-{ 0x0029, 0x0015, 0, VR::DS, VM::M1, "" },
++{ 0x0029, 0x0001, 0, VR::FD, VM::M1, "ImageCompressionFraction" },
++{ 0x0029, 0x0002, 0, VR::FD, VM::M1, "ImageQuality" },
++{ 0x0029, 0x0003, 0, VR::FD, VM::M1, "ImageBytesTransferred" },
++{ 0x0029, 0x0010, 0, VR::CS, VM::M1, "J2cParameterType" },
++{ 0x0029, 0x0011, 0, VR::US, VM::M1, "J2cPixelRepresentation" },
++{ 0x0029, 0x0012, 0, VR::US, VM::M1, "J2cBitsAllocated" },
++{ 0x0029, 0x0013, 0, VR::US, VM::M1, "J2cPixelShiftValue" },
++{ 0x0029, 0x0014, 0, VR::US, VM::M1, "J2cPlanarConfiguration" },
++{ 0x0029, 0x0015, 0, VR::DS, VM::M1, "J2cRescaleIntercept" },
+-{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "MD5Sum" },
++{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "PixelDataMD5SumPerFrame" },
+-{ 0x3F01, 0x0001, 0, VR::LO, VM::M1, "" },
+-{ 0x3F01, 0x0003, 0, VR::AE, VM::M1, "" },
+-{ 0x3F01, 0x0004, 0, VR::LO, VM::M1, "" },
+-{ 0x3F01, 0x0005, 0, VR::AE, VM::M1, "" },
+-{ 0x3F01, 0x0007, 0, VR::LO, VM::M1, "" },
++{ 0x3F01, 0x0001, 0, VR::LO, VM::M1, "InstitutionCode" },
++{ 0x3F01, 0x0002, 0, VR::AE, VM::M1, "RoutedTransferAE" },
++{ 0x3F01, 0x0003, 0, VR::AE, VM::M1, "SourcedAE" },
++{ 0x3F01, 0x0004, 0, VR::SH, VM::M1, "DeferredValidation" },
++{ 0x3F01, 0x0005, 0, VR::LO, VM::M1, "SeriesOwner" },
++{ 0x3F01, 0x0007, 0, VR::SH, VM::M1, "StrippedPixelData" },
++{ 0x3F01, 0x0008, 0, VR::SH, VM::M1, "PendingMoveRequest" },
+CMR42 CIRCLECVI
++{ 0x0025, 0x0010, 0, VR::LO, VM::M1, "WorkspaceID" },
++{ 0x0025, 0x0020, 0, VR::LO, VM::M1, "WorkspaceTimeString" },
++{ 0x0025, 0x0030, 0, VR::LO, VM::M1, "WorkspaceStream" },
+Philips Imaging DD 129
+-{ 0x2001, 0x0000, 0, VR::SQ, VM::M1, "PresentationStateSequence" },
++{ 0x2001, 0x0001, 0, VR::SQ, VM::M1, "" },
+http://www.gemedicalsystems.com/it_solutions/rad_pacs/
+-{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "Reference to pacs study" },
+-{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "Reference to pacs image" },
+-{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "Pacs examnotes flag" },
++{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "ReferenceToPacsStudy" },
++{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "ReferenceToPacsImage" },
++{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "PacsExamnotesFlag" },
+http://www.gemedicalsystems.com/it_solutions/orthoview/2.1
+-{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoView Session Date/Time" },
+-{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoView Session Creator" },
+-{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoView Session Completion Flag" },
+-{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoView File Sequence" },
+-{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoView File Name" },
+-{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoView File Content" },
++{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoViewSessionDateTime" },
++{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoViewSessionCreator" },
++{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoViewSessionCompletionFlag" },
++{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoViewFileSequence" },
++{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoViewFileName" },
++{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoViewFileContent" },
 
 =========================================================================*/
 
@@ -188,7 +330,7 @@ typedef vtkDICOMDictEntry::Entry DictEntry;
 
 // ----- WG12 Supplement 43 -----
 
-DictEntry Dict001Contents[] = {
+const DictEntry Dict001Contents[] = {
 { 0x0009, 0x0001, 0, VR::SQ, VM::M1, "EventTimerSequence" },
 { 0x0009, 0x0002, 0, VR::FD, VM::M1, "EventTimeInterval" },
 { 0x0009, 0x0003, 0, VR::SQ, VM::M1, "EventCodeSequence" },
@@ -234,7 +376,7 @@ DictEntry Dict001Contents[] = {
 { 0x0041, 0x0001, 0, VR::CS, VM::M1, "PerformedProtocolType" },
 };
 
-unsigned short Dict001TagHashTable[] = {
+const unsigned short Dict001TagHashTable[] = {
    44,    49,    54,    59,    64,    69,    72,    43,    75,    43,
    78,    81,    43,    43,    84,    43,    87,    90,    93,    43,
    96,    99,   102,   107,   110,    43,   113,    43,   116,   119,
@@ -254,7 +396,7 @@ unsigned short Dict001TagHashTable[] = {
    19,     8,     1,    30,     3,
 };
 
-unsigned short Dict001KeyHashTable[] = {
+const unsigned short Dict001KeyHashTable[] = {
    44,    43,    47,    43,    54,    43,    59,    43,    43,    43,
    64,    67,    70,    43,    73,    76,    43,    79,    84,    87,
    92,    97,   102,    43,    43,   107,   110,   113,    43,   116,
@@ -284,7 +426,7 @@ Dict001Contents
 
 // ----- SVISION -----
 
-DictEntry Dict002Contents[] = {
+const DictEntry Dict002Contents[] = {
 { 0x0017, 0x0000, 0, VR::LO, VM::M1, "ExtendedBodyPart" },
 { 0x0017, 0x0010, 0, VR::LO, VM::M1, "ExtendedViewPosition" },
 { 0x0017, 0x0020, 0, VR::SQ, VM::M1, "ScheduledProcedureStepList" },
@@ -375,7 +517,7 @@ DictEntry Dict002Contents[] = {
 { 0x0029, 0x0005, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict002TagHashTable[] = {
+const unsigned short Dict002TagHashTable[] = {
    89,    92,   101,   104,   109,   112,    88,   117,   120,   125,
   132,   135,    88,    88,    88,   138,   141,   146,    88,    88,
   149,   152,    88,   155,   158,   165,   172,   175,    88,    88,
@@ -410,7 +552,7 @@ unsigned short Dict002TagHashTable[] = {
    80,     1,    38,   177,     1,    37,   176,
 };
 
-unsigned short Dict002KeyHashTable[] = {
+const unsigned short Dict002KeyHashTable[] = {
    88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
    88,    88,    88,    89,    88,    88,    88,    88,    88,    88,
    88,    88,    88,    88,    88,    88,    88,    88,    88,    88,
@@ -452,15 +594,15 @@ Dict002Contents
 
 // ----- GEMS_XR3DCAL_01 -----
 
-DictEntry Dict003Contents[] = {
+const DictEntry Dict003Contents[] = {
 { 0x0021, 0x0020, 0, VR::LT, VM::M1, "GeneralizedCalibration" },
 };
 
-unsigned short Dict003TagHashTable[] = {
+const unsigned short Dict003TagHashTable[] = {
     2,     0,     1,     0,    32,
 };
 
-unsigned short Dict003KeyHashTable[] = {
+const unsigned short Dict003KeyHashTable[] = {
     2,     0,     1,     0, 46679,
 };
 
@@ -475,7 +617,7 @@ Dict003Contents
 
 // ----- GEMS_IMPS_01 -----
 
-DictEntry Dict004Contents[] = {
+const DictEntry Dict004Contents[] = {
 { 0x0029, 0x0004, 0, VR::SL, VM::M1, "LowerRangeOfPixels" },
 { 0x0029, 0x0005, 0, VR::DS, VM::M1, "LowerRangeOfPixels" },
 { 0x0029, 0x0006, 0, VR::DS, VM::M1, "LowerRangeOfPixels" },
@@ -493,7 +635,7 @@ DictEntry Dict004Contents[] = {
 { 0x0029, 0x0035, 0, VR::SL, VM::M1, "AdvantageCompUnderflow" },
 };
 
-unsigned short Dict004TagHashTable[] = {
+const unsigned short Dict004TagHashTable[] = {
    16,    23,    26,    33,    38,    41,    44,    15,    15,    15,
    15,    15,    15,    47,    50,     0,     3,     0,     4,     7,
    21,    12,    38,     1,     3,     7,     3,     2,     6,     5,
@@ -502,7 +644,7 @@ unsigned short Dict004TagHashTable[] = {
     2,     1,     5,    13,    52,
 };
 
-unsigned short Dict004KeyHashTable[] = {
+const unsigned short Dict004KeyHashTable[] = {
    16,    19,    24,    27,    30,    15,    15,    15,    15,    15,
    15,    33,    36,    15,    39,     0,     1,    13, 17181,     2,
     8, 51880,    14, 36140,     1,    10, 51880,     1,     7, 53853,
@@ -522,16 +664,16 @@ Dict004Contents
 
 // ----- Applicare/Centricity Radiology Web/Version 2.0 -----
 
-DictEntry Dict005Contents[] = {
+const DictEntry Dict005Contents[] = {
 { 0x4111, 0x0001, 0, VR::CS, VM::M1, "SecondarySpineLabel" },
 { 0x4111, 0x0002, 0, VR::IS, VM::M1, "AdditionalTagsForPresentationState" },
 };
 
-unsigned short Dict005TagHashTable[] = {
+const unsigned short Dict005TagHashTable[] = {
     3,     6,     0,     1,     0,     1,     1,     1,     2,
 };
 
-unsigned short Dict005KeyHashTable[] = {
+const unsigned short Dict005KeyHashTable[] = {
     3,     6,     0,     1,     0, 62822,     1,     1, 41832,
 };
 
@@ -546,15 +688,15 @@ Dict005Contents
 
 // ----- TOSHIBA_MEC_OT3 -----
 
-DictEntry Dict006Contents[] = {
+const DictEntry Dict006Contents[] = {
 { 0x0009, 0x0000, 0, VR::LO, VM::M1, "HISRISStudyID" },
 };
 
-unsigned short Dict006TagHashTable[] = {
+const unsigned short Dict006TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict006KeyHashTable[] = {
+const unsigned short Dict006KeyHashTable[] = {
     2,     0,     1,     0, 20925,
 };
 
@@ -569,7 +711,7 @@ Dict006Contents
 
 // ----- GEIIS -----
 
-DictEntry Dict007Contents[] = {
+const DictEntry Dict007Contents[] = {
 { 0x0009, 0x0010, 0, VR::SQ, VM::M1, "GEPrivateImageThumbnailSequence" },
 { 0x0009, 0x0012, 0, VR::IS, VM::M1, "" },
 { 0x0029, 0x0010, 0, VR::UL, VM::M1, "ShiftCount" },
@@ -587,7 +729,7 @@ DictEntry Dict007Contents[] = {
 { 0x7fd1, 0x0060, 0, VR::UL, VM::M1TN, "SubbandBytecounts" },
 };
 
-unsigned short Dict007TagHashTable[] = {
+const unsigned short Dict007TagHashTable[] = {
    16,    19,    15,    15,    15,    22,    25,    15,    28,    15,
    31,    36,    39,    48,    53,     0,     1,     6,    16,     1,
     4,    20,     1,    10,    32,     1,    11,    48,     1,     9,
@@ -596,7 +738,7 @@ unsigned short Dict007TagHashTable[] = {
    48,    13,    80,     1,     3,    18,
 };
 
-unsigned short Dict007KeyHashTable[] = {
+const unsigned short Dict007KeyHashTable[] = {
    16,    23,    15,    26,    15,    29,    32,    35,    38,    43,
    15,    46,    49,    52,    55,     0,     3,     0, 15028,    10,
 19611,    13, 20619,     1,     6, 52327,     1,    12, 41716,     1,
@@ -616,15 +758,15 @@ Dict007Contents
 
 // ----- Philips NM Private Group -----
 
-DictEntry Dict008Contents[] = {
+const DictEntry Dict008Contents[] = {
 { 0x7043, 0x0000, 0, VR::SH, VM::M1, "" },
 };
 
-unsigned short Dict008TagHashTable[] = {
+const unsigned short Dict008TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict008KeyHashTable[] = {
+const unsigned short Dict008KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
@@ -639,7 +781,7 @@ Dict008Contents
 
 // ----- GEMS_ACRQA_1.0 BLOCK1 -----
 
-DictEntry Dict009Contents[] = {
+const DictEntry Dict009Contents[] = {
 { 0x0023, 0x0000, 0, VR::LO, VM::M1, "CRExposureMenuCode" },
 { 0x0023, 0x0010, 0, VR::LO, VM::M1, "CRExposureMenuString" },
 { 0x0023, 0x0020, 0, VR::LO, VM::M1, "CREDRMode" },
@@ -652,14 +794,14 @@ DictEntry Dict009Contents[] = {
 { 0x0023, 0x0090, 0, VR::LO, VM::M1, "CRSShiftString" },
 };
 
-unsigned short Dict009TagHashTable[] = {
+const unsigned short Dict009TagHashTable[] = {
    10,    11,    16,    19,    22,    25,    28,    31,    34,    37,
     0,     2,     1,    16,     8,   128,     1,     7,   112,     1,
     2,    32,     1,     5,    80,     1,     0,     0,     1,     6,
    96,     1,     9,   144,     1,     4,    64,     1,     3,    48,
 };
 
-unsigned short Dict009KeyHashTable[] = {
+const unsigned short Dict009KeyHashTable[] = {
    11,    14,    17,    22,    27,    10,    30,    35,    10,    10,
     0,     1,     2, 48761,     1,     1, 46224,     2,     3, 41522,
     5, 31050,     2,     6, 39736,     8, 39860,     1,     4, 55886,
@@ -677,7 +819,7 @@ Dict009Contents
 
 // ----- GEMS_ACRQA_1.0 BLOCK3 -----
 
-DictEntry Dict010Contents[] = {
+const DictEntry Dict010Contents[] = {
 { 0x0023, 0x0000, 0, VR::DS, VM::M1, "CRDRE" },
 { 0x0023, 0x0010, 0, VR::US, VM::M1, "CRDRN" },
 { 0x0023, 0x0020, 0, VR::DS, VM::M1, "CRORE" },
@@ -690,14 +832,14 @@ DictEntry Dict010Contents[] = {
 { 0x0023, 0x0090, 0, VR::LO, VM::M1, "CREnergySubtractionParameters" },
 };
 
-unsigned short Dict010TagHashTable[] = {
+const unsigned short Dict010TagHashTable[] = {
    10,    11,    16,    19,    22,    25,    28,    31,    34,    37,
     0,     2,     1,    16,     8,   128,     1,     7,   112,     1,
     2,    32,     1,     5,    80,     1,     0,     0,     1,     6,
    96,     1,     9,   144,     1,     4,    64,     1,     3,    48,
 };
 
-unsigned short Dict010KeyHashTable[] = {
+const unsigned short Dict010KeyHashTable[] = {
    11,    14,    10,    17,    20,    23,    28,    33,    10,    36,
     0,     1,     6,  9446,     1,     5, 26824,     1,     8, 55588,
     1,     9, 43581,     2,     3, 37578,     4, 37577,     2,     1,
@@ -715,7 +857,7 @@ Dict010Contents
 
 // ----- GEMS_ACRQA_1.0 BLOCK2 -----
 
-DictEntry Dict011Contents[] = {
+const DictEntry Dict011Contents[] = {
 { 0x0023, 0x0000, 0, VR::US, VM::M1, "CRSShift" },
 { 0x0023, 0x0010, 0, VR::DS, VM::M1, "CRCShift" },
 { 0x0023, 0x0020, 0, VR::DS, VM::M1, "CRGT" },
@@ -728,14 +870,14 @@ DictEntry Dict011Contents[] = {
 { 0x0023, 0x0090, 0, VR::DS, VM::M1, "CRDRT" },
 };
 
-unsigned short Dict011TagHashTable[] = {
+const unsigned short Dict011TagHashTable[] = {
    10,    11,    16,    19,    22,    25,    28,    31,    34,    37,
     0,     2,     1,    16,     8,   128,     1,     7,   112,     1,
     2,    32,     1,     5,    80,     1,     0,     0,     1,     6,
    96,     1,     9,   144,     1,     4,    64,     1,     3,    48,
 };
 
-unsigned short Dict011KeyHashTable[] = {
+const unsigned short Dict011KeyHashTable[] = {
    11,    10,    14,    10,    10,    21,    24,    27,    32,    35,
     0,     1,     3, 34077,     3,     4, 34077,     6, 34115,     9,
 36381,     1,     0, 28887,     1,     8, 34114,     2,     1, 64674,
@@ -753,15 +895,15 @@ Dict011Contents
 
 // ----- Siemens Ultrasound Miscellaneous -----
 
-DictEntry Dict012Contents[] = {
+const DictEntry Dict012Contents[] = {
 { 0x0019, 0x0020, 0, VR::SH, VM::M1, "" },
 };
 
-unsigned short Dict012TagHashTable[] = {
+const unsigned short Dict012TagHashTable[] = {
     2,     0,     1,     0,    32,
 };
 
-unsigned short Dict012KeyHashTable[] = {
+const unsigned short Dict012KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
@@ -776,7 +918,7 @@ Dict012Contents
 
 // ----- SPI -----
 
-DictEntry Dict013Contents[] = {
+const DictEntry Dict013Contents[] = {
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "Comments" },
 { 0x0009, 0x0015, 0, VR::LO, VM::M1, "UID" },
 { 0x0009, 0x0040, 0, VR::US, VM::M1, "DataObjectType" },
@@ -787,13 +929,13 @@ DictEntry Dict013Contents[] = {
 { 0x0029, 0x0060, 0, VR::LO, VM::M1, "CompressionAlgorithm" },
 };
 
-unsigned short Dict013TagHashTable[] = {
+const unsigned short Dict013TagHashTable[] = {
     9,    14,     8,     8,    23,     8,     8,     8,     0,     2,
     2,    64,     7,    96,     4,     0,    16,     3,    65,     4,
    16,     6,    32,     2,     1,    21,     5,    21,
 };
 
-unsigned short Dict013KeyHashTable[] = {
+const unsigned short Dict013KeyHashTable[] = {
     9,     8,    12,    15,    18,     8,    23,    26,     0,     1,
     2, 24415,     1,     3, 55708,     1,     0, 52021,     2,     4,
 39623,     6, 29229,     1,     7, 57071,     2,     1,  1220,     5,
@@ -811,7 +953,7 @@ Dict013Contents
 
 // ----- GE ??? From Adantage Review CS -----
 
-DictEntry Dict014Contents[] = {
+const DictEntry Dict014Contents[] = {
 { 0x0019, 0x0030, 0, VR::LO, VM::M1, "CREDRMode" },
 { 0x0019, 0x0040, 0, VR::LO, VM::M1, "CRLatitude" },
 { 0x0019, 0x0050, 0, VR::LO, VM::M1, "CRGroupNumber" },
@@ -820,13 +962,13 @@ DictEntry Dict014Contents[] = {
 { 0x0019, 0x0090, 0, VR::LO, VM::M1, "CRFilmOutputExposures" },
 };
 
-unsigned short Dict014TagHashTable[] = {
+const unsigned short Dict014TagHashTable[] = {
     7,    10,    13,     6,    16,    19,     0,     1,     2,    80,
     1,     5,   144,     1,     3,   112,     1,     1,    64,     2,
     0,    48,     4,   128,
 };
 
-unsigned short Dict014KeyHashTable[] = {
+const unsigned short Dict014KeyHashTable[] = {
     7,     6,     6,     6,    12,    17,     0,     2,     0, 59423,
     3, 29905,     2,     1,  3667,     2,  5762,     2,     4, 44381,
     5, 33146,
@@ -843,7 +985,7 @@ Dict014Contents
 
 // ----- SIEMENS SMS-AX  QUANT 1.0 -----
 
-DictEntry Dict015Contents[] = {
+const DictEntry Dict015Contents[] = {
 { 0x0023, 0x0000, 0, VR::DS, VM::M2, "HorizontalCalibrationPixelSize" },
 { 0x0023, 0x0001, 0, VR::DS, VM::M2, "VerticalCalibrationPixelSize" },
 { 0x0023, 0x0002, 0, VR::LO, VM::M1, "CalibrationObject" },
@@ -855,14 +997,14 @@ DictEntry Dict015Contents[] = {
 { 0x0023, 0x0008, 0, VR::IS, VM::M1, "CalibrationTableObjectDistance" },
 };
 
-unsigned short Dict015TagHashTable[] = {
+const unsigned short Dict015TagHashTable[] = {
    10,    13,    16,    19,     9,    22,    25,    28,    33,     0,
     1,     7,     7,     1,     6,     6,     1,     5,     5,     1,
     4,     4,     1,     3,     3,     1,     2,     2,     2,     1,
     1,     8,     8,     1,     0,     0,
 };
 
-unsigned short Dict015KeyHashTable[] = {
+const unsigned short Dict015KeyHashTable[] = {
    10,    13,     9,    18,     9,    23,     9,    26,    31,     0,
     1,     0, 13876,     2,     3, 18830,     5, 23389,     2,     1,
 44985,     8, 15636,     1,     2, 21895,     2,     4, 18319,     6,
@@ -880,7 +1022,7 @@ Dict015Contents
 
 // ----- AgilityRuntime -----
 
-DictEntry Dict016Contents[] = {
+const DictEntry Dict016Contents[] = {
 { 0x0011, 0x0020, 0, VR::LO, VM::M1, "" },
 { 0x0011, 0x0021, 0, VR::LO, VM::M1, "" },
 { 0x0011, 0x0022, 0, VR::LO, VM::M1, "" },
@@ -891,14 +1033,14 @@ DictEntry Dict016Contents[] = {
 { 0x0029, 0x001f, 0, VR::US, VM::M1, "" },
 };
 
-unsigned short Dict016TagHashTable[] = {
+const unsigned short Dict016TagHashTable[] = {
     9,    14,    17,    20,     8,    25,    28,     8,     0,     2,
     1,    33,     3,    17,     1,     0,    32,     1,     5,    19,
     2,     2,    34,     4,    18,     1,     6,    20,     1,     7,
    31,
 };
 
-unsigned short Dict016KeyHashTable[] = {
+const unsigned short Dict016KeyHashTable[] = {
     8,     8,     8,     8,     8,     9,     8,     8,     0,     8,
     0,   672,     1,   672,     2,   672,     3,   672,     4,   672,
     5,   672,     6,   672,     7,   672,
@@ -915,7 +1057,7 @@ Dict016Contents
 
 // ----- SIEMENS RA GEN -----
 
-DictEntry Dict017Contents[] = {
+const DictEntry Dict017Contents[] = {
 { 0x0011, 0x0020, 0, VR::UL, VM::M1, "" },
 { 0x0011, 0x0025, 0, VR::UL, VM::M1, "" },
 { 0x0011, 0x0026, 0, VR::UL, VM::M1, "" },
@@ -1005,7 +1147,7 @@ DictEntry Dict017Contents[] = {
 { 0x0021, 0x0040, 0, VR::US, VM::M1, "" },
 };
 
-unsigned short Dict017TagHashTable[] = {
+const unsigned short Dict017TagHashTable[] = {
    87,    88,    93,    96,   101,   106,   111,   116,   119,   122,
    87,   131,   136,   139,   142,   145,   150,   153,    87,   160,
    87,   163,    87,   166,    87,   169,    87,   172,    87,    87,
@@ -1041,7 +1183,7 @@ unsigned short Dict017TagHashTable[] = {
    30,    76,
 };
 
-unsigned short Dict017KeyHashTable[] = {
+const unsigned short Dict017KeyHashTable[] = {
    87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
    87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
    87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
@@ -1082,7 +1224,7 @@ Dict017Contents
 
 // ----- Mayo/IBM Archive Project -----
 
-DictEntry Dict018Contents[] = {
+const DictEntry Dict018Contents[] = {
 { 0x0021, 0x0001, 0, VR::UN, VM::M1, "" },
 { 0x0021, 0x0010, 0, VR::UN, VM::M1, "" },
 { 0x0021, 0x0011, 0, VR::UN, VM::M1, "" },
@@ -1108,7 +1250,7 @@ DictEntry Dict018Contents[] = {
 { 0x0021, 0x0065, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict018TagHashTable[] = {
+const unsigned short Dict018TagHashTable[] = {
    24,    27,    30,    33,    36,    41,    46,    49,    52,    55,
    60,    63,    66,    69,    72,    75,    78,    81,    84,    23,
    87,    23,    23,     0,     1,    22,   101,     1,    17,    32,
@@ -1120,7 +1262,7 @@ unsigned short Dict018TagHashTable[] = {
    31,     1,    15,    30,     1,    21,    96,     1,    20,    80,
 };
 
-unsigned short Dict018KeyHashTable[] = {
+const unsigned short Dict018KeyHashTable[] = {
    23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
    23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
    23,    23,    24,     0,    23,     0,   233,     1,   233,     2,
@@ -1142,15 +1284,15 @@ Dict018Contents
 
 // ----- SIEMENS SIENET -----
 
-DictEntry Dict019Contents[] = {
+const DictEntry Dict019Contents[] = {
 { 0x0019, 0x0001, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict019TagHashTable[] = {
+const unsigned short Dict019TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict019KeyHashTable[] = {
+const unsigned short Dict019KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
@@ -1165,7 +1307,7 @@ Dict019Contents
 
 // ----- MDS NORDION OTP ANATOMY MODELLING -----
 
-DictEntry Dict020Contents[] = {
+const DictEntry Dict020Contents[] = {
 { 0x3005, 0x0000, 0, VR::SQ, VM::M1, "" },
 { 0x3005, 0x0002, 0, VR::CS, VM::M1, "" },
 { 0x3005, 0x0004, 0, VR::DS, VM::M1, "" },
@@ -1178,14 +1320,14 @@ DictEntry Dict020Contents[] = {
 { 0x3005, 0x0012, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict020TagHashTable[] = {
+const unsigned short Dict020TagHashTable[] = {
    10,    11,    10,    18,    10,    25,    10,    30,    10,    33,
     0,     3,     2,     4,     7,    14,     8,    16,     3,     3,
     6,     4,     8,     9,    18,     2,     0,     0,     5,    10,
     1,     1,     2,     1,     6,    12,
 };
 
-unsigned short Dict020KeyHashTable[] = {
+const unsigned short Dict020KeyHashTable[] = {
    10,    11,    10,    10,    10,    10,    10,    10,    10,    10,
     0,    10,     0,   538,     1,   538,     2,   538,     3,   538,
     4,   538,     5,   538,     6,   538,     7,   538,     8,   538,
@@ -1203,7 +1345,7 @@ Dict020Contents
 
 // ----- SIEMENS CT APPL DATASET -----
 
-DictEntry Dict021Contents[] = {
+const DictEntry Dict021Contents[] = {
 { 0x0029, 0x0000, 0, VR::LT, VM::M1, "DualEnergyAlgorithmParameters" },
 { 0x0029, 0x0001, 0, VR::US, VM::M1, "ValidCTVolumeMBoxTasks" },
 { 0x0029, 0x0002, 0, VR::LT, VM::M1, "ScanOptions" },
@@ -1258,7 +1400,7 @@ DictEntry Dict021Contents[] = {
 { 0x0029, 0x0045, 0, VR::DS, VM::M1, "FrameCount" },
 };
 
-unsigned short Dict021TagHashTable[] = {
+const unsigned short Dict021TagHashTable[] = {
    53,    58,    63,    68,    73,    80,    87,    92,    97,   102,
   107,   112,   117,   120,   123,   126,   129,   132,    52,    52,
    52,    52,    52,    52,   135,   138,   141,   144,   147,   150,
@@ -1281,7 +1423,7 @@ unsigned short Dict021TagHashTable[] = {
    19,    25,     1,    18,    24,
 };
 
-unsigned short Dict021KeyHashTable[] = {
+const unsigned short Dict021KeyHashTable[] = {
    53,    52,    52,    52,    56,    59,    62,    52,    52,    67,
    74,    52,    52,    52,    79,    84,    93,    98,    52,   101,
   106,    52,    52,    52,    52,    52,   109,   114,   121,   126,
@@ -1314,7 +1456,7 @@ Dict021Contents
 
 // ----- DCMTK_ANONYMIZER -----
 
-DictEntry Dict022Contents[] = {
+const DictEntry Dict022Contents[] = {
 { 0x0009, 0x0000, 0, VR::SQ, VM::M1, "AnonymizerUIDMap" },
 { 0x0009, 0x0010, 0, VR::UI, VM::M1, "AnonymizerUIDKey" },
 { 0x0009, 0x0020, 0, VR::UI, VM::M1, "AnonymizerUIDValue" },
@@ -1323,13 +1465,13 @@ DictEntry Dict022Contents[] = {
 { 0x0009, 0x0050, 0, VR::LO, VM::M1, "AnonymizerPatientIDValue" },
 };
 
-unsigned short Dict022TagHashTable[] = {
+const unsigned short Dict022TagHashTable[] = {
     7,    10,     6,    13,    18,    21,     0,     1,     4,    64,
     1,     1,    16,     2,     0,     0,     3,    48,     1,     5,
    80,     1,     2,    32,
 };
 
-unsigned short Dict022KeyHashTable[] = {
+const unsigned short Dict022KeyHashTable[] = {
     6,     6,     7,     6,     6,    16,     0,     4,     1, 45231,
     2, 25229,     4, 19471,     5, 21997,     2,     0, 45570,     3,
 19810,
@@ -1344,25 +1486,44 @@ Dict022KeyHashTable,
 Dict022Contents
 };
 
-// ----- AGFA PACS Archive Mirroring 1.0 -----
+// ----- ULTRAVISUAL_TAG_SET1 -----
 
-DictEntry Dict023Contents[] = {
-{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "" },
-{ 0x0031, 0x0001, 0, VR::UL, VM::M1, "" },
+const DictEntry Dict023Contents[] = {
+{ 0x0011, 0x0001, 0, VR::CS, VM::M1, "" },
+{ 0x0011, 0x0002, 0, VR::UN, VM::M1, "" },
+{ 0x0011, 0x0003, 0, VR::UN, VM::M1, "" },
+{ 0x0011, 0x0008, 0, VR::LO, VM::M1, "" },
+{ 0x0011, 0x0010, 0, VR::US, VM::M1, "" },
+{ 0x0011, 0x0011, 0, VR::UN, VM::M1, "" },
+{ 0x0011, 0x0012, 0, VR::UI, VM::M1, "" },
+{ 0x0011, 0x0018, 0, VR::UL, VM::M1, "" },
+{ 0x0011, 0x0019, 0, VR::UN, VM::M1, "" },
+{ 0x0011, 0x001a, 0, VR::CS, VM::M1, "" },
+{ 0x0011, 0x001b, 0, VR::IS, VM::M1, "" },
+{ 0x0011, 0x001c, 0, VR::IS, VM::M1, "" },
+{ 0x0011, 0x001d, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict023TagHashTable[] = {
-    3,     6,     0,     1,     1,     1,     1,     0,     0,
+const unsigned short Dict023TagHashTable[] = {
+   14,    19,    13,    22,    13,    27,    30,    13,    33,    36,
+   39,    42,    45,     0,     2,     5,    17,    11,    28,     1,
+    4,    16,     2,     0,     1,     6,    18,     1,     2,     3,
+    1,     1,     2,     1,     8,    25,     1,     7,    24,     1,
+   10,    27,     1,     9,    26,     2,     3,     8,    12,    29,
 };
 
-unsigned short Dict023KeyHashTable[] = {
-    2,     3,     0,     2,     0,  2690,     1,  2690,
+const unsigned short Dict023KeyHashTable[] = {
+   13,    13,    13,    13,    13,    13,    13,    13,    13,    13,
+   13,    13,    14,     0,    13,     0,   413,     1,   413,     2,
+  413,     3,   413,     4,   413,     5,   413,     6,   413,     7,
+  413,     8,   413,     9,   413,    10,   413,    11,   413,    12,
+  413,
 };
 
 vtkDICOMDictionary::Dict Dict023Data = {
-"AGFA PACS Archive Mirroring 1.0",
-2,
-2,
+"ULTRAVISUAL_TAG_SET1",
+13,
+13,
 Dict023TagHashTable,
 Dict023KeyHashTable,
 Dict023Contents
@@ -1370,18 +1531,18 @@ Dict023Contents
 
 // ----- syngoDynamics -----
 
-DictEntry Dict024Contents[] = {
+const DictEntry Dict024Contents[] = {
 { 0x0021, 0x00ae, 0, VR::OB, VM::M1, "" },
 { 0x0021, 0x00b0, 0, VR::LO, VM::M1, "" },
 { 0x0021, 0x00b1, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict024TagHashTable[] = {
+const unsigned short Dict024TagHashTable[] = {
     4,     3,     9,     0,     2,     0,   174,     1,   176,     1,
     2,   177,
 };
 
-unsigned short Dict024KeyHashTable[] = {
+const unsigned short Dict024KeyHashTable[] = {
     3,     3,     4,     0,     3,     0,  1793,     1,  1793,     2,
  1793,
 };
@@ -1397,19 +1558,19 @@ Dict024Contents
 
 // ----- SIEMENS SYNGO ULTRA-SOUND TOYON DATA STREAMING -----
 
-DictEntry Dict025Contents[] = {
+const DictEntry Dict025Contents[] = {
 { 0x7FD1, 0x0001, 0, VR::OB, VM::M1, "Padding" },
 { 0x7FD1, 0x0009, 0, VR::OB, VM::M1, "VersionID" },
 { 0x7FD1, 0x0010, 0, VR::LO, VM::M1, "Payload" },
 { 0x7FD1, 0x0011, 0, VR::LO, VM::M1, "AfterPayload" },
 };
 
-unsigned short Dict025TagHashTable[] = {
+const unsigned short Dict025TagHashTable[] = {
     4,     4,     5,     8,     0,     1,     2,    16,     3,     0,
     1,     1,     9,     3,    17,
 };
 
-unsigned short Dict025KeyHashTable[] = {
+const unsigned short Dict025KeyHashTable[] = {
     5,    10,     4,    13,     0,     2,     0, 19727,     1, 42278,
     1,     3, 47800,     1,     2, 27755,
 };
@@ -1425,7 +1586,7 @@ Dict025Contents
 
 // ----- Hipaa Private Creator -----
 
-DictEntry Dict026Contents[] = {
+const DictEntry Dict026Contents[] = {
 { 0x0011, 0x0001, 0, VR::LT, VM::M1, "EncryptedInstanceCreatorID" },
 { 0x0011, 0x0002, 0, VR::LT, VM::M1, "EncryptedSOPInstanceUID" },
 { 0x0011, 0x0003, 0, VR::LT, VM::M1, "EncryptedAccessionNumber" },
@@ -1470,7 +1631,7 @@ DictEntry Dict026Contents[] = {
 { 0x0011, 0x0042, 0, VR::LT, VM::M1, "EncryptedUID" },
 };
 
-unsigned short Dict026TagHashTable[] = {
+const unsigned short Dict026TagHashTable[] = {
    43,    46,    49,    52,    55,    58,    61,    66,    71,    76,
    81,    84,    87,    90,    93,    96,    99,    42,   102,   105,
   108,   111,   114,   117,   120,   123,    42,    42,    42,    42,
@@ -1490,7 +1651,7 @@ unsigned short Dict026TagHashTable[] = {
    37,    56,
 };
 
-unsigned short Dict026KeyHashTable[] = {
+const unsigned short Dict026KeyHashTable[] = {
    43,    48,    42,    42,    42,    51,    42,    54,    61,    64,
    67,    72,    81,    42,    84,    89,    94,    99,    42,    42,
   102,    42,   105,    42,   108,    42,   111,   114,   121,    42,
@@ -1520,16 +1681,16 @@ Dict026Contents
 
 // ----- GEMS_GNHD_01 -----
 
-DictEntry Dict027Contents[] = {
+const DictEntry Dict027Contents[] = {
 { 0x0033, 0x0001, 0, VR::UN, VM::M1, "" },
 { 0x0033, 0x0002, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict027TagHashTable[] = {
+const unsigned short Dict027TagHashTable[] = {
     3,     6,     0,     1,     0,     1,     1,     1,     2,
 };
 
-unsigned short Dict027KeyHashTable[] = {
+const unsigned short Dict027KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
@@ -1544,7 +1705,7 @@ Dict027Contents
 
 // ----- PAPYRUS 3.0 -----
 
-DictEntry Dict028Contents[] = {
+const DictEntry Dict028Contents[] = {
 { 0x0041, 0x0000, 0, VR::LT, VM::M1, "PapyrusComments" },
 { 0x0041, 0x0010, 0, VR::SQ, VM::M1, "PointerSequence" },
 { 0x0041, 0x0011, 0, VR::UL, VM::M1, "ImagePointer" },
@@ -1561,7 +1722,7 @@ DictEntry Dict028Contents[] = {
 { 0x0041, 0x0050, 0, VR::SQ, VM::M1, "ImageSequence" },
 };
 
-unsigned short Dict028TagHashTable[] = {
+const unsigned short Dict028TagHashTable[] = {
    15,    22,    27,    30,    14,    14,    14,    14,    35,    14,
    38,    41,    44,    47,     0,     3,     5,    20,     8,    34,
    11,    65,     2,     6,    21,     9,    49,     1,    10,    50,
@@ -1570,7 +1731,7 @@ unsigned short Dict028TagHashTable[] = {
     7,    33,
 };
 
-unsigned short Dict028KeyHashTable[] = {
+const unsigned short Dict028KeyHashTable[] = {
    14,    14,    15,    18,    14,    23,    14,    26,    29,    34,
    14,    37,    44,    49,     0,     1,     4, 43943,     2,     1,
 49618,     9, 38509,     1,    13, 32018,     1,     0, 44436,     2,
@@ -1588,9 +1749,39 @@ Dict028KeyHashTable,
 Dict028Contents
 };
 
+// ----- Philips MR Imaging DD 003 -----
+
+const DictEntry Dict029Contents[] = {
+{ 0x2005, 0x0082, 0, VR::CS, VM::M1TN, "RunningAttributes" },
+};
+
+const unsigned short Dict029TagHashTable[] = {
+    2,     0,     1,     0,   130,
+};
+
+const unsigned short Dict029KeyHashTable[] = {
+    2,     0,     1,     0, 45837,
+};
+
+vtkDICOMDictionary::Dict Dict029Data = {
+"Philips MR Imaging DD 003",
+1,
+1,
+Dict029TagHashTable,
+Dict029KeyHashTable,
+Dict029Contents
+};
+
 // ----- ACUSON -----
 
-DictEntry Dict029Contents[] = {
+const DictEntry Dict030Contents[] = {
+{ 0x0009, 0x0000, 0, VR::IS, VM::M1, "" },
+{ 0x0009, 0x0001, 0, VR::IS, VM::M1, "" },
+{ 0x0009, 0x0002, 0, VR::UN, VM::M1, "" },
+{ 0x0009, 0x0003, 0, VR::UN, VM::M1, "" },
+{ 0x0009, 0x0004, 0, VR::UN, VM::M1, "" },
+{ 0x0009, 0x0005, 0, VR::UN, VM::M1, "" },
+{ 0x0009, 0x0006, 0, VR::UN, VM::M1, "" },
 { 0x0009, 0x0007, 0, VR::UN, VM::M1, "" },
 { 0x0009, 0x0008, 0, VR::LT, VM::M1, "" },
 { 0x0009, 0x0009, 0, VR::LT, VM::M1, "" },
@@ -1608,40 +1799,47 @@ DictEntry Dict029Contents[] = {
 { 0x0009, 0x0015, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict029TagHashTable[] = {
-   16,    19,    22,    25,    28,    31,    34,    37,    15,    40,
-   43,    46,    49,    52,    55,     0,     1,     2,     9,     1,
-    1,     8,     1,     4,    11,     1,     3,    10,     1,     6,
-   13,     1,     5,    12,     1,     8,    15,     1,     7,    14,
-    1,    10,    17,     1,     9,    16,     1,    12,    19,     1,
-   11,    18,     1,    14,    21,     2,     0,     7,    13,    20,
+const unsigned short Dict030TagHashTable[] = {
+   23,    26,    29,    34,    39,    44,    49,    54,    59,    62,
+   65,    68,    71,    74,    77,    80,    22,    22,    22,    22,
+   22,    22,     0,     1,     9,     9,     1,     8,     8,     2,
+   11,    11,    17,    17,     2,    10,    10,    16,    16,     2,
+   13,    13,    19,    19,     2,    12,    12,    18,    18,     2,
+   15,    15,    21,    21,     2,    14,    14,    20,    20,     1,
+    1,     1,     1,     0,     0,     1,     3,     3,     1,     2,
+    2,     1,     5,     5,     1,     4,     4,     1,     7,     7,
+    1,     6,     6,
 };
 
-unsigned short Dict029KeyHashTable[] = {
-   15,    15,    15,    15,    15,    15,    15,    15,    15,    15,
-   15,    16,    15,    15,    15,     0,    15,     0,   358,     1,
-  358,     2,   358,     3,   358,     4,   358,     5,   358,     6,
-  358,     7,   358,     8,   358,     9,   358,    10,   358,    11,
-  358,    12,   358,    13,   358,    14,   358,
+const unsigned short Dict030KeyHashTable[] = {
+   22,    22,    22,    22,    22,    22,    22,    22,    22,    22,
+   22,    22,    22,    23,    22,    22,    22,    22,    22,    22,
+   22,    22,     0,    22,     0,   244,     1,   244,     2,   244,
+    3,   244,     4,   244,     5,   244,     6,   244,     7,   244,
+    8,   244,     9,   244,    10,   244,    11,   244,    12,   244,
+   13,   244,    14,   244,    15,   244,    16,   244,    17,   244,
+   18,   244,    19,   244,    20,   244,    21,   244,
 };
 
-vtkDICOMDictionary::Dict Dict029Data = {
+vtkDICOMDictionary::Dict Dict030Data = {
 "ACUSON",
-15,
-15,
-Dict029TagHashTable,
-Dict029KeyHashTable,
-Dict029Contents
+22,
+22,
+Dict030TagHashTable,
+Dict030KeyHashTable,
+Dict030Contents
 };
 
 // ----- Philips MR Imaging DD 001 -----
 
-DictEntry Dict030Contents[] = {
+const DictEntry Dict031Contents[] = {
 { 0x2005, 0x0000, 0, VR::FL, VM::M1, "ImageAngulationAP" },
 { 0x2005, 0x0001, 0, VR::FL, VM::M1, "ImageAngulationFH" },
 { 0x2005, 0x0002, 0, VR::FL, VM::M1, "ImageAngulationRL" },
+{ 0x2005, 0x0003, 0, VR::IS, VM::M1, "ImageAnnotationCount" },
 { 0x2005, 0x0004, 0, VR::CS, VM::M1, "ImageDisplayOrientation" },
 { 0x2005, 0x0005, 0, VR::CS, VM::M1, "SynergyReconstructionType" },
+{ 0x2005, 0x0007, 0, VR::IS, VM::M1, "ImageLineCount" },
 { 0x2005, 0x0008, 0, VR::FL, VM::M1, "ImageOffcenterAP" },
 { 0x2005, 0x0009, 0, VR::FL, VM::M1, "ImageOffcenterFH" },
 { 0x2005, 0x000a, 0, VR::FL, VM::M1, "ImageOffCentreRL" },
@@ -1711,7 +1909,7 @@ DictEntry Dict030Contents[] = {
 { 0x2005, 0x004b, 0, VR::IS, VM::M1TN, "ReferencedEchoNumber" },
 { 0x2005, 0x004c, 0, VR::CS, VM::M1TN, "ReferencedEntity" },
 { 0x2005, 0x004d, 0, VR::CS, VM::M1TN, "ReferencedImageType" },
-{ 0x2005, 0x004e, 0, VR::FL, VM::M1, "SlabFOVRL" },
+{ 0x2005, 0x004e, 0, VR::FL, VM::M1TN, "SlabFOVRL" },
 { 0x2005, 0x004f, 0, VR::FL, VM::M1TN, "SlabOffcentreAP" },
 { 0x2005, 0x0050, 0, VR::FL, VM::M1TN, "SlabOffcentreFH" },
 { 0x2005, 0x0051, 0, VR::FL, VM::M1TN, "SlabOffcentreRL" },
@@ -1727,7 +1925,7 @@ DictEntry Dict030Contents[] = {
 { 0x2005, 0x005b, 0, VR::FL, VM::M1TN, "VolumeOffcentreFH" },
 { 0x2005, 0x005c, 0, VR::FL, VM::M1TN, "VolumeOffcentreRL" },
 { 0x2005, 0x005d, 0, VR::CS, VM::M1TN, "VolumeType" },
-{ 0x2005, 0x005e, 0, VR::CS, VM::M1, "VolumeViewAxis" },
+{ 0x2005, 0x005e, 0, VR::CS, VM::M1TN, "VolumeViewAxis" },
 { 0x2005, 0x005f, 0, VR::CS, VM::M1, "StudyOrigin" },
 { 0x2005, 0x0060, 0, VR::IS, VM::M1, "StudySequenceNumber" },
 { 0x2005, 0x0061, 0, VR::CS, VM::M1, "PrepulseType" },
@@ -1765,6 +1963,12 @@ DictEntry Dict030Contents[] = {
 { 0x2005, 0x0087, 0, VR::SL, VM::M1TN, "NumberOfGeometrySlices" },
 { 0x2005, 0x0088, 0, VR::FL, VM::M1TN, "GeomAngulationAP" },
 { 0x2005, 0x0089, 0, VR::FL, VM::M1TN, "GeomAngulationFH" },
+{ 0x2005, 0x008A, 0, VR::FL, VM::M1TN, "GeomAngulationRL" },
+{ 0x2005, 0x008B, 0, VR::FL, VM::M1TN, "GeomFOVAP" },
+{ 0x2005, 0x008C, 0, VR::FL, VM::M1TN, "GeomFOVFH" },
+{ 0x2005, 0x008D, 0, VR::FL, VM::M1TN, "GeomFOVRL" },
+{ 0x2005, 0x008E, 0, VR::FL, VM::M1TN, "GeomOffCentreAP" },
+{ 0x2005, 0x008F, 0, VR::FL, VM::M1TN, "GeomOffCentreFH" },
 { 0x2005, 0x0090, 0, VR::FL, VM::M1TN, "GeomOffCentreRL" },
 { 0x2005, 0x0091, 0, VR::CS, VM::M1TN, "GeomPreparationDirect" },
 { 0x2005, 0x0092, 0, VR::FL, VM::M1TN, "GeomRadialAngle" },
@@ -1775,7 +1979,11 @@ DictEntry Dict030Contents[] = {
 { 0x2005, 0x0097, 0, VR::CS, VM::M1TN, "GeomViewAxis" },
 { 0x2005, 0x0098, 0, VR::CS, VM::M1TN, "GeomColour" },
 { 0x2005, 0x0099, 0, VR::CS, VM::M1TN, "GeomApplicationType" },
-{ 0x2005, 0x009e, 0, VR::SQ, VM::M1, "Geometry" },
+{ 0x2005, 0x009a, 0, VR::SL, VM::M1TN, "GeomId" },
+{ 0x2005, 0x009b, 0, VR::SH, VM::M1TN, "GeomApplicationName" },
+{ 0x2005, 0x009c, 0, VR::SH, VM::M1TN, "GeomLabelName" },
+{ 0x2005, 0x009d, 0, VR::CS, VM::M1TN, "GeomLineStyle" },
+{ 0x2005, 0x009e, 0, VR::SQ, VM::M1, "SeriesGeometry" },
 { 0x2005, 0x009f, 0, VR::CS, VM::M1, "SpectralSelectiveExcitationPulse" },
 { 0x2005, 0x00a0, 0, VR::FL, VM::M1, "DynamicScanBeginTime" },
 { 0x2005, 0x00a1, 0, VR::CS, VM::M1, "SyncraScanType" },
@@ -1786,152 +1994,160 @@ DictEntry Dict030Contents[] = {
 { 0x2005, 0x00a6, 0, VR::IS, VM::M1, "StackChannelCombi" },
 { 0x2005, 0x00a7, 0, VR::CS, VM::M1, "StackCoilConnection" },
 { 0x2005, 0x00a8, 0, VR::DS, VM::M1, "InversionTime" },
-{ 0x2005, 0x00a9, 0, VR::CS, VM::M1, "SeriesGeometryCorrection" },
+{ 0x2005, 0x00a9, 0, VR::CS, VM::M1, "GeometryCorrection" },
 { 0x2005, 0x00b0, 0, VR::FL, VM::M1, "DiffusionDirectionRL" },
 { 0x2005, 0x00b1, 0, VR::FL, VM::M1, "DiffusionDirectionAP" },
 { 0x2005, 0x00b2, 0, VR::FL, VM::M1, "DiffusionDirectionFH" },
-{ 0x2005, 0x00c0, 0, VR::CS, VM::M1, "SeriesScanSequence" },
+{ 0x2005, 0x00c0, 0, VR::CS, VM::M1, "ScanSequence" },
 };
 
-unsigned short Dict030TagHashTable[] = {
-  154,   154,   154,   154,   155,   158,   154,   154,   161,   164,
-  154,   167,   170,   173,   176,   179,   182,   185,   188,   191,
+const unsigned short Dict031TagHashTable[] = {
+  166,   166,   166,   166,   166,   166,   166,   166,   166,   166,
+  166,   166,   166,   166,   166,   166,   166,   166,   166,   166,
+  167,   170,   173,   166,   176,   179,   182,   185,   188,   191,
   194,   197,   200,   203,   206,   209,   212,   215,   218,   221,
-  224,   229,   234,   239,   244,   249,   252,   257,   260,   263,
-  266,   269,   272,   275,   278,   283,   288,   293,   298,   303,
-  308,   313,   318,   323,   328,   333,   338,   341,   344,   347,
-  350,   355,   360,   365,   370,   375,   380,   385,   390,   395,
-  400,   403,   406,   409,   412,   415,   418,   423,   428,   431,
-  434,   437,   440,   443,   448,   453,   458,   461,   464,   467,
-  470,   473,   476,   479,   482,   485,   488,   491,   494,   497,
-  500,   505,   508,   511,   514,   517,   154,   520,   523,   526,
-  529,   532,   535,   538,   541,   544,   547,   550,   553,   154,
-  556,   559,   562,   565,   154,   154,   568,   154,   571,   574,
-  577,   580,   154,   154,   154,   154,   154,   154,   154,   154,
-  154,   154,   154,   154,   154,   154,   154,   154,   154,   154,
-  154,   154,   154,   154,     0,     1,     4,     5,     1,     3,
-    4,     1,     1,     1,     1,     0,     0,     1,     2,     2,
-    1,    10,    13,     1,     9,    12,     1,    12,    15,     1,
-   11,    14,     1,     6,     9,     1,     5,     8,     1,     8,
-   11,     1,     7,    10,     1,    18,    21,     1,    17,    20,
-    1,    20,    23,     1,    19,    22,     1,    14,    17,     1,
-   13,    16,     1,    16,    19,     1,    15,    18,     1,    26,
-   29,     1,    25,    28,     2,    28,    31,   125,   135,     2,
-   27,    30,   124,   134,     2,    22,    25,   123,   133,     2,
-   21,    24,   122,   132,     2,    24,    27,   121,   131,     1,
-   23,    26,     2,    33,    37,   120,   129,     1,   119,   128,
-    1,    35,    39,     1,    34,    38,     1,    30,    33,     1,
-   29,    32,     1,    32,    35,     1,    31,    34,     2,    41,
-   45,   127,   137,     2,    40,    44,   126,   136,     2,    43,
-   47,   135,   151,     2,    42,    46,   134,   150,     2,    37,
-   41,   133,   149,     2,    36,    40,   132,   148,     2,    39,
-   43,   131,   147,     2,    38,    42,   130,   146,     2,    49,
-   53,   129,   145,     2,    48,    52,   128,   144,     2,    51,
-   55,   139,   159,     2,    50,    54,   138,   158,     1,    45,
-   49,     1,    44,    48,     1,    47,    51,     1,    46,    50,
-    2,    57,    61,   137,   153,     2,    56,    60,   136,   152,
-    2,    59,    63,   147,   167,     2,    58,    62,   146,   166,
-    2,    53,    57,   145,   165,     2,    52,    56,   144,   164,
-    2,    55,    59,   143,   163,     2,    54,    58,   142,   162,
-    2,    64,    68,   141,   161,     2,    65,    69,   140,   160,
-    1,    66,    70,     1,    67,    71,     1,    60,    64,     1,
-   61,    65,     1,    62,    66,     1,    63,    67,     2,    72,
-   76,   149,   169,     2,    73,    77,   148,   168,     1,    74,
-   78,     1,    75,    79,     1,    68,    72,     1,    69,    73,
-    1,    70,    74,     2,    71,    75,   152,   178,     2,    80,
-   84,   151,   177,     2,    81,    85,   150,   176,     1,    82,
-   86,     1,    83,    87,     1,    76,    80,     1,    77,    81,
-    1,    78,    82,     1,    79,    83,     1,    88,    92,     1,
-   89,    93,     1,    90,    94,     1,    91,    95,     1,    84,
-   88,     1,    85,    89,     1,    86,    90,     1,    87,    91,
-    2,    95,   100,   153,   192,     1,    96,   101,     1,    97,
-  102,     1,    98,   103,     1,    92,    96,     1,    93,    97,
-    1,    94,    99,     1,   103,   108,     1,   104,   109,     1,
-  105,   110,     1,   106,   111,     1,    99,   104,     1,   100,
-  105,     1,   101,   106,     1,   102,   107,     1,   111,   116,
-    1,   112,   117,     1,   113,   118,     1,   107,   112,     1,
-  108,   113,     1,   109,   114,     1,   110,   115,     1,   118,
-  126,     1,   114,   120,     1,   115,   121,     1,   116,   122,
-    1,   117,   123,
-};
-
-unsigned short Dict030KeyHashTable[] = {
-  155,   154,   154,   158,   154,   154,   163,   154,   168,   173,
-  178,   185,   198,   201,   204,   154,   211,   154,   214,   219,
-  222,   225,   232,   235,   154,   238,   154,   154,   154,   154,
-  154,   241,   244,   154,   154,   154,   247,   250,   255,   260,
-  265,   154,   268,   154,   273,   276,   154,   279,   154,   282,
-  154,   154,   285,   290,   293,   296,   301,   308,   311,   154,
-  154,   314,   154,   154,   317,   154,   322,   325,   154,   328,
-  331,   154,   334,   337,   154,   344,   154,   154,   154,   347,
-  350,   353,   154,   356,   361,   364,   154,   369,   374,   154,
-  379,   382,   387,   390,   154,   397,   400,   154,   154,   403,
-  154,   154,   154,   410,   154,   413,   416,   154,   423,   154,
-  426,   429,   154,   436,   441,   446,   453,   154,   154,   154,
-  154,   154,   456,   154,   459,   154,   154,   466,   154,   154,
-  471,   474,   479,   154,   154,   486,   489,   154,   492,   495,
-  500,   507,   154,   510,   515,   520,   523,   528,   533,   540,
-  547,   552,   154,   154,     0,     1,    33, 26803,     2,    96,
-51718,   131, 25182,     2,    71, 46113,   123, 35877,     2,    86,
-43029,   121, 57289,     2,    13,  2754,    49, 55612,     3,    17,
- 4821,    36, 39351,    53, 41583,     6,     0, 58352,     5, 32121,
-   34, 60629,    45, 29628,    83, 20403,    87, 43030,     1,   106,
-47562,     1,   130, 42226,     3,     1, 58353,     6, 32122,    84,
-20404,     1,   100, 49025,     2,    80, 31859,   114,  7623,     1,
-  101, 49026,     1,   108, 56729,     3,    81, 31860,   115,  7624,
-  129,   332,     1,    14,  4498,     1,   109, 56730,     1,    16,
-20610,     1,    70, 24612,     1,    95, 28483,     1,    63, 43114,
-    2,    30, 65514,   135, 50540,     2,     4,  4930,    35, 63512,
-    2,    55, 53916,   134, 46164,     1,    29, 22773,     2,    22,
-23670,   149, 61673,     1,    12, 36381,     1,    72, 34644,     1,
-  124, 52416,     1,    56, 51239,     2,   113, 14792,   151, 40233,
-    1,   103, 28531,     1,    54, 55213,     2,    20,  1741,   152,
-40234,     3,    46, 23381,    61, 39643,   104, 28532,     1,   136,
-51604,     1,    39, 58257,     1,    42, 28859,     2,    26,  5258,
-  118,  1319,     1,    38, 33570,     1,   117, 45531,     1,   143,
- 2345,     1,    47, 37507,     1,    28, 57755,     3,    21, 59828,
-   66,  9850,   140, 51793,     1,    37,  5074,     1,    79, 29492,
-    1,   126, 28080,     1,   138, 50096,     2,    78, 30999,   127,
-28081,     1,   153, 11809,     2,    77,   558,    90, 39836,     2,
-   27,  8879,    67, 19476,     2,   125, 37761,   139,  7384,     1,
-  133, 48478,     2,    52, 21761,    93, 37590,     1,   146, 12341,
-    3,     8, 45786,    89, 52469,    98, 45768,     1,   120, 64814,
-    1,    99, 28775,     3,    59, 60698,   105,  7582,   148, 59939,
-    1,    88, 43032,     1,   142, 59875,     3,     2, 58355,    85,
-20406,    92,  4711,     1,    25, 13519,     1,   119, 44957,     3,
-   10,  9630,   102, 49028,   111, 14788,     2,    82, 31862,   116,
- 7626,     2,    32, 46719,   112, 14789,     3,     9, 47582,    31,
- 5021,   110, 56732,     1,    23, 27452,     1,   141, 40165,     3,
-    7, 41615,    11, 11922,    50, 40526,     2,    44,  6828,    51,
-56517,     1,    48, 27159,     2,    19, 25049,   128, 32986,     3,
-   18,  3119,   107,  5332,   132, 43210,     1,    69, 44547,     1,
-   97, 50583,     1,    91,  6646,     2,    58, 46551,    94, 25859,
-    3,    15, 50673,    65, 56757,   144, 32211,     1,   145, 32211,
-    2,    41, 35172,    62, 17462,     2,    24,  2725,    75,   554,
-    1,   137,  9949,     2,     3, 62428,   147, 47696,     2,    76,
-  555,   150, 40236,     3,    43, 11112,    68, 54887,    74, 28534,
-    3,    64, 10228,    73, 34516,   122, 12489,     2,    57, 28759,
-   60, 52921,     1,    40, 31947,
+  224,   227,   230,   233,   236,   239,   242,   245,   248,   251,
+  254,   257,   260,   166,   263,   266,   269,   272,   275,   280,
+  285,   290,   295,   300,   303,   308,   313,   318,   323,   328,
+  333,   338,   343,   348,   353,   358,   363,   368,   373,   378,
+  383,   388,   393,   398,   403,   408,   413,   418,   423,   428,
+  433,   438,   443,   448,   453,   458,   463,   468,   473,   476,
+  479,   482,   485,   488,   491,   496,   501,   504,   507,   510,
+  513,   516,   521,   526,   531,   534,   537,   540,   543,   546,
+  549,   552,   166,   555,   558,   561,   564,   567,   570,   575,
+  578,   581,   584,   587,   590,   166,   593,   596,   599,   602,
+  166,   166,   605,   166,   608,   611,   614,   617,   166,   166,
+  166,   166,   166,   166,   166,   166,   166,   166,   166,   166,
+  166,   166,   166,   166,   166,   166,     0,     1,     5,     5,
+    1,     4,     4,     1,     6,     7,     1,     1,     1,     1,
+    0,     0,     1,     3,     3,     1,     2,     2,     1,    12,
+   13,     1,    11,    12,     1,    14,    15,     1,    13,    14,
+    1,     8,     9,     1,     7,     8,     1,    10,    11,     1,
+    9,    10,     1,    20,    21,     1,    19,    20,     1,    22,
+   23,     1,    21,    22,     1,    16,    17,     1,    15,    16,
+    1,    18,    19,     1,    17,    18,     1,    28,    29,     1,
+   27,    28,     1,    30,    31,     1,    29,    30,     1,    24,
+   25,     1,    23,    24,     1,    26,    27,     1,    25,    26,
+    1,    35,    37,     1,    37,    39,     1,    36,    38,     1,
+   32,    33,     1,    31,    32,     2,    34,    35,   127,   135,
+    2,    33,    34,   126,   134,     2,    43,    45,   125,   133,
+    2,    42,    44,   124,   132,     2,    45,    47,   123,   131,
+    1,    44,    46,     2,    39,    41,   122,   129,     2,    38,
+   40,   121,   128,     2,    41,    43,   135,   143,     2,    40,
+   42,   134,   142,     2,    51,    53,   133,   141,     2,    50,
+   52,   132,   140,     2,    53,    55,   131,   139,     2,    52,
+   54,   130,   138,     2,    47,    49,   129,   137,     2,    46,
+   48,   128,   136,     2,    49,    51,   143,   151,     2,    48,
+   50,   142,   150,     2,    59,    61,   141,   149,     2,    58,
+   60,   140,   148,     2,    61,    63,   139,   147,     2,    60,
+   62,   138,   146,     2,    55,    57,   137,   145,     2,    54,
+   56,   136,   144,     2,    57,    59,   151,   159,     2,    56,
+   58,   150,   158,     2,    66,    68,   149,   157,     2,    67,
+   69,   148,   156,     2,    68,    70,   147,   155,     2,    69,
+   71,   146,   154,     2,    62,    64,   145,   153,     2,    63,
+   65,   144,   152,     2,    64,    66,   159,   167,     2,    65,
+   67,   158,   166,     2,    74,    76,   157,   165,     2,    75,
+   77,   156,   164,     2,    76,    78,   155,   163,     2,    77,
+   79,   154,   162,     2,    70,    72,   153,   161,     2,    71,
+   73,   152,   160,     1,    72,    74,     1,    73,    75,     1,
+   82,    84,     1,    83,    85,     1,    84,    86,     1,    85,
+   87,     2,    78,    80,   161,   169,     2,    79,    81,   160,
+  168,     1,    80,    82,     1,    81,    83,     1,    90,    92,
+    1,    91,    93,     1,    92,    94,     2,    93,    95,   164,
+  178,     2,    86,    88,   163,   177,     2,    87,    89,   162,
+  176,     1,    88,    90,     1,    89,    91,     1,    97,   100,
+    1,    98,   101,     1,    99,   102,     1,   100,   103,     1,
+   94,    96,     1,    95,    97,     1,    96,    99,     1,   105,
+  108,     1,   106,   109,     1,   107,   110,     1,   108,   111,
+    2,   101,   104,   165,   192,     1,   102,   105,     1,   103,
+  106,     1,   104,   107,     1,   113,   116,     1,   114,   117,
+    1,   115,   118,     1,   109,   112,     1,   110,   113,     1,
+  111,   114,     1,   112,   115,     1,   120,   126,     1,   116,
+  120,     1,   117,   121,     1,   118,   122,     1,   119,   123,
+};
+
+const unsigned short Dict031KeyHashTable[] = {
+  167,   166,   170,   175,   178,   181,   166,   184,   187,   166,
+  166,   190,   195,   166,   200,   166,   166,   203,   166,   166,
+  208,   211,   220,   225,   230,   233,   166,   240,   166,   166,
+  166,   245,   248,   251,   254,   166,   257,   166,   166,   262,
+  265,   268,   273,   166,   278,   281,   284,   166,   291,   300,
+  307,   310,   313,   166,   316,   166,   321,   326,   329,   332,
+  335,   166,   166,   340,   343,   166,   166,   346,   166,   349,
+  352,   355,   358,   361,   366,   369,   374,   377,   380,   166,
+  383,   166,   386,   166,   166,   166,   166,   389,   396,   166,
+  399,   402,   405,   408,   166,   411,   420,   166,   423,   426,
+  429,   432,   166,   166,   166,   437,   442,   445,   450,   453,
+  166,   458,   461,   464,   467,   166,   470,   166,   473,   480,
+  166,   485,   488,   491,   166,   498,   166,   166,   501,   166,
+  506,   509,   512,   519,   522,   166,   525,   166,   530,   166,
+  166,   535,   542,   545,   548,   551,   556,   559,   166,   564,
+  166,   166,   166,   569,   572,   577,   580,   166,   166,   166,
+  583,   588,   595,   166,   600,   603,     0,     1,   109, 49954,
+    2,    67, 62130,   115, 13723,     1,    83, 60351,     1,    35,
+25655,     1,   105, 10677,     1,    54, 38349,     1,    77, 63682,
+    2,    74, 33719,   112, 13152,     2,    82, 60350,    86, 53671,
+    1,     9, 18078,     2,    11,  5453,    92, 61434,     1,    34,
+ 1494,     4,    81, 10779,    85, 53670,    91, 39991,   100, 34564,
+    2,    99, 37452,   132, 61192,     2,    51, 49223,   129, 26841,
+    1,    24, 56701,     3,   104, 55749,   135, 55077,   152, 33047,
+    2,    98, 15606,   164, 44432,     1,   131, 61191,     1,   128,
+26840,     1,    42, 53326,     1,   134, 55076,     2,    93,  4587,
+  163, 44431,     1,   117, 52869,     1,   149, 33877,     2,    22,
+ 3984,    61, 51573,     2,    27, 55180,    30, 30682,     1,   125,
+ 4858,     1,   137, 54000,     3,    49,  1633,   146, 61458,   150,
+ 4653,     4,    52, 43124,   116, 52868,   141, 46553,   156, 33831,
+    3,    66, 11858,   119, 18552,   157, 33831,     1,    73, 31725,
+    1,    43, 32630,     1,    14, 33751,     2,    40, 41408,   108,
+22015,     2,     5, 13259,   140, 10872,     1,    53, 40588,     1,
+   13, 41065,     1,    69,  7014,     2,     1, 24130,   148, 34531,
+    1,   126, 15464,     1,    76, 10680,     1,    79, 63685,     1,
+    0, 24129,     1,   123, 24722,     1,    84, 60353,     1,    50,
+29144,     2,    15, 45982,    44, 37827,     1,   127, 49244,     2,
+   12, 47624,    33, 10975,     1,    59,   624,     1,   139,  4411,
+    1,    48, 11426,     1,    87, 53673,     1,    16, 43652,     3,
+   32, 23667,    89, 18600,   138, 12327,     1,    37, 15493,     1,
+  133, 61194,     1,   130, 26843,     1,     8, 34537,     1,   136,
+55079,     4,    23, 51555,    57, 27120,   142, 51512,   162, 44434,
+    1,    88, 18599,     1,    45, 45051,     1,    72, 23622,     1,
+  114, 13720,     2,     7, 34536,    58, 19899,     2,    71, 50802,
+   95, 64877,     1,    17, 54906,     2,    75,  9123,   118, 52871,
+    1,    56, 65434,     2,   111, 13149,   113, 13719,     1,   161,
+48623,     1,    28, 38830,     1,    60, 12392,     1,    94, 53325,
+    1,    63, 59675,     3,     4, 33438,    55, 18047,   110, 13148,
+    2,    80,  3491,   124,  8428,     1,   143, 46886,     1,    25,
+64947,     3,    39, 14182,   103, 55746,   160, 65081,     1,   107,
+35459,     2,     2, 24132,     3, 30386,     1,    26, 10424,     1,
+  154, 33438,     3,    62, 40410,    97, 58007,   102, 55745,     1,
+   10,  3786,     1,   159, 25298,     2,    65, 33680,    70, 13019,
+    2,    31,  2176,   101, 12482,     3,    18, 37280,    47, 63017,
+   96, 61890,     1,   120, 65180,     1,   144, 21027,     1,    41,
+48518,     2,   155, 36917,   165, 27267,     1,   151, 12377,     2,
+   21, 17711,    29, 23239,     2,     6, 18278,   145,  6861,     1,
+   64,  1987,     2,   147,  5404,   158, 20134,     1,    90, 18602,
+    1,    38, 58614,     2,    19,  3682,   121,  8544,     3,    36,
+62562,    68, 27298,   122, 31703,     2,    20, 47900,   106, 10677,
+    1,   153,  8836,     2,    46,  4755,    78, 63682,
 };
 
-vtkDICOMDictionary::Dict Dict030Data = {
+vtkDICOMDictionary::Dict Dict031Data = {
 "Philips MR Imaging DD 001",
-154,
-154,
-Dict030TagHashTable,
-Dict030KeyHashTable,
-Dict030Contents
+166,
+166,
+Dict031TagHashTable,
+Dict031KeyHashTable,
+Dict031Contents
 };
 
 // ----- Philips MR Imaging DD 005 -----
 
-DictEntry Dict031Contents[] = {
+const DictEntry Dict032Contents[] = {
 { 0x2005, 0x0000, 0, VR::CS, VM::M1, "VolumeViewEnabled" },
 { 0x2005, 0x0001, 0, VR::UL, VM::M1, "NumberOfStudyReference" },
 { 0x2005, 0x0002, 0, VR::SQ, VM::M1, "SPSCode" },
 { 0x2005, 0x0003, 0, VR::UL, VM::M1, "NumberOfSPSCodes" },
 { 0x2005, 0x0004, 0, VR::SS, VM::M1, "" },
-{ 0x2005, 0x0006, 0, VR::SS, VM::M1, "" },
+{ 0x2005, 0x0006, 0, VR::SS, VM::M1, "NumberOfPSSpecificCharacterSets" },
 { 0x2005, 0x0007, 0, VR::SS, VM::M1, "NumberOfSpecificCharacterSet" },
 { 0x2005, 0x0009, 0, VR::DS, VM::M1, "RescaleInterceptOriginal" },
 { 0x2005, 0x000a, 0, VR::DS, VM::M1, "RescaleSlopeOriginal" },
@@ -1961,6 +2177,7 @@ DictEntry Dict031Contents[] = {
 { 0x2005, 0x0024, 0, VR::UL, VM::M1, "LUT2BeginColor" },
 { 0x2005, 0x0025, 0, VR::UL, VM::M1, "LUT2EndColor" },
 { 0x2005, 0x0026, 0, VR::CS, VM::M1, "ViewingHardcopyOnly" },
+{ 0x2005, 0x0027, 0, VR::CS, VM::M1, "" },
 { 0x2005, 0x0028, 0, VR::SL, VM::M1, "NumberOfLabelTypes" },
 { 0x2005, 0x0029, 0, VR::CS, VM::M1, "LabelType" },
 { 0x2005, 0x002a, 0, VR::CS, VM::M1, "ExamPrintStatus" },
@@ -2016,99 +2233,100 @@ DictEntry Dict031Contents[] = {
 { 0x2005, 0x005c, 0, VR::SQ, VM::M1, "ContrastBolusSequence" },
 { 0x2005, 0x005d, 0, VR::IS, VM::M1, "ContrastBolusID" },
 { 0x2005, 0x0060, 0, VR::CS, VM::M1, "LUTToRGBJobParams" },
-{ 0x2005, 0x0090, 0, VR::SQ, VM::M1, "" },
-{ 0x2005, 0x0091, 0, VR::SQ, VM::M1, "" },
-};
-
-unsigned short Dict031TagHashTable[] = {
-   93,    96,    99,   102,   105,   108,   111,   114,   117,   120,
-  123,   126,   129,   132,   135,   138,   141,   144,   147,   150,
-  153,   156,   159,   162,   165,   168,   171,   176,   181,   184,
-  187,   190,   193,   196,   199,   202,   205,   208,    92,    92,
-  211,   214,   219,   224,   229,   232,   235,   238,   241,    92,
-  244,   247,   250,    92,   253,   256,   259,   262,   265,   268,
-  271,   274,   277,   280,   283,   286,   289,   292,   295,   298,
-  301,   304,   307,   310,    92,   313,   316,   319,   322,   325,
-  328,   331,   334,   337,   340,   343,   346,   349,   352,   355,
-  358,   361,     0,     1,    44,    49,     1,    43,    48,     1,
-   46,    51,     1,    45,    50,     1,    56,    61,     1,    55,
-   60,     1,    58,    63,     1,    57,    62,     1,    52,    57,
-    1,    51,    56,     1,    54,    59,     1,    53,    58,     1,
-   63,    68,     1,    64,    69,     1,    65,    70,     1,    66,
-   71,     1,    59,    64,     1,    60,    65,     1,    61,    66,
-    1,    62,    67,     1,    71,    76,     1,    72,    77,     1,
-   73,    78,     1,    74,    79,     1,    67,    72,     1,    68,
-   73,     2,    69,    74,    91,   145,     2,    70,    75,    90,
-  144,     1,    79,    84,     1,    80,    85,     1,    81,    86,
-    1,    82,    87,     1,    75,    80,     1,    76,    81,     1,
-   77,    82,     1,    78,    83,     1,    87,    92,     1,    88,
-   93,     1,    83,    88,     2,     4,     4,    84,    89,     2,
-    6,     7,    85,    90,     2,     5,     6,    86,    91,     1,
-    1,     1,     1,     0,     0,     1,     3,     3,     1,     2,
-    2,     1,    89,    96,     1,    11,    15,     1,    10,    14,
-    1,     7,     9,     1,     9,    11,     1,     8,    10,     1,
-   17,    21,     1,    16,    20,     1,    19,    23,     1,    18,
-   22,     1,    13,    17,     1,    12,    16,     1,    15,    19,
-    1,    14,    18,     1,    25,    29,     1,    24,    28,     1,
-   27,    31,     1,    26,    30,     1,    21,    25,     1,    20,
-   24,     1,    23,    27,     1,    22,    26,     1,    33,    37,
-    1,    32,    36,     1,    34,    38,     1,    29,    33,     1,
-   28,    32,     1,    31,    35,     1,    30,    34,     1,    40,
-   45,     1,    39,    44,     1,    42,    47,     1,    41,    46,
-    1,    36,    41,     1,    35,    40,     1,    38,    43,     1,
-   37,    42,     1,    48,    53,     1,    47,    52,     1,    50,
-   55,     1,    49,    54,
-};
-
-unsigned short Dict031KeyHashTable[] = {
-   93,    96,   101,   104,    92,   111,   118,    92,   123,    92,
-  126,   129,    92,    92,   132,    92,    92,   135,   140,    92,
-  143,   150,    92,   153,   156,    92,    92,    92,   159,    92,
-  162,   165,    92,    92,   172,   175,    92,   180,   183,   186,
-  191,   194,   197,    92,   200,   203,    92,    92,   218,   221,
-   92,   226,   233,   236,   239,   246,   249,   254,   259,   262,
-  265,   270,    92,   273,    92,   278,   283,    92,    92,    92,
-   92,    92,   288,   291,   298,   301,    92,    92,   304,    92,
-  307,   312,    92,   315,    92,    92,    92,   322,    92,   325,
-  328,   331,     0,     1,    61, 41279,     2,    29, 28072,    53,
- 2878,     1,    76, 60453,     3,     9, 60562,    36, 47375,    71,
-40754,     3,    12, 48304,    18,  1772,    62, 14490,     2,    26,
-63509,    34, 24595,     1,    32, 42342,     1,    44, 40933,     1,
-   83, 38936,     1,    49,  9197,     2,    24, 48093,    25, 60266,
-    1,    86, 42955,     3,    10,  2705,    16, 49366,    85, 59479,
-    1,    46, 55341,     1,     0, 15605,     1,    27,  1000,     1,
-   84, 28779,     1,     2, 13242,     3,    50, 53081,    59, 33018,
-   79, 24852,     1,    60, 19308,     2,    17, 36739,    30, 10964,
-    1,    64, 31503,     1,     6, 44793,     2,    13, 58710,    41,
-30985,     1,    80,  9187,     1,    87, 49886,     1,    56, 11573,
-    1,    43, 48005,     7,     4,    58,     5,    58,    51,    58,
-   52,    58,    66, 51469,    90,    58,    91,    58,     1,    14,
- 8463,     2,    67,  7181,    88, 52683,     3,     7, 23123,    57,
-46998,    89,  7887,     1,    81, 41346,     1,    55, 45860,     3,
-   38, 48040,    45, 55808,    48, 15851,     1,    11, 33867,     2,
-   22, 13146,    65, 38636,     2,    37, 43614,    47, 46042,     1,
-   33, 36934,     1,    19, 50678,     2,    35, 39161,    70, 39719,
-    1,    23, 29599,     2,    21, 52635,    63,  6319,     2,    20,
-54691,    68, 52538,     2,    39, 22404,    72, 60153,     1,    77,
-41459,     3,    42, 18351,    58, 25982,    69, 34723,     1,    54,
-44621,     1,    40,  6419,     1,    75, 32069,     2,     8,  8309,
-   15, 17738,     1,    74, 58413,     3,     1, 51458,     3, 53363,
-   73, 50349,     1,    28, 36138,     1,    31, 33168,     1,    82,
- 2734,     1,    78, 14568,
+{ 0x2005, 0x0090, 0, VR::SQ, VM::M1, "OriginalVOILUTSequence" },
+{ 0x2005, 0x0091, 0, VR::SQ, VM::M1, "OriginalModalityLUTSequence" },
+};
+
+const unsigned short Dict032TagHashTable[] = {
+   94,    97,   100,   103,   106,   109,   112,   115,   118,   121,
+  124,   127,   130,   133,   136,   139,   142,   145,   148,   151,
+  154,   157,   160,   163,   166,   169,   172,   175,   178,   181,
+  184,   189,   194,   197,   200,   203,   206,   209,   212,   215,
+   93,    93,   218,   221,   224,   229,   234,   237,   240,   243,
+  246,    93,    93,   251,   254,   257,    93,   260,   263,   266,
+  269,   272,   275,   278,   281,   284,   287,   290,   293,   296,
+  299,   302,   305,   308,   311,   314,   317,   320,   323,   326,
+  329,   332,   335,   338,   341,   344,   347,   350,   353,   356,
+  359,   362,   365,     0,     1,    51,    55,     1,    50,    54,
+    1,    45,    49,     1,    44,    48,     1,    47,    51,     1,
+   46,    50,     1,    57,    61,     1,    56,    60,     1,    59,
+   63,     1,    58,    62,     1,    53,    57,     1,    52,    56,
+    1,    55,    59,     1,    54,    58,     1,    64,    68,     1,
+   65,    69,     1,    66,    70,     1,    67,    71,     1,    60,
+   64,     1,    61,    65,     1,    62,    66,     1,    63,    67,
+    1,    72,    76,     1,    73,    77,     1,    74,    78,     1,
+   75,    79,     1,    68,    72,     1,    69,    73,     1,    70,
+   74,     1,    71,    75,     2,    80,    84,    92,   145,     2,
+   81,    85,    91,   144,     1,    82,    86,     1,    83,    87,
+    1,    76,    80,     1,    77,    81,     1,    78,    82,     1,
+   79,    83,     1,    88,    92,     1,    89,    93,     1,    84,
+   88,     1,    85,    89,     2,     4,     4,    86,    90,     2,
+    6,     7,    87,    91,     1,     5,     6,     1,     1,     1,
+    1,     0,     0,     1,     3,     3,     2,     2,     2,    90,
+   96,     1,    11,    15,     1,    10,    14,     1,     7,     9,
+    1,     9,    11,     1,     8,    10,     1,    17,    21,     1,
+   16,    20,     1,    19,    23,     1,    18,    22,     1,    13,
+   17,     1,    12,    16,     1,    15,    19,     1,    14,    18,
+    1,    25,    29,     1,    24,    28,     1,    27,    31,     1,
+   26,    30,     1,    21,    25,     1,    20,    24,     1,    23,
+   27,     1,    22,    26,     1,    33,    37,     1,    32,    36,
+    1,    35,    39,     1,    34,    38,     1,    29,    33,     1,
+   28,    32,     1,    31,    35,     1,    30,    34,     1,    41,
+   45,     1,    40,    44,     1,    43,    47,     1,    42,    46,
+    1,    37,    41,     1,    36,    40,     1,    39,    43,     1,
+   38,    42,     1,    49,    53,     1,    48,    52,
+};
+
+const unsigned short Dict032KeyHashTable[] = {
+   94,    93,    99,   104,   107,   114,    93,   119,   122,    93,
+  125,   134,   137,   142,   147,   150,   153,    93,    93,    93,
+  156,   159,   162,   165,   170,   175,   178,    93,   181,   184,
+   93,   187,   190,    93,   193,   196,   201,   204,    93,   209,
+  214,   217,    93,   220,   223,   226,   231,   234,    93,   237,
+  242,   245,    93,   248,    93,    93,    93,    93,   255,    93,
+  258,   261,   264,   269,   272,   275,    93,   282,   285,   288,
+  291,    93,    93,   296,    93,   301,   304,    93,   307,   312,
+  315,    93,    93,   326,    93,    93,   329,   332,    93,   335,
+   93,    93,   338,     0,     2,     7, 47539,    84, 23719,     2,
+   49, 22728,    72, 57933,     1,    66, 33993,     3,    24, 36301,
+   33, 33014,    38,  1569,     2,     0, 57014,     6, 21057,     1,
+   46,  8699,     1,    45, 33446,     4,    17, 61713,    27, 42566,
+   41, 16921,    71, 24494,     1,    89, 65506,     2,    25, 25793,
+   26, 17726,     2,    42, 48974,    43,  7584,     1,    77, 32320,
+    1,    69, 64658,     1,    87, 26990,     1,    65, 27641,     1,
+   18, 41920,     1,    80, 28813,     2,    60, 41824,    85, 52429,
+    2,    22, 24280,    54,  9189,     1,    64, 45714,     1,    63,
+48159,     1,    19, 14899,     1,    67, 59372,     1,    90, 38104,
+    1,    81, 21068,     1,    47,  6827,     2,    10, 65393,    56,
+31978,     1,    73, 42594,     2,    20, 13936,    59, 14428,     2,
+   51, 25732,    57, 46683,     1,    50, 58426,     1,    12, 18892,
+    1,    15, 39393,     1,    23, 53945,     2,    30, 10846,    34,
+31377,     1,    28, 51253,     1,    48, 11722,     2,     1, 60066,
+   36,  4915,     1,    68, 47271,     1,    44, 55945,     3,    11,
+49006,    76, 28201,    86, 34175,     1,    32, 58094,     1,     9,
+64843,     1,    83, 27369,     2,    40,  6660,    61, 59972,     1,
+   70, 42806,     1,    29, 55957,     3,    21, 40794,    39, 36953,
+   74, 56150,     1,    58,  9144,     1,    78, 43832,     1,    91,
+ 1285,     2,     8, 59662,    75, 35235,     2,    31,  4624,    82,
+34559,     1,     5, 23985,     1,    13, 58783,     2,     2, 42696,
+   37, 10221,     1,    16, 63633,     5,     4,    57,    35,    57,
+   52,    57,    53,    57,    55, 28638,     1,    79, 10888,     1,
+   92, 54585,     1,    62, 23217,     1,    14, 11895,     2,     3,
+ 5575,    88,  4249,
 };
 
-vtkDICOMDictionary::Dict Dict031Data = {
+vtkDICOMDictionary::Dict Dict032Data = {
 "Philips MR Imaging DD 005",
-92,
-92,
-Dict031TagHashTable,
-Dict031KeyHashTable,
-Dict031Contents
+93,
+93,
+Dict032TagHashTable,
+Dict032KeyHashTable,
+Dict032Contents
 };
 
 // ----- Philips MR Imaging DD 004 -----
 
-DictEntry Dict032Contents[] = {
+const DictEntry Dict033Contents[] = {
 { 0x2005, 0x0000, 0, VR::SS, VM::M1, "SpectrumExtraNumber" },
 { 0x2005, 0x0001, 0, VR::SS, VM::M1, "SpectrumKxCoordinate" },
 { 0x2005, 0x0002, 0, VR::SS, VM::M1, "SpectrumKyCoordinate" },
@@ -2204,7 +2422,7 @@ DictEntry Dict032Contents[] = {
 { 0x2005, 0x0099, 0, VR::CS, VM::M1, "IViewBoldEnabled" },
 };
 
-unsigned short Dict032TagHashTable[] = {
+const unsigned short Dict033TagHashTable[] = {
    94,    97,   100,   103,   106,    93,    93,    93,   109,   112,
   115,   120,   125,   128,   131,   136,   141,   144,   147,   150,
   153,   156,   159,   162,   165,   168,   171,   176,   181,   184,
@@ -2243,7 +2461,7 @@ unsigned short Dict032TagHashTable[] = {
    40,     1,    33,    53,     1,    32,    52,
 };
 
-unsigned short Dict032KeyHashTable[] = {
+const unsigned short Dict033KeyHashTable[] = {
    94,    97,    93,   100,   105,   108,   113,   120,   123,    93,
    93,   126,   129,   134,   137,    93,   142,   145,   148,   153,
   156,   159,    93,   164,   167,   172,   175,   178,   181,   184,
@@ -2281,18 +2499,18 @@ unsigned short Dict032KeyHashTable[] = {
     8, 15065,     1,    27, 47868,
 };
 
-vtkDICOMDictionary::Dict Dict032Data = {
+vtkDICOMDictionary::Dict Dict033Data = {
 "Philips MR Imaging DD 004",
 93,
 93,
-Dict032TagHashTable,
-Dict032KeyHashTable,
-Dict032Contents
+Dict033TagHashTable,
+Dict033KeyHashTable,
+Dict033Contents
 };
 
 // ----- dcm4che/archive -----
 
-DictEntry Dict033Contents[] = {
+const DictEntry Dict034Contents[] = {
 { 0x0043, 0x0010, 0, VR::OB, VM::M1, "PatientPk" },
 { 0x0043, 0x0011, 0, VR::OB, VM::M1, "StudyPk" },
 { 0x0043, 0x0012, 0, VR::OB, VM::M1, "SeriesPk" },
@@ -2304,55 +2522,55 @@ DictEntry Dict033Contents[] = {
 { 0x0043, 0x0030, 0, VR::UI, VM::M1, "Dcm4cheURIReferencedTransferSyntaxUID" },
 };
 
-unsigned short Dict033TagHashTable[] = {
+const unsigned short Dict034TagHashTable[] = {
    10,    13,    16,    19,     9,    22,    25,     9,    30,     0,
     1,     3,    19,     1,     0,    16,     1,     1,    17,     1,
     6,    22,     1,     4,    20,     2,     5,    21,     8,    48,
     2,     2,    18,     7,    32,
 };
 
-unsigned short Dict033KeyHashTable[] = {
+const unsigned short Dict034KeyHashTable[] = {
    10,     9,     9,    15,     9,    20,     9,    27,    30,     0,
     2,     5, 55426,     6,  1849,     2,     3, 42978,     7, 16085,
     3,     1, 64148,     2, 49206,     8, 36481,     1,     4, 23520,
     1,     0, 26693,
 };
 
-vtkDICOMDictionary::Dict Dict033Data = {
+vtkDICOMDictionary::Dict Dict034Data = {
 "dcm4che/archive",
 9,
 9,
-Dict033TagHashTable,
-Dict033KeyHashTable,
-Dict033Contents
+Dict034TagHashTable,
+Dict034KeyHashTable,
+Dict034Contents
 };
 
 // ----- AMI Annotations_02 -----
 
-DictEntry Dict034Contents[] = {
+const DictEntry Dict035Contents[] = {
 { 0x3101, 0x0020, 0, VR::SQ, VM::M1, "AnnotationSequence" },
 };
 
-unsigned short Dict034TagHashTable[] = {
+const unsigned short Dict035TagHashTable[] = {
     2,     0,     1,     0,    32,
 };
 
-unsigned short Dict034KeyHashTable[] = {
+const unsigned short Dict035KeyHashTable[] = {
     2,     0,     1,     0, 13593,
 };
 
-vtkDICOMDictionary::Dict Dict034Data = {
+vtkDICOMDictionary::Dict Dict035Data = {
 "AMI Annotations_02",
 1,
 1,
-Dict034TagHashTable,
-Dict034KeyHashTable,
-Dict034Contents
+Dict035TagHashTable,
+Dict035KeyHashTable,
+Dict035Contents
 };
 
 // ----- TERARECON AQUARIUS -----
 
-DictEntry Dict035Contents[] = {
+const DictEntry Dict036Contents[] = {
 { 0x0077, 0x0010, 0, VR::UI, VM::M1TN, "OriginalSeriesStudyUID" },
 { 0x0077, 0x0012, 0, VR::UI, VM::M1TN, "OriginalSOPUID" },
 { 0x0077, 0x0014, 0, VR::LO, VM::M1TN, "ReferencedVolumeID" },
@@ -2375,7 +2593,7 @@ DictEntry Dict035Contents[] = {
 { 0x0077, 0x0090, 0, VR::FL, VM::M1, "COFRefinementLevel" },
 };
 
-unsigned short Dict035TagHashTable[] = {
+const unsigned short Dict036TagHashTable[] = {
    21,    20,    28,    35,    38,    20,    43,    46,    49,    20,
    54,    20,    57,    20,    60,    63,    66,    20,    69,    72,
     0,     3,     1,    18,     7,    38,    16,   132,     3,     0,
@@ -2386,7 +2604,7 @@ unsigned short Dict035TagHashTable[] = {
     2,    20,     1,    12,    80,
 };
 
-unsigned short Dict035KeyHashTable[] = {
+const unsigned short Dict036KeyHashTable[] = {
    21,    24,    20,    20,    27,    30,    33,    20,    42,    47,
    20,    20,    52,    20,    57,    60,    20,    63,    66,    20,
     0,     1,    12, 49303,     1,    14, 27846,     1,    11, 55840,
@@ -2397,45 +2615,45 @@ unsigned short Dict035KeyHashTable[] = {
  3460,    17, 64960,
 };
 
-vtkDICOMDictionary::Dict Dict035Data = {
+vtkDICOMDictionary::Dict Dict036Data = {
 "TERARECON AQUARIUS",
 20,
 20,
-Dict035TagHashTable,
-Dict035KeyHashTable,
-Dict035Contents
+Dict036TagHashTable,
+Dict036KeyHashTable,
+Dict036Contents
 };
 
 // ----- TOSHIBA COMAPL OOG -----
 
-DictEntry Dict036Contents[] = {
+const DictEntry Dict037Contents[] = {
 { 0x0029, 0x0008, 0, VR::CS, VM::M1, "COMAPLOOGType" },
 { 0x0029, 0x0009, 0, VR::LO, VM::M1, "COMAPLOOGVersion" },
 { 0x0029, 0x0010, 0, VR::OB, VM::M1, "COMAPLOOGInfo" },
 };
 
-unsigned short Dict036TagHashTable[] = {
+const unsigned short Dict037TagHashTable[] = {
     4,     3,     9,     0,     2,     0,     8,     2,    16,     1,
     1,     9,
 };
 
-unsigned short Dict036KeyHashTable[] = {
+const unsigned short Dict037KeyHashTable[] = {
     4,     9,     3,     0,     2,     0, 15896,     1, 42148,     1,
     2, 11099,
 };
 
-vtkDICOMDictionary::Dict Dict036Data = {
+vtkDICOMDictionary::Dict Dict037Data = {
 "TOSHIBA COMAPL OOG",
 3,
 3,
-Dict036TagHashTable,
-Dict036KeyHashTable,
-Dict036Contents
+Dict037TagHashTable,
+Dict037KeyHashTable,
+Dict037Contents
 };
 
 // ----- SYNARC_1.0 -----
 
-DictEntry Dict037Contents[] = {
+const DictEntry Dict038Contents[] = {
 { 0x0099, 0x0001, 0, VR::OB, VM::M1, "" },
 { 0x0099, 0x0002, 0, VR::OB, VM::M1, "" },
 { 0x0099, 0x0003, 0, VR::LO, VM::M1, "" },
@@ -2443,28 +2661,28 @@ DictEntry Dict037Contents[] = {
 { 0x0099, 0x0005, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict037TagHashTable[] = {
+const unsigned short Dict038TagHashTable[] = {
     5,     5,     6,     9,    14,     0,     1,     2,     3,     2,
     1,     2,     4,     5,     2,     0,     1,     3,     4,
 };
 
-unsigned short Dict037KeyHashTable[] = {
+const unsigned short Dict038KeyHashTable[] = {
     5,     6,     5,     5,     5,     0,     5,     0,  1076,     1,
  1076,     2,  1076,     3,  1076,     4,  1076,
 };
 
-vtkDICOMDictionary::Dict Dict037Data = {
+vtkDICOMDictionary::Dict Dict038Data = {
 "SYNARC_1.0",
 5,
 5,
-Dict037TagHashTable,
-Dict037KeyHashTable,
-Dict037Contents
+Dict038TagHashTable,
+Dict038KeyHashTable,
+Dict038Contents
 };
 
 // ----- LORAD Selenia -----
 
-DictEntry Dict038Contents[] = {
+const DictEntry Dict039Contents[] = {
 { 0x0019, 0x0006, 0, VR::LO, VM::M1, "PaddleID" },
 { 0x0019, 0x0007, 0, VR::SH, VM::M1, "PaddlePosition" },
 { 0x0019, 0x0008, 0, VR::LO, VM::M1, "CollimationSize" },
@@ -2493,7 +2711,7 @@ DictEntry Dict038Contents[] = {
 { 0x0019, 0x0090, 0, VR::DS, VM::M1, "ConventionalTomoAngle" },
 };
 
-unsigned short Dict038TagHashTable[] = {
+const unsigned short Dict039TagHashTable[] = {
    27,    30,    26,    26,    33,    36,    26,    26,    26,    39,
    42,    47,    26,    26,    52,    55,    60,    65,    70,    73,
    76,    81,    84,    89,    26,    94,     0,     1,    22,   112,
@@ -2506,7 +2724,7 @@ unsigned short Dict038TagHashTable[] = {
     6,    40,    20,    83,     1,    24,   128,
 };
 
-unsigned short Dict038KeyHashTable[] = {
+const unsigned short Dict039KeyHashTable[] = {
    27,    26,    26,    26,    32,    35,    38,    45,    50,    26,
    53,    56,    61,    26,    66,    69,    74,    77,    26,    80,
    83,    86,    26,    26,    89,    92,     0,     2,     0,  3062,
@@ -2519,18 +2737,18 @@ unsigned short Dict038KeyHashTable[] = {
     7,  2416,     2,    20, 13643,    23, 34231,
 };
 
-vtkDICOMDictionary::Dict Dict038Data = {
+vtkDICOMDictionary::Dict Dict039Data = {
 "LORAD Selenia",
 26,
 26,
-Dict038TagHashTable,
-Dict038KeyHashTable,
-Dict038Contents
+Dict039TagHashTable,
+Dict039KeyHashTable,
+Dict039Contents
 };
 
 // ----- SIEMENS SYNGO LAYOUT PROTOCOL -----
 
-DictEntry Dict039Contents[] = {
+const DictEntry Dict040Contents[] = {
 { 0x0073, 0x0002, 0, VR::US, VM::M1, "HangingProtocolExcellenceRank" },
 { 0x0073, 0x0004, 0, VR::CS, VM::M1, "TemplateDataRoleID" },
 { 0x0073, 0x0006, 0, VR::CS, VM::M1, "DataSharingFlag" },
@@ -2639,7 +2857,7 @@ DictEntry Dict039Contents[] = {
 { 0x0073, 0x00FF, 0, VR::LO, VM::M1, "VRTPreset" },
 };
 
-unsigned short Dict039TagHashTable[] = {
+const unsigned short Dict040TagHashTable[] = {
   107,   112,   106,   115,   118,   121,   124,   127,   106,   130,
   133,   136,   139,   144,   147,   150,   153,   158,   161,   164,
   167,   170,   173,   176,   181,   184,   187,   190,   195,   198,
@@ -2682,7 +2900,7 @@ unsigned short Dict039TagHashTable[] = {
     7,    22,    74,   190,     1,     6,    20,     1,    64,   162,
 };
 
-unsigned short Dict039KeyHashTable[] = {
+const unsigned short Dict040KeyHashTable[] = {
   107,   106,   116,   119,   122,   129,   132,   106,   135,   140,
   106,   143,   150,   106,   155,   158,   106,   161,   106,   106,
   164,   167,   106,   106,   106,   106,   106,   106,   106,   170,
@@ -2724,18 +2942,18 @@ unsigned short Dict039KeyHashTable[] = {
    51, 31276,
 };
 
-vtkDICOMDictionary::Dict Dict039Data = {
+vtkDICOMDictionary::Dict Dict040Data = {
 "SIEMENS SYNGO LAYOUT PROTOCOL",
 106,
 106,
-Dict039TagHashTable,
-Dict039KeyHashTable,
-Dict039Contents
+Dict040TagHashTable,
+Dict040KeyHashTable,
+Dict040Contents
 };
 
 // ----- SIEMENS MR VA0  RAW -----
 
-DictEntry Dict040Contents[] = {
+const DictEntry Dict041Contents[] = {
 { 0x0021, 0x0000, 0, VR::CS, VM::M1, "SequenceType" },
 { 0x0021, 0x0001, 0, VR::IS, VM::M1, "VectorSizeOriginal" },
 { 0x0021, 0x0002, 0, VR::IS, VM::M1, "VectorSizeExtended" },
@@ -2768,7 +2986,7 @@ DictEntry Dict040Contents[] = {
 { 0x0021, 0x0055, 0, VR::DS, VM::M6, "SaturationDistance" },
 };
 
-unsigned short Dict040TagHashTable[] = {
+const unsigned short Dict041TagHashTable[] = {
    31,    34,    37,    40,    43,    46,    49,    52,    55,    58,
    61,    64,    30,    30,    30,    30,    67,    70,    73,    76,
    79,    82,    85,    90,    95,   100,   105,   110,    30,    30,
@@ -2783,7 +3001,7 @@ unsigned short Dict040TagHashTable[] = {
     2,    18,    24,    29,    85,
 };
 
-unsigned short Dict040KeyHashTable[] = {
+const unsigned short Dict041KeyHashTable[] = {
    31,    30,    38,    41,    46,    30,    30,    49,    56,    61,
    64,    67,    72,    75,    78,    30,    81,    84,    30,    87,
    90,    93,    30,    96,    30,    99,   102,   107,    30,    30,
@@ -2798,18 +3016,18 @@ unsigned short Dict040KeyHashTable[] = {
    24, 22965,
 };
 
-vtkDICOMDictionary::Dict Dict040Data = {
+vtkDICOMDictionary::Dict Dict041Data = {
 "SIEMENS MR VA0  RAW",
 30,
 30,
-Dict040TagHashTable,
-Dict040KeyHashTable,
-Dict040Contents
+Dict041TagHashTable,
+Dict041KeyHashTable,
+Dict041Contents
 };
 
 // ----- SIEMENS CM VA0  LAB -----
 
-DictEntry Dict041Contents[] = {
+const DictEntry Dict042Contents[] = {
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "GeneratorIdentificationLabel" },
 { 0x0009, 0x0011, 0, VR::LO, VM::M1, "GantryIdentificationLabel" },
 { 0x0009, 0x0012, 0, VR::LO, VM::M1, "XRayTubeIdentificationLabel" },
@@ -2820,91 +3038,124 @@ DictEntry Dict041Contents[] = {
 { 0x0009, 0x0020, 0, VR::SH, VM::M1, "HeaderVersion" },
 };
 
-unsigned short Dict041TagHashTable[] = {
+const unsigned short Dict042TagHashTable[] = {
     9,    12,    17,    20,    23,    26,     8,    29,     0,     1,
     1,    17,     2,     0,    16,     7,    32,     1,     3,    19,
     1,     2,    18,     1,     5,    21,     1,     4,    20,     1,
     6,    22,
 };
 
-unsigned short Dict041KeyHashTable[] = {
+const unsigned short Dict042KeyHashTable[] = {
     9,    12,     8,    15,    18,     8,    23,    26,     0,     1,
     5, 29799,     1,     3, 55069,     1,     2, 18716,     2,     1,
 54980,     7, 47602,     1,     0,   122,     2,     4, 60080,     6,
 33446,
 };
 
-vtkDICOMDictionary::Dict Dict041Data = {
+vtkDICOMDictionary::Dict Dict042Data = {
 "SIEMENS CM VA0  LAB",
 8,
 8,
-Dict041TagHashTable,
-Dict041KeyHashTable,
-Dict041Contents
+Dict042TagHashTable,
+Dict042KeyHashTable,
+Dict042Contents
+};
+
+// ----- CoActiv_PvtTags -----
+
+const DictEntry Dict043Contents[] = {
+{ 0x7501, 0x0001, 0, VR::LO, VM::M1, "" },
+{ 0x7501, 0x0002, 0, VR::LO, VM::M1, "" },
+{ 0x7501, 0x0003, 0, VR::UI, VM::M1, "" },
+{ 0x7501, 0x0004, 0, VR::LO, VM::M1, "" },
+};
+
+const unsigned short Dict043TagHashTable[] = {
+    5,     8,    11,    14,     0,     1,     0,     1,     1,     3,
+    4,     1,     2,     3,     1,     1,     2,
+};
+
+const unsigned short Dict043KeyHashTable[] = {
+    4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
+    2,  1345,     3,  1345,
+};
+
+vtkDICOMDictionary::Dict Dict043Data = {
+"CoActiv_PvtTags",
+4,
+4,
+Dict043TagHashTable,
+Dict043KeyHashTable,
+Dict043Contents
 };
 
 // ----- MDDX -----
 
-DictEntry Dict042Contents[] = {
+const DictEntry Dict044Contents[] = {
 { 0x0011, 0x0001, 0, VR::UT, VM::M1, "AESEncryptedValues" },
 { 0x0011, 0x0002, 0, VR::LO, VM::M1, "AllupVersionDetails" },
 { 0x0011, 0x0003, 0, VR::LO, VM::M1, "MaskID" },
+{ 0x7fe1, 0x0001, 0, VR::UT, VM::M1, "AESEncryptedValues" },
+{ 0x7fe1, 0x0002, 0, VR::LO, VM::M1, "AllupVersionDetails" },
+{ 0x7fe1, 0x0003, 0, VR::LO, VM::M1, "MaskID" },
 };
 
-unsigned short Dict042TagHashTable[] = {
-    4,     7,     3,     0,     1,     2,     3,     2,     0,     1,
-    1,     2,
+const unsigned short Dict044TagHashTable[] = {
+    7,    10,     6,     6,    15,    20,     0,     1,     2,     3,
+    2,     1,     2,     3,     1,     2,     0,     1,     4,     2,
+    1,     5,     3,
 };
 
-unsigned short Dict042KeyHashTable[] = {
-    4,     9,     3,     0,     2,     0, 22612,     1,  5893,     1,
-    2, 30591,
+const unsigned short Dict044KeyHashTable[] = {
+    7,     6,     6,    12,    17,     6,     0,     2,     0, 44074,
+    3, 44074,     2,     1,  2946,     4,  2946,     2,     2, 48063,
+    5, 48063,
 };
 
-vtkDICOMDictionary::Dict Dict042Data = {
+vtkDICOMDictionary::Dict Dict044Data = {
 "MDDX",
-3,
-3,
-Dict042TagHashTable,
-Dict042KeyHashTable,
-Dict042Contents
+6,
+6,
+Dict044TagHashTable,
+Dict044KeyHashTable,
+Dict044Contents
 };
 
 // ----- http://www.gemedicalsystems.com/it_solutions/orthoview/2.1 -----
 
-DictEntry Dict043Contents[] = {
-{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoView Session Date/Time" },
-{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoView Session Creator" },
-{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoView Session Completion Flag" },
-{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoView File Sequence" },
-{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoView File Name" },
-{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoView File Content" },
+const DictEntry Dict045Contents[] = {
+{ 0x3117, 0x0010, 0, VR::DT, VM::M1, "OrthoViewSessionDateTime" },
+{ 0x3117, 0x0020, 0, VR::PN, VM::M1, "OrthoViewSessionCreator" },
+{ 0x3117, 0x0030, 0, VR::CS, VM::M1, "OrthoViewSessionCompletionFlag" },
+{ 0x3117, 0x0040, 0, VR::SQ, VM::M1, "OrthoViewFileSequence" },
+{ 0x3117, 0x0050, 0, VR::ST, VM::M1, "OrthoViewFileName" },
+{ 0x3117, 0x0060, 0, VR::OB, VM::M1, "OrthoViewFileContent" },
 };
 
-unsigned short Dict043TagHashTable[] = {
+const unsigned short Dict045TagHashTable[] = {
     7,    10,    15,    20,     6,     6,     0,     1,     3,    64,
     2,     0,    16,     1,    32,     2,     4,    80,     5,    96,
     1,     2,    48,
 };
 
-unsigned short Dict043KeyHashTable[] = {
-    7,    10,    17,     6,     6,     6,     0,     1,     2, 35654,
-    3,     3, 12582,     4, 31362,     5, 57809,     2,     0, 32343,
-    1, 13269,
+const unsigned short Dict045KeyHashTable[] = {
+    7,    12,     6,    15,     6,    20,     0,     2,     1, 15840,
+    2,  7958,     1,     0, 19322,     2,     4, 12279,     5,  9030,
+    1,     3, 19440,
 };
 
-vtkDICOMDictionary::Dict Dict043Data = {
+vtkDICOMDictionary::Dict Dict045Data = {
 "http://www.gemedicalsystems.com/it_solutions/orthoview/2.1",
 6,
 6,
-Dict043TagHashTable,
-Dict043KeyHashTable,
-Dict043Contents
+Dict045TagHashTable,
+Dict045KeyHashTable,
+Dict045Contents
 };
 
 // ----- PHILIPS NM -Private -----
 
-DictEntry Dict044Contents[] = {
+const DictEntry Dict046Contents[] = {
 { 0x7051, 0x0000, 0, VR::US, VM::M1, "CurrentSegment" },
 { 0x7051, 0x0001, 0, VR::US, VM::M1, "NumberOfSegments" },
 { 0x7051, 0x0002, 0, VR::FL, VM::M1, "SegmentStartPosition" },
@@ -2924,7 +3175,7 @@ DictEntry Dict044Contents[] = {
 { 0x7051, 0x0029, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict044TagHashTable[] = {
+const unsigned short Dict046TagHashTable[] = {
    17,    17,    18,    21,    26,    31,    38,    43,    48,    55,
    17,    17,    17,    17,    17,    17,    17,     0,     1,     0,
     0,     2,     1,     1,     8,    16,     2,     2,     2,     9,
@@ -2933,7 +3184,7 @@ unsigned short Dict044TagHashTable[] = {
     6,    11,    21,    15,    40,     2,     7,     7,    16,    41,
 };
 
-unsigned short Dict044KeyHashTable[] = {
+const unsigned short Dict046KeyHashTable[] = {
    17,    18,    17,    23,    26,    29,    17,    32,    17,    35,
    46,    17,    49,    52,    55,    60,    17,     0,     2,     6,
 17152,    11, 42235,     1,     4, 49858,     1,     7, 40226,     1,
@@ -2943,42 +3194,42 @@ unsigned short Dict044KeyHashTable[] = {
     1,     8, 47239,
 };
 
-vtkDICOMDictionary::Dict Dict044Data = {
+vtkDICOMDictionary::Dict Dict046Data = {
 "PHILIPS NM -Private",
 17,
 17,
-Dict044TagHashTable,
-Dict044KeyHashTable,
-Dict044Contents
+Dict046TagHashTable,
+Dict046KeyHashTable,
+Dict046Contents
 };
 
 // ----- SIEMENS WH SR 1.0 -----
 
-DictEntry Dict045Contents[] = {
+const DictEntry Dict047Contents[] = {
 { 0x0071, 0x0001, 0, VR::LO, VM::M1, "" },
 { 0x0071, 0x0002, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict045TagHashTable[] = {
+const unsigned short Dict047TagHashTable[] = {
     3,     6,     0,     1,     1,     2,     1,     0,     1,
 };
 
-unsigned short Dict045KeyHashTable[] = {
+const unsigned short Dict047KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict045Data = {
+vtkDICOMDictionary::Dict Dict047Data = {
 "SIEMENS WH SR 1.0",
 2,
 2,
-Dict045TagHashTable,
-Dict045KeyHashTable,
-Dict045Contents
+Dict047TagHashTable,
+Dict047KeyHashTable,
+Dict047Contents
 };
 
 // ----- PMOD_1 -----
 
-DictEntry Dict046Contents[] = {
+const DictEntry Dict048Contents[] = {
 { 0x0055, 0x0001, 0, VR::FD, VM::M1TN, "FrameStartTimesVector" },
 { 0x0055, 0x0002, 0, VR::FD, VM::M3T3N, "FramePositionsVector" },
 { 0x0055, 0x0003, 0, VR::FD, VM::M6T6N, "FrameOrientationsVector" },
@@ -2986,28 +3237,28 @@ DictEntry Dict046Contents[] = {
 { 0x0055, 0x0005, 0, VR::FD, VM::M1TN, "FrameRescaleSlopeVector" },
 };
 
-unsigned short Dict046TagHashTable[] = {
+const unsigned short Dict048TagHashTable[] = {
     6,    11,    16,     5,     5,     0,     2,     0,     1,     3,
     4,     2,     1,     2,     4,     5,     1,     2,     3,
 };
 
-unsigned short Dict046KeyHashTable[] = {
+const unsigned short Dict048KeyHashTable[] = {
     5,     6,     5,    11,    16,     0,     2,     2, 11757,     3,
 64319,     2,     0, 60720,     4, 17754,     1,     1,  8603,
 };
 
-vtkDICOMDictionary::Dict Dict046Data = {
+vtkDICOMDictionary::Dict Dict048Data = {
 "PMOD_1",
 5,
 5,
-Dict046TagHashTable,
-Dict046KeyHashTable,
-Dict046Contents
+Dict048TagHashTable,
+Dict048KeyHashTable,
+Dict048Contents
 };
 
 // ----- QCA Results -----
 
-DictEntry Dict047Contents[] = {
+const DictEntry Dict049Contents[] = {
 { 0x0009, 0x0000, 0, VR::CS, VM::M1, "AnalysisType" },
 { 0x0009, 0x0004, 0, VR::LO, VM::M1, "SegmentName" },
 { 0x0009, 0x0012, 0, VR::DS, VM::M1, "PreProcedureCatheterSize" },
@@ -3026,7 +3277,7 @@ DictEntry Dict047Contents[] = {
 { 0x0009, 0x0028, 0, VR::DS, VM::M1, "PostProcedureGeometricAreaReductionPercentage" },
 };
 
-unsigned short Dict047TagHashTable[] = {
+const unsigned short Dict049TagHashTable[] = {
    16,    17,    16,    16,    16,    16,    16,    16,    16,    22,
    25,    30,    35,    40,    47,    52,     0,     2,     8,    24,
    15,    40,     1,     0,     0,     2,     3,    19,    10,    35,
@@ -3035,7 +3286,7 @@ unsigned short Dict047TagHashTable[] = {
    14,    39,     2,     6,    22,    13,    38,
 };
 
-unsigned short Dict047KeyHashTable[] = {
+const unsigned short Dict049KeyHashTable[] = {
    17,    16,    16,    16,    16,    16,    16,    20,    23,    26,
    29,    34,    41,    44,    47,    52,     0,     1,     2, 59650,
     1,    15,  2407,     1,     8, 40137,     1,     1, 56857,     2,
@@ -3044,18 +3295,18 @@ unsigned short Dict047KeyHashTable[] = {
    13, 18002,     3,     3, 40892,     6, 40912,     9,  9799,
 };
 
-vtkDICOMDictionary::Dict Dict047Data = {
+vtkDICOMDictionary::Dict Dict049Data = {
 "QCA Results",
 16,
 16,
-Dict047TagHashTable,
-Dict047KeyHashTable,
-Dict047Contents
+Dict049TagHashTable,
+Dict049KeyHashTable,
+Dict049Contents
 };
 
 // ----- SIEMENS MED MG -----
 
-DictEntry Dict048Contents[] = {
+const DictEntry Dict050Contents[] = {
 { 0x0029, 0x0010, 0, VR::US, VM::M1, "ListOfGroupNumbers" },
 { 0x0029, 0x0015, 0, VR::LO, VM::M1, "ListOfShadowOwnerCodes" },
 { 0x0029, 0x0020, 0, VR::US, VM::M1, "ListOfElementNumbers" },
@@ -3066,54 +3317,54 @@ DictEntry Dict048Contents[] = {
 { 0x0029, 0x0070, 0, VR::LO, VM::M1, "ListOfTextConcatenation" },
 };
 
-unsigned short Dict048TagHashTable[] = {
+const unsigned short Dict050TagHashTable[] = {
     9,    18,     8,     8,    25,     8,     8,     8,     0,     4,
     4,    64,     5,    80,     6,    96,     7,   112,     3,     0,
    16,     2,    32,     3,    48,     1,     1,    21,
 };
 
-unsigned short Dict048KeyHashTable[] = {
+const unsigned short Dict050KeyHashTable[] = {
     9,    12,    17,     8,    22,    25,     8,    28,     0,     1,
     6, 28194,     2,     5, 28059,     7,  2168,     2,     3, 16906,
     4, 43179,     1,     2, 50495,     1,     1,  4798,     1,     0,
 31019,
 };
 
-vtkDICOMDictionary::Dict Dict048Data = {
+vtkDICOMDictionary::Dict Dict050Data = {
 "SIEMENS MED MG",
 8,
 8,
-Dict048TagHashTable,
-Dict048KeyHashTable,
-Dict048Contents
+Dict050TagHashTable,
+Dict050KeyHashTable,
+Dict050Contents
 };
 
 // ----- GEMS_CTHD_01 -----
 
-DictEntry Dict049Contents[] = {
+const DictEntry Dict051Contents[] = {
 { 0x0033, 0x0002, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict049TagHashTable[] = {
+const unsigned short Dict051TagHashTable[] = {
     2,     0,     1,     0,     2,
 };
 
-unsigned short Dict049KeyHashTable[] = {
+const unsigned short Dict051KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict049Data = {
+vtkDICOMDictionary::Dict Dict051Data = {
 "GEMS_CTHD_01",
 1,
 1,
-Dict049TagHashTable,
-Dict049KeyHashTable,
-Dict049Contents
+Dict051TagHashTable,
+Dict051KeyHashTable,
+Dict051Contents
 };
 
 // ----- astm.org/diconde/iod/Component -----
 
-DictEntry Dict050Contents[] = {
+const DictEntry Dict052Contents[] = {
 { 0x0011, 0x0023, 0, VR::ST, VM::M1TN, "CADFileFormat" },
 { 0x0011, 0x0024, 0, VR::ST, VM::M1TN, "ComponentReferenceSystem" },
 { 0x0011, 0x0025, 0, VR::ST, VM::M1TN, "ComponentManufacturingProcedure" },
@@ -3131,7 +3382,7 @@ DictEntry Dict050Contents[] = {
 { 0x0011, 0x0056, 0, VR::DS, VM::M1, "InnerDiameter" },
 };
 
-unsigned short Dict050TagHashTable[] = {
+const unsigned short Dict052TagHashTable[] = {
    15,    15,    15,    16,    19,    22,    27,    30,    37,    42,
    45,    50,    53,    15,    15,     0,     1,     4,    48,     1,
    11,    80,     2,     0,    35,     5,    50,     1,    12,    82,
@@ -3140,7 +3391,7 @@ unsigned short Dict050TagHashTable[] = {
     1,    10,    70,     1,     3,    40,
 };
 
-unsigned short Dict050KeyHashTable[] = {
+const unsigned short Dict052KeyHashTable[] = {
    16,    25,    28,    33,    15,    15,    38,    15,    15,    15,
    41,    46,    15,    15,    51,     0,     4,     0, 28810,     3,
 30475,     5, 34019,     6, 35263,     1,     4, 48497,     2,    10,
@@ -3149,69 +3400,98 @@ unsigned short Dict050KeyHashTable[] = {
 39507,     1,     9, 58756,
 };
 
-vtkDICOMDictionary::Dict Dict050Data = {
+vtkDICOMDictionary::Dict Dict052Data = {
 "astm.org/diconde/iod/Component",
 15,
 15,
-Dict050TagHashTable,
-Dict050KeyHashTable,
-Dict050Contents
+Dict052TagHashTable,
+Dict052KeyHashTable,
+Dict052Contents
+};
+
+// ----- GEMS_IDI_01 -----
+
+const DictEntry Dict053Contents[] = {
+{ 0x0073, 0x0020, 0, VR::DS, VM::M1, "" },
+{ 0x0073, 0x0021, 0, VR::DS, VM::M1, "" },
+{ 0x0073, 0x0030, 0, VR::OW, VM::M1, "HeightMap" },
+{ 0x0073, 0x0040, 0, VR::DS, VM::M1, "" },
+{ 0x0073, 0x0050, 0, VR::DS, VM::M1TN, "" },
+};
+
+const unsigned short Dict053TagHashTable[] = {
+    6,     9,    14,    17,     5,     0,     1,     4,    80,     2,
+    2,    48,     3,    64,     1,     0,    32,     1,     1,    33,
+};
+
+const unsigned short Dict053KeyHashTable[] = {
+    5,     6,     5,     5,     5,     0,     5,     0,  1076,     1,
+ 1076,     2, 32383,     3,  1076,     4,  1076,
+};
+
+vtkDICOMDictionary::Dict Dict053Data = {
+"GEMS_IDI_01",
+5,
+5,
+Dict053TagHashTable,
+Dict053KeyHashTable,
+Dict053Contents
 };
 
 // ----- PMOD_GENPET -----
 
-DictEntry Dict051Contents[] = {
+const DictEntry Dict054Contents[] = {
 { 0x7fe1, 0x0001, 0, VR::UT, VM::M1, "SlicesNames" },
 { 0x7fe1, 0x0002, 0, VR::UT, VM::M1, "GeneCodes" },
 { 0x7fe1, 0x0003, 0, VR::UT, VM::M1, "GeneLabels" },
 };
 
-unsigned short Dict051TagHashTable[] = {
+const unsigned short Dict054TagHashTable[] = {
     3,     4,     9,     0,     2,     0,     1,     1,     2,     1,
     2,     3,
 };
 
-unsigned short Dict051KeyHashTable[] = {
+const unsigned short Dict054KeyHashTable[] = {
     4,     7,     3,     0,     1,     1, 21830,     2,     0, 47785,
     2, 42962,
 };
 
-vtkDICOMDictionary::Dict Dict051Data = {
+vtkDICOMDictionary::Dict Dict054Data = {
 "PMOD_GENPET",
 3,
 3,
-Dict051TagHashTable,
-Dict051KeyHashTable,
-Dict051Contents
+Dict054TagHashTable,
+Dict054KeyHashTable,
+Dict054Contents
 };
 
 // ----- SHS MagicView 300 -----
 
-DictEntry Dict052Contents[] = {
+const DictEntry Dict055Contents[] = {
 { 0x0029, 0x0002, 0, VR::FD, VM::M1, "" },
 { 0x0029, 0x0003, 0, VR::FD, VM::M1, "" },
 };
 
-unsigned short Dict052TagHashTable[] = {
+const unsigned short Dict055TagHashTable[] = {
     3,     6,     0,     1,     1,     3,     1,     0,     2,
 };
 
-unsigned short Dict052KeyHashTable[] = {
+const unsigned short Dict055KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict052Data = {
+vtkDICOMDictionary::Dict Dict055Data = {
 "SHS MagicView 300",
 2,
 2,
-Dict052TagHashTable,
-Dict052KeyHashTable,
-Dict052Contents
+Dict055TagHashTable,
+Dict055KeyHashTable,
+Dict055Contents
 };
 
 // ----- INTELERAD MEDICAL SYSTEMS INTELEVIEWER -----
 
-DictEntry Dict053Contents[] = {
+const DictEntry Dict056Contents[] = {
 { 0x0071, 0x0001, 0, VR::LO, VM::M1, "" },
 { 0x0071, 0x0002, 0, VR::LO, VM::M1, "" },
 { 0x0071, 0x0003, 0, VR::UN, VM::M1, "" },
@@ -3222,104 +3502,104 @@ DictEntry Dict053Contents[] = {
 { 0x0071, 0x000A, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict053TagHashTable[] = {
+const unsigned short Dict056TagHashTable[] = {
     8,     9,    12,    17,    20,    23,    26,    29,     0,     1,
     0,     1,     2,     1,     2,     7,    10,     1,     2,     3,
     1,     3,     4,     1,     4,     5,     1,     5,     6,     1,
     6,     7,
 };
 
-unsigned short Dict053KeyHashTable[] = {
+const unsigned short Dict056KeyHashTable[] = {
     8,     8,     8,     8,     8,     9,     8,     8,     0,     8,
     0,   672,     1,   672,     2,   672,     3,   672,     4,   672,
     5,   672,     6,   672,     7,   672,
 };
 
-vtkDICOMDictionary::Dict Dict053Data = {
+vtkDICOMDictionary::Dict Dict056Data = {
 "INTELERAD MEDICAL SYSTEMS INTELEVIEWER",
 8,
 8,
-Dict053TagHashTable,
-Dict053KeyHashTable,
-Dict053Contents
+Dict056TagHashTable,
+Dict056KeyHashTable,
+Dict056Contents
 };
 
 // ----- SIEMENS IKM CKS CXRCAD FINDINGS -----
 
-DictEntry Dict054Contents[] = {
+const DictEntry Dict057Contents[] = {
 { 0x0029, 0x0001, 0, VR::UT, VM::M1, "" },
 };
 
-unsigned short Dict054TagHashTable[] = {
+const unsigned short Dict057TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict054KeyHashTable[] = {
+const unsigned short Dict057KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict054Data = {
+vtkDICOMDictionary::Dict Dict057Data = {
 "SIEMENS IKM CKS CXRCAD FINDINGS",
 1,
 1,
-Dict054TagHashTable,
-Dict054KeyHashTable,
-Dict054Contents
+Dict057TagHashTable,
+Dict057KeyHashTable,
+Dict057Contents
 };
 
 // ----- SIEMENS NUMARIS II -----
 
-DictEntry Dict055Contents[] = {
+const DictEntry Dict058Contents[] = {
 { 0x7fe3, 0x0000, 0, VR::LO, VM::M1, "ImageGraphicsFormatCode" },
 { 0x7fe3, 0x0010, 0, VR::OB, VM::M1, "ImageGraphics" },
 { 0x7fe3, 0x0020, 0, VR::OB, VM::M1, "ImageGraphicsDummy" },
 };
 
-unsigned short Dict055TagHashTable[] = {
+const unsigned short Dict058TagHashTable[] = {
     4,     9,     3,     0,     2,     1,    16,     2,    32,     1,
     0,     0,
 };
 
-unsigned short Dict055KeyHashTable[] = {
+const unsigned short Dict058KeyHashTable[] = {
     4,     7,     3,     0,     1,     2, 53079,     2,     0, 55636,
     1, 54408,
 };
 
-vtkDICOMDictionary::Dict Dict055Data = {
+vtkDICOMDictionary::Dict Dict058Data = {
 "SIEMENS NUMARIS II",
 3,
 3,
-Dict055TagHashTable,
-Dict055KeyHashTable,
-Dict055Contents
+Dict058TagHashTable,
+Dict058KeyHashTable,
+Dict058Contents
 };
 
 // ----- REPORT_FROM_APP -----
 
-DictEntry Dict056Contents[] = {
+const DictEntry Dict059Contents[] = {
 { 0x0039, 0x0095, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict056TagHashTable[] = {
+const unsigned short Dict059TagHashTable[] = {
     2,     0,     1,     0,   149,
 };
 
-unsigned short Dict056KeyHashTable[] = {
+const unsigned short Dict059KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict056Data = {
+vtkDICOMDictionary::Dict Dict059Data = {
 "REPORT_FROM_APP",
 1,
 1,
-Dict056TagHashTable,
-Dict056KeyHashTable,
-Dict056Contents
+Dict059TagHashTable,
+Dict059KeyHashTable,
+Dict059Contents
 };
 
 // ----- KINETDX -----
 
-DictEntry Dict057Contents[] = {
+const DictEntry Dict060Contents[] = {
 { 0x0021, 0x00a5, 0, VR::US, VM::M1, "" },
 { 0x0021, 0x00a6, 0, VR::OB, VM::M1, "" },
 { 0x0021, 0x00a8, 0, VR::LO, VM::M1, "" },
@@ -3329,30 +3609,30 @@ DictEntry Dict057Contents[] = {
 { 0x0021, 0x00b4, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict057TagHashTable[] = {
+const unsigned short Dict060TagHashTable[] = {
     8,    11,     7,    14,    19,     7,    24,     0,     1,     1,
   166,     1,     0,   165,     2,     4,   171,     5,   172,     2,
     3,   170,     6,   180,     1,     2,   168,
 };
 
-unsigned short Dict057KeyHashTable[] = {
+const unsigned short Dict060KeyHashTable[] = {
     7,     7,     7,     7,     7,     8,     7,     0,     7,     0,
   768,     1,   768,     2,   768,     3,   768,     4,   768,     5,
   768,     6,   768,
 };
 
-vtkDICOMDictionary::Dict Dict057Data = {
+vtkDICOMDictionary::Dict Dict060Data = {
 "KINETDX",
 7,
 7,
-Dict057TagHashTable,
-Dict057KeyHashTable,
-Dict057Contents
+Dict060TagHashTable,
+Dict060KeyHashTable,
+Dict060Contents
 };
 
 // ----- SIEMENS SYNGO WORKFLOW -----
 
-DictEntry Dict058Contents[] = {
+const DictEntry Dict061Contents[] = {
 { 0x0031, 0x0010, 0, VR::UI, VM::M1, "InternalPatientUID" },
 { 0x0031, 0x0011, 0, VR::SH, VM::M1, "PatientsDeathIndicator" },
 { 0x0031, 0x0012, 0, VR::DA, VM::M1, "PatientsDeathDate" },
@@ -3391,7 +3671,7 @@ DictEntry Dict058Contents[] = {
 { 0x0031, 0x0083, 0, VR::SQ, VM::M1, "InstitutionCodeSequence" },
 };
 
-unsigned short Dict058TagHashTable[] = {
+const unsigned short Dict061TagHashTable[] = {
    37,    42,    47,    50,    53,    56,    61,    64,    69,    74,
    36,    36,    36,    36,    36,    36,    36,    77,    36,    36,
    80,    36,    36,    36,    83,    86,    89,    92,    95,    98,
@@ -3408,7 +3688,7 @@ unsigned short Dict058TagHashTable[] = {
    18,    27,    91,
 };
 
-unsigned short Dict058KeyHashTable[] = {
+const unsigned short Dict061KeyHashTable[] = {
    37,    40,    36,    45,    36,    48,    36,    55,    60,    63,
    36,    66,    69,    36,    36,    36,    72,    75,    36,    78,
    81,    86,    91,    36,    94,    99,   102,    36,   109,    36,
@@ -3425,33 +3705,39 @@ unsigned short Dict058KeyHashTable[] = {
     1,    35, 44232,
 };
 
-vtkDICOMDictionary::Dict Dict058Data = {
+vtkDICOMDictionary::Dict Dict061Data = {
 "SIEMENS SYNGO WORKFLOW",
 36,
 36,
-Dict058TagHashTable,
-Dict058KeyHashTable,
-Dict058Contents
+Dict061TagHashTable,
+Dict061KeyHashTable,
+Dict061Contents
 };
 
 // ----- INTELERAD MEDICAL SYSTEMS -----
 
-DictEntry Dict059Contents[] = {
-{ 0x0029, 0x0010, 0, VR::CS, VM::M1, "" },
-{ 0x0029, 0x0011, 0, VR::US, VM::M1, "" },
-{ 0x0029, 0x0012, 0, VR::US, VM::M1, "" },
-{ 0x0029, 0x0013, 0, VR::US, VM::M1, "" },
-{ 0x0029, 0x0015, 0, VR::DS, VM::M1, "" },
+const DictEntry Dict062Contents[] = {
+{ 0x0029, 0x0001, 0, VR::FD, VM::M1, "ImageCompressionFraction" },
+{ 0x0029, 0x0002, 0, VR::FD, VM::M1, "ImageQuality" },
+{ 0x0029, 0x0003, 0, VR::FD, VM::M1, "ImageBytesTransferred" },
+{ 0x0029, 0x0010, 0, VR::CS, VM::M1, "J2cParameterType" },
+{ 0x0029, 0x0011, 0, VR::US, VM::M1, "J2cPixelRepresentation" },
+{ 0x0029, 0x0012, 0, VR::US, VM::M1, "J2cBitsAllocated" },
+{ 0x0029, 0x0013, 0, VR::US, VM::M1, "J2cPixelShiftValue" },
+{ 0x0029, 0x0014, 0, VR::US, VM::M1, "J2cPlanarConfiguration" },
+{ 0x0029, 0x0015, 0, VR::DS, VM::M1, "J2cRescaleIntercept" },
 { 0x0029, 0x0016, 0, VR::US, VM::M1, "" },
 { 0x0029, 0x0017, 0, VR::US, VM::M1, "" },
-{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "MD5Sum" },
+{ 0x0029, 0x0020, 0, VR::LO, VM::M1, "PixelDataMD5SumPerFrame" },
 { 0x0029, 0x0021, 0, VR::US, VM::M1, "" },
 { 0x0029, 0x0022, 0, VR::US, VM::M1, "" },
-{ 0x3F01, 0x0001, 0, VR::LO, VM::M1, "" },
-{ 0x3F01, 0x0003, 0, VR::AE, VM::M1, "" },
-{ 0x3F01, 0x0004, 0, VR::LO, VM::M1, "" },
-{ 0x3F01, 0x0005, 0, VR::AE, VM::M1, "" },
-{ 0x3F01, 0x0007, 0, VR::LO, VM::M1, "" },
+{ 0x3F01, 0x0001, 0, VR::LO, VM::M1, "InstitutionCode" },
+{ 0x3F01, 0x0002, 0, VR::AE, VM::M1, "RoutedTransferAE" },
+{ 0x3F01, 0x0003, 0, VR::AE, VM::M1, "SourcedAE" },
+{ 0x3F01, 0x0004, 0, VR::SH, VM::M1, "DeferredValidation" },
+{ 0x3F01, 0x0005, 0, VR::LO, VM::M1, "SeriesOwner" },
+{ 0x3F01, 0x0007, 0, VR::SH, VM::M1, "StrippedPixelData" },
+{ 0x3F01, 0x0008, 0, VR::SH, VM::M1, "PendingMoveRequest" },
 { 0x3F01, 0x0009, 0, VR::LO, VM::M1, "" },
 { 0x3F01, 0x000A, 0, VR::DA, VM::M1, "" },
 { 0x3F01, 0x000B, 0, VR::TM, VM::M1, "" },
@@ -3461,109 +3747,151 @@ DictEntry Dict059Contents[] = {
 { 0x3F03, 0x0004, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict059TagHashTable[] = {
-   22,    22,    22,    22,    23,    22,    26,    29,    32,    37,
-   42,    45,    50,    57,    62,    69,    72,    22,    75,    78,
-   22,    22,     0,     1,    15,     9,     1,    17,    11,     1,
-   16,    10,     2,     8,    33,    13,     5,     2,     7,    32,
-   12,     4,     1,    14,     7,     2,     9,    34,    21,     4,
-    3,     1,    17,    10,     1,    20,     3,     2,     0,    16,
-   19,     2,     3,     3,    19,    11,     3,    18,     1,     1,
-    2,    18,     1,     4,    21,     1,     6,    23,     1,     5,
-   22,
+const unsigned short Dict062TagHashTable[] = {
+   29,    36,    41,    48,    53,    56,    59,    62,    65,    68,
+   28,    71,    74,    28,    77,    80,    28,    28,    28,    28,
+   83,    86,    89,    92,    95,    98,   101,   104,     0,     3,
+    4,    17,    14,     1,    26,     3,     2,     3,    16,    25,
+    2,     3,     6,    19,    16,     3,    24,     1,     2,     5,
+   18,    15,     2,     1,     8,    21,     1,     7,    20,     1,
+   10,    23,     1,     9,    22,     1,    12,    33,     1,    11,
+   32,     1,    13,    34,     1,     0,     1,     1,     2,     3,
+    1,     1,     2,     1,    21,     9,     1,    20,     8,     1,
+   23,    11,     1,    22,    10,     1,    18,     5,     1,    17,
+    4,     1,    19,     7,     1,    27,     4,
+};
+
+const unsigned short Dict062KeyHashTable[] = {
+   28,    29,    32,    35,    38,    41,    66,    69,    28,    74,
+   77,    28,    28,    28,    28,    28,    80,    28,    28,    83,
+   28,    86,    28,    89,    92,    95,    98,    28,     0,     1,
+    1,  4956,     1,    14, 20478,     1,    18, 24242,     1,    19,
+44398,    12,     8, 53317,     9,   192,    10,   192,    12,   192,
+   13,   192,    21,   192,    22,   192,    23,   192,    24,   192,
+   25,   192,    26,   192,    27,   192,     1,    11, 37862,     2,
+    2, 18574,     3,  4512,     1,     6, 48802,     1,    20, 21816,
+    1,     0, 28368,     1,     5, 38941,     1,     4, 62031,     1,
+   15, 31693,     1,    16, 16142,     1,    17,  3178,     1,     7,
+ 7296,
+};
+
+vtkDICOMDictionary::Dict Dict062Data = {
+"INTELERAD MEDICAL SYSTEMS",
+28,
+28,
+Dict062TagHashTable,
+Dict062KeyHashTable,
+Dict062Contents
 };
 
-unsigned short Dict059KeyHashTable[] = {
-   22,    22,    22,    22,    22,    22,    23,    22,    22,    22,
-   22,    22,    22,    26,    22,    22,    22,    22,    22,    22,
-   22,    22,     0,     1,     7, 63303,    21,     0,   244,     1,
-  244,     2,   244,     3,   244,     4,   244,     5,   244,     6,
-  244,     8,   244,     9,   244,    10,   244,    11,   244,    12,
-  244,    13,   244,    14,   244,    15,   244,    16,   244,    17,
-  244,    18,   244,    19,   244,    20,   244,    21,   244,
+// ----- DVMInsight Receiver Tracking -----
+
+const DictEntry Dict063Contents[] = {
+{ 0x5AB3, 0x0000, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0002, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0004, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0006, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0008, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0010, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0012, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0014, 0, VR::LO, VM::M1, "" },
+{ 0x5AB3, 0x0016, 0, VR::LO, VM::M1, "" },
 };
 
-vtkDICOMDictionary::Dict Dict059Data = {
-"INTELERAD MEDICAL SYSTEMS",
-22,
-22,
-Dict059TagHashTable,
-Dict059KeyHashTable,
-Dict059Contents
+const unsigned short Dict063TagHashTable[] = {
+   10,     9,    15,     9,    20,    23,    26,    29,     9,     0,
+    2,     2,     4,     6,    18,     2,     3,     6,     7,    20,
+    1,     8,    22,     1,     0,     0,     1,     4,     8,     2,
+    1,     2,     5,    16,
+};
+
+const unsigned short Dict063KeyHashTable[] = {
+    9,     9,     9,     9,     9,     9,     9,     9,    10,     0,
+    9,     0,   597,     1,   597,     2,   597,     3,   597,     4,
+  597,     5,   597,     6,   597,     7,   597,     8,   597,
+};
+
+vtkDICOMDictionary::Dict Dict063Data = {
+"DVMInsight Receiver Tracking",
+9,
+9,
+Dict063TagHashTable,
+Dict063KeyHashTable,
+Dict063Contents
 };
 
 // ----- SIEMENS SYNGO FUNCTION ASSIGNMENT -----
 
-DictEntry Dict060Contents[] = {
+const DictEntry Dict064Contents[] = {
 { 0x0029, 0x0001, 0, VR::LO, VM::M1, "DataReference" },
 };
 
-unsigned short Dict060TagHashTable[] = {
+const unsigned short Dict064TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict060KeyHashTable[] = {
+const unsigned short Dict064KeyHashTable[] = {
     2,     0,     1,     0, 62574,
 };
 
-vtkDICOMDictionary::Dict Dict060Data = {
+vtkDICOMDictionary::Dict Dict064Data = {
 "SIEMENS SYNGO FUNCTION ASSIGNMENT",
 1,
 1,
-Dict060TagHashTable,
-Dict060KeyHashTable,
-Dict060Contents
+Dict064TagHashTable,
+Dict064KeyHashTable,
+Dict064Contents
 };
 
 // ----- FFP DATA -----
 
-DictEntry Dict061Contents[] = {
+const DictEntry Dict065Contents[] = {
 { 0x0009, 0x0001, 0, VR::UN, VM::M1, "CRHeaderInformation" },
 };
 
-unsigned short Dict061TagHashTable[] = {
+const unsigned short Dict065TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict061KeyHashTable[] = {
+const unsigned short Dict065KeyHashTable[] = {
     2,     0,     1,     0, 60169,
 };
 
-vtkDICOMDictionary::Dict Dict061Data = {
+vtkDICOMDictionary::Dict Dict065Data = {
 "FFP DATA",
 1,
 1,
-Dict061TagHashTable,
-Dict061KeyHashTable,
-Dict061Contents
+Dict065TagHashTable,
+Dict065KeyHashTable,
+Dict065Contents
 };
 
 // ----- astm.org/diconde/iod/ComponentStudy -----
 
-DictEntry Dict062Contents[] = {
+const DictEntry Dict066Contents[] = {
 { 0x0009, 0x0020, 0, VR::DA, VM::M1, "ExpiryDate" },
 };
 
-unsigned short Dict062TagHashTable[] = {
+const unsigned short Dict066TagHashTable[] = {
     2,     0,     1,     0,    32,
 };
 
-unsigned short Dict062KeyHashTable[] = {
+const unsigned short Dict066KeyHashTable[] = {
     2,     0,     1,     0, 42404,
 };
 
-vtkDICOMDictionary::Dict Dict062Data = {
+vtkDICOMDictionary::Dict Dict066Data = {
 "astm.org/diconde/iod/ComponentStudy",
 1,
 1,
-Dict062TagHashTable,
-Dict062KeyHashTable,
-Dict062Contents
+Dict066TagHashTable,
+Dict066KeyHashTable,
+Dict066Contents
 };
 
 // ----- SIEMENS SYNGO INDEX SERVICE -----
 
-DictEntry Dict063Contents[] = {
+const DictEntry Dict067Contents[] = {
 { 0x0009, 0x0020, 0, VR::DA, VM::M1, "ObjectInsertionDate" },
 { 0x0009, 0x0030, 0, VR::SQ, VM::M1, "InstanceObjectStates" },
 { 0x0009, 0x0031, 0, VR::SQ, VM::M1, "SeriesObjectStates" },
@@ -3581,7 +3909,7 @@ DictEntry Dict063Contents[] = {
 { 0x0009, 0x00A0, 0, VR::LO, VM::M1, "SenderSystemDeviceName" },
 };
 
-unsigned short Dict063TagHashTable[] = {
+const unsigned short Dict067TagHashTable[] = {
    16,    19,    22,    25,    28,    33,    36,    15,    15,    15,
    15,    39,    44,    49,    54,     0,     1,     6,    67,     1,
     7,    68,     1,     8,    69,     1,     9,    70,     2,    10,
@@ -3590,7 +3918,7 @@ unsigned short Dict063TagHashTable[] = {
     4,    65,    13,    80,     1,     5,    66,
 };
 
-unsigned short Dict063KeyHashTable[] = {
+const unsigned short Dict067KeyHashTable[] = {
    16,    19,    15,    22,    25,    30,    15,    33,    40,    43,
    15,    15,    48,    51,    54,     0,     1,     4, 16890,     1,
     6, 23062,     1,     7, 18517,     2,     3, 42506,    12, 15723,
@@ -3599,96 +3927,96 @@ unsigned short Dict063KeyHashTable[] = {
 56295,     1,     8, 35058,     1,     9, 63221,
 };
 
-vtkDICOMDictionary::Dict Dict063Data = {
+vtkDICOMDictionary::Dict Dict067Data = {
 "SIEMENS SYNGO INDEX SERVICE",
 15,
 15,
-Dict063TagHashTable,
-Dict063KeyHashTable,
-Dict063Contents
+Dict067TagHashTable,
+Dict067KeyHashTable,
+Dict067Contents
 };
 
 // ----- http://www.gemedicalsystems.com/it_solutions/rad_pacs/ -----
 
-DictEntry Dict064Contents[] = {
-{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "Reference to pacs study" },
-{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "Reference to pacs image" },
-{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "Pacs examnotes flag" },
+const DictEntry Dict068Contents[] = {
+{ 0x3115, 0x0001, 0, VR::UT, VM::M1, "ReferenceToPacsStudy" },
+{ 0x3115, 0x0002, 0, VR::UT, VM::M1, "ReferenceToPacsImage" },
+{ 0x3115, 0x0003, 0, VR::CS, VM::M1, "PacsExamnotesFlag" },
 };
 
-unsigned short Dict064TagHashTable[] = {
+const unsigned short Dict068TagHashTable[] = {
     3,     4,     7,     0,     1,     2,     3,     2,     0,     1,
     1,     2,
 };
 
-unsigned short Dict064KeyHashTable[] = {
-    4,     7,     3,     0,     1,     0, 11293,     2,     1, 30368,
-    2, 33011,
+const unsigned short Dict068KeyHashTable[] = {
+    4,     3,     7,     0,     1,     1,  9387,     2,     0, 55847,
+    2,  3144,
 };
 
-vtkDICOMDictionary::Dict Dict064Data = {
+vtkDICOMDictionary::Dict Dict068Data = {
 "http://www.gemedicalsystems.com/it_solutions/rad_pacs/",
 3,
 3,
-Dict064TagHashTable,
-Dict064KeyHashTable,
-Dict064Contents
+Dict068TagHashTable,
+Dict068KeyHashTable,
+Dict068Contents
 };
 
 // ----- SIEMENS CT APPL TMP DATAMODEL -----
 
-DictEntry Dict065Contents[] = {
+const DictEntry Dict069Contents[] = {
 { 0x0029, 0x0000, 0, VR::OB, VM::M1, "CTTaskCommonDataModel" },
 };
 
-unsigned short Dict065TagHashTable[] = {
+const unsigned short Dict069TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict065KeyHashTable[] = {
+const unsigned short Dict069KeyHashTable[] = {
     2,     0,     1,     0, 20131,
 };
 
-vtkDICOMDictionary::Dict Dict065Data = {
+vtkDICOMDictionary::Dict Dict069Data = {
 "SIEMENS CT APPL TMP DATAMODEL",
 1,
 1,
-Dict065TagHashTable,
-Dict065KeyHashTable,
-Dict065Contents
+Dict069TagHashTable,
+Dict069KeyHashTable,
+Dict069Contents
 };
 
 // ----- CTP -----
 
-DictEntry Dict066Contents[] = {
+const DictEntry Dict070Contents[] = {
 { 0x0013, 0x0010, 0, VR::LO, VM::M1, "ProjectName" },
 { 0x0013, 0x0011, 0, VR::LO, VM::M1, "TrialName" },
 { 0x0013, 0x0012, 0, VR::LO, VM::M1, "SiteName" },
 { 0x0013, 0x0013, 0, VR::LO, VM::M1, "SiteID" },
 };
 
-unsigned short Dict066TagHashTable[] = {
+const unsigned short Dict070TagHashTable[] = {
     5,     8,    11,    14,     0,     1,     3,    19,     1,     2,
    18,     1,     1,    17,     1,     0,    16,
 };
 
-unsigned short Dict066KeyHashTable[] = {
+const unsigned short Dict070KeyHashTable[] = {
     4,     5,     8,    11,     0,     1,     0, 39615,     1,     1,
  8344,     2,     2, 12198,     3,  9289,
 };
 
-vtkDICOMDictionary::Dict Dict066Data = {
+vtkDICOMDictionary::Dict Dict070Data = {
 "CTP",
 4,
 4,
-Dict066TagHashTable,
-Dict066KeyHashTable,
-Dict066Contents
+Dict070TagHashTable,
+Dict070KeyHashTable,
+Dict070Contents
 };
 
 // ----- PixelMed Publishing -----
 
-DictEntry Dict067Contents[] = {
+const DictEntry Dict071Contents[] = {
 { 0x0011, 0x0002, 0, VR::UC, VM::M1, "StrainDescription" },
 { 0x0011, 0x0003, 0, VR::LO, VM::M1, "StrainNomenclature" },
 { 0x0011, 0x0004, 0, VR::LO, VM::M1, "StrainStockNumber" },
@@ -3713,7 +4041,7 @@ DictEntry Dict067Contents[] = {
 { 0x7FE1, 0x0002, 0, VR::OD, VM::M1, "DoublePixelData" },
 };
 
-unsigned short Dict067TagHashTable[] = {
+const unsigned short Dict071TagHashTable[] = {
    23,    28,    33,    36,    22,    39,    22,    22,    22,    42,
    45,    52,    55,    58,    22,    22,    22,    22,    63,    66,
    69,    74,     0,     2,     5,     7,    10,    82,     2,     4,
@@ -3725,7 +4053,7 @@ unsigned short Dict067TagHashTable[] = {
     1,
 };
 
-unsigned short Dict067KeyHashTable[] = {
+const unsigned short Dict071KeyHashTable[] = {
    22,    22,    22,    22,    23,    26,    31,    36,    22,    22,
    41,    22,    44,    22,    47,    22,    50,    57,    66,    69,
    72,    77,     0,     1,    21,  7700,     2,     9, 47329,    19,
@@ -3736,116 +4064,116 @@ unsigned short Dict067KeyHashTable[] = {
    20, 18182,     2,     0, 44345,    18,   716,     1,    16,  7011,
 };
 
-vtkDICOMDictionary::Dict Dict067Data = {
+vtkDICOMDictionary::Dict Dict071Data = {
 "PixelMed Publishing",
 22,
 22,
-Dict067TagHashTable,
-Dict067KeyHashTable,
-Dict067Contents
+Dict071TagHashTable,
+Dict071KeyHashTable,
+Dict071Contents
 };
 
 // ----- POLYTRON-SMS 2.5 -----
 
-DictEntry Dict068Contents[] = {
+const DictEntry Dict072Contents[] = {
 { 0x0009, 0x0002, 0, VR::OB, VM::M1, "" },
 { 0x0009, 0x0004, 0, VR::OB, VM::M1, "" },
 { 0x0009, 0x0006, 0, VR::OB, VM::M1, "" },
 { 0x0089, 0x0010, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict068TagHashTable[] = {
+const unsigned short Dict072TagHashTable[] = {
     4,     5,     4,     8,     0,     1,     1,     4,     3,     0,
     2,     2,     6,     3,    16,
 };
 
-unsigned short Dict068KeyHashTable[] = {
+const unsigned short Dict072KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict068Data = {
+vtkDICOMDictionary::Dict Dict072Data = {
 "POLYTRON-SMS 2.5",
 4,
 4,
-Dict068TagHashTable,
-Dict068KeyHashTable,
-Dict068Contents
+Dict072TagHashTable,
+Dict072KeyHashTable,
+Dict072Contents
 };
 
 // ----- Philips Imaging DD 129 -----
 
-DictEntry Dict069Contents[] = {
-{ 0x2001, 0x0000, 0, VR::SQ, VM::M1, "" },
+const DictEntry Dict073Contents[] = {
+{ 0x2001, 0x0000, 0, VR::SQ, VM::M1, "PresentationStateSequence" },
 { 0x2001, 0x0001, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict069TagHashTable[] = {
+const unsigned short Dict073TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict069KeyHashTable[] = {
-    2,     3,     0,     2,     0,  2690,     1,  2690,
+const unsigned short Dict073KeyHashTable[] = {
+    2,     3,     0,     2,     0, 11901,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict069Data = {
+vtkDICOMDictionary::Dict Dict073Data = {
 "Philips Imaging DD 129",
 2,
 2,
-Dict069TagHashTable,
-Dict069KeyHashTable,
-Dict069Contents
+Dict073TagHashTable,
+Dict073KeyHashTable,
+Dict073Contents
 };
 
 // ----- Philips Imaging DD 124 -----
 
-DictEntry Dict070Contents[] = {
+const DictEntry Dict074Contents[] = {
 { 0x1001, 0x0003, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict070TagHashTable[] = {
+const unsigned short Dict074TagHashTable[] = {
     2,     0,     1,     0,     3,
 };
 
-unsigned short Dict070KeyHashTable[] = {
+const unsigned short Dict074KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict070Data = {
+vtkDICOMDictionary::Dict Dict074Data = {
 "Philips Imaging DD 124",
 1,
 1,
-Dict070TagHashTable,
-Dict070KeyHashTable,
-Dict070Contents
+Dict074TagHashTable,
+Dict074KeyHashTable,
+Dict074Contents
 };
 
 // ----- PMS-THORA-5.1 -----
 
-DictEntry Dict071Contents[] = {
+const DictEntry Dict075Contents[] = {
 { 0x0089, 0x0020, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict071TagHashTable[] = {
+const unsigned short Dict075TagHashTable[] = {
     2,     0,     1,     0,    32,
 };
 
-unsigned short Dict071KeyHashTable[] = {
+const unsigned short Dict075KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict071Data = {
+vtkDICOMDictionary::Dict Dict075Data = {
 "PMS-THORA-5.1",
 1,
 1,
-Dict071TagHashTable,
-Dict071KeyHashTable,
-Dict071Contents
+Dict075TagHashTable,
+Dict075KeyHashTable,
+Dict075Contents
 };
 
 // ----- SIEMENS MED SMS USG S2000 -----
 
-DictEntry Dict072Contents[] = {
+const DictEntry Dict076Contents[] = {
 { 0x0019, 0x0000, 0, VR::SH, VM::M1, "PrivateCreatorVersion" },
 { 0x0019, 0x0003, 0, VR::FD, VM::M1, "FrameRate" },
 { 0x0019, 0x000C, 0, VR::US, VM::M1, "BurnedInGraphics" },
@@ -3899,7 +4227,7 @@ DictEntry Dict072Contents[] = {
 { 0x0019, 0x0095, 0, VR::US, VM::M1, "" },
 };
 
-unsigned short Dict072TagHashTable[] = {
+const unsigned short Dict076TagHashTable[] = {
    52,    57,    62,    65,    68,    75,    78,    81,    84,    87,
    90,    93,    98,    51,   103,    51,    51,    51,   106,   109,
   112,   117,    51,   122,   127,   130,   137,    51,    51,   140,
@@ -3922,7 +4250,7 @@ unsigned short Dict072TagHashTable[] = {
   131,
 };
 
-unsigned short Dict072KeyHashTable[] = {
+const unsigned short Dict076KeyHashTable[] = {
    51,    51,    51,    51,    52,    55,    51,    58,    63,    51,
    68,    73,    78,    81,    84,    89,    51,    92,    97,    51,
   102,   105,   108,    51,    51,   113,   116,    51,    51,   137,
@@ -3944,41 +4272,41 @@ unsigned short Dict072KeyHashTable[] = {
    32, 40330,
 };
 
-vtkDICOMDictionary::Dict Dict072Data = {
+vtkDICOMDictionary::Dict Dict076Data = {
 "SIEMENS MED SMS USG S2000",
 51,
 51,
-Dict072TagHashTable,
-Dict072KeyHashTable,
-Dict072Contents
+Dict076TagHashTable,
+Dict076KeyHashTable,
+Dict076Contents
 };
 
 // ----- SIEMENS MED OCS SS VERSION INFO -----
 
-DictEntry Dict073Contents[] = {
+const DictEntry Dict077Contents[] = {
 { 0x0039, 0x0076, 0, VR::LO, VM::M1, "StructureSetPredecessor" },
 };
 
-unsigned short Dict073TagHashTable[] = {
+const unsigned short Dict077TagHashTable[] = {
     2,     0,     1,     0,   118,
 };
 
-unsigned short Dict073KeyHashTable[] = {
+const unsigned short Dict077KeyHashTable[] = {
     2,     0,     1,     0, 27329,
 };
 
-vtkDICOMDictionary::Dict Dict073Data = {
+vtkDICOMDictionary::Dict Dict077Data = {
 "SIEMENS MED OCS SS VERSION INFO",
 1,
 1,
-Dict073TagHashTable,
-Dict073KeyHashTable,
-Dict073Contents
+Dict077TagHashTable,
+Dict077KeyHashTable,
+Dict077Contents
 };
 
 // ----- ELSCINT1 -----
 
-DictEntry Dict074Contents[] = {
+const DictEntry Dict078Contents[] = {
 { 0x0003, 0x0001, 0, VR::OW, VM::M1, "OffsetListStructure" },
 { 0x00E1, 0x0001, 0, VR::US, VM::M1, "DataDictionaryVersion" },
 { 0x00E1, 0x0005, 0, VR::IS, VM::M1, "" },
@@ -4140,21 +4468,33 @@ DictEntry Dict074Contents[] = {
 { 0x07A1, 0x003D, 0, VR::US, VM::M1, "" },
 { 0x07A1, 0x0040, 0, VR::CS, VM::M1, "" },
 { 0x07A1, 0x0043, 0, VR::IS, VM::M1, "" },
+{ 0x07A1, 0x0045, 0, VR::LT, VM::M1, "" },
 { 0x07A1, 0x0047, 0, VR::CS, VM::M1, "" },
+{ 0x07A1, 0x004A, 0, VR::SH, VM::M1, "" },
 { 0x07A1, 0x0050, 0, VR::US, VM::M1, "" },
 { 0x07A1, 0x0056, 0, VR::US, VM::M1, "" },
+{ 0x07A1, 0x0058, 0, VR::CS, VM::M1, "" },
+{ 0x07A1, 0x005D, 0, VR::DT, VM::M1, "" },
+{ 0x07A1, 0x005F, 0, VR::CS, VM::M1, "" },
 { 0x07A1, 0x0070, 0, VR::SH, VM::M1, "" },
 { 0x07A1, 0x0071, 0, VR::SH, VM::M1, "" },
 { 0x07A1, 0x0075, 0, VR::LO, VM::M2, "" },
+{ 0x07A1, 0x0076, 0, VR::ST, VM::M1, "" },
 { 0x07A1, 0x0085, 0, VR::UL, VM::M1, "" },
 { 0x07A1, 0x0087, 0, VR::LT, VM::M1, "" },
 { 0x07A1, 0x0088, 0, VR::CS, VM::M1, "" },
+{ 0x07A1, 0x008C, 0, VR::ST, VM::M1, "" },
+{ 0x07A1, 0x0094, 0, VR::ST, VM::M1, "" },
+{ 0x07A1, 0x0096, 0, VR::DA, VM::M1, "" },
+{ 0x07A1, 0x0097, 0, VR::SH, VM::M1, "" },
 { 0x07A1, 0x0098, 0, VR::CS, VM::M1, "" },
 { 0x07A1, 0x009F, 0, VR::CS, VM::M1, "" },
+{ 0x07A1, 0x00D0, 0, VR::LO, VM::M1, "" },
 { 0x07A3, 0x0001, 0, VR::LO, VM::M1, "" },
 { 0x07A3, 0x0003, 0, VR::CS, VM::M1, "" },
 { 0x07A3, 0x0005, 0, VR::CS, VM::M1, "" },
 { 0x07A3, 0x0006, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x0009, 0, VR::IS, VM::M1, "" },
 { 0x07A3, 0x0013, 0, VR::SH, VM::M1, "" },
 { 0x07A3, 0x0014, 0, VR::ST, VM::M1, "" },
 { 0x07A3, 0x0015, 0, VR::ST, VM::M1, "" },
@@ -4173,13 +4513,34 @@ DictEntry Dict074Contents[] = {
 { 0x07A3, 0x0065, 0, VR::CS, VM::M1, "" },
 { 0x07A3, 0x0066, 0, VR::IS, VM::M1, "" },
 { 0x07A3, 0x0080, 0, VR::SQ, VM::M1, "" },
+{ 0x07A3, 0x0092, 0, VR::DS, VM::M1, "" },
+{ 0x07A3, 0x0093, 0, VR::DS, VM::M1, "" },
 { 0x07A3, 0x0099, 0, VR::CS, VM::M1, "" },
 { 0x07A3, 0x009C, 0, VR::CS, VM::M1, "" },
 { 0x07A3, 0x009F, 0, VR::CS, VM::M1, "" },
 { 0x07A3, 0x00B9, 0, VR::CS, VM::M1, "" },
 { 0x07A3, 0x00BB, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00C0, 0, VR::SQ, VM::M1, "" },
+{ 0x07A3, 0x00C1, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00C2, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00C3, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00C4, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00C5, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00C8, 0, VR::AE, VM::M1, "" },
+{ 0x07A3, 0x00C9, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00CB, 0, VR::SQ, VM::M1, "" },
+{ 0x07A3, 0x00CC, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00E3, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00F2, 0, VR::CS, VM::M1, "" },
+{ 0x07A3, 0x00F5, 0, VR::LO, VM::M1, "" },
+{ 0x07A3, 0x00FA, 0, VR::DT, VM::M1, "" },
+{ 0x07A3, 0x00FB, 0, VR::DT, VM::M1, "" },
 { 0x07A5, 0x0000, 0, VR::LO, VM::M1, "" },
+{ 0x07A5, 0x0054, 0, VR::DT, VM::M1, "" },
 { 0x07A5, 0x0056, 0, VR::CS, VM::M1, "" },
+{ 0x07A5, 0x0059, 0, VR::IS, VM::M1, "" },
+{ 0x07A5, 0x0062, 0, VR::LO, VM::M1, "" },
+{ 0x07A5, 0x0069, 0, VR::LO, VM::M1, "" },
 { 0x5001, 0x0070, 0, VR::SQ, VM::M1, "" },
 { 0x5001, 0x0071, 0, VR::SH, VM::M1, "" },
 { 0x5001, 0x0080, 0, VR::SQ, VM::M1, "" },
@@ -4189,168 +4550,215 @@ DictEntry Dict074Contents[] = {
 { 0x5001, 0x0084, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict074TagHashTable[] = {
-  209,   208,   212,   217,   220,   223,   226,   229,   208,   208,
-  232,   235,   238,   241,   208,   208,   248,   251,   254,   257,
-  262,   267,   208,   272,   208,   277,   280,   283,   286,   289,
-  292,   208,   295,   302,   208,   307,   310,   313,   318,   323,
-  208,   208,   326,   208,   208,   208,   329,   334,   337,   342,
-  345,   352,   208,   355,   358,   361,   366,   369,   208,   376,
-  379,   382,   385,   208,   390,   397,   402,   405,   410,   415,
-  422,   427,   432,   435,   438,   441,   444,   449,   452,   457,
-  462,   465,   468,   473,   478,   481,   486,   495,   504,   509,
-  514,   521,   526,   531,   534,   543,   208,   208,   208,   548,
-  208,   551,   554,   557,   560,   565,   208,   568,   573,   576,
-  579,   208,   208,   208,   208,   208,   208,   208,   208,   208,
-  582,   585,   208,   588,   208,   208,   591,   594,   597,   602,
-  607,   612,   617,   208,   620,   625,   628,   635,   642,   208,
-  208,   645,   648,   651,   208,   208,   208,   208,   208,   208,
-  208,   208,   654,   659,   208,   208,   662,   208,   665,   208,
-  668,   673,   676,   681,   208,   686,   689,   208,   208,   692,
-  208,   208,   208,   695,   698,   701,   208,   704,   707,   712,
-  715,   718,   208,   208,   723,   728,   731,   208,   208,   208,
-  736,   739,   742,   747,   208,   752,   208,   208,   755,   758,
-  208,   208,   208,   208,   208,   208,   208,   208,     0,     1,
-   14,    50,     2,     0,     1,    12,    48,     1,    13,    49,
-    1,    78,    83,     1,    15,    55,     1,    43,    65,     1,
-   42,    64,     1,    36,   235,     1,    16,    57,     1,    17,
-   62,     3,    18,    63,    37,   236,   121,    92,     1,    71,
-   71,     1,    70,    70,     1,    69,    69,     2,     1,     1,
-   68,    68,     2,     3,     6,    67,    67,     2,     4,     7,
-   66,    66,     2,     2,     5,    65,    64,     1,    77,    78,
-    1,    76,    77,     1,    75,    76,     1,    74,    75,     1,
-   73,    74,     1,    72,    73,     3,    40,    38,    61,    54,
-  119,    48,     2,    62,    55,   120,    49,     1,    33,   194,
-    1,    59,    50,     2,    34,   196,    60,    51,     2,     5,
-   20,    58,    48,     1,    39,    33,     1,     6,    24,     2,
-   35,   207,    63,    56,     1,    64,    57,     2,    55,    38,
-   93,    36,     1,    56,    39,     3,    41,    52,   108,    34,
-  158,    61,     1,   109,    35,     1,   110,    37,     1,   111,
-   38,     2,    92,    35,   112,    39,     1,   113,    40,     3,
-  114,    41,   157,    54,   184,    52,     1,   115,    43,     1,
-  116,    44,     1,   117,    45,     2,    57,    40,   118,    46,
-    3,    32,   160,    86,    20,    94,    16,     2,    87,    21,
-   95,    17,     1,    88,    22,     2,    89,    23,    96,    19,
-    2,    97,    20,   156,    43,     3,    83,    17,    98,    21,
-  155,    42,     2,    84,    18,    99,    22,     2,    85,    19,
-  100,    23,     1,   101,    24,     1,   102,    25,     1,   103,
-   26,     1,   104,    27,     2,    90,    24,   105,    28,     1,
-   91,    25,     2,   106,    30,   183,    35,     2,   107,    31,
-  182,    34,     1,    82,     4,     1,    49,     7,     2,    47,
-    4,   181,    31,     2,    48,     5,   154,    28,     1,    45,
-    2,     2,    46,     3,    79,     1,     4,    80,     2,   130,
-    8,   153,    25,   180,    27,     4,    44,     1,    81,     3,
-  131,     9,   152,    24,     2,    54,    14,   178,    21,     2,
-  151,    22,   177,    20,     3,    52,    12,   128,     4,   179,
-   23,     2,    53,    13,   129,     5,     2,    51,    10,   150,
-   19,     1,   149,    18,     4,    38,    24,    50,     8,   148,
-   17,   176,    19,     2,   127,     1,   147,    16,     1,   146,
-   12,     1,   145,    10,     1,   144,     9,     1,   143,     8,
-    2,   142,     7,   174,     5,     1,   132,     0,     2,   175,
-    6,   199,     0,     1,   172,     1,     1,   141,     2,     1,
-  173,     3,     1,   136,    49,     1,   135,    48,     1,   166,
-  117,     1,   164,   112,     1,   165,   113,     2,    28,    99,
-  206,   131,     2,    27,    98,   205,   130,     2,    26,    97,
-  204,   129,     2,    25,    96,   203,   128,     1,   198,   187,
-    2,    29,   101,   197,   185,     1,   207,   132,     3,    31,
-  107,   134,    33,   190,   100,     3,    30,   106,   133,    32,
-  191,   101,     1,   192,   102,     1,   187,    97,     1,   188,
-   98,     1,   189,    99,     2,   137,    80,   163,    86,     1,
-  186,    85,     1,   200,    86,     1,   162,    80,     2,    22,
-   67,   196,   159,     1,    21,    66,     2,    20,    65,   171,
-  159,     2,    19,    64,   195,   156,     1,   170,   152,     1,
-  194,   153,     1,   161,    71,     1,   160,    67,     1,   159,
-   64,     1,   185,    67,     1,   122,   112,     2,    24,    81,
-  123,   115,     1,    23,    80,     1,   125,   117,     2,   124,
-  116,   169,   136,     2,   138,   112,   167,   133,     1,   139,
-  113,     2,   140,   114,   168,   135,     1,   126,   127,     1,
-  193,   128,     2,     8,    34,   201,   112,     2,     9,    35,
-  202,   113,     1,     7,    33,     1,    10,    36,     1,    11,
-   37,
-};
-
-unsigned short Dict074KeyHashTable[] = {
-  208,   208,   208,   208,   209,   208,   208,   208,   212,   208,
-  208,   208,   208,   208,   208,   208,   208,   208,   208,   208,
-  208,   208,   208,   208,   208,   208,   208,   208,   208,   208,
-  215,   208,   220,   208,   223,   208,   208,   208,   208,   208,
-  226,   208,   208,   208,   208,   208,   208,   208,   229,   208,
-  208,   208,   232,   208,   208,   208,   208,   208,   208,   208,
-  235,   208,   208,   208,   208,   208,   208,   208,   238,   208,
-  208,   208,   208,   241,   208,   208,   244,   208,   208,   208,
-  208,   208,   249,   208,   252,   208,   208,   208,   208,   208,
-  208,   255,   208,   208,   208,   208,   258,   208,   261,   208,
-  208,   208,   264,   267,   208,   208,   208,   208,   208,   208,
-  270,   208,   208,   208,   208,   208,   208,   208,   208,   208,
-  273,   208,   208,   208,   208,   276,   208,   208,   208,   208,
-  208,   208,   208,   208,   208,   208,   208,   208,   279,   208,
-  208,   208,   208,   208,   208,   282,   208,   208,   285,   208,
-  208,   208,   208,   208,   208,   208,   208,   208,   208,   208,
-  208,   208,   208,   208,   208,   288,   208,   208,   208,   291,
-  208,   208,   208,   208,   208,   294,   208,   297,   208,   208,
-  208,   300,   208,   208,   208,   208,   208,   641,   644,   647,
-  650,   208,   653,   208,   208,   208,   208,   208,   208,   208,
-  208,   656,   208,   208,   208,   208,   659,   208,     0,     1,
-   45, 28650,     1,    26, 56733,     2,     8, 16578,   127, 50619,
-    1,    50,  5267,     1,    57, 57159,     1,    19, 44316,     1,
-   44, 27022,     1,     9,  4060,     1,    49, 60926,     1,    23,
-33441,     1,   128, 10891,     2,    52, 35680,    53, 17207,     1,
-  134, 58701,     1,    56, 61829,     1,     1, 40198,     1,   138,
-12521,     1,   139, 14762,     1,    59, 18434,     1,    46, 22081,
-    1,   133, 14121,     1,    51, 23763,     1,    48, 10768,     1,
-   47, 52584,     1,   132, 57458,     1,    60, 61093,     1,   137,
-60632,     1,     7, 11800,     1,    15, 53654,     1,   129, 63551,
-  170,     2,    25,     3,    25,     4,    25,     5,    25,     6,
-   25,    10,    25,    11,    25,    12,    25,    13,    25,    14,
-   25,    16,    25,    17,    25,    18,    25,    20,    25,    21,
-   25,    22,    25,    24,    25,    25,    25,    27,    25,    29,
-   25,    30,    25,    31,    25,    32,    25,    33,    25,    34,
-   25,    35,    25,    36,    25,    37,    25,    38,    25,    39,
-   25,    41,    25,    42,    25,    43,    25,    54,    25,    58,
-   25,    61,    25,    62,    25,    63,    25,    64,    25,    65,
-   25,    66,    25,    67,    25,    68,    25,    69,    25,    70,
-   25,    71,    25,    72,    25,    73,    25,    74,    25,    75,
-   25,    76,    25,    77,    25,    78,    25,    79,    25,    80,
-   25,    81,    25,    82,    25,    83,    25,    84,    25,    85,
-   25,    86,    25,    87,    25,    88,    25,    89,    25,    90,
-   25,    91,    25,    92,    25,    93,    25,    94,    25,    95,
-   25,    96,    25,    97,    25,    98,    25,    99,    25,   100,
-   25,   101,    25,   102,    25,   103,    25,   104,    25,   105,
-   25,   106,    25,   107,    25,   108,    25,   109,    25,   110,
-   25,   111,    25,   112,    25,   113,    25,   114,    25,   115,
-   25,   116,    25,   117,    25,   118,    25,   119,    25,   120,
-   25,   121,    25,   122,    25,   123,    25,   124,    25,   125,
-   25,   126,    25,   130,    25,   131,    25,   141,    25,   142,
-   25,   143,    25,   144,    25,   145,    25,   146,    25,   147,
-   25,   148,    25,   149,    25,   150,    25,   151,    25,   152,
-   25,   153,    25,   154,    25,   155,    25,   156,    25,   157,
-   25,   158,    25,   159,    25,   160,    25,   161,    25,   162,
-   25,   163,    25,   164,    25,   165,    25,   166,    25,   167,
-   25,   168,    25,   169,    25,   170,    25,   171,    25,   172,
-   25,   173,    25,   174,    25,   175,    25,   176,    25,   177,
-   25,   178,    25,   179,    25,   180,    25,   181,    25,   182,
-   25,   183,    25,   184,    25,   185,    25,   186,    25,   187,
-   25,   188,    25,   189,    25,   190,    25,   191,    25,   192,
-   25,   193,    25,   194,    25,   195,    25,   196,    25,   197,
-   25,   198,    25,   199,    25,   200,    25,   201,    25,   202,
-   25,   203,    25,   204,    25,   205,    25,   206,    25,   207,
-   25,     1,   135,  3010,     1,   136, 23976,     1,    55,  5738,
-    1,    28, 29418,     1,   140, 13622,     1,     0, 10589,     1,
-   40, 25955,
+const unsigned short Dict078TagHashTable[] = {
+  242,   245,   254,   259,   264,   269,   276,   279,   282,   285,
+  290,   297,   300,   305,   312,   315,   318,   321,   324,   327,
+  332,   337,   344,   349,   352,   357,   362,   367,   370,   375,
+  378,   383,   386,   389,   394,   397,   400,   403,   408,   413,
+  241,   241,   241,   416,   419,   422,   425,   430,   433,   241,
+  241,   438,   443,   446,   449,   241,   241,   241,   452,   455,
+  241,   241,   241,   241,   458,   241,   241,   463,   241,   241,
+  466,   469,   241,   241,   241,   472,   241,   241,   241,   241,
+  475,   480,   483,   241,   241,   486,   489,   492,   241,   495,
+  241,   498,   241,   241,   503,   241,   506,   509,   241,   241,
+  512,   241,   515,   241,   241,   241,   241,   241,   520,   523,
+  241,   526,   241,   529,   241,   532,   241,   537,   540,   543,
+  241,   241,   241,   241,   241,   241,   241,   241,   546,   549,
+  552,   557,   241,   241,   562,   241,   565,   568,   241,   573,
+  576,   241,   579,   582,   585,   588,   591,   596,   603,   608,
+  611,   241,   241,   241,   614,   241,   241,   617,   620,   241,
+  623,   626,   631,   636,   241,   241,   241,   241,   641,   241,
+  241,   241,   241,   644,   647,   241,   241,   241,   650,   653,
+  658,   661,   666,   241,   241,   241,   241,   241,   669,   241,
+  241,   672,   675,   680,   685,   690,   697,   241,   702,   709,
+  712,   715,   718,   723,   728,   733,   241,   738,   745,   752,
+  755,   758,   763,   766,   773,   241,   241,   241,   241,   776,
+  781,   784,   789,   794,   801,   806,   811,   814,   819,   826,
+  833,   840,   847,   241,   852,   855,   860,   863,   241,   868,
+  873,     0,     1,    88,    22,     4,    89,    23,    96,    19,
+  157,    54,   196,    52,     2,     0,     1,    97,    20,     2,
+   83,    17,    98,    21,     2,    84,    18,    99,    22,     3,
+    5,    20,    85,    19,   100,    23,     1,   101,    24,     1,
+  102,    25,     1,   103,    26,     2,     6,    24,   104,    27,
+    3,    36,   235,    90,    24,   105,    28,     1,    91,    25,
+    2,   106,    30,   156,    43,     3,    37,   236,   107,    31,
+  155,    42,     1,    82,     4,     1,    49,     7,     1,    47,
+    4,     1,    48,     5,     1,    45,     2,     2,    46,     3,
+   79,     1,     2,    80,     2,   130,     8,     3,    44,     1,
+   81,     3,   131,     9,     2,    54,    14,   195,    35,     1,
+  194,    34,     2,    52,    12,   128,     4,     2,    53,    13,
+  129,     5,     2,    51,    10,   193,    31,     1,   154,    28,
+    2,    38,    24,    50,     8,     1,   127,     1,     2,   153,
+   25,   192,    27,     1,   152,    24,     1,   190,    21,     2,
+  151,    22,   189,    20,     1,   191,    23,     1,    33,   194,
+    1,   150,    19,     2,    34,   196,   149,    18,     2,   148,
+   17,   188,    19,     1,   147,    16,     1,   146,    12,     1,
+  187,     9,     1,   145,    10,     2,    35,   207,   144,     9,
+    1,   143,     8,     2,   142,     7,   185,     5,     2,   186,
+    6,   228,     0,     1,   183,     1,     1,   141,     2,     1,
+  184,     3,     1,   234,   112,     1,   235,   113,     2,    32,
+  160,   172,   118,     1,   171,   117,     1,   169,   112,     1,
+  170,   113,     1,   233,   105,     2,   202,   100,   232,    98,
+    1,   203,   101,     1,   204,   102,     1,   199,    97,     1,
+  200,    98,     1,   201,    99,     1,   168,    95,     2,   167,
+   93,   231,    89,     1,   166,    88,     1,   165,    86,     1,
+  198,    85,     1,   230,    86,     2,   164,    80,   229,    84,
+    1,   163,    74,     1,   212,   187,     1,   211,   185,     1,
+  162,    71,     2,   132,     0,   161,    69,     1,   160,    67,
+    1,   159,    64,     1,   197,    67,     1,    28,    99,     1,
+   27,    98,     2,    26,    97,   136,    49,     2,    25,    96,
+  135,    48,     1,    29,   101,     1,    31,   107,     2,    30,
+  106,   210,   159,     1,   181,   159,     1,   209,   156,     1,
+  180,   152,     1,   208,   153,     1,   122,   112,     1,   123,
+  115,     2,   134,    33,   177,   148,     3,   125,   117,   133,
+   32,   179,   151,     2,   124,   116,   178,   150,     1,   207,
+  147,     1,   206,   146,     1,   176,   140,     1,   126,   127,
+    1,   175,   136,     1,    22,    67,     2,    21,    66,   173,
+  133,     2,    20,    65,   137,    80,     2,    19,    64,   174,
+  135,     1,   205,   128,     1,   226,   250,     1,   227,   251,
+    1,    24,    81,     2,    23,    80,    78,    83,     1,   225,
+  245,     2,    43,    65,   224,   242,     1,    42,    64,     1,
+  121,    92,     1,    71,    71,     2,     8,    34,    70,    70,
+    2,     9,    35,    69,    69,     2,    68,    68,   138,   112,
+    3,     7,    33,    67,    67,   139,   113,     2,    66,    66,
+  140,   114,     3,    10,    36,    65,    64,   223,   227,     1,
+   11,    37,     1,    77,    78,     1,    76,    77,     2,    75,
+   76,   239,   131,     2,    74,    75,   238,   130,     2,    73,
+   74,   237,   129,     2,    72,    73,   236,   128,     3,    40,
+   38,    61,    54,   119,    48,     3,    14,    50,    62,    55,
+  120,    49,     1,   240,   132,     1,    12,    48,     2,    13,
+   49,    59,    50,     1,    60,    51,     3,    15,    55,    58,
+   48,   182,   208,     1,    39,    33,     2,    16,    57,   222,
+  204,     1,    17,    62,     2,    18,    63,    63,    56,     2,
+   64,    57,   221,   203,     3,    55,    38,    93,    36,   219,
+  200,     2,    56,    39,   220,   201,     2,    41,    52,   108,
+   34,     1,   109,    35,     2,     1,     1,   217,   196,     3,
+    3,     6,   110,    37,   218,   197,     3,     4,     7,   111,
+   38,   215,   194,     3,    92,    35,   112,    39,   216,   195,
+    3,     2,     5,   113,    40,   213,   192,     2,   114,    41,
+  214,   193,     1,   115,    43,     2,   116,    44,   158,    61,
+    1,   117,    45,     2,    57,    40,   118,    46,     2,    86,
+   20,    94,    16,     2,    87,    21,    95,    17,
+};
+
+const unsigned short Dict078KeyHashTable[] = {
+  241,   241,   241,   241,   241,   241,   241,   241,   241,   241,
+  241,   241,   241,   242,   241,   241,   241,   241,   241,   241,
+  241,   241,   241,   241,   245,   241,   241,   241,   241,   241,
+  241,   241,   248,   241,   241,   241,   241,   241,   241,   241,
+  241,   241,   251,   241,   254,   241,   241,   241,   241,   241,
+  241,   241,   241,   241,   241,   241,   257,   241,   260,   241,
+  241,   241,   241,   263,   241,   241,   266,   241,   241,   269,
+  241,   241,   241,   241,   241,   241,   241,   241,   272,   275,
+  241,   684,   687,   241,   241,   241,   241,   241,   241,   241,
+  690,   241,   241,   241,   241,   241,   241,   241,   693,   241,
+  241,   241,   241,   241,   241,   241,   241,   241,   241,   241,
+  241,   241,   241,   241,   696,   699,   241,   241,   241,   241,
+  241,   241,   241,   241,   241,   702,   241,   241,   241,   241,
+  241,   241,   241,   241,   241,   241,   241,   705,   241,   241,
+  241,   241,   241,   241,   241,   241,   708,   241,   241,   241,
+  241,   241,   241,   241,   711,   241,   241,   241,   714,   241,
+  241,   241,   241,   241,   241,   241,   241,   241,   717,   241,
+  722,   241,   725,   241,   241,   730,   241,   241,   733,   241,
+  241,   241,   241,   241,   241,   241,   241,   241,   736,   241,
+  241,   241,   241,   241,   241,   241,   241,   241,   241,   739,
+  241,   241,   742,   241,   241,   241,   241,   241,   241,   241,
+  745,   241,   241,   241,   241,   241,   241,   241,   241,   748,
+  241,   241,   241,   751,   241,   241,   241,   241,   241,   241,
+  241,   241,   241,   754,   241,   241,   241,   241,   241,   241,
+  241,     0,     1,    60, 57351,     1,    57, 25946,     1,    48,
+13101,     1,   136, 35378,     1,   127,  1538,     1,    53, 10500,
+    1,    51, 18062,     1,   128,   154,     1,    47, 45384,     1,
+   15, 20202,     1,    44, 55138,   204,     2,    22,     3,    22,
+    4,    22,     5,    22,     6,    22,    10,    22,    11,    22,
+   12,    22,    13,    22,    14,    22,    16,    22,    17,    22,
+   18,    22,    20,    22,    21,    22,    22,    22,    24,    22,
+   25,    22,    27,    22,    29,    22,    30,    22,    31,    22,
+   32,    22,    33,    22,    34,    22,    35,    22,    36,    22,
+   37,    22,    38,    22,    39,    22,    41,    22,    42,    22,
+   43,    22,    54,    22,    55, 49006,    58,    22,    61,    22,
+   62,    22,    63,    22,    64,    22,    65,    22,    66,    22,
+   67,    22,    68,    22,    69,    22,    70,    22,    71,    22,
+   72,    22,    73,    22,    74,    22,    75,    22,    76,    22,
+   77,    22,    78,    22,    79,    22,    80,    22,    81,    22,
+   82,    22,    83,    22,    84,    22,    85,    22,    86,    22,
+   87,    22,    88,    22,    89,    22,    90,    22,    91,    22,
+   92,    22,    93,    22,    94,    22,    95,    22,    96,    22,
+   97,    22,    98,    22,    99,    22,   100,    22,   101,    22,
+  102,    22,   103,    22,   104,    22,   105,    22,   106,    22,
+  107,    22,   108,    22,   109,    22,   110,    22,   111,    22,
+  112,    22,   113,    22,   114,    22,   115,    22,   116,    22,
+  117,    22,   118,    22,   119,    22,   120,    22,   121,    22,
+  122,    22,   123,    22,   124,    22,   125,    22,   126,    22,
+  130,    22,   131,    22,   141,    22,   142,    22,   143,    22,
+  144,    22,   145,    22,   146,    22,   147,    22,   148,    22,
+  149,    22,   150,    22,   151,    22,   152,    22,   153,    22,
+  154,    22,   155,    22,   156,    22,   157,    22,   158,    22,
+  159,    22,   160,    22,   161,    22,   162,    22,   163,    22,
+  164,    22,   165,    22,   166,    22,   167,    22,   168,    22,
+  169,    22,   170,    22,   171,    22,   172,    22,   173,    22,
+  174,    22,   175,    22,   176,    22,   177,    22,   178,    22,
+  179,    22,   180,    22,   181,    22,   182,    22,   183,    22,
+  184,    22,   185,    22,   186,    22,   187,    22,   188,    22,
+  189,    22,   190,    22,   191,    22,   192,    22,   193,    22,
+  194,    22,   195,    22,   196,    22,   197,    22,   198,    22,
+  199,    22,   200,    22,   201,    22,   202,    22,   203,    22,
+  204,    22,   205,    22,   206,    22,   207,    22,   208,    22,
+  209,    22,   210,    22,   211,    22,   212,    22,   213,    22,
+  214,    22,   215,    22,   216,    22,   217,    22,   218,    22,
+  219,    22,   220,    22,   221,    22,   222,    22,   223,    22,
+  224,    22,   225,    22,   226,    22,   227,    22,   228,    22,
+  229,    22,   230,    22,   231,    22,   232,    22,   233,    22,
+  234,    22,   235,    22,   236,    22,   237,    22,   238,    22,
+  239,    22,   240,    22,     1,     9, 56531,     1,    56, 56626,
+    1,   132, 47687,     1,    46,  4645,     1,    45, 43218,     1,
+   19, 48581,     1,     0, 39324,     1,   139, 59785,     1,   134,
+13136,     1,   140, 40038,     1,    23, 59862,     2,    49, 64820,
+  133, 33398,     1,     7, 47983,     2,    26, 15788,    40, 18866,
+    1,    59,  9927,     1,    52, 30522,     1,   129, 38261,     1,
+    1, 39860,     1,   138, 11078,     1,    50, 17054,     1,    28,
+ 3635,     1,   135, 42300,     2,     8,  6693,   137, 41724,
 };
 
-vtkDICOMDictionary::Dict Dict074Data = {
+vtkDICOMDictionary::Dict Dict078Data = {
 "ELSCINT1",
-208,
-208,
-Dict074TagHashTable,
-Dict074KeyHashTable,
-Dict074Contents
+241,
+241,
+Dict078TagHashTable,
+Dict078KeyHashTable,
+Dict078Contents
+};
+
+// ----- Brainlab-S9-History -----
+
+const DictEntry Dict079Contents[] = {
+{ 0x0009, 0x0031, 0, VR::SQ, VM::M1, "" },
+{ 0x0009, 0x0032, 0, VR::SQ, VM::M1, "" },
+{ 0x0009, 0x0033, 0, VR::SQ, VM::M1, "" },
+};
+
+const unsigned short Dict079TagHashTable[] = {
+    3,     4,     7,     0,     1,     2,    51,     2,     0,    49,
+    1,    50,
+};
+
+const unsigned short Dict079KeyHashTable[] = {
+    3,     3,     4,     0,     3,     0,  1793,     1,  1793,     2,
+ 1793,
+};
+
+vtkDICOMDictionary::Dict Dict079Data = {
+"Brainlab-S9-History",
+3,
+3,
+Dict079TagHashTable,
+Dict079KeyHashTable,
+Dict079Contents
 };
 
 // ----- SIEMENS IMAGE SHADOW ATTRIBUTES -----
 
-DictEntry Dict075Contents[] = {
+const DictEntry Dict080Contents[] = {
 { 0x0021, 0x0001, 0, VR::US, VM::M1, "" },
 { 0x0021, 0x0002, 0, VR::FD, VM::M1TN, "" },
 { 0x0021, 0x0003, 0, VR::DS, VM::M1, "" },
@@ -4405,7 +4813,7 @@ DictEntry Dict075Contents[] = {
 { 0x0021, 0x005e, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict075TagHashTable[] = {
+const unsigned short Dict080TagHashTable[] = {
    53,    56,    52,    61,    66,    69,    72,    77,    52,    84,
    89,    96,   101,   106,   109,   112,   115,   118,   121,   126,
   129,   132,   135,    52,    52,    52,   140,   143,   146,   149,
@@ -4428,7 +4836,7 @@ unsigned short Dict075TagHashTable[] = {
    69,     1,    35,    70,     1,    36,    71,
 };
 
-unsigned short Dict075KeyHashTable[] = {
+const unsigned short Dict080KeyHashTable[] = {
    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,
    52,    52,    52,    52,    52,    52,    52,    52,    52,    52,
    52,    52,    52,    52,    52,    53,    52,    52,    52,    52,
@@ -4447,18 +4855,18 @@ unsigned short Dict075KeyHashTable[] = {
    48,   103,    49,   103,    50,   103,    51,   103,
 };
 
-vtkDICOMDictionary::Dict Dict075Data = {
+vtkDICOMDictionary::Dict Dict080Data = {
 "SIEMENS IMAGE SHADOW ATTRIBUTES",
 52,
 52,
-Dict075TagHashTable,
-Dict075KeyHashTable,
-Dict075Contents
+Dict080TagHashTable,
+Dict080KeyHashTable,
+Dict080Contents
 };
 
 // ----- Harmony R1.0 -----
 
-DictEntry Dict076Contents[] = {
+const DictEntry Dict081Contents[] = {
 { 0x0019, 0x0000, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0001, 0, VR::LO, VM::M1, "" },
 { 0x0019, 0x0002, 0, VR::US, VM::M1, "" },
@@ -4576,7 +4984,7 @@ DictEntry Dict076Contents[] = {
 { 0x0019, 0x0083, 0, VR::US, VM::M1, "" },
 };
 
-unsigned short Dict076TagHashTable[] = {
+const unsigned short Dict081TagHashTable[] = {
   116,   121,   124,   127,   130,   133,   138,   141,   144,   149,
   154,   159,   164,   169,   172,   175,   178,   181,   184,   187,
   190,   193,   196,   199,   202,   205,   208,   211,   214,   217,
@@ -4624,7 +5032,7 @@ unsigned short Dict076TagHashTable[] = {
   117,     1,    93,   104,     1,    94,   105,     1,    95,   106,
 };
 
-unsigned short Dict076KeyHashTable[] = {
+const unsigned short Dict081KeyHashTable[] = {
   115,   115,   115,   115,   115,   115,   115,   115,   115,   115,
   115,   115,   115,   115,   115,   115,   115,   115,   115,   115,
   115,   115,   115,   115,   115,   115,   115,   115,   115,   115,
@@ -4662,18 +5070,18 @@ unsigned short Dict076KeyHashTable[] = {
    46,   112,    46,   113,    46,   114,    46,
 };
 
-vtkDICOMDictionary::Dict Dict076Data = {
+vtkDICOMDictionary::Dict Dict081Data = {
 "Harmony R1.0",
 115,
 115,
-Dict076TagHashTable,
-Dict076KeyHashTable,
-Dict076Contents
+Dict081TagHashTable,
+Dict081KeyHashTable,
+Dict081Contents
 };
 
 // ----- FDMS 1.0 -----
 
-DictEntry Dict077Contents[] = {
+const DictEntry Dict082Contents[] = {
 { 0x0009, 0x0004, 0, VR::SH, VM::M1, "ImageControlUnit" },
 { 0x0009, 0x0005, 0, VR::OW, VM::M1, "ImageUID" },
 { 0x0009, 0x0006, 0, VR::OW, VM::M1, "RouteImageUID" },
@@ -4786,7 +5194,7 @@ DictEntry Dict077Contents[] = {
 { 0x50F1, 0x0020, 0, VR::CS, VM::M1, "ImageProcessingModificationFlag" },
 };
 
-unsigned short Dict077TagHashTable[] = {
+const unsigned short Dict082TagHashTable[] = {
   111,   114,   117,   120,   123,   126,   131,   134,   139,   144,
   151,   110,   156,   163,   110,   166,   169,   172,   110,   179,
   182,   187,   190,   199,   210,   215,   110,   110,   224,   227,
@@ -4829,7 +5237,7 @@ unsigned short Dict077TagHashTable[] = {
    95,    68,   108,    16,
 };
 
-unsigned short Dict077KeyHashTable[] = {
+const unsigned short Dict082KeyHashTable[] = {
   110,   110,   111,   110,   110,   110,   110,   110,   110,   110,
   114,   110,   110,   110,   110,   110,   110,   110,   117,   122,
   125,   110,   110,   110,   128,   131,   110,   110,   136,   110,
@@ -4870,18 +5278,18 @@ unsigned short Dict077KeyHashTable[] = {
     1,   106,  6441,     1,     4, 49943,
 };
 
-vtkDICOMDictionary::Dict Dict077Data = {
+vtkDICOMDictionary::Dict Dict082Data = {
 "FDMS 1.0",
 110,
 110,
-Dict077TagHashTable,
-Dict077KeyHashTable,
-Dict077Contents
+Dict082TagHashTable,
+Dict082KeyHashTable,
+Dict082Contents
 };
 
 // ----- SIEMENS SYNGO SOP CLASS PACKING -----
 
-DictEntry Dict078Contents[] = {
+const DictEntry Dict083Contents[] = {
 { 0x0031, 0x0010, 0, VR::SQ, VM::M1, "SOPClassPackingSequence" },
 { 0x0031, 0x0020, 0, VR::CS, VM::M1, "PackingVersion" },
 { 0x0031, 0x0021, 0, VR::CS, VM::M1, "PackingOriginator" },
@@ -4903,7 +5311,7 @@ DictEntry Dict078Contents[] = {
 { 0x0031, 0x0080, 0, VR::OB, VM::M1, "StreamChunk" },
 };
 
-unsigned short Dict078TagHashTable[] = {
+const unsigned short Dict083TagHashTable[] = {
    20,    23,    28,    33,    36,    39,    19,    42,    45,    50,
    55,    19,    19,    19,    58,    19,    61,    64,    69,     0,
     1,     4,    49,     2,     3,    48,    10,    80,     2,     6,
@@ -4914,7 +5322,7 @@ unsigned short Dict078TagHashTable[] = {
     9,    65,
 };
 
-unsigned short Dict078KeyHashTable[] = {
+const unsigned short Dict083KeyHashTable[] = {
    19,    20,    25,    19,    19,    28,    35,    19,    19,    19,
    40,    43,    46,    19,    49,    52,    59,    19,    62,     0,
     2,     6, 59670,    14, 16357,     1,     2, 62314,     3,     5,
@@ -4924,18 +5332,18 @@ unsigned short Dict078KeyHashTable[] = {
    11, 42793,     3,     1, 46226,     3, 56742,     9, 34825,
 };
 
-vtkDICOMDictionary::Dict Dict078Data = {
+vtkDICOMDictionary::Dict Dict083Data = {
 "SIEMENS SYNGO SOP CLASS PACKING",
 19,
 19,
-Dict078TagHashTable,
-Dict078KeyHashTable,
-Dict078Contents
+Dict083TagHashTable,
+Dict083KeyHashTable,
+Dict083Contents
 };
 
 // ----- Sound Technologies -----
 
-DictEntry Dict079Contents[] = {
+const DictEntry Dict084Contents[] = {
 { 0xf001, 0x0000, 0, VR::LO, VM::M1, "PatientSpecies" },
 { 0xf001, 0x0001, 0, VR::LO, VM::M1, "PatientBreed" },
 { 0xf001, 0x0002, 0, VR::LO, VM::M1, "PatientCategorySize" },
@@ -4969,7 +5377,7 @@ DictEntry Dict079Contents[] = {
 { 0xf001, 0x001e, 0, VR::LO, VM::M1, "ReceptorBitsPerPixel" },
 };
 
-unsigned short Dict079TagHashTable[] = {
+const unsigned short Dict084TagHashTable[] = {
    32,    35,    38,    41,    44,    47,    50,    53,    56,    59,
    62,    65,    68,    71,    74,    77,    80,    83,    86,    89,
    92,    95,    98,   101,   104,   107,   110,    31,   113,   118,
@@ -4985,7 +5393,7 @@ unsigned short Dict079TagHashTable[] = {
     0,     1,     3,     3,
 };
 
-unsigned short Dict079KeyHashTable[] = {
+const unsigned short Dict084KeyHashTable[] = {
    31,    31,    32,    31,    39,    42,    31,    45,    31,    48,
    51,    60,    31,    63,    66,    71,    74,    77,    80,    83,
    86,    31,    93,    98,    31,   101,   104,    31,   109,   112,
@@ -5000,42 +5408,42 @@ unsigned short Dict079KeyHashTable[] = {
     0, 60758,     1,    21,  8879,
 };
 
-vtkDICOMDictionary::Dict Dict079Data = {
+vtkDICOMDictionary::Dict Dict084Data = {
 "Sound Technologies",
 31,
 31,
-Dict079TagHashTable,
-Dict079KeyHashTable,
-Dict079Contents
+Dict084TagHashTable,
+Dict084KeyHashTable,
+Dict084Contents
 };
 
 // ----- PHILIPS XCT -Private -----
 
-DictEntry Dict080Contents[] = {
+const DictEntry Dict085Contents[] = {
 { 0x7051, 0x0001, 0, VR::DS, VM::M1, "AttenuationThreshold" },
 { 0x7051, 0x0002, 0, VR::DS, VM::M1, "DLPEstimate" },
 };
 
-unsigned short Dict080TagHashTable[] = {
+const unsigned short Dict085TagHashTable[] = {
     3,     6,     0,     1,     1,     2,     1,     0,     1,
 };
 
-unsigned short Dict080KeyHashTable[] = {
+const unsigned short Dict085KeyHashTable[] = {
     3,     6,     0,     1,     0, 53311,     1,     1, 62176,
 };
 
-vtkDICOMDictionary::Dict Dict080Data = {
+vtkDICOMDictionary::Dict Dict085Data = {
 "PHILIPS XCT -Private",
 2,
 2,
-Dict080TagHashTable,
-Dict080KeyHashTable,
-Dict080Contents
+Dict085TagHashTable,
+Dict085KeyHashTable,
+Dict085Contents
 };
 
 // ----- Siemens: Thorax/Multix FD Image Stamp -----
 
-DictEntry Dict081Contents[] = {
+const DictEntry Dict086Contents[] = {
 { 0x0023, 0x0000, 0, VR::US, VM::M1, "" },
 { 0x0023, 0x0001, 0, VR::US, VM::M1, "" },
 { 0x0023, 0x0002, 0, VR::US, VM::M1, "" },
@@ -5043,28 +5451,28 @@ DictEntry Dict081Contents[] = {
 { 0x0023, 0x0004, 0, VR::US, VM::M1, "" },
 };
 
-unsigned short Dict081TagHashTable[] = {
+const unsigned short Dict086TagHashTable[] = {
     6,     5,     9,    12,    15,     0,     1,     0,     0,     1,
     3,     3,     1,     2,     2,     2,     1,     1,     4,     4,
 };
 
-unsigned short Dict081KeyHashTable[] = {
+const unsigned short Dict086KeyHashTable[] = {
     5,     6,     5,     5,     5,     0,     5,     0,  1076,     1,
  1076,     2,  1076,     3,  1076,     4,  1076,
 };
 
-vtkDICOMDictionary::Dict Dict081Data = {
+vtkDICOMDictionary::Dict Dict086Data = {
 "Siemens: Thorax/Multix FD Image Stamp",
 5,
 5,
-Dict081TagHashTable,
-Dict081KeyHashTable,
-Dict081Contents
+Dict086TagHashTable,
+Dict086KeyHashTable,
+Dict086Contents
 };
 
 // ----- GEMS_PARM_01 -----
 
-DictEntry Dict082Contents[] = {
+const DictEntry Dict087Contents[] = {
 { 0x0043, 0x0001, 0, VR::SS, VM::M1, "BitmapOfPrescanOptions" },
 { 0x0043, 0x0002, 0, VR::SS, VM::M1, "GradientOffsetInX" },
 { 0x0043, 0x0003, 0, VR::SS, VM::M1, "GradientOffsetInY" },
@@ -5219,7 +5627,7 @@ DictEntry Dict082Contents[] = {
 { 0x0043, 0x00b2, 0, VR::DS, VM::M1TN, "AdvancedEddyCorrection" },
 };
 
-unsigned short Dict082TagHashTable[] = {
+const unsigned short Dict087TagHashTable[] = {
   153,   156,   159,   162,   165,   168,   171,   174,   177,   180,
   183,   186,   152,   189,   192,   195,   152,   152,   152,   152,
   152,   152,   152,   152,   152,   152,   152,   152,   152,   152,
@@ -5278,7 +5686,7 @@ unsigned short Dict082TagHashTable[] = {
     1,    49,    53,     1,    52,    56,     1,    53,    57,
 };
 
-unsigned short Dict082KeyHashTable[] = {
+const unsigned short Dict087KeyHashTable[] = {
   153,   156,   159,   152,   162,   165,   152,   152,   152,   168,
   171,   152,   152,   174,   152,   152,   177,   182,   152,   152,
   152,   185,   152,   188,   193,   198,   203,   206,   209,   152,
@@ -5337,41 +5745,41 @@ unsigned short Dict082KeyHashTable[] = {
     2,     8,  8174,   135,  7544,
 };
 
-vtkDICOMDictionary::Dict Dict082Data = {
+vtkDICOMDictionary::Dict Dict087Data = {
 "GEMS_PARM_01",
 152,
 152,
-Dict082TagHashTable,
-Dict082KeyHashTable,
-Dict082Contents
+Dict087TagHashTable,
+Dict087KeyHashTable,
+Dict087Contents
 };
 
 // ----- MedIns HP Extensions -----
 
-DictEntry Dict083Contents[] = {
+const DictEntry Dict088Contents[] = {
 { 0x5473, 0x0003, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict083TagHashTable[] = {
+const unsigned short Dict088TagHashTable[] = {
     2,     0,     1,     0,     3,
 };
 
-unsigned short Dict083KeyHashTable[] = {
+const unsigned short Dict088KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict083Data = {
+vtkDICOMDictionary::Dict Dict088Data = {
 "MedIns HP Extensions",
 1,
 1,
-Dict083TagHashTable,
-Dict083KeyHashTable,
-Dict083Contents
+Dict088TagHashTable,
+Dict088KeyHashTable,
+Dict088Contents
 };
 
 // ----- SIEMENS CM VA0  ACQU -----
 
-DictEntry Dict084Contents[] = {
+const DictEntry Dict089Contents[] = {
 { 0x0019, 0x0010, 0, VR::LO, VM::M1, "ParameterFileName" },
 { 0x0019, 0x0011, 0, VR::LO, VM::M1, "SequenceFileName" },
 { 0x0019, 0x0012, 0, VR::LO, VM::M1, "SequenceFileOwner" },
@@ -5379,28 +5787,28 @@ DictEntry Dict084Contents[] = {
 { 0x0019, 0x0014, 0, VR::LO, VM::M1, "EPIFileName" },
 };
 
-unsigned short Dict084TagHashTable[] = {
+const unsigned short Dict089TagHashTable[] = {
     6,     9,     5,    12,    17,     0,     1,     3,    19,     1,
     2,    18,     2,     1,    17,     4,    20,     1,     0,    16,
 };
 
-unsigned short Dict084KeyHashTable[] = {
+const unsigned short Dict089KeyHashTable[] = {
     5,     6,     9,    12,     5,     0,     1,     1, 34950,     1,
     3,  6208,     3,     0, 13588,     2,  2254,     4, 33901,
 };
 
-vtkDICOMDictionary::Dict Dict084Data = {
+vtkDICOMDictionary::Dict Dict089Data = {
 "SIEMENS CM VA0  ACQU",
 5,
 5,
-Dict084TagHashTable,
-Dict084KeyHashTable,
-Dict084Contents
+Dict089TagHashTable,
+Dict089KeyHashTable,
+Dict089Contents
 };
 
 // ----- PHILIPS MR/LAST -----
 
-DictEntry Dict085Contents[] = {
+const DictEntry Dict090Contents[] = {
 { 0x0019, 0x0009, 0, VR::DS, VM::M1, "MainMagneticField" },
 { 0x0019, 0x000e, 0, VR::IS, VM::M1, "FlowCompensation" },
 { 0x0019, 0x00B7, 0, VR::IS, VM::M1, "" },
@@ -5457,7 +5865,7 @@ DictEntry Dict085Contents[] = {
 { 0x6001, 0x0000, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict085TagHashTable[] = {
+const unsigned short Dict090TagHashTable[] = {
    55,    60,    63,    66,    71,    54,    74,    79,    84,    89,
    94,    54,    97,   102,    54,    54,   107,   112,   117,   122,
   129,    54,    54,   132,    54,   135,    54,    54,    54,    54,
@@ -5480,7 +5888,7 @@ unsigned short Dict085TagHashTable[] = {
     1,    32,    19,     1,    31,    18,
 };
 
-unsigned short Dict085KeyHashTable[] = {
+const unsigned short Dict090KeyHashTable[] = {
    55,    54,    58,    54,    54,    61,    54,    64,    67,    70,
    73,    54,    76,    54,    54,    79,    82,    54,    54,    85,
    54,    88,    54,    91,    54,    96,    54,    54,    54,    54,
@@ -5502,18 +5910,18 @@ unsigned short Dict085KeyHashTable[] = {
     2,    38, 14666,    39,  7005,
 };
 
-vtkDICOMDictionary::Dict Dict085Data = {
+vtkDICOMDictionary::Dict Dict090Data = {
 "PHILIPS MR/LAST",
 54,
 54,
-Dict085TagHashTable,
-Dict085KeyHashTable,
-Dict085Contents
+Dict090TagHashTable,
+Dict090KeyHashTable,
+Dict090Contents
 };
 
 // ----- AEGIS_DICOM_2.00 -----
 
-DictEntry Dict086Contents[] = {
+const DictEntry Dict091Contents[] = {
 { 0x0003, 0x0000, 0, VR::US, VM::M1TN, "" },
 { 0x0005, 0x0000, 0, VR::US, VM::M1TN, "" },
 { 0x0009, 0x0000, 0, VR::US, VM::M1TN, "" },
@@ -5522,29 +5930,29 @@ DictEntry Dict086Contents[] = {
 { 0x1369, 0x0000, 0, VR::US, VM::M1TN, "" },
 };
 
-unsigned short Dict086TagHashTable[] = {
+const unsigned short Dict091TagHashTable[] = {
     6,     7,     6,    10,    15,    18,     0,     1,     3,     0,
     2,     0,     0,     2,     0,     1,     5,     0,     2,     1,
     0,     4,     0,
 };
 
-unsigned short Dict086KeyHashTable[] = {
+const unsigned short Dict091KeyHashTable[] = {
     6,     6,     6,     6,     6,     7,     0,     6,     0,   896,
     1,   896,     2,   896,     3,   896,     4,   896,     5,   896,
 };
 
-vtkDICOMDictionary::Dict Dict086Data = {
+vtkDICOMDictionary::Dict Dict091Data = {
 "AEGIS_DICOM_2.00",
 6,
 6,
-Dict086TagHashTable,
-Dict086KeyHashTable,
-Dict086Contents
+Dict091TagHashTable,
+Dict091KeyHashTable,
+Dict091Contents
 };
 
 // ----- MeVis eD: Absolute Temporal Positions -----
 
-DictEntry Dict087Contents[] = {
+const DictEntry Dict092Contents[] = {
 { 0x0021, 0x0010, 0, VR::LT, VM::M1, "TimepointDateTime" },
 { 0x0021, 0x0011, 0, VR::CS, VM::M1, "TimepointDateTimeType" },
 { 0x0021, 0x0012, 0, VR::UN, VM::M1, "TimepointSeriesDescription" },
@@ -5552,28 +5960,28 @@ DictEntry Dict087Contents[] = {
 { 0x0021, 0x0071, 0, VR::UN, VM::M1, "TimepointEmptyFrames" },
 };
 
-unsigned short Dict087TagHashTable[] = {
+const unsigned short Dict092TagHashTable[] = {
     6,     9,     5,    14,    17,     0,     1,     3,    19,     2,
     2,    18,     4,   113,     1,     1,    17,     1,     0,    16,
 };
 
-unsigned short Dict087KeyHashTable[] = {
+const unsigned short Dict092KeyHashTable[] = {
     6,     5,    11,    14,     5,     0,     2,     0, 20911,     1,
 25769,     1,     2,  4175,     2,     3, 13689,     4, 63720,
 };
 
-vtkDICOMDictionary::Dict Dict087Data = {
+vtkDICOMDictionary::Dict Dict092Data = {
 "MeVis eD: Absolute Temporal Positions",
 5,
 5,
-Dict087TagHashTable,
-Dict087KeyHashTable,
-Dict087Contents
+Dict092TagHashTable,
+Dict092KeyHashTable,
+Dict092Contents
 };
 
 // ----- NQLeft -----
 
-DictEntry Dict088Contents[] = {
+const DictEntry Dict093Contents[] = {
 { 0x0199, 0x0001, 0, VR::FL, VM::M1, "LeftCorticalWhiteMatter" },
 { 0x0199, 0x0002, 0, VR::FL, VM::M1, "LeftCorticalGrayMatter" },
 { 0x0199, 0x0003, 0, VR::FL, VM::M1, "Left3rdVentricle" },
@@ -5634,7 +6042,7 @@ DictEntry Dict088Contents[] = {
 { 0x0199, 0x003a, 0, VR::FL, VM::M1, "LeftMeningie" },
 };
 
-unsigned short Dict088TagHashTable[] = {
+const unsigned short Dict093TagHashTable[] = {
    59,    62,    65,    68,    71,    74,    77,    80,    83,    58,
    58,    58,    58,    58,    58,    86,    89,    92,    95,    98,
   101,   104,   107,   110,   113,   116,   119,   122,   125,   128,
@@ -5660,7 +6068,7 @@ unsigned short Dict088TagHashTable[] = {
    12,     1,    10,    11,     1,     9,    10,
 };
 
-unsigned short Dict088KeyHashTable[] = {
+const unsigned short Dict093KeyHashTable[] = {
    59,    62,    65,    70,    58,    58,    73,    58,    58,    58,
    58,    78,    58,    83,    90,    58,    93,    58,    58,    58,
    98,   101,   110,    58,    58,   113,   118,   121,   124,   137,
@@ -5685,18 +6093,18 @@ unsigned short Dict088KeyHashTable[] = {
    27, 16416,
 };
 
-vtkDICOMDictionary::Dict Dict088Data = {
+vtkDICOMDictionary::Dict Dict093Data = {
 "NQLeft",
 58,
 58,
-Dict088TagHashTable,
-Dict088KeyHashTable,
-Dict088Contents
+Dict093TagHashTable,
+Dict093KeyHashTable,
+Dict093Contents
 };
 
 // ----- iCAD PK Study -----
 
-DictEntry Dict089Contents[] = {
+const DictEntry Dict094Contents[] = {
 { 0x3335, 0x0000, 0, VR::LO, VM::M1, "" },
 { 0x3335, 0x0001, 0, VR::LO, VM::M1, "" },
 { 0x3335, 0x0002, 0, VR::LO, VM::M1, "" },
@@ -5727,7 +6135,7 @@ DictEntry Dict089Contents[] = {
 { 0x3335, 0x001b, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict089TagHashTable[] = {
+const unsigned short Dict094TagHashTable[] = {
    29,    32,    35,    38,    41,    44,    47,    50,    53,    58,
    63,    68,    28,    28,    28,    28,    73,    76,    79,    82,
    85,    88,    91,    94,    97,   100,   103,   106,     0,     1,
@@ -5741,7 +6149,7 @@ unsigned short Dict089TagHashTable[] = {
     1,     8,     8,     1,    11,    11,     1,    10,    10,
 };
 
-unsigned short Dict089KeyHashTable[] = {
+const unsigned short Dict094KeyHashTable[] = {
    28,    28,    28,    28,    28,    29,    28,    28,    28,    28,
    28,    28,    28,    28,    28,    28,    28,    28,    28,    28,
    28,    28,    28,    28,    28,    28,    28,    28,     0,    28,
@@ -5753,42 +6161,42 @@ unsigned short Dict089KeyHashTable[] = {
    25,   192,    26,   192,    27,   192,
 };
 
-vtkDICOMDictionary::Dict Dict089Data = {
+vtkDICOMDictionary::Dict Dict094Data = {
 "iCAD PK Study",
 28,
 28,
-Dict089TagHashTable,
-Dict089KeyHashTable,
-Dict089Contents
+Dict094TagHashTable,
+Dict094KeyHashTable,
+Dict094Contents
 };
 
 // ----- SPI-P-Private_ICS Release 1;3 -----
 
-DictEntry Dict090Contents[] = {
+const DictEntry Dict095Contents[] = {
 { 0x0029, 0x0000, 0, VR::ST, VM::M1, "" },
 { 0x0029, 0x0001, 0, VR::ST, VM::M1, "" },
 };
 
-unsigned short Dict090TagHashTable[] = {
+const unsigned short Dict095TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict090KeyHashTable[] = {
+const unsigned short Dict095KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict090Data = {
+vtkDICOMDictionary::Dict Dict095Data = {
 "SPI-P-Private_ICS Release 1;3",
 2,
 2,
-Dict090TagHashTable,
-Dict090KeyHashTable,
-Dict090Contents
+Dict095TagHashTable,
+Dict095KeyHashTable,
+Dict095Contents
 };
 
 // ----- SPI-P-Private_ICS Release 1;2 -----
 
-DictEntry Dict091Contents[] = {
+const DictEntry Dict096Contents[] = {
 { 0x0029, 0x0000, 0, VR::FD, VM::M1, "" },
 { 0x0029, 0x0001, 0, VR::FD, VM::M1, "" },
 { 0x0029, 0x0002, 0, VR::FD, VM::M1, "" },
@@ -5805,7 +6213,7 @@ DictEntry Dict091Contents[] = {
 { 0x0029, 0x00d9, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict091TagHashTable[] = {
+const unsigned short Dict096TagHashTable[] = {
    15,    18,    23,    28,    14,    31,    14,    14,    14,    14,
    34,    37,    42,    47,     0,     1,     3,     3,     2,     2,
     2,    12,   166,     2,     5,     5,    11,   165,     1,     4,
@@ -5814,7 +6222,7 @@ unsigned short Dict091TagHashTable[] = {
     7,   160,
 };
 
-unsigned short Dict091KeyHashTable[] = {
+const unsigned short Dict096KeyHashTable[] = {
    14,    14,    14,    14,    14,    15,    14,    14,    14,    14,
    14,    14,    14,    14,     0,    14,     0,   384,     1,   384,
     2,   384,     3,   384,     4,   384,     5,   384,     6,   384,
@@ -5822,18 +6230,18 @@ unsigned short Dict091KeyHashTable[] = {
    12,   384,    13,   384,
 };
 
-vtkDICOMDictionary::Dict Dict091Data = {
+vtkDICOMDictionary::Dict Dict096Data = {
 "SPI-P-Private_ICS Release 1;2",
 14,
 14,
-Dict091TagHashTable,
-Dict091KeyHashTable,
-Dict091Contents
+Dict096TagHashTable,
+Dict096KeyHashTable,
+Dict096Contents
 };
 
 // ----- SPI-P-Private_ICS Release 1;1 -----
 
-DictEntry Dict092Contents[] = {
+const DictEntry Dict097Contents[] = {
 { 0x0029, 0x0000, 0, VR::SL, VM::M1, "" },
 { 0x0029, 0x0005, 0, VR::FL, VM::M1, "" },
 { 0x0029, 0x0006, 0, VR::FL, VM::M1, "" },
@@ -5853,7 +6261,7 @@ DictEntry Dict092Contents[] = {
 { 0x0029, 0x00d6, 0, VR::ST, VM::M1, "" },
 };
 
-unsigned short Dict092TagHashTable[] = {
+const unsigned short Dict097TagHashTable[] = {
    18,    17,    17,    17,    21,    17,    17,    24,    27,    30,
    35,    42,    45,    48,    55,    17,    60,     0,     1,    15,
   213,     1,     7,   203,     1,     0,     0,     1,     4,    33,
@@ -5863,7 +6271,7 @@ unsigned short Dict092TagHashTable[] = {
     1,    14,   212,
 };
 
-unsigned short Dict092KeyHashTable[] = {
+const unsigned short Dict097KeyHashTable[] = {
    17,    17,    17,    17,    17,    17,    17,    17,    17,    18,
    17,    17,    17,    17,    17,    17,    17,     0,    17,     0,
   316,     1,   316,     2,   316,     3,   316,     4,   316,     5,
@@ -5872,18 +6280,18 @@ unsigned short Dict092KeyHashTable[] = {
   316,    16,   316,
 };
 
-vtkDICOMDictionary::Dict Dict092Data = {
+vtkDICOMDictionary::Dict Dict097Data = {
 "SPI-P-Private_ICS Release 1;1",
 17,
 17,
-Dict092TagHashTable,
-Dict092KeyHashTable,
-Dict092Contents
+Dict097TagHashTable,
+Dict097KeyHashTable,
+Dict097Contents
 };
 
 // ----- SIEMENS CT VA0  GEN -----
 
-DictEntry Dict093Contents[] = {
+const DictEntry Dict098Contents[] = {
 { 0x0019, 0x0010, 0, VR::DS, VM::M1, "SourceSideCollimatorAperture" },
 { 0x0019, 0x0011, 0, VR::DS, VM::M1, "DetectorSideCollimatorAperture" },
 { 0x0019, 0x0020, 0, VR::IS, VM::M1, "ExposureTime" },
@@ -5935,7 +6343,7 @@ DictEntry Dict093Contents[] = {
 { 0x0021, 0x00a7, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict093TagHashTable[] = {
+const unsigned short Dict098TagHashTable[] = {
    50,    55,    49,    58,    61,    64,    67,    74,    83,    92,
    95,    98,    49,    49,   103,   108,   113,   116,    49,   123,
    49,   126,    49,   129,   132,    49,    49,    49,    49,    49,
@@ -5956,7 +6364,7 @@ unsigned short Dict093TagHashTable[] = {
     1,     9,    69,     1,    26,    64,     1,    20,    17,
 };
 
-unsigned short Dict093KeyHashTable[] = {
+const unsigned short Dict098KeyHashTable[] = {
    50,    49,    53,    56,    61,    64,    49,    49,    49,    69,
    72,    49,    49,    49,    77,    80,    49,    49,    83,    88,
    91,    96,    99,   102,   105,   110,    49,    49,   113,    49,
@@ -5977,42 +6385,42 @@ unsigned short Dict093KeyHashTable[] = {
 47014,    42, 29886,
 };
 
-vtkDICOMDictionary::Dict Dict093Data = {
+vtkDICOMDictionary::Dict Dict098Data = {
 "SIEMENS CT VA0  GEN",
 49,
 49,
-Dict093TagHashTable,
-Dict093KeyHashTable,
-Dict093Contents
+Dict098TagHashTable,
+Dict098KeyHashTable,
+Dict098Contents
 };
 
 // ----- SPI-P-Private_ICS Release 1;5 -----
 
-DictEntry Dict094Contents[] = {
+const DictEntry Dict099Contents[] = {
 { 0x0029, 0x0050, 0, VR::CS, VM::M1, "" },
 { 0x0029, 0x0055, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict094TagHashTable[] = {
+const unsigned short Dict099TagHashTable[] = {
     3,     6,     0,     1,     0,    80,     1,     1,    85,
 };
 
-unsigned short Dict094KeyHashTable[] = {
+const unsigned short Dict099KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict094Data = {
+vtkDICOMDictionary::Dict Dict099Data = {
 "SPI-P-Private_ICS Release 1;5",
 2,
 2,
-Dict094TagHashTable,
-Dict094KeyHashTable,
-Dict094Contents
+Dict099TagHashTable,
+Dict099KeyHashTable,
+Dict099Contents
 };
 
 // ----- SPI-P-Private_ICS Release 1;4 -----
 
-DictEntry Dict095Contents[] = {
+const DictEntry Dict100Contents[] = {
 { 0x0029, 0x00d6, 0, VR::FD, VM::M1, "" },
 { 0x0029, 0x00d7, 0, VR::FD, VM::M1, "" },
 { 0x0029, 0x00d8, 0, VR::FD, VM::M1, "" },
@@ -6023,31 +6431,31 @@ DictEntry Dict095Contents[] = {
 { 0x0029, 0x00e0, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict095TagHashTable[] = {
+const unsigned short Dict100TagHashTable[] = {
     9,     8,    12,    17,    20,    23,    26,    29,     0,     1,
     4,   218,     2,     2,   216,     7,   224,     1,     3,   217,
     1,     0,   214,     1,     1,   215,     1,     5,   220,     1,
     6,   221,
 };
 
-unsigned short Dict095KeyHashTable[] = {
+const unsigned short Dict100KeyHashTable[] = {
     8,     8,     8,     8,     8,     9,     8,     8,     0,     8,
     0,   672,     1,   672,     2,   672,     3,   672,     4,   672,
     5,   672,     6,   672,     7,   672,
 };
 
-vtkDICOMDictionary::Dict Dict095Data = {
+vtkDICOMDictionary::Dict Dict100Data = {
 "SPI-P-Private_ICS Release 1;4",
 8,
 8,
-Dict095TagHashTable,
-Dict095KeyHashTable,
-Dict095Contents
+Dict100TagHashTable,
+Dict100KeyHashTable,
+Dict100Contents
 };
 
 // ----- SPI-P-GV-CT Release 1 -----
 
-DictEntry Dict096Contents[] = {
+const DictEntry Dict101Contents[] = {
 { 0x0009, 0x0000, 0, VR::LO, VM::M1, "" },
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "" },
 { 0x0009, 0x0020, 0, VR::LO, VM::M1, "" },
@@ -6106,7 +6514,7 @@ DictEntry Dict096Contents[] = {
 { 0x0029, 0x00d1, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict096TagHashTable[] = {
+const unsigned short Dict101TagHashTable[] = {
    57,    60,    69,    74,    56,    56,    56,    56,    79,    86,
    56,    93,    98,   101,    56,    56,   106,   117,   126,   131,
    56,    56,    56,   140,   143,   148,   153,   158,    56,    56,
@@ -6129,7 +6537,7 @@ unsigned short Dict096TagHashTable[] = {
    22,   112,     1,    38,   128,
 };
 
-unsigned short Dict096KeyHashTable[] = {
+const unsigned short Dict101KeyHashTable[] = {
    56,    56,    56,    56,    56,    57,    56,    56,    56,    56,
    56,    56,    56,    56,    56,    56,    56,    56,    56,    56,
    56,    56,    56,    56,    56,    56,    56,    56,    56,    56,
@@ -6149,64 +6557,64 @@ unsigned short Dict096KeyHashTable[] = {
    51,    96,    52,    96,    53,    96,    54,    96,    55,    96,
 };
 
-vtkDICOMDictionary::Dict Dict096Data = {
+vtkDICOMDictionary::Dict Dict101Data = {
 "SPI-P-GV-CT Release 1",
 56,
 56,
-Dict096TagHashTable,
-Dict096KeyHashTable,
-Dict096Contents
+Dict101TagHashTable,
+Dict101KeyHashTable,
+Dict101Contents
 };
 
 // ----- GEMS_ADWSoft_DPO1 -----
 
-DictEntry Dict097Contents[] = {
+const DictEntry Dict102Contents[] = {
 { 0x0039, 0x0095, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict097TagHashTable[] = {
+const unsigned short Dict102TagHashTable[] = {
     2,     0,     1,     0,   149,
 };
 
-unsigned short Dict097KeyHashTable[] = {
+const unsigned short Dict102KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict097Data = {
+vtkDICOMDictionary::Dict Dict102Data = {
 "GEMS_ADWSoft_DPO1",
 1,
 1,
-Dict097TagHashTable,
-Dict097KeyHashTable,
-Dict097Contents
+Dict102TagHashTable,
+Dict102KeyHashTable,
+Dict102Contents
 };
 
 // ----- PHILIPS MR R5.5/PART -----
 
-DictEntry Dict098Contents[] = {
+const DictEntry Dict103Contents[] = {
 { 0x0019, 0x0000, 0, VR::DS, VM::M1, "FieldOfView" },
 };
 
-unsigned short Dict098TagHashTable[] = {
+const unsigned short Dict103TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict098KeyHashTable[] = {
+const unsigned short Dict103KeyHashTable[] = {
     2,     0,     1,     0, 16313,
 };
 
-vtkDICOMDictionary::Dict Dict098Data = {
+vtkDICOMDictionary::Dict Dict103Data = {
 "PHILIPS MR R5.5/PART",
 1,
 1,
-Dict098TagHashTable,
-Dict098KeyHashTable,
-Dict098Contents
+Dict103TagHashTable,
+Dict103KeyHashTable,
+Dict103Contents
 };
 
 // ----- iCAD PK -----
 
-DictEntry Dict099Contents[] = {
+const DictEntry Dict104Contents[] = {
 { 0x3335, 0x0010, 0, VR::LO, VM::M1, "" },
 { 0x3335, 0x0015, 0, VR::LO, VM::M1, "" },
 { 0x3335, 0x0016, 0, VR::LO, VM::M1, "" },
@@ -6274,7 +6682,7 @@ DictEntry Dict099Contents[] = {
 { 0x3335, 0x00c0, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict099TagHashTable[] = {
+const unsigned short Dict104TagHashTable[] = {
    66,    73,    80,    65,    65,    65,    83,    86,    91,    94,
    97,   100,   103,   106,   109,   112,   115,   118,   121,   124,
   127,   130,    65,    65,    65,    65,    65,    65,    65,   135,
@@ -6302,7 +6710,7 @@ unsigned short Dict099TagHashTable[] = {
   113,     1,    20,   114,
 };
 
-unsigned short Dict099KeyHashTable[] = {
+const unsigned short Dict104KeyHashTable[] = {
    65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
    65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
    65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
@@ -6325,18 +6733,18 @@ unsigned short Dict099KeyHashTable[] = {
    82,    62,    82,    63,    82,    64,    82,
 };
 
-vtkDICOMDictionary::Dict Dict099Data = {
+vtkDICOMDictionary::Dict Dict104Data = {
 "iCAD PK",
 65,
 65,
-Dict099TagHashTable,
-Dict099KeyHashTable,
-Dict099Contents
+Dict104TagHashTable,
+Dict104KeyHashTable,
+Dict104Contents
 };
 
 // ----- AGFA_ADC_Compact -----
 
-DictEntry Dict100Contents[] = {
+const DictEntry Dict105Contents[] = {
 { 0x0019, 0x0030, 0, VR::ST, VM::M1, "SetOfDestinationTypes" },
 { 0x0019, 0x0040, 0, VR::ST, VM::M1, "SetOfDestinationIds" },
 { 0x0019, 0x0050, 0, VR::ST, VM::M1, "SetOfProcessingCodes" },
@@ -6351,7 +6759,7 @@ DictEntry Dict100Contents[] = {
 { 0x0019, 0x0095, 0, VR::CS, VM::M1, "ImageQuality" },
 };
 
-unsigned short Dict100TagHashTable[] = {
+const unsigned short Dict105TagHashTable[] = {
    13,    20,    23,    12,    26,    29,    12,    12,    32,    35,
    38,    43,     0,     3,     2,    80,     3,    96,    10,   116,
     1,     4,    97,     1,     5,    98,     1,     1,    64,     1,
@@ -6359,7 +6767,7 @@ unsigned short Dict100TagHashTable[] = {
   114,    11,   149,     1,     9,   115,
 };
 
-unsigned short Dict100KeyHashTable[] = {
+const unsigned short Dict105KeyHashTable[] = {
    13,    16,    21,    12,    12,    24,    31,    12,    34,    37,
    40,    43,     0,     1,     8, 42909,     2,     7, 13980,    11,
 11564,     1,     3, 34741,     3,     2,  8609,     5, 22700,    10,
@@ -6367,18 +6775,18 @@ unsigned short Dict100KeyHashTable[] = {
     1,     9, 47443,     1,     6, 23732,
 };
 
-vtkDICOMDictionary::Dict Dict100Data = {
+vtkDICOMDictionary::Dict Dict105Data = {
 "AGFA_ADC_Compact",
 12,
 12,
-Dict100TagHashTable,
-Dict100KeyHashTable,
-Dict100Contents
+Dict105TagHashTable,
+Dict105KeyHashTable,
+Dict105Contents
 };
 
 // ----- SIEMENS SMS-AX  ACQ 1.0 -----
 
-DictEntry Dict101Contents[] = {
+const DictEntry Dict106Contents[] = {
 { 0x0021, 0x0000, 0, VR::US, VM::M1, "AcquisitionType" },
 { 0x0021, 0x0001, 0, VR::US, VM::M1, "AcquisitionMode" },
 { 0x0021, 0x0002, 0, VR::US, VM::M1, "FootswitchIndex" },
@@ -6472,7 +6880,7 @@ DictEntry Dict101Contents[] = {
 { 0x0021, 0x00A6, 0, VR::FD, VM::M1, "ThreeDRRIntervalTimeMeasured" },
 };
 
-unsigned short Dict101TagHashTable[] = {
+const unsigned short Dict106TagHashTable[] = {
    92,    95,    98,   101,    91,   104,   109,   114,   119,   124,
   129,   134,   139,   142,   145,    91,    91,   148,    91,    91,
    91,    91,   151,   154,   157,   160,   163,   168,   173,   178,
@@ -6510,7 +6918,7 @@ unsigned short Dict101TagHashTable[] = {
   114,
 };
 
-unsigned short Dict101KeyHashTable[] = {
+const unsigned short Dict106KeyHashTable[] = {
    92,    95,    91,    98,   103,    91,    91,   106,   111,    91,
    91,    91,   114,    91,   119,   122,    91,    91,   125,   128,
    91,   133,    91,   136,   139,    91,   146,   149,   152,    91,
@@ -6547,41 +6955,41 @@ unsigned short Dict101KeyHashTable[] = {
    90, 10165,
 };
 
-vtkDICOMDictionary::Dict Dict101Data = {
+vtkDICOMDictionary::Dict Dict106Data = {
 "SIEMENS SMS-AX  ACQ 1.0",
 91,
 91,
-Dict101TagHashTable,
-Dict101KeyHashTable,
-Dict101Contents
+Dict106TagHashTable,
+Dict106KeyHashTable,
+Dict106Contents
 };
 
 // ----- SPI-P-CTBE-Private Release 1 -----
 
-DictEntry Dict102Contents[] = {
+const DictEntry Dict107Contents[] = {
 { 0x0021, 0x0000, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict102TagHashTable[] = {
+const unsigned short Dict107TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict102KeyHashTable[] = {
+const unsigned short Dict107KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict102Data = {
+vtkDICOMDictionary::Dict Dict107Data = {
 "SPI-P-CTBE-Private Release 1",
 1,
 1,
-Dict102TagHashTable,
-Dict102KeyHashTable,
-Dict102Contents
+Dict107TagHashTable,
+Dict107KeyHashTable,
+Dict107Contents
 };
 
 // ----- SIEMENS SYNGO VOLUME -----
 
-DictEntry Dict103Contents[] = {
+const DictEntry Dict108Contents[] = {
 { 0x0029, 0x0012, 0, VR::US, VM::M1, "Slices" },
 { 0x0029, 0x0014, 0, VR::OB, VM::M1, "VolumeHistogram" },
 { 0x0029, 0x0018, 0, VR::IS, VM::M1, "VolumeLevel" },
@@ -6595,7 +7003,7 @@ DictEntry Dict103Contents[] = {
 { 0x0029, 0x0047, 0, VR::OB, VM::M1, "VolumeHistogramData" },
 };
 
-unsigned short Dict103TagHashTable[] = {
+const unsigned short Dict108TagHashTable[] = {
    12,    15,    11,    18,    21,    24,    31,    34,    37,    40,
    11,     0,     1,     9,    70,     1,    10,    71,     1,     3,
    48,     1,     0,    18,     3,     2,    24,     4,    50,     6,
@@ -6603,7 +7011,7 @@ unsigned short Dict103TagHashTable[] = {
     1,     8,    68,
 };
 
-unsigned short Dict103KeyHashTable[] = {
+const unsigned short Dict108KeyHashTable[] = {
    11,    12,    15,    20,    23,    26,    29,    32,    11,    35,
    40,     0,     1,     0,  4789,     2,     1, 59707,     5, 17396,
     1,    10, 10630,     1,     6, 13799,     1,     9,  1256,     1,
@@ -6611,18 +7019,18 @@ unsigned short Dict103KeyHashTable[] = {
     1,     7, 30644,
 };
 
-vtkDICOMDictionary::Dict Dict103Data = {
+vtkDICOMDictionary::Dict Dict108Data = {
 "SIEMENS SYNGO VOLUME",
 11,
 11,
-Dict103TagHashTable,
-Dict103KeyHashTable,
-Dict103Contents
+Dict108TagHashTable,
+Dict108KeyHashTable,
+Dict108Contents
 };
 
 // ----- Applicare/RadWorks/Version 6.0 -----
 
-DictEntry Dict104Contents[] = {
+const DictEntry Dict109Contents[] = {
 { 0x4103, 0x0001, 0, VR::AT, VM::M1TN, "NonExistentTags" },
 { 0x4103, 0x0002, 0, VR::UI, VM::M1TN, "NonExistentObjects" },
 { 0x4105, 0x0001, 0, VR::CS, VM::M1, "AnnotationType" },
@@ -6643,7 +7051,7 @@ DictEntry Dict104Contents[] = {
 { 0x4107, 0x0001, 0, VR::SQ, VM::M1, "RequestedPaletteColorLUT" },
 };
 
-unsigned short Dict104TagHashTable[] = {
+const unsigned short Dict109TagHashTable[] = {
    18,    19,    18,    22,    25,    18,    28,    33,    36,    39,
    44,    49,    52,    55,    58,    61,    64,    67,     0,     1,
    15,    14,     1,    16,    16,     1,     2,     1,     2,     4,
@@ -6653,7 +7061,7 @@ unsigned short Dict104TagHashTable[] = {
    11,     1,    11,    10,     1,    14,    13,     1,    13,    12,
 };
 
-unsigned short Dict104KeyHashTable[] = {
+const unsigned short Dict109KeyHashTable[] = {
    18,    19,    18,    22,    25,    28,    31,    36,    39,    42,
    45,    50,    18,    55,    58,    18,    18,    63,     0,     1,
     7, 42844,     1,    13, 28566,     1,     9, 57638,     1,    12,
@@ -6663,23 +7071,26 @@ unsigned short Dict104KeyHashTable[] = {
 60586,     8, 10865,     2,     6, 36303,    16,   298,
 };
 
-vtkDICOMDictionary::Dict Dict104Data = {
+vtkDICOMDictionary::Dict Dict109Data = {
 "Applicare/RadWorks/Version 6.0",
 18,
 18,
-Dict104TagHashTable,
-Dict104KeyHashTable,
-Dict104Contents
+Dict109TagHashTable,
+Dict109KeyHashTable,
+Dict109Contents
 };
 
 // ----- SIEMENS MED SP DXMG WH AWS 1 -----
 
-DictEntry Dict105Contents[] = {
+const DictEntry Dict110Contents[] = {
 { 0x0019, 0x0001, 0, VR::UL, VM::M1TN, "AECCoordinates" },
 { 0x0019, 0x0002, 0, VR::US, VM::M2, "AECCoordinatesSize" },
 { 0x0019, 0x0010, 0, VR::ST, VM::M1, "DerivationDescription" },
 { 0x0041, 0x0002, 0, VR::SH, VM::M1, "ReasonForTheRequestedProcedure" },
 { 0x0051, 0x0010, 0, VR::DS, VM::M1, "" },
+{ 0x0051, 0x0020, 0, VR::DS, VM::M1TN, "" },
+{ 0x0051, 0x0021, 0, VR::LO, VM::M1, "" },
+{ 0x0051, 0x0032, 0, VR::DS, VM::M3, "" },
 { 0x0051, 0x0037, 0, VR::DS, VM::M6, "" },
 { 0x0051, 0x0050, 0, VR::UI, VM::M1, "" },
 { 0x0051, 0x0060, 0, VR::DS, VM::M1, "PrimaryPositionerScanArc" },
@@ -6691,58 +7102,61 @@ DictEntry Dict105Contents[] = {
 { 0x0055, 0x0001, 0, VR::LO, VM::M1, "ProjectionViewDisplayString" },
 };
 
-unsigned short Dict105TagHashTable[] = {
-   14,    15,    14,    14,    14,    20,    23,    26,    29,    34,
-   39,    46,    14,    49,     0,     2,     6,    80,    13,     1,
-    1,     5,    55,     1,     8,    97,     1,     7,    96,     2,
-    4,    16,    10,    99,     2,     2,    16,     9,    98,     3,
-    0,     1,     3,     2,    12,   101,     1,    11,   100,     1,
-    1,     2,
+const unsigned short Dict110TagHashTable[] = {
+   18,    23,    30,    17,    17,    17,    17,    33,    17,    36,
+   39,    44,    17,    47,    52,    55,    60,     0,     2,    12,
+   98,    16,     1,     3,     8,    55,     9,    80,    15,   101,
+    1,    14,   100,     1,     0,     1,     1,     2,    16,     2,
+    1,     2,     5,    32,     1,     6,    33,     2,     4,    16,
+    7,    50,     1,    11,    97,     2,     3,     2,    10,    96,
+    1,    13,    99,
 };
 
-unsigned short Dict105KeyHashTable[] = {
-   15,    20,    14,    23,    26,    33,    14,    14,    14,    14,
-   42,    14,    47,    14,     0,     2,     2, 11785,     8, 40534,
-    1,    10, 58671,     1,     0, 32133,     3,     1, 64000,    11,
-22717,    13,   709,     4,     4,   384,     5,   384,     6,   384,
-    9, 25667,     2,     7, 33413,    12, 52822,     1,     3, 45982,
+const unsigned short Dict110KeyHashTable[] = {
+   18,    17,    17,    23,    28,    31,    34,    17,    17,    37,
+   17,    52,    55,    17,    58,    17,    17,     0,     2,    10,
+15952,    16, 58410,     2,     0, 61158,    12, 44268,     1,    14,
+10998,     1,    15, 58921,     1,    11, 60366,     7,     2, 25125,
+    4,   316,     5,   316,     6,   316,     7,   316,     8,   316,
+    9,   316,     1,     1, 21865,     1,    13,  5911,     1,     3,
+10882,
 };
 
-vtkDICOMDictionary::Dict Dict105Data = {
+vtkDICOMDictionary::Dict Dict110Data = {
 "SIEMENS MED SP DXMG WH AWS 1",
-14,
-14,
-Dict105TagHashTable,
-Dict105KeyHashTable,
-Dict105Contents
+17,
+17,
+Dict110TagHashTable,
+Dict110KeyHashTable,
+Dict110Contents
 };
 
 // ----- SIEMENS MR PS 04 -----
 
-DictEntry Dict106Contents[] = {
+const DictEntry Dict111Contents[] = {
 { 0x0021, 0x0001, 0, VR::FD, VM::M1TN, "" },
 };
 
-unsigned short Dict106TagHashTable[] = {
+const unsigned short Dict111TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict106KeyHashTable[] = {
+const unsigned short Dict111KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict106Data = {
+vtkDICOMDictionary::Dict Dict111Data = {
 "SIEMENS MR PS 04",
 1,
 1,
-Dict106TagHashTable,
-Dict106KeyHashTable,
-Dict106Contents
+Dict111TagHashTable,
+Dict111KeyHashTable,
+Dict111Contents
 };
 
 // ----- GEMS_Ultrasound_MovieGroup_001 -----
 
-DictEntry Dict107Contents[] = {
+const DictEntry Dict112Contents[] = {
 { 0x7fe1, 0x0001, 0, VR::SQ, VM::M1, "" },
 { 0x7fe1, 0x0002, 0, VR::LO, VM::M1, "" },
 { 0x7fe1, 0x0003, 0, VR::UL, VM::M1, "" },
@@ -6788,7 +7202,7 @@ DictEntry Dict107Contents[] = {
 { 0x7fe1, 0x0088, 0, VR::FD, VM::M1, "" },
 };
 
-unsigned short Dict107TagHashTable[] = {
+const unsigned short Dict112TagHashTable[] = {
    43,    43,    44,    47,    52,    43,    57,    60,    43,    65,
    43,    43,    68,    43,    43,    43,    43,    43,    73,    76,
    79,    82,    85,    43,    88,    91,    96,    99,   102,   107,
@@ -6807,7 +7221,7 @@ unsigned short Dict107TagHashTable[] = {
    15,    60,    20,    82,     1,    19,    81,     1,    14,    58,
 };
 
-unsigned short Dict107KeyHashTable[] = {
+const unsigned short Dict112KeyHashTable[] = {
    43,    43,    43,    43,    43,    43,    44,    43,    43,    43,
    43,    43,    43,    43,    43,    43,    43,    43,    43,    43,
    43,    43,    43,    43,    43,    43,    43,    43,    43,    43,
@@ -6824,18 +7238,18 @@ unsigned short Dict107KeyHashTable[] = {
   125,
 };
 
-vtkDICOMDictionary::Dict Dict107Data = {
+vtkDICOMDictionary::Dict Dict112Data = {
 "GEMS_Ultrasound_MovieGroup_001",
 43,
 43,
-Dict107TagHashTable,
-Dict107KeyHashTable,
-Dict107Contents
+Dict112TagHashTable,
+Dict112KeyHashTable,
+Dict112Contents
 };
 
 // ----- CARESTREAM IMAGE INFORMATION -----
 
-DictEntry Dict108Contents[] = {
+const DictEntry Dict113Contents[] = {
 { 0x0029, 0x0015, 0, VR::LO, VM::M1, "" },
 { 0x0029, 0x0016, 0, VR::LO, VM::M1, "" },
 { 0x0029, 0x0017, 0, VR::LO, VM::M1, "" },
@@ -6845,30 +7259,30 @@ DictEntry Dict108Contents[] = {
 { 0x0029, 0x001b, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict108TagHashTable[] = {
+const unsigned short Dict113TagHashTable[] = {
     8,    13,    16,     7,    19,     7,    22,     0,     2,     1,
    22,     3,    24,     1,     6,    27,     1,     5,    26,     1,
     0,    21,     2,     2,    23,     4,    25,
 };
 
-unsigned short Dict108KeyHashTable[] = {
+const unsigned short Dict113KeyHashTable[] = {
     7,     7,     7,     7,     7,     8,     7,     0,     7,     0,
   768,     1,   768,     2,   768,     3,   768,     4,   768,     5,
   768,     6,   768,
 };
 
-vtkDICOMDictionary::Dict Dict108Data = {
+vtkDICOMDictionary::Dict Dict113Data = {
 "CARESTREAM IMAGE INFORMATION",
 7,
 7,
-Dict108TagHashTable,
-Dict108KeyHashTable,
-Dict108Contents
+Dict113TagHashTable,
+Dict113KeyHashTable,
+Dict113Contents
 };
 
 // ----- GEMS_DL_STUDY_01 -----
 
-DictEntry Dict109Contents[] = {
+const DictEntry Dict114Contents[] = {
 { 0x0015, 0x0080, 0, VR::DS, VM::M1, "StudyDose" },
 { 0x0015, 0x0081, 0, VR::DS, VM::M1, "StudyTotalDap" },
 { 0x0015, 0x0082, 0, VR::DS, VM::M1, "FluoroDoseAreaProduct" },
@@ -6896,7 +7310,7 @@ DictEntry Dict109Contents[] = {
 { 0x0015, 0x009d, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict109TagHashTable[] = {
+const unsigned short Dict114TagHashTable[] = {
    26,    29,    32,    35,    40,    43,    46,    51,    56,    61,
    25,    25,    25,    64,    67,    70,    73,    76,    79,    25,
    82,    85,    88,    91,    94,     0,     1,     1,   129,     1,
@@ -6909,7 +7323,7 @@ unsigned short Dict109TagHashTable[] = {
   132,     1,     3,   131,     1,     2,   130,
 };
 
-unsigned short Dict109KeyHashTable[] = {
+const unsigned short Dict114KeyHashTable[] = {
    25,    25,    26,    25,    31,    36,    39,    25,    25,    25,
    25,    25,    68,    25,    25,    25,    71,    76,    25,    79,
    82,    25,    25,    25,    25,     0,     2,     0,  7999,     8,
@@ -6921,18 +7335,18 @@ unsigned short Dict109KeyHashTable[] = {
     2, 47198,     1,     3, 31344,
 };
 
-vtkDICOMDictionary::Dict Dict109Data = {
+vtkDICOMDictionary::Dict Dict114Data = {
 "GEMS_DL_STUDY_01",
 25,
 25,
-Dict109TagHashTable,
-Dict109KeyHashTable,
-Dict109Contents
+Dict114TagHashTable,
+Dict114KeyHashTable,
+Dict114Contents
 };
 
 // ----- Silhouette VRS 3.0 -----
 
-DictEntry Dict110Contents[] = {
+const DictEntry Dict115Contents[] = {
 { 0x0029, 0x0013, 0, VR::UN, VM::M1, "" },
 { 0x0029, 0x0014, 0, VR::UN, VM::M1, "" },
 { 0x0029, 0x0017, 0, VR::UN, VM::M1, "" },
@@ -6952,7 +7366,7 @@ DictEntry Dict110Contents[] = {
 { 0x0029, 0x0036, 0, VR::US, VM::M1, "" },
 };
 
-unsigned short Dict110TagHashTable[] = {
+const unsigned short Dict115TagHashTable[] = {
    18,    21,    26,    17,    29,    17,    17,    32,    35,    17,
    38,    43,    48,    17,    51,    58,    61,     0,     1,     5,
    26,     2,     8,    29,    11,    40,     1,     7,    28,     1,
@@ -6962,7 +7376,7 @@ unsigned short Dict110TagHashTable[] = {
    24,     1,     6,    27,
 };
 
-unsigned short Dict110KeyHashTable[] = {
+const unsigned short Dict115KeyHashTable[] = {
    17,    17,    17,    17,    17,    17,    17,    17,    17,    18,
    17,    17,    17,    17,    17,    17,    17,     0,    17,     0,
   316,     1,   316,     2,   316,     3,   316,     4,   316,     5,
@@ -6971,18 +7385,18 @@ unsigned short Dict110KeyHashTable[] = {
   316,    16,   316,
 };
 
-vtkDICOMDictionary::Dict Dict110Data = {
+vtkDICOMDictionary::Dict Dict115Data = {
 "Silhouette VRS 3.0",
 17,
 17,
-Dict110TagHashTable,
-Dict110KeyHashTable,
-Dict110Contents
+Dict115TagHashTable,
+Dict115KeyHashTable,
+Dict115Contents
 };
 
 // ----- GEMS_HELIOS_01 -----
 
-DictEntry Dict111Contents[] = {
+const DictEntry Dict116Contents[] = {
 { 0x0045, 0x0001, 0, VR::SS, VM::M1, "NumberOfMacroRowsInDetector" },
 { 0x0045, 0x0002, 0, VR::FL, VM::M1, "MacroWidthAtISOCenter" },
 { 0x0045, 0x0003, 0, VR::SS, VM::M1, "DASType" },
@@ -7023,7 +7437,7 @@ DictEntry Dict111Contents[] = {
 { 0x0045, 0x0045, 0, VR::ST, VM::M1, "CardiacScanOptions" },
 };
 
-unsigned short Dict111TagHashTable[] = {
+const unsigned short Dict116TagHashTable[] = {
    39,    46,    53,    58,    63,    68,    73,    76,    79,    82,
    87,    92,    38,    97,    38,    38,   100,    38,    38,    38,
    38,    38,    38,    38,    38,   103,   106,   111,   114,   117,
@@ -7041,7 +7455,7 @@ unsigned short Dict111TagHashTable[] = {
    15,
 };
 
-unsigned short Dict111KeyHashTable[] = {
+const unsigned short Dict116KeyHashTable[] = {
    39,    38,    38,    38,    44,    38,    38,    53,    58,    38,
    38,    38,    61,    38,    64,    69,    74,    79,    38,    84,
    38,    87,    38,    90,    38,    38,    93,    96,    99,    38,
@@ -7058,18 +7472,18 @@ unsigned short Dict111KeyHashTable[] = {
    34, 31006,     1,    10, 65035,
 };
 
-vtkDICOMDictionary::Dict Dict111Data = {
+vtkDICOMDictionary::Dict Dict116Data = {
 "GEMS_HELIOS_01",
 38,
 38,
-Dict111TagHashTable,
-Dict111KeyHashTable,
-Dict111Contents
+Dict116TagHashTable,
+Dict116KeyHashTable,
+Dict116Contents
 };
 
 // ----- Kodak Image Information -----
 
-DictEntry Dict112Contents[] = {
+const DictEntry Dict117Contents[] = {
 { 0x0029, 0x0015, 0, VR::LO, VM::M1, "" },
 { 0x0029, 0x0016, 0, VR::LO, VM::M1, "" },
 { 0x0029, 0x0017, 0, VR::LO, VM::M1, "" },
@@ -7078,29 +7492,29 @@ DictEntry Dict112Contents[] = {
 { 0x0029, 0x001a, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict112TagHashTable[] = {
+const unsigned short Dict117TagHashTable[] = {
     7,    12,    15,    18,     6,     6,     0,     2,     0,    21,
     4,    25,     1,     3,    24,     1,     2,    23,     2,     1,
    22,     5,    26,
 };
 
-unsigned short Dict112KeyHashTable[] = {
+const unsigned short Dict117KeyHashTable[] = {
     6,     6,     6,     6,     6,     7,     0,     6,     0,   896,
     1,   896,     2,   896,     3,   896,     4,   896,     5,   896,
 };
 
-vtkDICOMDictionary::Dict Dict112Data = {
+vtkDICOMDictionary::Dict Dict117Data = {
 "Kodak Image Information",
 6,
 6,
-Dict112TagHashTable,
-Dict112KeyHashTable,
-Dict112Contents
+Dict117TagHashTable,
+Dict117KeyHashTable,
+Dict117Contents
 };
 
 // ----- QUASAR_INTERNAL_USE -----
 
-DictEntry Dict113Contents[] = {
+const DictEntry Dict118Contents[] = {
 { 0x0009, 0x0001, 0, VR::UL, VM::M1TN, "RateVector" },
 { 0x0009, 0x0002, 0, VR::UL, VM::M1TN, "CountVector" },
 { 0x0009, 0x0003, 0, VR::UL, VM::M1TN, "TimeVector" },
@@ -7145,7 +7559,7 @@ DictEntry Dict113Contents[] = {
 { 0x0041, 0x0001, 0, VR::UT, VM::M1, "" },
 };
 
-unsigned short Dict113TagHashTable[] = {
+const unsigned short Dict118TagHashTable[] = {
    43,    46,    51,    42,    42,    42,    56,    59,    62,    42,
    65,    68,    42,    42,    71,    42,    74,    77,    80,    85,
    88,    42,    91,    94,    99,   102,   105,   110,   115,   120,
@@ -7164,7 +7578,7 @@ unsigned short Dict113TagHashTable[] = {
    28,    16,    39,   144,     1,    40,   146,
 };
 
-unsigned short Dict113KeyHashTable[] = {
+const unsigned short Dict118KeyHashTable[] = {
    42,    43,    42,    42,    42,    46,    42,    99,   102,   107,
    42,    42,    42,    42,   114,   119,    42,    42,    42,    42,
    42,    42,    42,    42,    42,    42,    42,   124,    42,    42,
@@ -7181,41 +7595,41 @@ unsigned short Dict113KeyHashTable[] = {
     1,     9,  8070,     1,    11,  5450,     1,     3, 63967,
 };
 
-vtkDICOMDictionary::Dict Dict113Data = {
+vtkDICOMDictionary::Dict Dict118Data = {
 "QUASAR_INTERNAL_USE",
 42,
 42,
-Dict113TagHashTable,
-Dict113KeyHashTable,
-Dict113Contents
+Dict118TagHashTable,
+Dict118KeyHashTable,
+Dict118Contents
 };
 
 // ----- VEPRO BROKER 1.0 -----
 
-DictEntry Dict114Contents[] = {
+const DictEntry Dict119Contents[] = {
 { 0x0057, 0x0010, 0, VR::SQ, VM::M1, "DataReplaceSequence" },
 };
 
-unsigned short Dict114TagHashTable[] = {
+const unsigned short Dict119TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict114KeyHashTable[] = {
+const unsigned short Dict119KeyHashTable[] = {
     2,     0,     1,     0, 61012,
 };
 
-vtkDICOMDictionary::Dict Dict114Data = {
+vtkDICOMDictionary::Dict Dict119Data = {
 "VEPRO BROKER 1.0",
 1,
 1,
-Dict114TagHashTable,
-Dict114KeyHashTable,
-Dict114Contents
+Dict119TagHashTable,
+Dict119KeyHashTable,
+Dict119Contents
 };
 
 // ----- SIEMENS CT VA0  COAD -----
 
-DictEntry Dict115Contents[] = {
+const DictEntry Dict120Contents[] = {
 { 0x0019, 0x0010, 0, VR::IS, VM::M1, "DistanceSourceToSourceSideCollimator" },
 { 0x0019, 0x0011, 0, VR::IS, VM::M1, "DistanceSourceToDetectorSideCollimator" },
 { 0x0019, 0x0020, 0, VR::IS, VM::M1, "NumberOfPossibleChannels" },
@@ -7267,7 +7681,7 @@ DictEntry Dict115Contents[] = {
 { 0x0019, 0x00c5, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict115TagHashTable[] = {
+const unsigned short Dict120TagHashTable[] = {
    49,    49,    49,    49,    49,    49,    50,    55,    60,    67,
    72,    49,    75,    49,    49,    49,    49,    78,    81,    84,
    87,    90,    93,    98,   103,   106,   109,   112,   119,   122,
@@ -7289,7 +7703,7 @@ unsigned short Dict115TagHashTable[] = {
     1,    21,   148,
 };
 
-unsigned short Dict115KeyHashTable[] = {
+const unsigned short Dict120KeyHashTable[] = {
    49,    49,    50,    53,    49,    56,    59,    49,    49,    62,
    49,    49,    49,    65,    49,    49,    68,    75,    49,    49,
    80,    49,    83,    86,    91,    49,    49,    49,    94,    49,
@@ -7309,152 +7723,193 @@ unsigned short Dict115KeyHashTable[] = {
 16906,     2,     4, 42439,    22, 57762,     1,    40, 62864,
 };
 
-vtkDICOMDictionary::Dict Dict115Data = {
+vtkDICOMDictionary::Dict Dict120Data = {
 "SIEMENS CT VA0  COAD",
 49,
 49,
-Dict115TagHashTable,
-Dict115KeyHashTable,
-Dict115Contents
+Dict120TagHashTable,
+Dict120KeyHashTable,
+Dict120Contents
 };
 
 // ----- PHILIPS MR -----
 
-DictEntry Dict116Contents[] = {
+const DictEntry Dict121Contents[] = {
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "SPIRelease" },
 { 0x0009, 0x0012, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict116TagHashTable[] = {
+const unsigned short Dict121TagHashTable[] = {
     2,     3,     0,     2,     0,    16,     1,    18,
 };
 
-unsigned short Dict116KeyHashTable[] = {
+const unsigned short Dict121KeyHashTable[] = {
     3,     6,     0,     1,     0, 59817,     1,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict116Data = {
+vtkDICOMDictionary::Dict Dict121Data = {
 "PHILIPS MR",
 2,
 2,
-Dict116TagHashTable,
-Dict116KeyHashTable,
-Dict116Contents
+Dict121TagHashTable,
+Dict121KeyHashTable,
+Dict121Contents
 };
 
 // ----- MeVis BreastCare -----
 
-DictEntry Dict117Contents[] = {
+const DictEntry Dict122Contents[] = {
 { 0x0019, 0x0001, 0, VR::LO, VM::M1, "AnnotationVersion" },
 { 0x0071, 0x0001, 0, VR::LO, VM::M1, "XMLFormattedTextValue" },
 };
 
-unsigned short Dict117TagHashTable[] = {
+const unsigned short Dict122TagHashTable[] = {
     3,     6,     0,     1,     0,     1,     1,     1,     1,
 };
 
-unsigned short Dict117KeyHashTable[] = {
+const unsigned short Dict122KeyHashTable[] = {
     3,     2,     0,     2,     0,  6835,     1, 62111,
 };
 
-vtkDICOMDictionary::Dict Dict117Data = {
+vtkDICOMDictionary::Dict Dict122Data = {
 "MeVis BreastCare",
 2,
 2,
-Dict117TagHashTable,
-Dict117KeyHashTable,
-Dict117Contents
+Dict122TagHashTable,
+Dict122KeyHashTable,
+Dict122Contents
+};
+
+// ----- GEMS_MR_RAW_01 -----
+
+const DictEntry Dict123Contents[] = {
+{ 0x7001, 0x1001, 0, VR::OB, VM::M1, "Rdb_hdr_rec" },
+{ 0x7001, 0x1002, 0, VR::OB, VM::M1, "Rdb_hdr_per_pass_tab" },
+{ 0x7001, 0x1003, 0, VR::OB, VM::M1, "Rdb_hdr_unlock_raw" },
+{ 0x7001, 0x1004, 0, VR::OB, VM::M1, "Rdb_hdr_data_acq_tab" },
+{ 0x7001, 0x1005, 0, VR::OB, VM::M1, "Rdb_hdr_nex_tab" },
+{ 0x7001, 0x1006, 0, VR::OB, VM::M1, "Rdb_hdr_nex_abort_tab" },
+{ 0x7001, 0x1007, 0, VR::OB, VM::M1, "Rdb_hdr_tool" },
+{ 0x7001, 0x1008, 0, VR::OB, VM::M1, "Rdb_raw_data" },
+{ 0x7001, 0x1009, 0, VR::OB, VM::M1, "SSPSave" },
+{ 0x7001, 0x100A, 0, VR::OB, VM::M1, "UDASave" },
+{ 0x7001, 0x100B, 0, VR::OB, VM::M1, "Rdb_chemsat_data" },
+};
+
+const unsigned short Dict123TagHashTable[] = {
+   12,    15,    11,    20,    23,    26,    29,    32,    35,    38,
+   41,     0,     1,    10,  4107,     2,     0,  4097,     9,  4106,
+    1,     2,  4099,     1,     1,  4098,     1,     4,  4101,     1,
+    3,  4100,     1,     6,  4103,     1,     5,  4102,     1,     8,
+ 4105,     1,     7,  4104,
+};
+
+const unsigned short Dict123KeyHashTable[] = {
+   11,    11,    11,    12,    15,    20,    25,    28,    31,    36,
+   39,     0,     1,     3, 23886,     2,     0,  7693,     9, 11838,
+    2,     5, 37924,     6, 11222,     1,     2, 46296,     1,    10,
+11129,     2,     4, 38678,     8,  1958,     1,     7, 19522,     1,
+    1, 12326,
+};
+
+vtkDICOMDictionary::Dict Dict123Data = {
+"GEMS_MR_RAW_01",
+11,
+11,
+Dict123TagHashTable,
+Dict123KeyHashTable,
+Dict123Contents
 };
 
 // ----- VEPRO VIF 3.0 DATA -----
 
-DictEntry Dict118Contents[] = {
+const DictEntry Dict124Contents[] = {
 { 0x0055, 0x0020, 0, VR::OB, VM::M1, "" },
 { 0x0055, 0x0030, 0, VR::OB, VM::M1, "IconData" },
 { 0x0055, 0x0065, 0, VR::OB, VM::M1, "ImageHashValue" },
 };
 
-unsigned short Dict118TagHashTable[] = {
+const unsigned short Dict124TagHashTable[] = {
     4,     7,    10,     0,     1,     2,   101,     1,     1,    48,
     1,     0,    32,
 };
 
-unsigned short Dict118KeyHashTable[] = {
+const unsigned short Dict124KeyHashTable[] = {
     4,     3,     7,     0,     1,     2, 33635,     2,     0,  1793,
     1, 56642,
 };
 
-vtkDICOMDictionary::Dict Dict118Data = {
+vtkDICOMDictionary::Dict Dict124Data = {
 "VEPRO VIF 3.0 DATA",
 3,
 3,
-Dict118TagHashTable,
-Dict118KeyHashTable,
-Dict118Contents
+Dict124TagHashTable,
+Dict124KeyHashTable,
+Dict124Contents
 };
 
 // ----- MeVis eatDicom -----
 
-DictEntry Dict119Contents[] = {
+const DictEntry Dict125Contents[] = {
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "eatDicomVersion" },
 { 0x0009, 0x0011, 0, VR::ST, VM::M1, "eatDicomOptions" },
 };
 
-unsigned short Dict119TagHashTable[] = {
+const unsigned short Dict125TagHashTable[] = {
     3,     6,     0,     1,     1,    17,     1,     0,    16,
 };
 
-unsigned short Dict119KeyHashTable[] = {
+const unsigned short Dict125KeyHashTable[] = {
     2,     3,     0,     2,     0, 24984,     1, 21435,
 };
 
-vtkDICOMDictionary::Dict Dict119Data = {
+vtkDICOMDictionary::Dict Dict125Data = {
 "MeVis eatDicom",
 2,
 2,
-Dict119TagHashTable,
-Dict119KeyHashTable,
-Dict119Contents
+Dict125TagHashTable,
+Dict125KeyHashTable,
+Dict125Contents
 };
 
 // ----- DIGISCAN IMAGE -----
 
-DictEntry Dict120Contents[] = {
+const DictEntry Dict126Contents[] = {
 { 0x0029, 0x0031, 0, VR::US, VM::M1TN, "" },
 { 0x0029, 0x0032, 0, VR::US, VM::M1TN, "" },
 { 0x0029, 0x0033, 0, VR::LO, VM::M1, "" },
 { 0x0029, 0x0034, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict120TagHashTable[] = {
+const unsigned short Dict126TagHashTable[] = {
     5,     8,    11,    14,     0,     1,     0,    49,     1,     3,
    52,     1,     2,    51,     1,     1,    50,
 };
 
-unsigned short Dict120KeyHashTable[] = {
+const unsigned short Dict126KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict120Data = {
+vtkDICOMDictionary::Dict Dict126Data = {
 "DIGISCAN IMAGE",
 4,
 4,
-Dict120TagHashTable,
-Dict120KeyHashTable,
-Dict120Contents
+Dict126TagHashTable,
+Dict126KeyHashTable,
+Dict126Contents
 };
 
 // ----- MITRA OBJECT UTF8 ATTRIBUTES 1.0 -----
 
-DictEntry Dict121Contents[] = {
-{ 0x0033, 0x0002, 0, VR::OB, VM::M1, "" },
-{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "" },
-{ 0x0033, 0x0006, 0, VR::OB, VM::M1, "" },
-{ 0x0033, 0x0008, 0, VR::OB, VM::M1, "" },
-{ 0x0033, 0x000a, 0, VR::OB, VM::M1, "" },
-{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "" },
-{ 0x0033, 0x000e, 0, VR::OB, VM::M1, "" },
+const DictEntry Dict127Contents[] = {
+{ 0x0033, 0x0002, 0, VR::PN, VM::M1, "PatientNameUTF8Encoded" },
+{ 0x0033, 0x0004, 0, VR::CS, VM::M1, "StudyDescriptionUTF8Encoded" },
+{ 0x0033, 0x0006, 0, VR::PN, VM::M1, "ReferringPhysicianNameUTF8Encoded" },
+{ 0x0033, 0x0008, 0, VR::PN, VM::M1, "RequestingPhysicianNameUTF8Encoded" },
+{ 0x0033, 0x000a, 0, VR::PN, VM::M1, "PerformingPhysicianNameUTF8Encoded" },
+{ 0x0033, 0x000c, 0, VR::LO, VM::M1, "ReasonForStudyUTF8Encoded" },
+{ 0x0033, 0x000e, 0, VR::LO, VM::M1, "StudyCommentsUTF8Encoded" },
 { 0x0033, 0x0013, 0, VR::PN, VM::M1, "" },
 { 0x0033, 0x0014, 0, VR::OB, VM::M1, "" },
 { 0x0033, 0x0015, 0, VR::OB, VM::M1, "" },
@@ -7462,7 +7917,7 @@ DictEntry Dict121Contents[] = {
 { 0x0033, 0x0019, 0, VR::PN, VM::M1, "" },
 };
 
-unsigned short Dict121TagHashTable[] = {
+const unsigned short Dict127TagHashTable[] = {
    12,    13,    20,    23,    12,    28,    31,    34,    37,    40,
    12,    43,     0,     3,     0,     2,     6,    14,    10,    22,
     1,     9,    21,     2,     5,    12,     8,    20,     1,     2,
@@ -7470,49 +7925,50 @@ unsigned short Dict121TagHashTable[] = {
     1,     4,    10,     1,     3,     8,
 };
 
-unsigned short Dict121KeyHashTable[] = {
-   12,    12,    12,    12,    12,    13,    12,    12,    12,    12,
-   12,    12,     0,    12,     0,   448,     1,   448,     2,   448,
-    3,   448,     4,   448,     5,   448,     6,   448,     7,   448,
-    8,   448,     9,   448,    10,   448,    11,   448,
+const unsigned short Dict127KeyHashTable[] = {
+   13,    16,    19,    12,    12,    22,    33,    36,    39,    12,
+   12,    42,     0,     1,     4, 22592,     1,     6, 57109,     1,
+    5, 52851,     5,     7,   448,     8,   448,     9,   448,    10,
+  448,    11,   448,     1,     3,  2102,     1,     1, 45511,     1,
+    0, 33809,     1,     2, 23768,
 };
 
-vtkDICOMDictionary::Dict Dict121Data = {
+vtkDICOMDictionary::Dict Dict127Data = {
 "MITRA OBJECT UTF8 ATTRIBUTES 1.0",
 12,
 12,
-Dict121TagHashTable,
-Dict121KeyHashTable,
-Dict121Contents
+Dict127TagHashTable,
+Dict127KeyHashTable,
+Dict127Contents
 };
 
 // ----- GEMS_Ultrasound_ExamGroup_001 -----
 
-DictEntry Dict122Contents[] = {
+const DictEntry Dict128Contents[] = {
 { 0x6005, 0x0010, 0, VR::UT, VM::M1, "" },
 { 0x6005, 0x0020, 0, VR::UT, VM::M1, "" },
 };
 
-unsigned short Dict122TagHashTable[] = {
+const unsigned short Dict128TagHashTable[] = {
     2,     3,     0,     2,     0,    16,     1,    32,
 };
 
-unsigned short Dict122KeyHashTable[] = {
+const unsigned short Dict128KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict122Data = {
+vtkDICOMDictionary::Dict Dict128Data = {
 "GEMS_Ultrasound_ExamGroup_001",
 2,
 2,
-Dict122TagHashTable,
-Dict122KeyHashTable,
-Dict122Contents
+Dict128TagHashTable,
+Dict128KeyHashTable,
+Dict128Contents
 };
 
 // ----- VEPRO BROKER 1.0 DATA REPLACE -----
 
-DictEntry Dict123Contents[] = {
+const DictEntry Dict129Contents[] = {
 { 0x0057, 0x0020, 0, VR::SQ, VM::M1, "OriginalDataSequence" },
 { 0x0057, 0x0030, 0, VR::SQ, VM::M1, "ReplacedDataSequence" },
 { 0x0057, 0x0040, 0, VR::DA, VM::M1, "DateOfDataReplacement" },
@@ -7522,81 +7978,81 @@ DictEntry Dict123Contents[] = {
 { 0x0057, 0x0044, 0, VR::LO, VM::M1, "ComputerName" },
 };
 
-unsigned short Dict123TagHashTable[] = {
+const unsigned short Dict129TagHashTable[] = {
     8,    11,    14,     7,    17,    20,    23,     0,     1,     4,
    66,     1,     3,    65,     1,     2,    64,     1,     1,    48,
     1,     6,    68,     2,     0,    32,     5,    67,
 };
 
-unsigned short Dict123KeyHashTable[] = {
+const unsigned short Dict129KeyHashTable[] = {
     8,     7,    11,    14,    17,    22,    25,     0,     1,     0,
 58411,     1,     6, 30261,     1,     4, 44241,     2,     2,  5234,
     3, 17497,     1,     1, 24725,     1,     5, 10092,
 };
 
-vtkDICOMDictionary::Dict Dict123Data = {
+vtkDICOMDictionary::Dict Dict129Data = {
 "VEPRO BROKER 1.0 DATA REPLACE",
 7,
 7,
-Dict123TagHashTable,
-Dict123KeyHashTable,
-Dict123Contents
+Dict129TagHashTable,
+Dict129KeyHashTable,
+Dict129Contents
 };
 
 // ----- PHILIPS-MR-1 -----
 
-DictEntry Dict124Contents[] = {
+const DictEntry Dict130Contents[] = {
 { 0x0019, 0x0011, 0, VR::IS, VM::M1, "ChemicalShiftNumber" },
 { 0x0019, 0x0012, 0, VR::IS, VM::M1, "PhaseNumber" },
 { 0x0021, 0x0001, 0, VR::IS, VM::M1, "ReconstructionNumber" },
 { 0x0021, 0x0002, 0, VR::IS, VM::M1, "SliceNumber" },
 };
 
-unsigned short Dict124TagHashTable[] = {
+const unsigned short Dict130TagHashTable[] = {
     5,     4,     4,    10,     0,     2,     0,    17,     2,     1,
     2,     1,    18,     3,     2,
 };
 
-unsigned short Dict124KeyHashTable[] = {
+const unsigned short Dict130KeyHashTable[] = {
     5,     4,     8,    13,     0,     1,     2,  1804,     2,     0,
 57880,     3,  7303,     1,     1, 29943,
 };
 
-vtkDICOMDictionary::Dict Dict124Data = {
+vtkDICOMDictionary::Dict Dict130Data = {
 "PHILIPS-MR-1",
 4,
 4,
-Dict124TagHashTable,
-Dict124KeyHashTable,
-Dict124Contents
+Dict130TagHashTable,
+Dict130KeyHashTable,
+Dict130Contents
 };
 
 // ----- MERGE TECHNOLOGIES, INC. -----
 
-DictEntry Dict125Contents[] = {
+const DictEntry Dict131Contents[] = {
 { 0x0009, 0x0000, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict125TagHashTable[] = {
+const unsigned short Dict131TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict125KeyHashTable[] = {
+const unsigned short Dict131KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict125Data = {
+vtkDICOMDictionary::Dict Dict131Data = {
 "MERGE TECHNOLOGIES, INC.",
 1,
 1,
-Dict125TagHashTable,
-Dict125KeyHashTable,
-Dict125Contents
+Dict131TagHashTable,
+Dict131KeyHashTable,
+Dict131Contents
 };
 
 // ----- SIEMENS DLR.01 -----
 
-DictEntry Dict126Contents[] = {
+const DictEntry Dict132Contents[] = {
 { 0x0019, 0x0010, 0, VR::LO, VM::M1, "MeasurementMode" },
 { 0x0019, 0x0011, 0, VR::LO, VM::M1, "ImageType" },
 { 0x0019, 0x0015, 0, VR::LO, VM::M1, "SoftwareVersion" },
@@ -7643,7 +8099,7 @@ DictEntry Dict126Contents[] = {
 { 0x0041, 0x0031, 0, VR::LO, VM::M1, "FullFilmFormat" },
 };
 
-unsigned short Dict126TagHashTable[] = {
+const unsigned short Dict132TagHashTable[] = {
    45,    48,    51,    44,    44,    54,    44,    57,    60,    65,
    68,    71,    74,    79,    82,    85,    88,    93,    98,   101,
    44,   104,   107,   110,   113,   118,    44,    44,   123,   126,
@@ -7663,7 +8119,7 @@ unsigned short Dict126TagHashTable[] = {
   103,     1,    13,    49,     1,    12,    48,     1,    14,    50,
 };
 
-unsigned short Dict126KeyHashTable[] = {
+const unsigned short Dict132KeyHashTable[] = {
    44,    45,    44,    50,    55,    58,    44,    44,    44,    61,
    44,    44,    44,    68,    81,    44,    88,    95,    98,    44,
   103,    44,   106,   111,    44,   114,   117,   120,   123,   126,
@@ -7682,18 +8138,18 @@ unsigned short Dict126KeyHashTable[] = {
     1,     3, 36627,     1,     8, 41394,     1,    26,  4098,
 };
 
-vtkDICOMDictionary::Dict Dict126Data = {
+vtkDICOMDictionary::Dict Dict132Data = {
 "SIEMENS DLR.01",
 44,
 44,
-Dict126TagHashTable,
-Dict126KeyHashTable,
-Dict126Contents
+Dict132TagHashTable,
+Dict132KeyHashTable,
+Dict132Contents
 };
 
 // ----- Agfa ADC NX -----
 
-DictEntry Dict127Contents[] = {
+const DictEntry Dict133Contents[] = {
 { 0x0019, 0x0007, 0, VR::CS, VM::M1, "" },
 { 0x0019, 0x0009, 0, VR::SQ, VM::M1, "" },
 { 0x0019, 0x0021, 0, VR::FL, VM::M1, "" },
@@ -7713,7 +8169,7 @@ DictEntry Dict127Contents[] = {
 { 0x0019, 0x00fe, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict127TagHashTable[] = {
+const unsigned short Dict133TagHashTable[] = {
    18,    21,    17,    24,    17,    27,    17,    32,    17,    35,
    38,    41,    44,    47,    52,    55,    60,     0,     1,     8,
   244,     1,     9,   245,     1,    13,   250,     2,     2,    33,
@@ -7723,7 +8179,7 @@ unsigned short Dict127TagHashTable[] = {
     2,     1,     9,    11,   247,
 };
 
-unsigned short Dict127KeyHashTable[] = {
+const unsigned short Dict133KeyHashTable[] = {
    18,    17,    17,    21,    17,    24,    17,    17,    17,    27,
    17,    17,    17,    46,    49,    52,    57,     0,     1,     8,
 58476,     1,    11, 50881,     1,     9, 49224,     9,     0,   316,
@@ -7732,42 +8188,42 @@ unsigned short Dict127KeyHashTable[] = {
     5, 58475,     2,     6, 58475,    10, 41319,     1,     7, 58475,
 };
 
-vtkDICOMDictionary::Dict Dict127Data = {
+vtkDICOMDictionary::Dict Dict133Data = {
 "Agfa ADC NX",
 17,
 17,
-Dict127TagHashTable,
-Dict127KeyHashTable,
-Dict127Contents
+Dict133TagHashTable,
+Dict133KeyHashTable,
+Dict133Contents
 };
 
 // ----- Imaging Dynamics Company Ltd. -----
 
-DictEntry Dict128Contents[] = {
+const DictEntry Dict134Contents[] = {
 { 0x4321, 0x0042, 0, VR::US, VM::M1, "" },
 { 0x4321, 0x0064, 0, VR::LO, VM::M1, "PODMode" },
 };
 
-unsigned short Dict128TagHashTable[] = {
+const unsigned short Dict134TagHashTable[] = {
     3,     2,     0,     2,     0,    66,     1,   100,
 };
 
-unsigned short Dict128KeyHashTable[] = {
+const unsigned short Dict134KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1, 25126,
 };
 
-vtkDICOMDictionary::Dict Dict128Data = {
+vtkDICOMDictionary::Dict Dict134Data = {
 "Imaging Dynamics Company Ltd.",
 2,
 2,
-Dict128TagHashTable,
-Dict128KeyHashTable,
-Dict128Contents
+Dict134TagHashTable,
+Dict134KeyHashTable,
+Dict134Contents
 };
 
 // ----- SIEMENS DFR.01 ORIGINAL -----
 
-DictEntry Dict129Contents[] = {
+const DictEntry Dict135Contents[] = {
 { 0x0017, 0x0011, 0, VR::US, VM::M1, "" },
 { 0x0017, 0x0012, 0, VR::US, VM::M1, "" },
 { 0x0017, 0x0014, 0, VR::US, VM::M1, "" },
@@ -7813,7 +8269,7 @@ DictEntry Dict129Contents[] = {
 { 0x0017, 0x00c2, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict129TagHashTable[] = {
+const unsigned short Dict135TagHashTable[] = {
    43,    44,    49,    52,    55,    58,    63,    70,    73,    78,
    85,    88,    91,    43,    94,    97,    43,   102,   105,    43,
    43,    43,   108,   111,    43,   114,    43,    43,   119,    43,
@@ -7832,7 +8288,7 @@ unsigned short Dict129TagHashTable[] = {
    23,    69,     1,    41,   193,     2,    21,    67,    42,   194,
 };
 
-unsigned short Dict129KeyHashTable[] = {
+const unsigned short Dict135KeyHashTable[] = {
    43,    43,    43,    43,    43,    43,    44,    43,    43,    43,
    43,    43,    43,    43,    43,    43,    43,    43,    43,    43,
    43,    43,    43,    43,    43,    43,    43,    43,    43,    43,
@@ -7849,18 +8305,18 @@ unsigned short Dict129KeyHashTable[] = {
   125,
 };
 
-vtkDICOMDictionary::Dict Dict129Data = {
+vtkDICOMDictionary::Dict Dict135Data = {
 "SIEMENS DFR.01 ORIGINAL",
 43,
 43,
-Dict129TagHashTable,
-Dict129KeyHashTable,
-Dict129Contents
+Dict135TagHashTable,
+Dict135KeyHashTable,
+Dict135Contents
 };
 
 // ----- NQHeader -----
 
-DictEntry Dict130Contents[] = {
+const DictEntry Dict136Contents[] = {
 { 0x0099, 0x0001, 0, VR::UI, VM::M1, "Version" },
 { 0x0099, 0x0002, 0, VR::UI, VM::M1, "AnalyzedSeriesUID" },
 { 0x0099, 0x0003, 0, VR::LT, VM::M1, "License" },
@@ -7871,31 +8327,31 @@ DictEntry Dict130Contents[] = {
 { 0x0099, 0x0021, 0, VR::FL, VM::M1, "ICV" },
 };
 
-unsigned short Dict130TagHashTable[] = {
+const unsigned short Dict136TagHashTable[] = {
     9,    12,    15,    20,     8,     8,    25,    28,     0,     1,
     2,     3,     1,     1,     2,     2,     0,     1,     7,    33,
     2,     5,    16,     6,    32,     1,     4,     5,     1,     3,
     4,
 };
 
-unsigned short Dict130KeyHashTable[] = {
+const unsigned short Dict136KeyHashTable[] = {
     9,     8,    16,    21,     8,     8,     8,    26,     0,     3,
     2,   513,     3, 36268,     6, 59479,     2,     1, 13509,     4,
 12345,     2,     0,  6789,     5, 11919,     1,     7, 65100,
 };
 
-vtkDICOMDictionary::Dict Dict130Data = {
+vtkDICOMDictionary::Dict Dict136Data = {
 "NQHeader",
 8,
 8,
-Dict130TagHashTable,
-Dict130KeyHashTable,
-Dict130Contents
+Dict136TagHashTable,
+Dict136KeyHashTable,
+Dict136Contents
 };
 
 // ----- SIEMENS CT APPL PRESENTATION -----
 
-DictEntry Dict131Contents[] = {
+const DictEntry Dict137Contents[] = {
 { 0x0029, 0x0000, 0, VR::US, VM::M1, "TranslucentMode" },
 { 0x0029, 0x0001, 0, VR::FD, VM::M1, "TranslucentWindowSize" },
 { 0x0029, 0x0002, 0, VR::US, VM::M1, "PanoramicMode" },
@@ -7909,7 +8365,7 @@ DictEntry Dict131Contents[] = {
 { 0x0029, 0x0010, 0, VR::US, VM::M1, "KernelFilter" },
 };
 
-unsigned short Dict131TagHashTable[] = {
+const unsigned short Dict137TagHashTable[] = {
    12,    17,    20,    25,    11,    11,    11,    28,    31,    34,
    37,     0,     2,     5,     5,     8,     8,     1,     4,     4,
     2,     7,     7,    10,    16,     1,     6,     6,     1,     1,
@@ -7917,48 +8373,48 @@ unsigned short Dict131TagHashTable[] = {
     9,     9,
 };
 
-unsigned short Dict131KeyHashTable[] = {
+const unsigned short Dict137KeyHashTable[] = {
    11,    12,    17,    11,    20,    11,    11,    11,    25,    34,
    37,     0,     2,     6, 57280,     8,  4794,     1,     0, 40913,
     2,     3, 15109,    10, 34552,     4,     1,   489,     2,  3604,
     5, 30722,     7, 49656,     1,     4, 55748,     1,     9, 43036,
 };
 
-vtkDICOMDictionary::Dict Dict131Data = {
+vtkDICOMDictionary::Dict Dict137Data = {
 "SIEMENS CT APPL PRESENTATION",
 11,
 11,
-Dict131TagHashTable,
-Dict131KeyHashTable,
-Dict131Contents
+Dict137TagHashTable,
+Dict137KeyHashTable,
+Dict137Contents
 };
 
 // ----- SIEMENS SYNGO PRINT SERVICE -----
 
-DictEntry Dict132Contents[] = {
+const DictEntry Dict138Contents[] = {
 { 0x0029, 0x0010, 0, VR::IS, VM::M1, "SheetNumber" },
 };
 
-unsigned short Dict132TagHashTable[] = {
+const unsigned short Dict138TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict132KeyHashTable[] = {
+const unsigned short Dict138KeyHashTable[] = {
     2,     0,     1,     0, 41639,
 };
 
-vtkDICOMDictionary::Dict Dict132Data = {
+vtkDICOMDictionary::Dict Dict138Data = {
 "SIEMENS SYNGO PRINT SERVICE",
 1,
 1,
-Dict132TagHashTable,
-Dict132KeyHashTable,
-Dict132Contents
+Dict138TagHashTable,
+Dict138KeyHashTable,
+Dict138Contents
 };
 
 // ----- Siemens: Thorax/Multix FD Raw Image Settings -----
 
-DictEntry Dict133Contents[] = {
+const DictEntry Dict139Contents[] = {
 { 0x0025, 0x0000, 0, VR::SS, VM::M1, "RawImageAmplification" },
 { 0x0025, 0x0001, 0, VR::SS, VM::M1, "GammaLUT" },
 { 0x0025, 0x0002, 0, VR::US, VM::M1, "" },
@@ -7999,7 +8455,7 @@ DictEntry Dict133Contents[] = {
 { 0x0025, 0x0037, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict133TagHashTable[] = {
+const unsigned short Dict139TagHashTable[] = {
    39,    42,    45,    48,    51,    54,    57,    60,    63,    66,
    69,    72,    75,    78,    81,    84,    87,    92,    97,   102,
   107,   110,   113,   118,   123,   126,    38,    38,    38,    38,
@@ -8017,7 +8473,7 @@ unsigned short Dict133TagHashTable[] = {
     6,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict133KeyHashTable[] = {
+const unsigned short Dict139KeyHashTable[] = {
    38,    38,    38,    38,    38,    38,    38,    39,    38,    38,
    38,    42,    45,    38,    48,    51,    38,    38,    54,    38,
    38,    59,    38,    66,    38,   105,    38,    38,    38,   110,
@@ -8033,42 +8489,42 @@ unsigned short Dict133KeyHashTable[] = {
    34, 16771,     1,    28, 19197,     2,    10, 26273,    13,  6170,
 };
 
-vtkDICOMDictionary::Dict Dict133Data = {
+vtkDICOMDictionary::Dict Dict139Data = {
 "Siemens: Thorax/Multix FD Raw Image Settings",
 38,
 38,
-Dict133TagHashTable,
-Dict133KeyHashTable,
-Dict133Contents
+Dict139TagHashTable,
+Dict139KeyHashTable,
+Dict139Contents
 };
 
 // ----- SIEMENS CT VA0  ORI -----
 
-DictEntry Dict134Contents[] = {
+const DictEntry Dict140Contents[] = {
 { 0x0009, 0x0020, 0, VR::LO, VM::M1, "" },
 { 0x0009, 0x0030, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict134TagHashTable[] = {
+const unsigned short Dict140TagHashTable[] = {
     2,     3,     0,     2,     0,    32,     1,    48,
 };
 
-unsigned short Dict134KeyHashTable[] = {
+const unsigned short Dict140KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict134Data = {
+vtkDICOMDictionary::Dict Dict140Data = {
 "SIEMENS CT VA0  ORI",
 2,
 2,
-Dict134TagHashTable,
-Dict134KeyHashTable,
-Dict134Contents
+Dict140TagHashTable,
+Dict140KeyHashTable,
+Dict140Contents
 };
 
 // ----- Philips X-ray Imaging DD 001 -----
 
-DictEntry Dict135Contents[] = {
+const DictEntry Dict141Contents[] = {
 { 0x2003, 0x0000, 0, VR::CS, VM::M1, "" },
 { 0x2003, 0x0001, 0, VR::LO, VM::M1, "" },
 { 0x2003, 0x0002, 0, VR::FD, VM::M3, "" },
@@ -8102,7 +8558,7 @@ DictEntry Dict135Contents[] = {
 { 0x2003, 0x0032, 0, VR::UI, VM::M1, "" },
 };
 
-unsigned short Dict135TagHashTable[] = {
+const unsigned short Dict141TagHashTable[] = {
    32,    37,    42,    45,    48,    31,    31,    51,    54,    31,
    31,    31,    57,    60,    63,    68,    31,    71,    76,    79,
    82,    85,    88,    93,    96,    31,    99,   102,   105,   110,
@@ -8117,7 +8573,7 @@ unsigned short Dict135TagHashTable[] = {
     1,     8,    18,     2,     7,    17,    30,    50,
 };
 
-unsigned short Dict135KeyHashTable[] = {
+const unsigned short Dict141KeyHashTable[] = {
    31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
    31,    31,    31,    31,    31,    31,    31,    31,    32,    31,
    31,    31,    31,    31,    31,    31,    31,    31,    31,    31,
@@ -8130,18 +8586,18 @@ unsigned short Dict135KeyHashTable[] = {
   173,    29,   173,    30,   173,
 };
 
-vtkDICOMDictionary::Dict Dict135Data = {
+vtkDICOMDictionary::Dict Dict141Data = {
 "Philips X-ray Imaging DD 001",
 31,
 31,
-Dict135TagHashTable,
-Dict135KeyHashTable,
-Dict135Contents
+Dict141TagHashTable,
+Dict141KeyHashTable,
+Dict141Contents
 };
 
 // ----- SIEMENS SMS-AX  VIEW 1.0 -----
 
-DictEntry Dict136Contents[] = {
+const DictEntry Dict142Contents[] = {
 { 0x0019, 0x0000, 0, VR::US, VM::M1, "ReviewMode" },
 { 0x0019, 0x0001, 0, VR::US, VM::M1, "AnatomicalBackgroundPercent" },
 { 0x0019, 0x0002, 0, VR::US, VM::M1, "NumberOfPhases" },
@@ -8176,7 +8632,7 @@ DictEntry Dict136Contents[] = {
 { 0x0019, 0x0042, 0, VR::SL, VM::M2, "DispayedAreaBottomRightHandCorner" },
 };
 
-unsigned short Dict136TagHashTable[] = {
+const unsigned short Dict142TagHashTable[] = {
    32,    32,    33,    36,    39,    42,    45,    48,    51,    54,
    57,    60,    63,    66,    69,    72,    75,    78,    81,    84,
    87,    90,    93,    96,    99,   102,   107,   112,   115,   118,
@@ -8192,7 +8648,7 @@ unsigned short Dict136TagHashTable[] = {
     4,     1,     7,     7,     1,     6,     6,
 };
 
-unsigned short Dict136KeyHashTable[] = {
+const unsigned short Dict142KeyHashTable[] = {
    32,    33,    32,    36,    39,    44,    47,    50,    53,    32,
    56,    32,    61,    64,    67,    70,    32,    32,    73,    78,
    83,    32,    86,    91,    32,    32,    32,   100,   103,   110,
@@ -8207,96 +8663,96 @@ unsigned short Dict136KeyHashTable[] = {
     1,    20, 21703,     2,     5, 20548,    12, 57634,
 };
 
-vtkDICOMDictionary::Dict Dict136Data = {
+vtkDICOMDictionary::Dict Dict142Data = {
 "SIEMENS SMS-AX  VIEW 1.0",
 32,
 32,
-Dict136TagHashTable,
-Dict136KeyHashTable,
-Dict136Contents
+Dict142TagHashTable,
+Dict142KeyHashTable,
+Dict142Contents
 };
 
 // ----- SPI-P-Private_CDS Release 1 -----
 
-DictEntry Dict137Contents[] = {
+const DictEntry Dict143Contents[] = {
 { 0x0021, 0x0040, 0, VR::IS, VM::M1, "" },
 { 0x0029, 0x0000, 0, VR::UN, VM::M1, "" },
 { 0x0029, 0x0010, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict137TagHashTable[] = {
+const unsigned short Dict143TagHashTable[] = {
     4,     3,     9,     0,     2,     0,    64,     2,    16,     1,
     1,     0,
 };
 
-unsigned short Dict137KeyHashTable[] = {
+const unsigned short Dict143KeyHashTable[] = {
     3,     3,     4,     0,     3,     0,  1793,     1,  1793,     2,
  1793,
 };
 
-vtkDICOMDictionary::Dict Dict137Data = {
+vtkDICOMDictionary::Dict Dict143Data = {
 "SPI-P-Private_CDS Release 1",
 3,
 3,
-Dict137TagHashTable,
-Dict137KeyHashTable,
-Dict137Contents
+Dict143TagHashTable,
+Dict143KeyHashTable,
+Dict143Contents
 };
 
 // ----- astm.org/diconde/iod/NdeCtImage -----
 
-DictEntry Dict138Contents[] = {
+const DictEntry Dict144Contents[] = {
 { 0x0009, 0x0002, 0, VR::IS, VM::M1, "LINACEnergy" },
 { 0x0009, 0x0004, 0, VR::IS, VM::M1, "LINACOutput" },
 };
 
-unsigned short Dict138TagHashTable[] = {
+const unsigned short Dict144TagHashTable[] = {
     2,     3,     0,     2,     0,     2,     1,     4,
 };
 
-unsigned short Dict138KeyHashTable[] = {
+const unsigned short Dict144KeyHashTable[] = {
     3,     6,     0,     1,     0,  5547,     1,     1, 20494,
 };
 
-vtkDICOMDictionary::Dict Dict138Data = {
+vtkDICOMDictionary::Dict Dict144Data = {
 "astm.org/diconde/iod/NdeCtImage",
 2,
 2,
-Dict138TagHashTable,
-Dict138KeyHashTable,
-Dict138Contents
+Dict144TagHashTable,
+Dict144KeyHashTable,
+Dict144Contents
 };
 
 // ----- SIEMENS SYNGO TIME POINT SERVICE -----
 
-DictEntry Dict139Contents[] = {
+const DictEntry Dict145Contents[] = {
 { 0x0029, 0x0001, 0, VR::LO, VM::M1, "TimePointID" },
 { 0x0029, 0x0002, 0, VR::LO, VM::M1, "TimePointInformation" },
 { 0x0029, 0x0050, 0, VR::SQ, VM::M1, "StudiesinTimePointSequence" },
 };
 
-unsigned short Dict139TagHashTable[] = {
+const unsigned short Dict145TagHashTable[] = {
     4,     7,     3,     0,     1,     2,    80,     2,     0,     1,
     1,     2,
 };
 
-unsigned short Dict139KeyHashTable[] = {
+const unsigned short Dict145KeyHashTable[] = {
     3,     4,     7,     0,     1,     0, 17902,     2,     1,  4630,
     2, 57039,
 };
 
-vtkDICOMDictionary::Dict Dict139Data = {
+vtkDICOMDictionary::Dict Dict145Data = {
 "SIEMENS SYNGO TIME POINT SERVICE",
 3,
 3,
-Dict139TagHashTable,
-Dict139KeyHashTable,
-Dict139Contents
+Dict145TagHashTable,
+Dict145KeyHashTable,
+Dict145Contents
 };
 
 // ----- Silhouette Line V1.0 -----
 
-DictEntry Dict140Contents[] = {
+const DictEntry Dict146Contents[] = {
 { 0x0029, 0x0011, 0, VR::IS, VM::M1, "LineName" },
 { 0x0029, 0x0012, 0, VR::LT, VM::M1, "LineNameFont" },
 { 0x0029, 0x0013, 0, VR::UL, VM::M1, "LineNameDisplay" },
@@ -8318,7 +8774,7 @@ DictEntry Dict140Contents[] = {
 { 0x0029, 0x0029, 0, VR::UL, VM::M1, "LineDontSave" },
 };
 
-unsigned short Dict140TagHashTable[] = {
+const unsigned short Dict146TagHashTable[] = {
    20,    23,    28,    31,    34,    37,    40,    19,    43,    46,
    49,    54,    59,    62,    65,    68,    19,    19,    71,     0,
     1,    18,    41,     2,     2,    19,    17,    40,     1,     1,
@@ -8329,7 +8785,7 @@ unsigned short Dict140TagHashTable[] = {
    38,     1,     0,    17,
 };
 
-unsigned short Dict140KeyHashTable[] = {
+const unsigned short Dict146KeyHashTable[] = {
    19,    20,    19,    19,    29,    32,    19,    19,    35,    40,
    47,    50,    53,    19,    19,    60,    63,    66,    19,     0,
     4,     8, 50265,    11, 56860,    14, 53126,    16, 22638,     1,
@@ -8339,18 +8795,18 @@ unsigned short Dict140KeyHashTable[] = {
     1,     1, 44530,     1,     2, 16316,     1,    17, 19604,
 };
 
-vtkDICOMDictionary::Dict Dict140Data = {
+vtkDICOMDictionary::Dict Dict146Data = {
 "Silhouette Line V1.0",
 19,
 19,
-Dict140TagHashTable,
-Dict140KeyHashTable,
-Dict140Contents
+Dict146TagHashTable,
+Dict146KeyHashTable,
+Dict146Contents
 };
 
 // ----- BrainLAB_BeamProfile -----
 
-DictEntry Dict141Contents[] = {
+const DictEntry Dict147Contents[] = {
 { 0x3411, 0x0001, 0, VR::SQ, VM::M1, "BeamProfileSequence" },
 { 0x3411, 0x0002, 0, VR::IS, VM::M1, "BeamProfileNumber" },
 { 0x3411, 0x0003, 0, VR::SQ, VM::M1, "BeamParameterSequence" },
@@ -8359,30 +8815,30 @@ DictEntry Dict141Contents[] = {
 { 0x3411, 0x0006, 0, VR::IS, VM::M1, "ReferencedBeamProfileNumber" },
 };
 
-unsigned short Dict141TagHashTable[] = {
+const unsigned short Dict147TagHashTable[] = {
     7,    10,    13,    16,    19,    22,     0,     1,     2,     3,
     1,     1,     2,     1,     4,     5,     1,     3,     4,     1,
     0,     1,     1,     5,     6,
 };
 
-unsigned short Dict141KeyHashTable[] = {
+const unsigned short Dict147KeyHashTable[] = {
     7,    12,    15,     6,    20,     6,     0,     2,     0, 57638,
     3, 30167,     1,     5, 42433,     2,     2,  5395,     4, 42837,
     1,     1, 52792,
 };
 
-vtkDICOMDictionary::Dict Dict141Data = {
+vtkDICOMDictionary::Dict Dict147Data = {
 "BrainLAB_BeamProfile",
 6,
 6,
-Dict141TagHashTable,
-Dict141KeyHashTable,
-Dict141Contents
+Dict147TagHashTable,
+Dict147KeyHashTable,
+Dict147Contents
 };
 
 // ----- astm.org/diconde/iod/NdeDxCalibrationData -----
 
-DictEntry Dict142Contents[] = {
+const DictEntry Dict148Contents[] = {
 { 0x0009, 0x0040, 0, VR::SQ, VM::M1, "DarkCurrentSequence" },
 { 0x0009, 0x0050, 0, VR::OW, VM::M1, "DarkCurrentCounts" },
 { 0x0009, 0x0060, 0, VR::SQ, VM::M1, "GainCorrectionReferenceSequence" },
@@ -8398,7 +8854,7 @@ DictEntry Dict142Contents[] = {
 { 0x0009, 0x0099, 0, VR::LT, VM::M1, "CalibrationNotes" },
 };
 
-unsigned short Dict142TagHashTable[] = {
+const unsigned short Dict148TagHashTable[] = {
    14,    13,    13,    17,    22,    25,    28,    31,    36,    39,
    44,    13,    13,     0,     1,     2,    96,     2,     3,   112,
    12,   153,     1,     4,   113,     1,     5,   114,     1,     6,
@@ -8406,7 +8862,7 @@ unsigned short Dict142TagHashTable[] = {
     9,   118,    11,   128,     2,     1,    80,    10,   119,
 };
 
-unsigned short Dict142KeyHashTable[] = {
+const unsigned short Dict148KeyHashTable[] = {
    14,    19,    22,    13,    25,    30,    35,    13,    38,    43,
    13,    13,    13,     0,     2,     7, 25645,    11, 50357,     1,
     3, 29772,     1,     0, 24037,     2,     2, 48192,     5,  8278,
@@ -8414,18 +8870,18 @@ unsigned short Dict142KeyHashTable[] = {
  9334,    10,  7464,     2,     4, 53052,     9,  5902,
 };
 
-vtkDICOMDictionary::Dict Dict142Data = {
+vtkDICOMDictionary::Dict Dict148Data = {
 "astm.org/diconde/iod/NdeDxCalibrationData",
 13,
 13,
-Dict142TagHashTable,
-Dict142KeyHashTable,
-Dict142Contents
+Dict148TagHashTable,
+Dict148KeyHashTable,
+Dict148Contents
 };
 
 // ----- GEMS_XELPRV_01 -----
 
-DictEntry Dict143Contents[] = {
+const DictEntry Dict149Contents[] = {
 { 0x0033, 0x0008, 0, VR::CS, VM::M1, "" },
 { 0x0033, 0x0010, 0, VR::SL, VM::M1, "" },
 { 0x0033, 0x0011, 0, VR::LO, VM::M1, "" },
@@ -8449,7 +8905,7 @@ DictEntry Dict143Contents[] = {
 { 0x0033, 0x0072, 0, VR::UI, VM::M1, "" },
 };
 
-unsigned short Dict143TagHashTable[] = {
+const unsigned short Dict149TagHashTable[] = {
    22,    25,    30,    35,    40,    45,    21,    21,    21,    21,
    21,    21,    21,    48,    51,    54,    57,    62,    67,    70,
    75,     0,     1,     6,    25,     2,     5,    24,    20,   114,
@@ -8460,7 +8916,7 @@ unsigned short Dict143TagHashTable[] = {
     2,     8,    27,    13,    32,     1,     7,    26,
 };
 
-unsigned short Dict143KeyHashTable[] = {
+const unsigned short Dict149KeyHashTable[] = {
    21,    21,    21,    21,    21,    22,    21,    21,    21,    21,
    21,    21,    21,    21,    21,    21,    21,    21,    21,    21,
    21,     0,    21,     0,   256,     1,   256,     2,   256,     3,
@@ -8470,18 +8926,18 @@ unsigned short Dict143KeyHashTable[] = {
   256,    19,   256,    20,   256,
 };
 
-vtkDICOMDictionary::Dict Dict143Data = {
+vtkDICOMDictionary::Dict Dict149Data = {
 "GEMS_XELPRV_01",
 21,
 21,
-Dict143TagHashTable,
-Dict143KeyHashTable,
-Dict143Contents
+Dict149TagHashTable,
+Dict149KeyHashTable,
+Dict149Contents
 };
 
 // ----- AgilityOverlay -----
 
-DictEntry Dict144Contents[] = {
+const DictEntry Dict150Contents[] = {
 { 0x0071, 0x0001, 0, VR::ST, VM::M1, "" },
 { 0x0071, 0x0002, 0, VR::ST, VM::M1, "" },
 { 0x0071, 0x0003, 0, VR::ST, VM::M1, "" },
@@ -8524,7 +8980,7 @@ DictEntry Dict144Contents[] = {
 { 0x0071, 0x0060, 0, VR::FD, VM::M1, "" },
 };
 
-unsigned short Dict144TagHashTable[] = {
+const unsigned short Dict150TagHashTable[] = {
    41,    46,    49,    56,    59,    62,    40,    40,    40,    40,
    40,    40,    65,    68,    71,    40,    74,    77,    82,    85,
    88,    91,    94,    97,   100,   103,    40,   106,   109,   112,
@@ -8543,7 +8999,7 @@ unsigned short Dict144TagHashTable[] = {
    86,
 };
 
-unsigned short Dict144KeyHashTable[] = {
+const unsigned short Dict150KeyHashTable[] = {
    40,    40,    40,    40,    40,    40,    40,    40,    40,    40,
    40,    40,    40,    40,    40,    40,    40,    40,    40,    40,
    40,    41,    40,    40,    40,    40,    40,    40,    40,    40,
@@ -8559,18 +9015,18 @@ unsigned short Dict144KeyHashTable[] = {
    39,   134,
 };
 
-vtkDICOMDictionary::Dict Dict144Data = {
+vtkDICOMDictionary::Dict Dict150Data = {
 "AgilityOverlay",
 40,
 40,
-Dict144TagHashTable,
-Dict144KeyHashTable,
-Dict144Contents
+Dict150TagHashTable,
+Dict150KeyHashTable,
+Dict150Contents
 };
 
 // ----- VEPRO VIM 5.0 DATA -----
 
-DictEntry Dict145Contents[] = {
+const DictEntry Dict151Contents[] = {
 { 0x0055, 0x0010, 0, VR::OB, VM::M1, "" },
 { 0x0055, 0x0020, 0, VR::OB, VM::M1, "" },
 { 0x0055, 0x0030, 0, VR::OB, VM::M1, "IconData" },
@@ -8578,52 +9034,52 @@ DictEntry Dict145Contents[] = {
 { 0x0055, 0x0065, 0, VR::OB, VM::M1, "ImageHashValue" },
 };
 
-unsigned short Dict145TagHashTable[] = {
+const unsigned short Dict151TagHashTable[] = {
     6,     9,     5,    12,    17,     0,     1,     2,    48,     1,
     1,    32,     2,     0,    16,     4,   101,     1,     3,    81,
 };
 
-unsigned short Dict145KeyHashTable[] = {
+const unsigned short Dict151KeyHashTable[] = {
     6,    11,     5,     5,     5,     0,     2,     2, 60200,     4,
 20181,     3,     0,  1076,     1,  1076,     3,  1076,
 };
 
-vtkDICOMDictionary::Dict Dict145Data = {
+vtkDICOMDictionary::Dict Dict151Data = {
 "VEPRO VIM 5.0 DATA",
 5,
 5,
-Dict145TagHashTable,
-Dict145KeyHashTable,
-Dict145Contents
+Dict151TagHashTable,
+Dict151KeyHashTable,
+Dict151Contents
 };
 
 // ----- SIEMENS DICOM -----
 
-DictEntry Dict146Contents[] = {
+const DictEntry Dict152Contents[] = {
 { 0x0009, 0x0010, 0, VR::UN, VM::M1, "" },
 { 0x0009, 0x0012, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict146TagHashTable[] = {
+const unsigned short Dict152TagHashTable[] = {
     2,     3,     0,     2,     0,    16,     1,    18,
 };
 
-unsigned short Dict146KeyHashTable[] = {
+const unsigned short Dict152KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict146Data = {
+vtkDICOMDictionary::Dict Dict152Data = {
 "SIEMENS DICOM",
 2,
 2,
-Dict146TagHashTable,
-Dict146KeyHashTable,
-Dict146Contents
+Dict152TagHashTable,
+Dict152KeyHashTable,
+Dict152Contents
 };
 
 // ----- SIEMENS MED NM -----
 
-DictEntry Dict147Contents[] = {
+const DictEntry Dict153Contents[] = {
 { 0x0009, 0x0080, 0, VR::ST, VM::M1, "" },
 { 0x0011, 0x0010, 0, VR::ST, VM::M1, "" },
 { 0x0017, 0x0000, 0, VR::ST, VM::M1, "" },
@@ -8818,7 +9274,7 @@ DictEntry Dict147Contents[] = {
 { 0x7fe3, 0x0028, 0, VR::OW, VM::M1, "" },
 };
 
-unsigned short Dict147TagHashTable[] = {
+const unsigned short Dict153TagHashTable[] = {
   193,   200,   205,   210,   213,   218,   221,   226,   233,   236,
   241,   244,   192,   192,   192,   247,   250,   255,   264,   267,
   192,   270,   273,   278,   285,   288,   293,   296,   192,   192,
@@ -8891,7 +9347,7 @@ unsigned short Dict147TagHashTable[] = {
   167,     1,    11,   166,     1,    10,   165,
 };
 
-unsigned short Dict147KeyHashTable[] = {
+const unsigned short Dict153KeyHashTable[] = {
   193,   192,   192,   196,   192,   199,   192,   192,   192,   192,
   192,   192,   192,   192,   192,   192,   192,   316,   321,   328,
   335,   340,   345,   348,   351,   354,   192,   363,   366,   192,
@@ -8962,18 +9418,18 @@ unsigned short Dict147KeyHashTable[] = {
   159, 39388,
 };
 
-vtkDICOMDictionary::Dict Dict147Data = {
+vtkDICOMDictionary::Dict Dict153Data = {
 "SIEMENS MED NM",
 192,
 192,
-Dict147TagHashTable,
-Dict147KeyHashTable,
-Dict147Contents
+Dict153TagHashTable,
+Dict153KeyHashTable,
+Dict153Contents
 };
 
 // ----- SPI-P-XSB-DCI Release 1 -----
 
-DictEntry Dict148Contents[] = {
+const DictEntry Dict154Contents[] = {
 { 0x0019, 0x0010, 0, VR::LT, VM::M1, "VideoBeamBoost" },
 { 0x0019, 0x0011, 0, VR::US, VM::M1, "ChannelGeneratingVideoSync" },
 { 0x0019, 0x0012, 0, VR::US, VM::M1, "VideoGain" },
@@ -8981,29 +9437,29 @@ DictEntry Dict148Contents[] = {
 { 0x0019, 0x0020, 0, VR::DS, VM::M1, "RTDDataCompressionFactor" },
 };
 
-unsigned short Dict148TagHashTable[] = {
+const unsigned short Dict154TagHashTable[] = {
     6,     9,    12,    15,    18,     0,     1,     3,    19,     1,
     2,    18,     1,     4,    32,     1,     1,    17,     1,     0,
    16,
 };
 
-unsigned short Dict148KeyHashTable[] = {
+const unsigned short Dict154KeyHashTable[] = {
     5,     5,     5,     6,    13,     0,     3,     1, 23927,     2,
 49848,     3, 24448,     2,     0, 35076,     4, 22366,
 };
 
-vtkDICOMDictionary::Dict Dict148Data = {
+vtkDICOMDictionary::Dict Dict154Data = {
 "SPI-P-XSB-DCI Release 1",
 5,
 5,
-Dict148TagHashTable,
-Dict148KeyHashTable,
-Dict148Contents
+Dict154TagHashTable,
+Dict154KeyHashTable,
+Dict154Contents
 };
 
 // ----- GEMS_AWSOFT_CD1 -----
 
-DictEntry Dict149Contents[] = {
+const DictEntry Dict155Contents[] = {
 { 0x0039, 0x0065, 0, VR::UI, VM::M1, "ReferenceToStudyUID" },
 { 0x0039, 0x0070, 0, VR::UI, VM::M1, "ReferenceToSeriesUID" },
 { 0x0039, 0x0075, 0, VR::IS, VM::M1, "ReferenceToOriginalInstance" },
@@ -9015,32 +9471,32 @@ DictEntry Dict149Contents[] = {
 { 0x0039, 0x00FF, 0, VR::OB, VM::M1, "DPOData" },
 };
 
-unsigned short Dict149TagHashTable[] = {
+const unsigned short Dict155TagHashTable[] = {
    10,    15,     9,    20,     9,    25,     9,    28,    31,     0,
     2,     1,   112,     5,   144,     2,     4,   133,     7,   170,
     2,     0,   101,     6,   149,     1,     2,   117,     1,     3,
   128,     1,     8,   255,
 };
 
-unsigned short Dict149KeyHashTable[] = {
+const unsigned short Dict155KeyHashTable[] = {
     9,    10,    13,    16,    19,    26,    29,     9,    32,     0,
     1,     4,  7069,     1,     2, 61095,     1,     1, 56857,     3,
     5,  6363,     6, 21677,     7,  8310,     1,     0, 25477,     1,
     8,  7068,     1,     3, 20833,
 };
 
-vtkDICOMDictionary::Dict Dict149Data = {
+vtkDICOMDictionary::Dict Dict155Data = {
 "GEMS_AWSOFT_CD1",
 9,
 9,
-Dict149TagHashTable,
-Dict149KeyHashTable,
-Dict149Contents
+Dict155TagHashTable,
+Dict155KeyHashTable,
+Dict155Contents
 };
 
 // ----- GEMS_SEND_02 -----
 
-DictEntry Dict150Contents[] = {
+const DictEntry Dict156Contents[] = {
 { 0x0045, 0x0055, 0, VR::DS, VM::M8, "A_Coefficients" },
 { 0x0045, 0x0062, 0, VR::IS, VM::M1, "UserWindowCenter" },
 { 0x0045, 0x0063, 0, VR::IS, VM::M1, "UserWindowWidth" },
@@ -9051,35 +9507,35 @@ DictEntry Dict150Contents[] = {
 { 0x0045, 0x0073, 0, VR::IS, VM::M1, "CollimatorHeight" },
 };
 
-unsigned short Dict150TagHashTable[] = {
+const unsigned short Dict156TagHashTable[] = {
     9,     8,    14,     8,    17,     8,    20,    25,     0,     2,
     0,    85,     3,   101,     1,     4,   103,     1,     5,   105,
     2,     2,    99,     7,   115,     2,     1,    98,     6,   114,
 };
 
-unsigned short Dict150KeyHashTable[] = {
+const unsigned short Dict156KeyHashTable[] = {
     8,     8,     8,     9,    16,    23,     8,    26,     0,     3,
     4,  5352,     5, 13265,     6, 22843,     3,     2, 29079,     3,
 16921,     7,  6426,     1,     1, 25135,     1,     0, 59138,
 };
 
-vtkDICOMDictionary::Dict Dict150Data = {
+vtkDICOMDictionary::Dict Dict156Data = {
 "GEMS_SEND_02",
 8,
 8,
-Dict150TagHashTable,
-Dict150KeyHashTable,
-Dict150Contents
+Dict156TagHashTable,
+Dict156KeyHashTable,
+Dict156Contents
 };
 
 // ----- Philips Imaging DD 001 -----
 
-DictEntry Dict151Contents[] = {
+const DictEntry Dict157Contents[] = {
 { 0x2001, 0x0001, 0, VR::FL, VM::M1, "ChemicalShift" },
 { 0x2001, 0x0002, 0, VR::IS, VM::M1, "ChemicalShiftNumberMR" },
 { 0x2001, 0x0003, 0, VR::FL, VM::M1, "DiffusionBFactor" },
 { 0x2001, 0x0004, 0, VR::CS, VM::M1, "DiffusionDirection" },
-{ 0x2001, 0x0005, 0, VR::SS, VM::M1, "" },
+{ 0x2001, 0x0005, 0, VR::SS, VM::M1, "GraphicAnnotationParentID" },
 { 0x2001, 0x0006, 0, VR::CS, VM::M1, "ImageEnhanced" },
 { 0x2001, 0x0007, 0, VR::CS, VM::M1, "ImageTypeEDES" },
 { 0x2001, 0x0008, 0, VR::IS, VM::M1, "PhaseNumber" },
@@ -9111,53 +9567,59 @@ DictEntry Dict151Contents[] = {
 { 0x2001, 0x0023, 0, VR::DS, VM::M1, "FlipAngle" },
 { 0x2001, 0x0024, 0, VR::CS, VM::M1, "SeriesIsInteractive" },
 { 0x2001, 0x0025, 0, VR::SH, VM::M1, "EchoTimeDisplay" },
-{ 0x2001, 0x0026, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x0026, 0, VR::CS, VM::M1, "PresentationStateSubtractionActive" },
 { 0x2001, 0x0029, 0, VR::FL, VM::M1, "" },
 { 0x2001, 0x002b, 0, VR::CS, VM::M1, "" },
 { 0x2001, 0x002d, 0, VR::SS, VM::M1, "NumberOfSlicesInStack" },
 { 0x2001, 0x0032, 0, VR::FL, VM::M1, "StackRadialAngle" },
 { 0x2001, 0x0033, 0, VR::CS, VM::M1, "StackRadialAxis" },
 { 0x2001, 0x0035, 0, VR::SS, VM::M1, "StackSliceNumber" },
-{ 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackSliceType" },
+{ 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackType" },
 { 0x2001, 0x0039, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x003d, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x003f, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0046, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0047, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x0048, 0, VR::SS, VM::M1, "" },
-{ 0x2001, 0x004b, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004c, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004d, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004e, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0050, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0051, 0, VR::IS, VM::M1, "" },
-{ 0x2001, 0x0052, 0, VR::UI, VM::M1, "" },
-{ 0x2001, 0x0053, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0054, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x0055, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x0056, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x003d, 0, VR::UL, VM::M1, "ContourFillColor" },
+{ 0x2001, 0x003f, 0, VR::CS, VM::M1, "DisplayedAreaZoomInterpolationMeth" },
+{ 0x2001, 0x0043, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxFrstEndPnt" },
+{ 0x2001, 0x0044, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxScndEndPnt" },
+{ 0x2001, 0x0045, 0, VR::IS, VM::M2, "EllipsDisplShutOtherAxFrstEndPnt" },
+{ 0x2001, 0x0046, 0, VR::CS, VM::M1, "GraphicLineStyle" },
+{ 0x2001, 0x0047, 0, VR::FL, VM::M1, "GraphicLineWidth" },
+{ 0x2001, 0x0048, 0, VR::SS, VM::M1, "GraphicAnnotationID" },
+{ 0x2001, 0x004b, 0, VR::CS, VM::M1, "InterpolationMethod" },
+{ 0x2001, 0x004c, 0, VR::CS, VM::M1, "PolyLineBeginPointStyle" },
+{ 0x2001, 0x004d, 0, VR::CS, VM::M1, "PolyLineEndPointStyle" },
+{ 0x2001, 0x004e, 0, VR::CS, VM::M1, "WindowSmoothingTaste" },
+{ 0x2001, 0x0050, 0, VR::LO, VM::M1, "GraphicMarkerType" },
+{ 0x2001, 0x0051, 0, VR::IS, VM::M1, "OverlayPlaneID" },
+{ 0x2001, 0x0052, 0, VR::UI, VM::M1, "ImagePresentationStateUID" },
+{ 0x2001, 0x0053, 0, VR::CS, VM::M1, "PresentationGLTrafoInvert" },
+{ 0x2001, 0x0054, 0, VR::FL, VM::M1, "ContourFillTransparency" },
+{ 0x2001, 0x0055, 0, VR::UL, VM::M1, "GraphicLineColor" },
+{ 0x2001, 0x0056, 0, VR::CS, VM::M1, "GraphicType" },
 { 0x2001, 0x0058, 0, VR::UL, VM::M1, "ContrastTransferTaste" },
-{ 0x2001, 0x005a, 0, VR::ST, VM::M1, "" },
+{ 0x2001, 0x005a, 0, VR::ST, VM::M1, "GraphicAnnotationModel" },
+{ 0x2001, 0x005d, 0, VR::ST, VM::M1, "MeasurementTextUnits" },
+{ 0x2001, 0x005e, 0, VR::ST, VM::M1, "MeasurementTextType" },
 { 0x2001, 0x005f, 0, VR::SQ, VM::M1, "StackSequence" },
 { 0x2001, 0x0060, 0, VR::SL, VM::M1, "NumberOfStacks" },
 { 0x2001, 0x0061, 0, VR::CS, VM::M1, "SeriesTransmitted" },
 { 0x2001, 0x0062, 0, VR::CS, VM::M1, "SeriesCommitted" },
 { 0x2001, 0x0063, 0, VR::CS, VM::M1, "ExaminationSource" },
-{ 0x2001, 0x0064, 0, VR::SH, VM::M1, "" },
-{ 0x2001, 0x0065, 0, VR::SQ, VM::M1, "" },
+{ 0x2001, 0x0064, 0, VR::SH, VM::M1, "TextType" },
+{ 0x2001, 0x0065, 0, VR::SQ, VM::M1, "GraphicOverlayPlane" },
 { 0x2001, 0x0067, 0, VR::CS, VM::M1, "LinearPresentationGLTrafoShapeSub" },
-{ 0x2001, 0x0068, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x0069, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x006a, 0, VR::SQ, VM::M1, "" },
+{ 0x2001, 0x0068, 0, VR::SQ, VM::M1, "LinearModalityGLTrafo" },
+{ 0x2001, 0x0069, 0, VR::SQ, VM::M1, "DisplayShutter" },
+{ 0x2001, 0x006a, 0, VR::SQ, VM::M1, "SpatialTransformation" },
 { 0x2001, 0x006b, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x006d, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x006d, 0, VR::LO, VM::M1, "TextFont" },
 { 0x2001, 0x006e, 0, VR::SH, VM::M1, "SeriesType" },
-{ 0x2001, 0x0071, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x0071, 0, VR::CS, VM::M1, "GraphicConstraint" },
+{ 0x2001, 0x0072, 0, VR::IS, VM::M1, "EllipsDisplShutOtherAxScndEndPnt" },
 { 0x2001, 0x0074, 0, VR::DS, VM::M1, "" },
 { 0x2001, 0x0075, 0, VR::DS, VM::M1, "" },
 { 0x2001, 0x0076, 0, VR::UL, VM::M1, "NumberOfFrames" },
 { 0x2001, 0x0077, 0, VR::CS, VM::M1, "GLTrafoType" },
-{ 0x2001, 0x007a, 0, VR::FL, VM::M1, "" },
+{ 0x2001, 0x007a, 0, VR::FL, VM::M1, "WindowRoundingFactor" },
 { 0x2001, 0x007b, 0, VR::IS, VM::M1, "AcquisitionNumber" },
 { 0x2001, 0x007c, 0, VR::US, VM::M1, "FrameNumber" },
 { 0x2001, 0x0080, 0, VR::LO, VM::M1, "" },
@@ -9166,25 +9628,25 @@ DictEntry Dict151Contents[] = {
 { 0x2001, 0x0083, 0, VR::DS, VM::M1, "ImagingFrequency" },
 { 0x2001, 0x0084, 0, VR::DS, VM::M1, "InversionTime" },
 { 0x2001, 0x0085, 0, VR::DS, VM::M1, "MagneticFieldStrength" },
-{ 0x2001, 0x0086, 0, VR::IS, VM::M1, "NumberOfPhaseEncodingSteps" },
+{ 0x2001, 0x0086, 0, VR::IS, VM::M1, "NrOfPhaseEncodingSteps" },
 { 0x2001, 0x0087, 0, VR::SH, VM::M1, "ImagedNucleus" },
 { 0x2001, 0x0088, 0, VR::DS, VM::M1, "NumberOfAverages" },
 { 0x2001, 0x0089, 0, VR::DS, VM::M1, "PhaseFOVPercent" },
 { 0x2001, 0x008a, 0, VR::DS, VM::M1, "SamplingPercent" },
 { 0x2001, 0x008b, 0, VR::SH, VM::M1, "TransmittingCoil" },
-{ 0x2001, 0x0090, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0091, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0092, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0093, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x0090, 0, VR::LO, VM::M1, "TextForegroundColor" },
+{ 0x2001, 0x0091, 0, VR::LO, VM::M1, "TextBackgroundColor" },
+{ 0x2001, 0x0092, 0, VR::LO, VM::M1, "TextShadowColor" },
+{ 0x2001, 0x0093, 0, VR::LO, VM::M1, "TextStyle" },
 { 0x2001, 0x009a, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x009b, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x009c, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x009b, 0, VR::UL, VM::M1, "GraphicNumber" },
+{ 0x2001, 0x009c, 0, VR::LO, VM::M1, "GraphicAnnotationLabel" },
 { 0x2001, 0x009f, 0, VR::US, VM::M2, "PixelProcessingKernelSize" },
 { 0x2001, 0x00a1, 0, VR::CS, VM::M1, "IsRawImage" },
-{ 0x2001, 0x00a3, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00a4, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00a5, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00c1, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x00a3, 0, VR::UL, VM::M1, "TextColorForeground" },
+{ 0x2001, 0x00a4, 0, VR::UL, VM::M1, "TextColorBackground" },
+{ 0x2001, 0x00a5, 0, VR::UL, VM::M1, "TextColorShadow" },
+{ 0x2001, 0x00c1, 0, VR::LO, VM::M1, "LinearModalityGLTrafo" },
 { 0x2001, 0x00c8, 0, VR::LO, VM::M1, "ExamCardName" },
 { 0x2001, 0x00cc, 0, VR::ST, VM::M1, "DerivationDescription" },
 { 0x2001, 0x00da, 0, VR::CS, VM::M1, "" },
@@ -9192,111 +9654,117 @@ DictEntry Dict151Contents[] = {
 { 0x2001, 0x00f2, 0, VR::FL, VM::M6, "RetrospectiveMotionCorrection" },
 };
 
-unsigned short Dict151TagHashTable[] = {
-  116,   121,   124,   127,   115,   130,   133,   136,   139,   142,
-  145,   148,   115,   151,   115,   154,   115,   115,   115,   115,
-  157,   160,   163,   166,   169,   174,   177,   180,   185,   190,
-  195,   200,   205,   210,   213,   218,   223,   226,   229,   115,
-  234,   237,   240,   245,   252,   259,   264,   269,   274,   279,
-  284,   287,   292,   295,   298,   301,   306,   309,   312,   317,
-  322,   325,   330,   333,   336,   339,   344,   349,   352,   355,
-  358,   361,   364,   367,   370,   373,   376,   379,   115,   382,
-  385,   115,   388,   115,   391,   115,   115,   115,   115,   115,
-  394,   397,   400,   115,   403,   406,   409,   115,   115,   115,
-  412,   415,   418,   115,   115,   421,   115,   115,   115,   115,
-  424,   427,   430,   115,   115,     0,     2,    50,    75,   112,
-  218,     1,    51,    76,     1,    52,    77,     1,    53,    78,
-    1,    54,    80,     1,    55,    81,     1,    56,    82,     1,
-   57,    83,     1,    58,    84,     1,    59,    85,     1,    60,
-   86,     1,    61,    88,     1,    62,    90,     1,    63,    95,
-    1,    64,    96,     1,    65,    97,     1,    66,    98,     2,
-   67,    99,   114,   242,     1,    68,   100,     1,    69,   101,
-    2,    88,   131,   113,   241,     2,    70,   103,    87,   130,
-    2,    71,   104,    86,   129,     2,    72,   105,    85,   128,
-    2,    73,   106,    92,   135,     2,    74,   107,    91,   134,
-    1,    90,   133,     2,    75,   109,    89,   132,     2,    76,
-  110,    96,   139,     1,    95,   138,     1,    94,   137,     2,
-   77,   113,    93,   136,     1,     0,     1,     1,    78,   116,
-    2,     2,     3,    79,   117,     3,     1,     2,    80,   118,
-  100,   147,     3,     4,     5,    81,   119,    99,   146,     2,
-    3,     4,    98,   145,     2,     6,     7,    97,   144,     2,
-    5,     6,    82,   122,     2,     8,     9,    83,   123,     2,
-    7,     8,    84,   124,     1,    10,    11,     2,     9,    10,
-  102,   155,     1,   101,   154,     1,    11,    12,     1,    13,
-   15,     2,    12,    14,   104,   159,     1,    15,    17,     1,
-   14,    16,     2,    17,    19,   103,   156,     2,    16,    18,
-  106,   163,     1,    19,    21,     2,    18,    20,   105,   161,
-    1,    21,    23,     1,    20,    22,     1,    23,    25,     2,
-   22,    24,   108,   165,     2,    25,    27,   107,   164,     1,
-   24,    26,     1,    27,    29,     1,    26,    28,     1,    29,
-   31,     1,    28,    30,     1,    31,    33,     1,    30,    32,
-    1,    33,    35,     1,    32,    34,     1,    35,    37,     1,
-   34,    36,     1,    36,    38,     1,    37,    41,     1,    38,
-   43,     1,    39,    45,     1,    41,    51,     1,    40,    50,
-    1,    42,    53,     1,   109,   193,     1,    43,    54,     1,
-   44,    57,     1,    45,    61,     1,   110,   200,     1,    46,
-   63,     1,   111,   204,     1,    47,    70,     1,    48,    71,
-    1,    49,    72,
-};
-
-unsigned short Dict151KeyHashTable[] = {
-  115,   116,   115,   115,   119,   115,   115,   124,   115,   115,
-  127,   115,   130,   135,   115,   138,   115,   115,   141,   144,
-  147,   150,   115,   153,   115,   158,   161,   115,   166,   115,
-  169,   172,   115,   115,   115,   175,   115,   180,   183,   186,
-  115,   115,   191,   194,   201,   204,   209,   115,   212,   115,
-  215,   115,   218,   225,   228,   115,   115,   115,   115,   231,
-  234,   115,   237,   240,   115,   243,   115,   246,   115,   249,
-  115,   115,   115,   115,   252,   115,   115,   115,   255,   115,
-  115,   258,   261,   266,   115,   269,   272,   275,   115,   115,
-  115,   278,   115,   375,   378,   115,   115,   115,   381,   115,
-  115,   115,   384,   115,   387,   115,   390,   115,   115,   115,
-  393,   115,   115,   115,   398,     0,     1,     0,  2088,     2,
-   17, 35626,    39, 44341,     1,    26, 25264,     1,     9,  9372,
-    2,    13, 44827,    31, 16493,     1,    28, 18577,     1,    88,
-25260,     1,    64, 27166,     1,    23, 64272,     1,    80, 31103,
-    1,    91, 22519,     2,    24,    80,   104, 54963,     1,    89,
- 9032,     2,    14, 42773,    81, 56404,     1,    94, 15378,     1,
-   12,  4822,     1,    43,  2266,     2,    25, 31003,   105, 60713,
-    1,    34, 21703,     1,    84, 28737,     2,    40, 49592,    93,
-35726,     1,    70, 48180,     3,    21, 62292,    63, 53651,    86,
-15159,     1,    61,  6687,     2,     6, 27050,    16, 42136,     1,
-    7,  1611,     1,     8, 52205,     1,    87,   326,     3,    65,
-63497,    67,  3013,   110, 14157,     1,    83, 65494,     1,    18,
-62604,     1,     5, 32337,     1,     3,  2891,     1,    10, 16721,
-    1,    22, 12701,     1,    30, 13913,     1,   113, 52492,     1,
-   42,  9525,     1,    95, 44829,     1,    20, 20148,     1,    35,
-27688,     2,    96, 38698,   114, 40816,     1,    11, 34906,     1,
-    2, 12392,     1,    27,    62,     1,     1, 33166,    48,     4,
-   46,    32, 21122,    36,    46,    37,    46,    38,    46,    41,
-60502,    44,    46,    45,    46,    46,    46,    47,    46,    48,
-   46,    49,    46,    50,    46,    51,    46,    52,    46,    53,
-   46,    54,    46,    55,    46,    56,    46,    57,    46,    58,
-   46,    59,    46,    60,    46,    62,    46,    68,    46,    69,
-   46,    71,    46,    72,    46,    73,    46,    74,    46,    75,
-   46,    77,    46,    78,    46,    79,    46,    82,    46,    85,
-   46,    97,    46,    98,    46,    99,    46,   100,    46,   101,
-   46,   102,    46,   103,    46,   106,    46,   107,    46,   108,
-   46,   109,    46,   112,    46,     1,    15, 34543,     1,    29,
-14876,     1,    92, 61619,     1,    76, 23588,     1,    66, 53818,
-    1,    19, 30631,     2,    33, 62259,    90, 30886,     1,   111,
- 9412,
+const unsigned short Dict157TagHashTable[] = {
+  122,   125,   128,   133,   138,   141,   144,   147,   150,   121,
+  153,   156,   121,   159,   121,   162,   121,   121,   121,   121,
+  121,   165,   168,   171,   121,   121,   174,   177,   121,   121,
+  121,   180,   121,   185,   121,   121,   121,   121,   188,   193,
+  196,   199,   202,   207,   121,   121,   210,   213,   216,   219,
+  121,   222,   225,   230,   233,   236,   239,   242,   121,   245,
+  121,   248,   121,   121,   251,   254,   257,   260,   263,   266,
+  269,   272,   275,   121,   278,   281,   284,   289,   292,   295,
+  298,   301,   121,   121,   304,   307,   312,   315,   320,   325,
+  330,   335,   338,   343,   348,   355,   362,   367,   370,   373,
+  376,   379,   384,   389,   394,   397,   400,   403,   406,   409,
+  414,   419,   422,   425,   430,   433,   436,   441,   446,   449,
+  454,     0,     1,    26,    28,     1,    29,    31,     2,    28,
+   30,   114,   165,     2,    31,    33,   113,   164,     1,    30,
+   32,     1,    33,    35,     1,    32,    34,     1,    35,    37,
+    1,    34,    36,     1,    36,    38,     1,    37,    41,     1,
+   38,    43,     1,    39,    45,     1,    41,    51,     1,    40,
+   50,     1,    42,    53,     1,    43,    54,     1,    44,    57,
+    2,    45,    61,   115,   193,     1,    46,    63,     2,    47,
+   67,   116,   200,     1,    48,    68,     1,    49,    69,     1,
+   50,    70,     2,    51,    71,   117,   204,     1,    52,    72,
+    1,    53,    75,     1,    54,    76,     1,    55,    77,     1,
+   56,    78,     1,    57,    80,     2,    58,    81,   118,   218,
+    1,    59,    82,     1,    60,    83,     1,    61,    84,     1,
+   62,    85,     1,    63,    86,     1,    64,    88,     1,    65,
+   90,     1,    66,    93,     1,    67,    94,     1,    68,    95,
+    1,    69,    96,     1,    70,    97,     1,    71,    98,     1,
+   72,    99,     1,    73,   100,     1,    74,   101,     1,    75,
+  103,     1,    76,   104,     2,    77,   105,   120,   242,     1,
+   78,   106,     1,    79,   107,     1,   119,   241,     1,    80,
+  109,     1,    81,   110,     1,    82,   113,     2,    83,   114,
+   94,   131,     1,    93,   130,     2,    84,   116,    92,   129,
+    2,    85,   117,    91,   128,     2,    86,   118,    98,   135,
+    2,    87,   119,    97,   134,     1,    96,   133,     2,     0,
+    1,    95,   132,     2,    88,   122,   102,   139,     3,     2,
+    3,    89,   123,   101,   138,     3,     1,     2,    90,   124,
+  100,   137,     2,     4,     5,    99,   136,     1,     3,     4,
+    1,     6,     7,     1,     5,     6,     1,     8,     9,     2,
+    7,     8,   106,   147,     2,    10,    11,   105,   146,     2,
+    9,    10,   104,   145,     1,   103,   144,     1,    11,    12,
+    1,    13,    15,     1,    12,    14,     1,    15,    17,     2,
+   14,    16,   108,   155,     2,    17,    19,   107,   154,     1,
+   16,    18,     1,    19,    21,     2,    18,    20,   110,   159,
+    1,    21,    23,     1,    20,    22,     2,    23,    25,   109,
+  156,     2,    22,    24,   112,   163,     1,    25,    27,     2,
+   24,    26,   111,   161,     1,    27,    29,
+};
+
+const unsigned short Dict157KeyHashTable[] = {
+  121,   121,   121,   121,   121,   122,   125,   132,   137,   121,
+  121,   140,   143,   146,   149,   154,   159,   162,   165,   168,
+  121,   121,   121,   121,   171,   121,   174,   177,   121,   121,
+  121,   182,   185,   121,   188,   121,   191,   196,   121,   201,
+  206,   211,   121,   121,   214,   217,   121,   121,   222,   225,
+  234,   237,   244,   247,   121,   121,   252,   255,   274,   277,
+  121,   282,   285,   121,   290,   295,   121,   121,   300,   303,
+  306,   121,   309,   312,   315,   320,   325,   328,   331,   334,
+  339,   121,   344,   349,   352,   121,   121,   355,   358,   365,
+  368,   371,   121,   378,   121,   381,   386,   389,   392,   395,
+  400,   121,   403,   406,   411,   121,   414,   121,   121,   419,
+  422,   425,   428,   431,   121,   121,   434,   437,   121,   121,
+  440,     0,     1,    36, 38495,     3,    67, 48876,    74, 48231,
+   96, 36938,     2,    61, 25073,   101,  3610,     1,    93,  6268,
+    1,    80, 29542,     1,    31, 33007,     1,   102, 40571,     2,
+   90, 37603,    97, 26027,     2,    14, 26570,    15, 60995,     1,
+   54, 13865,     1,     4, 53828,     1,    19, 11781,     1,    94,
+40256,     1,    40, 35759,     1,    99,  1999,     2,    60, 13301,
+   83, 37303,     1,    58, 23725,     1,    25, 48964,     1,    20,
+49480,     2,    21, 53787,    22, 16946,     2,     8, 27410,    24,
+56946,     2,    41, 26630,    49, 18458,     2,    33, 44007,   116,
+10747,     1,   104, 51872,     1,    62,  9966,     2,    29, 53677,
+   32, 47156,     1,    34, 44458,     4,    16, 35172,    65, 11534,
+  109, 63093,   113, 14616,     1,    23,  3673,     3,     5, 25859,
+   68, 30409,    82,  4893,     1,   103, 33584,     2,     6, 63622,
+   50, 37311,     1,     9, 50070,     9,    37,    44,    38,    44,
+   44,    44,    79,    44,    84,    44,    85,    44,    91,    44,
+  107,    44,   118,    44,     1,   105, 30749,     2,    27, 28765,
+   66, 14024,     1,    11, 52132,     2,    30, 26222,    73, 33790,
+    2,    46, 59320,    63, 54477,     2,    87,  4861,    89, 11334,
+    1,    57, 52379,     1,   119, 31474,     1,     3,  9247,     1,
+   71, 61982,     1,    98, 55314,     2,    39, 23185,    72, 46193,
+    2,    17, 16527,    78, 61047,     1,    92, 18740,     1,    43,
+15568,     1,    51,  7525,     2,    42, 19885,   110, 49529,     2,
+    1, 40729,    77, 22250,     2,    28,  5198,    75, 40916,     1,
+    7, 34028,     1,    10,  8309,     1,    53, 62351,     3,    45,
+45029,    55, 23907,   111, 57702,     1,   108, 40875,     1,    56,
+46044,     3,    70, 14852,    76, 61743,   115, 61743,     1,     0,
+10108,     2,    18, 28627,    86, 38226,     1,    59, 37023,     1,
+   13, 13356,     1,    64, 29103,     2,    95, 10750,   100, 40071,
+    1,    48, 45173,     1,    26,  6137,     2,   106, 60724,   117,
+ 9487,     1,    12,  7832,     2,     2, 35067,   120, 64248,     1,
+  112, 34383,     1,    81, 25668,     1,    88, 59755,     1,    47,
+26328,     1,    69, 27443,     1,    35,   317,     1,   114, 37450,
+    1,    52, 45035,
 };
 
-vtkDICOMDictionary::Dict Dict151Data = {
+vtkDICOMDictionary::Dict Dict157Data = {
 "Philips Imaging DD 001",
-115,
-115,
-Dict151TagHashTable,
-Dict151KeyHashTable,
-Dict151Contents
+121,
+121,
+Dict157TagHashTable,
+Dict157KeyHashTable,
+Dict157Contents
 };
 
 // ----- PRIVATE_CODE_STRING_1003 -----
 
-DictEntry Dict152Contents[] = {
+const DictEntry Dict158Contents[] = {
 { 0x1003, 0x0001, 0, VR::UN, VM::M1, "NumberOfProbes" },
-{ 0x1003, 0x0010, 0, VR::UN, VM::M1, "US Probe Sequence" },
+{ 0x1003, 0x0010, 0, VR::UN, VM::M1, "USProbeSequence" },
 { 0x1003, 0x0011, 0, VR::UN, VM::M1, "Identifier" },
 { 0x1003, 0x0012, 0, VR::UN, VM::M1, "ProbeName" },
 { 0x1003, 0x0013, 0, VR::UN, VM::M1, "Depth" },
@@ -9323,7 +9791,7 @@ DictEntry Dict152Contents[] = {
 { 0x1003, 0x0043, 0, VR::UN, VM::M1, "Focus" },
 };
 
-unsigned short Dict152TagHashTable[] = {
+const unsigned short Dict158TagHashTable[] = {
    27,    30,    33,    26,    26,    26,    26,    26,    26,    36,
    26,    26,    26,    26,    39,    44,    49,    54,    59,    64,
    69,    74,    79,    84,    89,    92,     0,     1,    10,    25,
@@ -9336,31 +9804,31 @@ unsigned short Dict152TagHashTable[] = {
    19,    49,     1,    18,    48,
 };
 
-unsigned short Dict152KeyHashTable[] = {
-   27,    26,    34,    26,    37,    40,    45,    48,    26,    26,
-   53,    26,    62,    65,    68,    26,    26,    26,    26,    26,
-   71,    74,    77,    82,    87,    26,     0,     3,     2, 62212,
-    7, 54333,    23, 62212,     1,    13, 48157,     1,     9,  3088,
-    2,    20, 32205,    25, 56144,     1,    14, 30943,     2,     8,
-16664,    18,  2750,     4,     0, 14266,     4, 17176,    16,  5098,
-   17, 55538,     1,    12, 40215,     1,    24, 50301,     1,    21,
- 9095,     1,     6,  4184,     1,    11, 35619,     2,    19, 17277,
-   22, 64610,     2,     5, 24208,    10, 43477,     3,     1,   751,
+const unsigned short Dict158KeyHashTable[] = {
+   27,    26,    34,    26,    39,    42,    47,    50,    26,    26,
+   55,    26,    64,    67,    70,    26,    26,    26,    26,    26,
+   73,    76,    79,    84,    89,    26,     0,     3,     2, 62212,
+    7, 54333,    23, 62212,     2,     1, 45350,    13, 48157,     1,
+    9,  3088,     2,    20, 32205,    25, 56144,     1,    14, 30943,
+    2,     8, 16664,    18,  2750,     4,     0, 14266,     4, 17176,
+   16,  5098,    17, 55538,     1,    12, 40215,     1,    24, 50301,
+    1,    21,  9095,     1,     6,  4184,     1,    11, 35619,     2,
+   19, 17277,    22, 64610,     2,     5, 24208,    10, 43477,     2,
     3, 41983,    15, 50436,
 };
 
-vtkDICOMDictionary::Dict Dict152Data = {
+vtkDICOMDictionary::Dict Dict158Data = {
 "PRIVATE_CODE_STRING_1003",
 26,
 26,
-Dict152TagHashTable,
-Dict152KeyHashTable,
-Dict152Contents
+Dict158TagHashTable,
+Dict158KeyHashTable,
+Dict158Contents
 };
 
 // ----- Applicare/Workflow/Version 1.0 -----
 
-DictEntry Dict153Contents[] = {
+const DictEntry Dict159Contents[] = {
 { 0x3113, 0x0001, 0, VR::CS, VM::M1, "OrderControl" },
 { 0x3113, 0x0010, 0, VR::SH, VM::M1, "ScheduledActionItemCodeValue" },
 { 0x3113, 0x0011, 0, VR::SH, VM::M1, "ScheduledActionItemCodingSchemeDesignator" },
@@ -9381,7 +9849,7 @@ DictEntry Dict153Contents[] = {
 { 0x3113, 0x00E2, 0, VR::CS, VM::M1, "KfEditLockUser" },
 };
 
-unsigned short Dict153TagHashTable[] = {
+const unsigned short Dict159TagHashTable[] = {
    18,    18,    18,    18,    19,    22,    25,    18,    18,    28,
    31,    36,    41,    46,    49,    54,    59,    64,     0,     1,
    12,    39,     1,    11,    38,     1,    10,    37,     1,     9,
@@ -9391,7 +9859,7 @@ unsigned short Dict153TagHashTable[] = {
     2,    17,    17,   226,     1,     1,    16,
 };
 
-unsigned short Dict153KeyHashTable[] = {
+const unsigned short Dict159KeyHashTable[] = {
    19,    22,    25,    18,    18,    30,    33,    18,    36,    18,
    39,    18,    18,    42,    51,    56,    61,    18,     0,     1,
    10, 48685,     1,    11, 15677,     2,     0,  7200,     2, 39829,
@@ -9401,18 +9869,85 @@ unsigned short Dict153KeyHashTable[] = {
 19055,     2,    12, 20206,    17, 41562,
 };
 
-vtkDICOMDictionary::Dict Dict153Data = {
+vtkDICOMDictionary::Dict Dict159Data = {
 "Applicare/Workflow/Version 1.0",
 18,
 18,
-Dict153TagHashTable,
-Dict153KeyHashTable,
-Dict153Contents
+Dict159TagHashTable,
+Dict159KeyHashTable,
+Dict159Contents
 };
 
 // ----- PRIVATE_CODE_STRING_1001 -----
 
-DictEntry Dict154Contents[] = {
+const DictEntry Dict160Contents[] = {
+{ 0x1001, 0x00A0, 0, VR::SQ, VM::M1, "MarkerSequence" },
+{ 0x1001, 0x00A1, 0, VR::SL, VM::M1, "MarkerType" },
+{ 0x1001, 0x00A2, 0, VR::SL, VM::M1, "MarkerNumber" },
+{ 0x1001, 0x00A3, 0, VR::FD, VM::M3, "Marker3DPosition" },
+{ 0x1001, 0x00B0, 0, VR::SL, VM::M1, "DistanceUnit" },
+{ 0x1001, 0x00B1, 0, VR::SL, VM::M1, "DoseUnit" },
+{ 0x1001, 0x00B2, 0, VR::SL, VM::M1, "NormalisationMode" },
+{ 0x1001, 0x00B3, 0, VR::FD, VM::M1, "NormalisationFactor" },
+{ 0x1001, 0x00B4, 0, VR::FD, VM::M1, "FValue" },
+{ 0x1001, 0x00B5, 0, VR::FD, VM::M1, "PrescribedDose" },
+{ 0x1001, 0x00B6, 0, VR::FD, VM::M1, "AbsoluteDoseFactor" },
+{ 0x1001, 0x00B7, 0, VR::SL, VM::M1, "DecoupledSK" },
+{ 0x1001, 0x00B8, 0, VR::FD, VM::M1, "AbsoluteTimeFactor" },
+{ 0x1001, 0x00B9, 0, VR::FD, VM::M1, "TotalTreatmentTime" },
+{ 0x1001, 0x00BA, 0, VR::SL, VM::M1, "TG43Model" },
+{ 0x1001, 0x00BB, 0, VR::SL, VM::M1, "ThreeDDoseGridSize" },
+{ 0x1001, 0x00BC, 0, VR::FD, VM::M3, "DoseGridCorner1" },
+{ 0x1001, 0x00BD, 0, VR::FD, VM::M3, "DoseGridCorner2" },
+{ 0x1001, 0x00BE, 0, VR::FD, VM::M1, "PatientDataConversion" },
+{ 0x1001, 0x00BF, 0, VR::FD, VM::M1, "VolumeDataConversion" },
+{ 0x1001, 0x00C0, 0, VR::FD, VM::M3, "VolumeDataVector" },
+{ 0x1001, 0x00C1, 0, VR::SL, VM::M1, "OptimizationMethod" },
+{ 0x1001, 0x00C2, 0, VR::SL, VM::M1, "DisplayMethod" },
+{ 0x1001, 0x00C3, 0, VR::SQ, VM::M1, "VOIBasedOptimizationSettingsSequence" },
+{ 0x1001, 0x00C5, 0, VR::SL, VM::M1, "VOINumber" },
+{ 0x1001, 0x00C6, 0, VR::LO, VM::M1, "VOIName" },
+{ 0x1001, 0x00C7, 0, VR::SL, VM::M1, "VOIType" },
+{ 0x1001, 0x00C8, 0, VR::SL, VM::M1, "VOIClass" },
+{ 0x1001, 0x00C9, 0, VR::SL, VM::M1, "VOIPriority" },
+{ 0x1001, 0x00CA, 0, VR::SL, VM::M1, "NoOfPoints" },
+{ 0x1001, 0x00CB, 0, VR::FD, VM::M1, "PercentOnSurface" },
+{ 0x1001, 0x00CC, 0, VR::FD, VM::M1, "SurfaceMargin" },
+{ 0x1001, 0x00CD, 0, VR::SL, VM::M1, "Selected" },
+{ 0x1001, 0x00CE, 0, VR::FD, VM::M1, "DoseLimit" },
+{ 0x1001, 0x00CF, 0, VR::FD, VM::M1, "ImportanceFactor" },
+{ 0x1001, 0x00D0, 0, VR::FD, VM::M1, "ImportanceFactorFrom" },
+{ 0x1001, 0x00D1, 0, VR::FD, VM::M1, "ImportanceFactorTo" },
+{ 0x1001, 0x00D2, 0, VR::FD, VM::M1, "Focus" },
+{ 0x1001, 0x00D3, 0, VR::SL, VM::M1, "SurfaceSamplingMethod" },
+{ 0x1001, 0x00D4, 0, VR::FD, VM::M1, "NumberOfSamplingPointsPerccm" },
+{ 0x1001, 0x00D5, 0, VR::SL, VM::M1, "ConvergenceAccuracy" },
+{ 0x1001, 0x00D6, 0, VR::SL, VM::M1, "MaxNoOfConvergenceIterations" },
+{ 0x1001, 0x00D7, 0, VR::FD, VM::M1, "WeightSmoothing" },
+{ 0x1001, 0x00D8, 0, VR::SL, VM::M1, "StepsPerImportanceFactor" },
+{ 0x1001, 0x00D9, 0, VR::FD, VM::M1, "ConstraintsPTVDmax" },
+{ 0x1001, 0x00DA, 0, VR::FD, VM::M1, "ConstraintsNTDmax" },
+{ 0x1001, 0x00DB, 0, VR::SL, VM::M1, "AlgorithmicPopulationSize" },
+{ 0x1001, 0x00DC, 0, VR::SL, VM::M1, "AlgorithmicGenerations" },
+{ 0x1001, 0x00DD, 0, VR::SL, VM::M1, "AlgorithmicInitializations" },
+{ 0x1001, 0x00DE, 0, VR::SL, VM::M1, "MinNoOfSDP" },
+{ 0x1001, 0x00DF, 0, VR::SL, VM::M1, "DepthMethod" },
+{ 0x1001, 0x00E0, 0, VR::SL, VM::M1, "DepthDefinedOn" },
+{ 0x1001, 0x00E1, 0, VR::FD, VM::M1, "Depth" },
+{ 0x1001, 0x00E2, 0, VR::SQ, VM::M1, "VOIBasedPlacementSettingsSequence" },
+{ 0x1001, 0x00E7, 0, VR::SL, VM::M1, "VOISelected" },
+{ 0x1001, 0x00E8, 0, VR::FD, VM::M1, "Margin" },
+{ 0x1001, 0x00E9, 0, VR::SL, VM::M1, "SelectionMethod" },
+{ 0x1001, 0x00EA, 0, VR::FD, VM::M1, "SelectionDistance" },
+{ 0x1001, 0x00EB, 0, VR::FD, VM::M1, "WBTOnContourSpacing" },
+{ 0x1001, 0x00EC, 0, VR::FD, VM::M1, "WBTUrethraMargin" },
+{ 0x1001, 0x00ED, 0, VR::FD, VM::M1, "WBTSearchingRadiusPTV" },
+{ 0x1001, 0x00EE, 0, VR::FD, VM::M1, "WBTSearchingRadiusOAR" },
+{ 0x1001, 0x00EF, 0, VR::FD, VM::M3, "WBTStartingPoint" },
+{ 0x1001, 0x00F0, 0, VR::FD, VM::M4, "WBTSurface" },
+{ 0x1001, 0x00F1, 0, VR::FD, VM::M4, "WBTNoOfInteriorCatheters" },
+{ 0x1001, 0x00F2, 0, VR::FD, VM::M4, "WBTRelativeRadius" },
+{ 0x1001, 0x00F3, 0, VR::SL, VM::M1, "SortingMethod" },
 { 0x1001, 0x00A0, 0, VR::SQ, VM::M1, "MarkerSequence" },
 { 0x1001, 0x00A1, 0, VR::SL, VM::M1, "MarkerType" },
 { 0x1001, 0x00A2, 0, VR::SL, VM::M1, "MarkerNumber" },
@@ -9426,7 +9961,7 @@ DictEntry Dict154Contents[] = {
 { 0x1001, 0x00B6, 0, VR::FD, VM::M1, "AbsoluteDoseFactor" },
 { 0x1001, 0x00B7, 0, VR::SL, VM::M1, "DecoupledSK" },
 { 0x1001, 0x00B8, 0, VR::FD, VM::M1, "AbsoluteTimeFactor" },
-{ 0x1001, 0x00B9, 0, VR::FD, VM::M1, "Total Treatment Time" },
+{ 0x1001, 0x00B9, 0, VR::FD, VM::M1, "TotalTreatmentTime" },
 { 0x1001, 0x00BA, 0, VR::SL, VM::M1, "TG43Model" },
 { 0x1001, 0x00BB, 0, VR::SL, VM::M1, "ThreeDDoseGridSize" },
 { 0x1001, 0x00BC, 0, VR::FD, VM::M3, "DoseGridCorner1" },
@@ -9482,125 +10017,167 @@ DictEntry Dict154Contents[] = {
 { 0x1001, 0x00F3, 0, VR::SL, VM::M1, "SortingMethod" },
 };
 
-unsigned short Dict154TagHashTable[] = {
-   67,    67,    67,    68,    71,    74,    77,    80,    83,    67,
-   86,    89,    92,    95,    98,   101,   104,   107,   110,   113,
-  116,   119,   122,   125,   128,   131,   134,   137,   140,   143,
-  146,   149,   152,   157,   162,   167,    67,   172,   175,    67,
-  178,    67,    67,   181,   184,   187,   190,   193,   196,   201,
-  206,   211,   216,   221,   226,   231,   234,   237,   240,   243,
-  246,   249,   252,   255,    67,    67,    67,     0,     1,    22,
-  194,     1,    23,   195,     1,    20,   192,     1,    21,   193,
-    1,    25,   198,     1,    26,   199,     1,    24,   197,     1,
-   29,   202,     1,    30,   203,     1,    27,   200,     1,    28,
-  201,     1,    33,   206,     1,    34,   207,     1,    31,   204,
-    1,    32,   205,     1,    37,   210,     1,    38,   211,     1,
-   35,   208,     1,    36,   209,     1,    41,   214,     1,    42,
-  215,     1,    39,   212,     1,    40,   213,     1,    45,   218,
-    1,    46,   219,     1,    43,   216,     1,    44,   217,     1,
-   49,   222,     2,     3,   163,    50,   223,     2,     2,   162,
-   47,   220,     2,     1,   161,    48,   221,     2,     0,   160,
-   53,   226,     1,    51,   224,     1,    52,   225,     1,    54,
-  231,     1,    57,   234,     1,    58,   235,     1,    55,   232,
-    1,    56,   233,     1,    61,   238,     2,     7,   179,    62,
-  239,     2,     6,   178,    59,   236,     2,     5,   177,    60,
-  237,     2,     4,   176,    65,   242,     2,    11,   183,    66,
-  243,     2,    10,   182,    63,   240,     2,     9,   181,    64,
-  241,     1,     8,   180,     1,    15,   187,     1,    14,   186,
-    1,    13,   185,     1,    12,   184,     1,    19,   191,     1,
-   18,   190,     1,    17,   189,     1,    16,   188,
-};
-
-unsigned short Dict154KeyHashTable[] = {
-   68,    73,    67,    78,    67,    85,    92,    95,    67,    98,
-  101,   104,   111,   114,    67,   117,    67,   124,    67,    67,
-   67,    67,   127,   134,   137,   142,   145,   148,   151,    67,
-  154,    67,   157,    67,   160,   163,   166,   169,   172,    67,
-  175,    67,   178,   181,    67,   184,   191,    67,    67,    67,
-  194,   197,   202,    67,   205,   210,   213,   216,   221,    67,
-  224,   229,   234,   239,   244,    67,    67,     0,     2,    32,
-59034,    34, 55346,     2,    29,  5649,    62, 14253,     3,    13,
- 5667,    33, 24356,    48, 38032,     3,    50, 45042,    58, 61715,
-   66,  9709,     1,    23,  7679,     1,     7, 29535,     1,    65,
-55151,     1,    51, 13172,     3,    24,   539,    45, 19530,    47,
-37028,     1,    52, 50682,     1,    43, 21717,     3,     1, 58302,
-   46, 24805,    60, 47315,     1,    41,   895,     3,     9, 45279,
-   10, 12136,    12, 43860,     1,    18, 49089,     2,    15, 36775,
-   64, 52169,     1,    22, 23873,     1,    39,  9833,     1,    40,
- 8652,     1,     0, 18796,     1,    30, 25994,     1,    21,  4239,
-    1,    44, 63381,     1,     5, 22095,     1,     6, 45058,     1,
-   61, 47289,     1,     4, 49838,     1,    42, 11999,     1,    16,
-34562,     1,    17, 34562,     3,    26, 36856,    35, 43551,    54,
-65285,     1,     8,  1374,     1,    14, 23522,     2,    19, 36846,
-   49,  8197,     1,    31, 18120,     2,    38, 37084,    56, 44274,
-    1,    53,  8170,     1,    55, 34041,     2,     2, 25885,    28,
-25300,     1,    25, 33246,     2,    37, 25699,    59, 26501,     2,
-    3, 17778,    36,  4148,     2,    11, 17758,    63, 21471,     2,
-   20, 37337,    27, 57166,     1,    57, 42386,
+const unsigned short Dict160TagHashTable[] = {
+  134,   134,   134,   134,   134,   134,   134,   134,   134,   134,
+  134,   134,   134,   134,   134,   134,   134,   134,   134,   134,
+  134,   134,   134,   134,   134,   134,   134,   134,   134,   134,
+  134,   134,   135,   140,   145,   150,   134,   134,   134,   134,
+  134,   134,   134,   134,   134,   134,   134,   134,   155,   160,
+  165,   170,   175,   180,   185,   190,   195,   200,   205,   210,
+  215,   220,   225,   230,   134,   134,   134,   134,   134,   134,
+  235,   240,   245,   250,   255,   260,   134,   265,   270,   275,
+  280,   285,   290,   295,   300,   305,   310,   315,   320,   325,
+  330,   335,   340,   345,   350,   355,   360,   365,   370,   375,
+  380,   385,   390,   134,   395,   400,   134,   405,   134,   134,
+  410,   415,   420,   425,   430,   435,   440,   445,   450,   455,
+  460,   465,   134,   134,   134,   134,   134,   134,   134,   134,
+  134,   134,   134,   134,     0,     2,     3,   163,    70,   163,
+    2,     2,   162,    69,   162,     2,     1,   161,    68,   161,
+    2,     0,   160,    67,   160,     2,     7,   179,    74,   179,
+    2,     6,   178,    73,   178,     2,     5,   177,    72,   177,
+    2,     4,   176,    71,   176,     2,    11,   183,    78,   183,
+    2,    10,   182,    77,   182,     2,     9,   181,    76,   181,
+    2,     8,   180,    75,   180,     2,    15,   187,    82,   187,
+    2,    14,   186,    81,   186,     2,    13,   185,    80,   185,
+    2,    12,   184,    79,   184,     2,    19,   191,    86,   191,
+    2,    18,   190,    85,   190,     2,    17,   189,    84,   189,
+    2,    16,   188,    83,   188,     2,    22,   194,    89,   194,
+    2,    23,   195,    90,   195,     2,    20,   192,    87,   192,
+    2,    21,   193,    88,   193,     2,    25,   198,    92,   198,
+    2,    26,   199,    93,   199,     2,    24,   197,    91,   197,
+    2,    29,   202,    96,   202,     2,    30,   203,    97,   203,
+    2,    27,   200,    94,   200,     2,    28,   201,    95,   201,
+    2,    33,   206,   100,   206,     2,    34,   207,   101,   207,
+    2,    31,   204,    98,   204,     2,    32,   205,    99,   205,
+    2,    37,   210,   104,   210,     2,    38,   211,   105,   211,
+    2,    35,   208,   102,   208,     2,    36,   209,   103,   209,
+    2,    41,   214,   108,   214,     2,    42,   215,   109,   215,
+    2,    39,   212,   106,   212,     2,    40,   213,   107,   213,
+    2,    45,   218,   112,   218,     2,    46,   219,   113,   219,
+    2,    43,   216,   110,   216,     2,    44,   217,   111,   217,
+    2,    49,   222,   116,   222,     2,    50,   223,   117,   223,
+    2,    47,   220,   114,   220,     2,    48,   221,   115,   221,
+    2,    53,   226,   120,   226,     2,    51,   224,   118,   224,
+    2,    52,   225,   119,   225,     2,    54,   231,   121,   231,
+    2,    57,   234,   124,   234,     2,    58,   235,   125,   235,
+    2,    55,   232,   122,   232,     2,    56,   233,   123,   233,
+    2,    61,   238,   128,   238,     2,    62,   239,   129,   239,
+    2,    59,   236,   126,   236,     2,    60,   237,   127,   237,
+    2,    65,   242,   132,   242,     2,    66,   243,   133,   243,
+    2,    63,   240,   130,   240,     2,    64,   241,   131,   241,
+};
+
+const unsigned short Dict160KeyHashTable[] = {
+  135,   134,   134,   144,   134,   153,   134,   134,   134,   134,
+  158,   163,   172,   134,   134,   177,   134,   134,   134,   134,
+  134,   134,   182,   134,   134,   134,   134,   191,   196,   134,
+  201,   134,   134,   134,   134,   134,   206,   134,   211,   134,
+  134,   134,   216,   221,   134,   226,   231,   134,   134,   134,
+  236,   241,   246,   134,   251,   260,   134,   265,   270,   134,
+  134,   275,   284,   289,   294,   134,   134,   134,   299,   134,
+  134,   134,   308,   317,   322,   134,   327,   134,   332,   134,
+  341,   134,   346,   134,   355,   134,   134,   134,   134,   360,
+  365,   370,   379,   384,   134,   134,   134,   134,   134,   389,
+  134,   394,   399,   134,   404,   134,   134,   409,   134,   134,
+  134,   134,   414,   134,   134,   134,   134,   134,   423,   134,
+  134,   134,   134,   428,   433,   134,   134,   438,   134,   447,
+  452,   134,   134,   134,     0,     4,    32, 29517,    34, 27673,
+   99, 29517,   101, 27673,     4,    33, 12178,    48, 19016,   100,
+12178,   115, 19016,     2,    50, 22521,   117, 22521,     2,    51,
+39354,   118, 39354,     4,    45,  9765,    47, 51282,   112,  9765,
+  114, 51282,     2,    52, 58109,   119, 58109,     2,     1, 61919,
+   68, 61919,     4,    10, 38836,    12, 21930,    77, 38836,    79,
+21930,     2,    40, 37094,   107, 37094,     2,     0, 42166,    67,
+42166,     2,    30, 45765,    97, 45765,     2,     6, 22529,    73,
+22529,     2,     4, 24919,    71, 24919,     2,    16, 50049,    83,
+50049,     2,    17, 50049,    84, 50049,     2,    26, 51196,    93,
+51196,     2,     8,   687,    75,   687,     2,    14, 44529,    81,
+44529,     2,    19, 18423,    86, 18423,     2,    31,  9060,    98,
+ 9060,     4,    38, 51310,    56, 54905,   105, 51310,   123, 54905,
+    2,    53, 36853,   120, 36853,     2,    28, 12650,    95, 12650,
+    2,    25, 49391,    92, 49391,     4,     3,  8889,    36,  2074,
+   70,  8889,   103,  2074,     2,    11, 41647,    78, 41647,     2,
+   27, 61351,    94, 61351,     2,    57, 53961,   124, 53961,     4,
+   29, 35592,    62, 39894,    96, 35592,   129, 39894,     4,    58,
+63625,    66,  4854,   125, 63625,   133,  4854,     2,    23,  3839,
+   90,  3839,     2,     7, 47535,    74, 47535,     2,    65, 60343,
+  132, 60343,     4,    13, 11749,    24, 33037,    80, 11749,    91,
+33037,     2,    43, 10858,   110, 10858,     4,    46, 12402,    60,
+56425,   113, 12402,   127, 56425,     2,    41, 33215,   108, 33215,
+    2,     9, 55407,    76, 55407,     2,    18, 24544,    85, 24544,
+    4,    15, 18387,    64, 26084,    82, 18387,   131, 26084,     2,
+   22, 11936,    89, 11936,     2,    39,  4916,   106,  4916,     2,
+   21,  2119,    88,  2119,     2,    44, 31690,   111, 31690,     2,
+    5, 43815,    72, 43815,     2,    61, 56412,   128, 56412,     2,
+   42,  5999,   109,  5999,     4,    35, 54543,    54, 32642,   102,
+54543,   121, 32642,     2,    49, 36866,   116, 36866,     2,    55,
+49788,   122, 49788,     2,     2, 45710,    69, 45710,     4,    37,
+12849,    59, 46018,   104, 12849,   126, 46018,     2,    63, 10735,
+  130, 10735,     2,    20, 51436,    87, 51436,
 };
 
-vtkDICOMDictionary::Dict Dict154Data = {
+vtkDICOMDictionary::Dict Dict160Data = {
 "PRIVATE_CODE_STRING_1001",
-67,
-67,
-Dict154TagHashTable,
-Dict154KeyHashTable,
-Dict154Contents
+134,
+134,
+Dict160TagHashTable,
+Dict160KeyHashTable,
+Dict160Contents
 };
 
 // ----- SIEMENS MR EXTRACTED CSA HEADER -----
 
-DictEntry Dict155Contents[] = {
+const DictEntry Dict161Contents[] = {
 { 0x0025, 0x0001, 0, VR::SQ, VM::M1, "ExtractedMRHeaderInformationSequence" },
 { 0x0025, 0x0002, 0, VR::LO, VM::M1, "ExtractedMRHeaderCreatorIdentificationCode" },
 { 0x0025, 0x0003, 0, VR::AT, VM::M1, "ExtractedMRHeaderTag" },
 };
 
-unsigned short Dict155TagHashTable[] = {
+const unsigned short Dict161TagHashTable[] = {
     4,     3,     9,     0,     2,     0,     1,     1,     2,     1,
     2,     3,
 };
 
-unsigned short Dict155KeyHashTable[] = {
+const unsigned short Dict161KeyHashTable[] = {
     4,     7,     3,     0,     1,     2,  9615,     2,     0, 12741,
     1, 45335,
 };
 
-vtkDICOMDictionary::Dict Dict155Data = {
+vtkDICOMDictionary::Dict Dict161Data = {
 "SIEMENS MR EXTRACTED CSA HEADER",
 3,
 3,
-Dict155TagHashTable,
-Dict155KeyHashTable,
-Dict155Contents
+Dict161TagHashTable,
+Dict161KeyHashTable,
+Dict161Contents
 };
 
 // ----- KRETZ_US -----
 
-DictEntry Dict156Contents[] = {
+const DictEntry Dict162Contents[] = {
 { 0x7fe1, 0x0001, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict156TagHashTable[] = {
+const unsigned short Dict162TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict156KeyHashTable[] = {
+const unsigned short Dict162KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict156Data = {
+vtkDICOMDictionary::Dict Dict162Data = {
 "KRETZ_US",
 1,
 1,
-Dict156TagHashTable,
-Dict156KeyHashTable,
-Dict156Contents
+Dict162TagHashTable,
+Dict162KeyHashTable,
+Dict162Contents
 };
 
 // ----- GEIIS PACS -----
 
-DictEntry Dict157Contents[] = {
+const DictEntry Dict163Contents[] = {
 { 0x0903, 0x0010, 0, VR::US, VM::M1, "RejectImageFlag" },
 { 0x0903, 0x0011, 0, VR::US, VM::M1, "SignificantFlag" },
 { 0x0903, 0x0012, 0, VR::US, VM::M1, "ConfidentialFlag" },
@@ -9612,32 +10189,32 @@ DictEntry Dict157Contents[] = {
 { 0x0907, 0x0031, 0, VR::UI, VM::M1TN, "ExcludeStudyUIDs" },
 };
 
-unsigned short Dict157TagHashTable[] = {
+const unsigned short Dict163TagHashTable[] = {
    10,    17,    22,     9,     9,     9,     9,    25,    30,     0,
     3,     1,    17,     6,    35,     8,    49,     2,     0,    16,
     5,    34,     1,     4,    33,     2,     3,    32,     7,    36,
     1,     2,    18,
 };
 
-unsigned short Dict157KeyHashTable[] = {
+const unsigned short Dict163KeyHashTable[] = {
    10,     9,     9,    13,     9,    16,    19,    22,    29,     0,
     1,     8, 17205,     1,     4, 31146,     1,     0, 35306,     1,
     5, 48128,     3,     1,  7407,     6, 21601,     7, 57919,     2,
     2, 34991,     3,   597,
 };
 
-vtkDICOMDictionary::Dict Dict157Data = {
+vtkDICOMDictionary::Dict Dict163Data = {
 "GEIIS PACS",
 9,
 9,
-Dict157TagHashTable,
-Dict157KeyHashTable,
-Dict157Contents
+Dict163TagHashTable,
+Dict163KeyHashTable,
+Dict163Contents
 };
 
 // ----- PRIVATE_CODE_STRING_0021 -----
 
-DictEntry Dict158Contents[] = {
+const DictEntry Dict164Contents[] = {
 { 0x0021, 0x0070, 0, VR::FD, VM::M1, "DistanceBasePlaneToTemplate" },
 { 0x0021, 0x0071, 0, VR::FD, VM::M16, "VolumeToPatientMatrix" },
 { 0x0021, 0x0072, 0, VR::FD, VM::M16, "PatientToWorldMatrix" },
@@ -9647,30 +10224,30 @@ DictEntry Dict158Contents[] = {
 { 0x0021, 0x0076, 0, VR::FD, VM::M1, "BasePlaneOffset" },
 };
 
-unsigned short Dict158TagHashTable[] = {
+const unsigned short Dict164TagHashTable[] = {
     8,    11,    14,    17,    20,    23,    26,     0,     1,     4,
   116,     1,     5,   117,     1,     6,   118,     1,     0,   112,
     1,     1,   113,     1,     2,   114,     1,     3,   115,
 };
 
-unsigned short Dict158KeyHashTable[] = {
+const unsigned short Dict164KeyHashTable[] = {
     8,    11,    14,    17,     7,    20,    25,     0,     1,     3,
 20656,     1,     2, 38847,     1,     4, 15502,     1,     6, 44588,
     2,     0, 47747,     1, 60787,     1,     5, 64891,
 };
 
-vtkDICOMDictionary::Dict Dict158Data = {
+vtkDICOMDictionary::Dict Dict164Data = {
 "PRIVATE_CODE_STRING_0021",
 7,
 7,
-Dict158TagHashTable,
-Dict158KeyHashTable,
-Dict158Contents
+Dict164TagHashTable,
+Dict164KeyHashTable,
+Dict164Contents
 };
 
 // ----- SIEMENS CT VA0  IDE -----
 
-DictEntry Dict159Contents[] = {
+const DictEntry Dict165Contents[] = {
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "" },
 { 0x0009, 0x0030, 0, VR::CS, VM::M1, "" },
 { 0x0009, 0x0031, 0, VR::SH, VM::M1, "" },
@@ -9682,55 +10259,55 @@ DictEntry Dict159Contents[] = {
 { 0x0009, 0x0051, 0, VR::TM, VM::M1, "" },
 };
 
-unsigned short Dict159TagHashTable[] = {
+const unsigned short Dict165TagHashTable[] = {
    10,     9,    13,    18,     9,    21,     9,    24,    31,     0,
     1,     5,    64,     2,     2,    49,     6,    66,     1,     1,
    48,     1,     3,    50,     3,     0,    16,     4,    52,     7,
    80,     1,     8,    81,
 };
 
-unsigned short Dict159KeyHashTable[] = {
+const unsigned short Dict165KeyHashTable[] = {
     9,     9,     9,     9,     9,     9,     9,     9,    10,     0,
     9,     0,   597,     1,   597,     2,   597,     3,   597,     4,
   597,     5,   597,     6,   597,     7,   597,     8,   597,
 };
 
-vtkDICOMDictionary::Dict Dict159Data = {
+vtkDICOMDictionary::Dict Dict165Data = {
 "SIEMENS CT VA0  IDE",
 9,
 9,
-Dict159TagHashTable,
-Dict159KeyHashTable,
-Dict159Contents
+Dict165TagHashTable,
+Dict165KeyHashTable,
+Dict165Contents
 };
 
 // ----- SCHICK TECHNOLOGIES - Note List Creator ID -----
 
-DictEntry Dict160Contents[] = {
+const DictEntry Dict166Contents[] = {
 { 0x0021, 0x0001, 0, VR::UI, VM::M1, "" },
 { 0x0021, 0x0002, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict160TagHashTable[] = {
+const unsigned short Dict166TagHashTable[] = {
     3,     6,     0,     1,     0,     1,     1,     1,     2,
 };
 
-unsigned short Dict160KeyHashTable[] = {
+const unsigned short Dict166KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict160Data = {
+vtkDICOMDictionary::Dict Dict166Data = {
 "SCHICK TECHNOLOGIES - Note List Creator ID",
 2,
 2,
-Dict160TagHashTable,
-Dict160KeyHashTable,
-Dict160Contents
+Dict166TagHashTable,
+Dict166KeyHashTable,
+Dict166Contents
 };
 
 // ----- Mortara_Inc -----
 
-DictEntry Dict161Contents[] = {
+const DictEntry Dict167Contents[] = {
 { 0x1455, 0x0000, 0, VR::OW, VM::M1, "ELIInterpretationVector" },
 { 0x1455, 0x0001, 0, VR::UN, VM::M1, "CustomID" },
 { 0x1455, 0x0002, 0, VR::UT, VM::M1, "Race" },
@@ -9743,32 +10320,32 @@ DictEntry Dict161Contents[] = {
 { 0x1455, 0x0010, 0, VR::LO, VM::M1, "ManufacturerName" },
 };
 
-unsigned short Dict161TagHashTable[] = {
+const unsigned short Dict167TagHashTable[] = {
    11,    16,    19,    24,    27,    30,    33,    36,    10,    10,
     0,     2,     4,     4,     9,    16,     1,     5,     5,     2,
     6,     6,     8,     8,     1,     7,     7,     1,     0,     0,
     1,     1,     1,     1,     2,     2,     1,     3,     3,
 };
 
-unsigned short Dict161KeyHashTable[] = {
+const unsigned short Dict167KeyHashTable[] = {
    11,    16,    10,    23,    28,    10,    10,    10,    10,    31,
     0,     2,     2, 24176,     6,  8606,     3,     4, 51201,     7,
  8606,     9, 49301,     2,     1, 44833,     8, 41000,     1,     0,
 15367,     2,     3, 19436,     5, 48235,
 };
 
-vtkDICOMDictionary::Dict Dict161Data = {
+vtkDICOMDictionary::Dict Dict167Data = {
 "Mortara_Inc",
 10,
 10,
-Dict161TagHashTable,
-Dict161KeyHashTable,
-Dict161Contents
+Dict167TagHashTable,
+Dict167KeyHashTable,
+Dict167Contents
 };
 
 // ----- SMIL_PB79 -----
 
-DictEntry Dict162Contents[] = {
+const DictEntry Dict168Contents[] = {
 { 0x0079, 0x0000, 0, VR::LO, VM::M1, "Analgesia" },
 { 0x0079, 0x0001, 0, VR::LO, VM::M1, "Anesthesia" },
 { 0x0079, 0x0002, 0, VR::IS, VM::M1, "BedMotion" },
@@ -9793,7 +10370,7 @@ DictEntry Dict162Contents[] = {
 { 0x0079, 0x0017, 0, VR::IS, VM::M1, "SubjectOrientation" },
 };
 
-unsigned short Dict162TagHashTable[] = {
+const unsigned short Dict168TagHashTable[] = {
    22,    23,    26,    29,    32,    35,    38,    41,    44,    47,
    50,    53,    56,    59,    62,    22,    65,    70,    75,    78,
    81,    84,     0,     1,    21,    23,     1,     7,     8,     1,
@@ -9805,7 +10382,7 @@ unsigned short Dict162TagHashTable[] = {
    19,     1,    19,    20,     1,    20,    21,
 };
 
-unsigned short Dict162KeyHashTable[] = {
+const unsigned short Dict168KeyHashTable[] = {
    23,    22,    22,    28,    35,    42,    45,    48,    22,    51,
    22,    22,    22,    54,    57,    60,    63,    66,    69,    72,
    77,    80,     0,     2,     1,  9743,     2, 22793,     3,     3,
@@ -9817,64 +10394,64 @@ unsigned short Dict162KeyHashTable[] = {
     1,    15,  9402,
 };
 
-vtkDICOMDictionary::Dict Dict162Data = {
+vtkDICOMDictionary::Dict Dict168Data = {
 "SMIL_PB79",
 22,
 22,
-Dict162TagHashTable,
-Dict162KeyHashTable,
-Dict162Contents
+Dict168TagHashTable,
+Dict168KeyHashTable,
+Dict168Contents
 };
 
 // ----- SIEMENS IKM CKS LUNGCAD BMK -----
 
-DictEntry Dict163Contents[] = {
+const DictEntry Dict169Contents[] = {
 { 0x0029, 0x0001, 0, VR::UT, VM::M1, "" },
 };
 
-unsigned short Dict163TagHashTable[] = {
+const unsigned short Dict169TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict163KeyHashTable[] = {
+const unsigned short Dict169KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict163Data = {
+vtkDICOMDictionary::Dict Dict169Data = {
 "SIEMENS IKM CKS LUNGCAD BMK",
 1,
 1,
-Dict163TagHashTable,
-Dict163KeyHashTable,
-Dict163Contents
+Dict169TagHashTable,
+Dict169KeyHashTable,
+Dict169Contents
 };
 
 // ----- APEX_PRIVATE -----
 
-DictEntry Dict164Contents[] = {
+const DictEntry Dict170Contents[] = {
 { 0x0027, 0x0011, 0, VR::DS, VM::M1, "BedPosition" },
 };
 
-unsigned short Dict164TagHashTable[] = {
+const unsigned short Dict170TagHashTable[] = {
     2,     0,     1,     0,    17,
 };
 
-unsigned short Dict164KeyHashTable[] = {
+const unsigned short Dict170KeyHashTable[] = {
     2,     0,     1,     0, 32165,
 };
 
-vtkDICOMDictionary::Dict Dict164Data = {
+vtkDICOMDictionary::Dict Dict170Data = {
 "APEX_PRIVATE",
 1,
 1,
-Dict164TagHashTable,
-Dict164KeyHashTable,
-Dict164Contents
+Dict170TagHashTable,
+Dict170KeyHashTable,
+Dict170Contents
 };
 
 // ----- PRIVATE_CODE_STRING_0019 -----
 
-DictEntry Dict165Contents[] = {
+const DictEntry Dict171Contents[] = {
 { 0x0019, 0x0000, 0, VR::FD, VM::M1, "Calibration" },
 { 0x0019, 0x0001, 0, VR::FD, VM::M1, "DepthConversion" },
 { 0x0019, 0x0002, 0, VR::FD, VM::M1, "Stepsize" },
@@ -9882,28 +10459,28 @@ DictEntry Dict165Contents[] = {
 { 0x0019, 0x0004, 0, VR::ST, VM::M1, "DataID" },
 };
 
-unsigned short Dict165TagHashTable[] = {
+const unsigned short Dict171TagHashTable[] = {
     6,     9,    12,     5,    15,     0,     1,     0,     0,     1,
     3,     3,     1,     2,     2,     2,     1,     1,     4,     4,
 };
 
-unsigned short Dict165KeyHashTable[] = {
+const unsigned short Dict171KeyHashTable[] = {
     5,     6,     9,     5,    12,     0,     1,     3, 61458,     1,
     1, 32134,     3,     0, 16277,     2,  5976,     4, 30856,
 };
 
-vtkDICOMDictionary::Dict Dict165Data = {
+vtkDICOMDictionary::Dict Dict171Data = {
 "PRIVATE_CODE_STRING_0019",
 5,
 5,
-Dict165TagHashTable,
-Dict165KeyHashTable,
-Dict165Contents
+Dict171TagHashTable,
+Dict171KeyHashTable,
+Dict171Contents
 };
 
 // ----- GEMS_IMAG_01 -----
 
-DictEntry Dict166Contents[] = {
+const DictEntry Dict172Contents[] = {
 { 0x0027, 0x0006, 0, VR::SL, VM::M1, "ImageArchiveFlag" },
 { 0x0027, 0x0010, 0, VR::SS, VM::M1, "ScoutType" },
 { 0x0027, 0x001c, 0, VR::SL, VM::M1, "VmaMamp" },
@@ -9942,7 +10519,7 @@ DictEntry Dict166Contents[] = {
 { 0x0027, 0x0062, 0, VR::FL, VM::M1, "NumberOfExcitations" },
 };
 
-unsigned short Dict166TagHashTable[] = {
+const unsigned short Dict172TagHashTable[] = {
    37,    40,    43,    46,    36,    36,    49,    52,    57,    60,
    63,    66,    36,    36,    36,    36,    36,    69,    72,    75,
    78,    83,    88,    93,    98,   101,   104,   107,   110,   113,
@@ -9959,7 +10536,7 @@ unsigned short Dict166TagHashTable[] = {
    76,    33,    96,     2,    26,    77,    34,    97,
 };
 
-unsigned short Dict166KeyHashTable[] = {
+const unsigned short Dict172KeyHashTable[] = {
    36,    37,    36,    42,    47,    50,    53,    36,    60,    63,
    68,    71,    76,    36,    81,    36,    84,    87,    90,    36,
    93,    98,    36,    36,   103,    36,    36,   106,   109,    36,
@@ -9976,18 +10553,18 @@ unsigned short Dict166KeyHashTable[] = {
 16095,    34,  5761,
 };
 
-vtkDICOMDictionary::Dict Dict166Data = {
+vtkDICOMDictionary::Dict Dict172Data = {
 "GEMS_IMAG_01",
 36,
 36,
-Dict166TagHashTable,
-Dict166KeyHashTable,
-Dict166Contents
+Dict172TagHashTable,
+Dict172KeyHashTable,
+Dict172Contents
 };
 
 // ----- Silhouette ROI V1.0 -----
 
-DictEntry Dict167Contents[] = {
+const DictEntry Dict173Contents[] = {
 { 0x0029, 0x0011, 0, VR::IS, VM::M1, "ROIName" },
 { 0x0029, 0x0012, 0, VR::LT, VM::M1, "ROINameFont" },
 { 0x0029, 0x0013, 0, VR::LT, VM::M1, "ROINormalColor" },
@@ -10014,7 +10591,7 @@ DictEntry Dict167Contents[] = {
 { 0x0029, 0x0034, 0, VR::UL, VM::M1, "ROIDontSave" },
 };
 
-unsigned short Dict167TagHashTable[] = {
+const unsigned short Dict173TagHashTable[] = {
    25,    32,    39,    42,    24,    45,    24,    24,    48,    53,
    56,    61,    66,    71,    76,    81,    24,    24,    24,    24,
    24,    24,    24,    24,     0,     3,     8,    25,    18,    41,
@@ -10026,7 +10603,7 @@ unsigned short Dict167TagHashTable[] = {
    39,     2,     5,    22,    15,    38,
 };
 
-unsigned short Dict167KeyHashTable[] = {
+const unsigned short Dict173KeyHashTable[] = {
    25,    24,    30,    33,    36,    39,    42,    45,    48,    24,
    24,    51,    24,    54,    57,    24,    62,    65,    24,    70,
    73,    76,    79,    82,     0,     2,     0, 32878,     4, 10856,
@@ -10039,18 +10616,18 @@ unsigned short Dict167KeyHashTable[] = {
 15238,
 };
 
-vtkDICOMDictionary::Dict Dict167Data = {
+vtkDICOMDictionary::Dict Dict173Data = {
 "Silhouette ROI V1.0",
 24,
 24,
-Dict167TagHashTable,
-Dict167KeyHashTable,
-Dict167Contents
+Dict173TagHashTable,
+Dict173KeyHashTable,
+Dict173Contents
 };
 
 // ----- DZDICOM 4.3.0 -----
 
-DictEntry Dict168Contents[] = {
+const DictEntry Dict174Contents[] = {
 { 0x0009, 0x0001, 0, VR::UI, VM::M1, "" },
 { 0x0009, 0x0002, 0, VR::LO, VM::M1, "" },
 { 0x0009, 0x0003, 0, VR::LO, VM::M1, "" },
@@ -10078,7 +10655,7 @@ DictEntry Dict168Contents[] = {
 { 0x0009, 0x00f9, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict168TagHashTable[] = {
+const unsigned short Dict174TagHashTable[] = {
    25,    26,    33,    36,    41,    44,    47,    25,    50,    25,
    53,    56,    59,    62,    65,    70,    25,    25,    73,    76,
    79,    84,    87,    25,    90,     0,     3,     7,     8,    10,
@@ -10091,7 +10668,7 @@ unsigned short Dict168TagHashTable[] = {
     2,     8,    17,    18,   116,
 };
 
-unsigned short Dict168KeyHashTable[] = {
+const unsigned short Dict174KeyHashTable[] = {
    25,    25,    25,    25,    25,    25,    26,    25,    25,    25,
    25,    25,    25,    25,    25,    25,    25,    25,    25,    25,
    25,    25,    25,    25,    25,     0,    25,     0,   215,     1,
@@ -10102,18 +10679,18 @@ unsigned short Dict168KeyHashTable[] = {
   215,    22,   215,    23,   215,    24,   215,
 };
 
-vtkDICOMDictionary::Dict Dict168Data = {
+vtkDICOMDictionary::Dict Dict174Data = {
 "DZDICOM 4.3.0",
 25,
 25,
-Dict168TagHashTable,
-Dict168KeyHashTable,
-Dict168Contents
+Dict174TagHashTable,
+Dict174KeyHashTable,
+Dict174Contents
 };
 
 // ----- SIEMENS SERIES SHADOW ATTRIBUTES -----
 
-DictEntry Dict169Contents[] = {
+const DictEntry Dict175Contents[] = {
 { 0x0021, 0x0001, 0, VR::IS, VM::M1, "" },
 { 0x0021, 0x0002, 0, VR::DS, VM::M1TN, "" },
 { 0x0021, 0x0003, 0, VR::OB, VM::M1, "" },
@@ -10163,7 +10740,7 @@ DictEntry Dict169Contents[] = {
 { 0x0021, 0x003b, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict169TagHashTable[] = {
+const unsigned short Dict175TagHashTable[] = {
    47,    48,    51,    56,    61,    47,    66,    71,    76,    79,
    82,    87,    92,    97,   102,   107,   112,   115,   118,   121,
   124,   127,    47,   130,    47,   133,   136,    47,    47,    47,
@@ -10184,7 +10761,7 @@ unsigned short Dict169TagHashTable[] = {
    11,    13,     1,    10,    12,     1,    12,    15,
 };
 
-unsigned short Dict169KeyHashTable[] = {
+const unsigned short Dict175KeyHashTable[] = {
    47,    47,    47,    47,    47,    47,    47,    47,    47,    47,
    47,    47,    47,    47,    47,    47,    47,    47,    47,    47,
    47,    47,    47,    48,    47,    47,    47,    47,    47,    47,
@@ -10202,41 +10779,41 @@ unsigned short Dict169KeyHashTable[] = {
   114,    46,   114,
 };
 
-vtkDICOMDictionary::Dict Dict169Data = {
+vtkDICOMDictionary::Dict Dict175Data = {
 "SIEMENS SERIES SHADOW ATTRIBUTES",
 47,
 47,
-Dict169TagHashTable,
-Dict169KeyHashTable,
-Dict169Contents
+Dict175TagHashTable,
+Dict175KeyHashTable,
+Dict175Contents
 };
 
 // ----- DL_INTERNAL_USE -----
 
-DictEntry Dict170Contents[] = {
+const DictEntry Dict176Contents[] = {
 { 0x0015, 0x008f, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict170TagHashTable[] = {
+const unsigned short Dict176TagHashTable[] = {
     2,     0,     1,     0,   143,
 };
 
-unsigned short Dict170KeyHashTable[] = {
+const unsigned short Dict176KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict170Data = {
+vtkDICOMDictionary::Dict Dict176Data = {
 "DL_INTERNAL_USE",
 1,
 1,
-Dict170TagHashTable,
-Dict170KeyHashTable,
-Dict170Contents
+Dict176TagHashTable,
+Dict176KeyHashTable,
+Dict176Contents
 };
 
 // ----- HOLOGIC, Inc. -----
 
-DictEntry Dict171Contents[] = {
+const DictEntry Dict177Contents[] = {
 { 0x0019, 0x0001, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0002, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0003, 0, VR::IS, VM::M1, "" },
@@ -10294,7 +10871,7 @@ DictEntry Dict171Contents[] = {
 { 0x7f01, 0x0012, 0, VR::OB, VM::M1, "CodecContent" },
 };
 
-unsigned short Dict171TagHashTable[] = {
+const unsigned short Dict177TagHashTable[] = {
    55,    55,    55,    56,    55,    59,    62,    65,    68,    55,
    71,    74,    77,    55,    55,    80,    55,    83,    88,    91,
    96,   101,   104,    55,   107,    55,   110,   113,    55,   116,
@@ -10318,7 +10895,7 @@ unsigned short Dict171TagHashTable[] = {
   112,     1,    35,   113,
 };
 
-unsigned short Dict171KeyHashTable[] = {
+const unsigned short Dict177KeyHashTable[] = {
    56,    55,    55,    55,    55,    63,    70,    55,    55,    55,
    55,    55,    75,    55,    84,    55,    55,    87,    55,    92,
    95,    55,    98,   103,    55,    55,   106,   109,   120,   123,
@@ -10341,41 +10918,41 @@ unsigned short Dict171KeyHashTable[] = {
     1,    39, 35678,
 };
 
-vtkDICOMDictionary::Dict Dict171Data = {
+vtkDICOMDictionary::Dict Dict177Data = {
 "HOLOGIC, Inc.",
 55,
 55,
-Dict171TagHashTable,
-Dict171KeyHashTable,
-Dict171Contents
+Dict177TagHashTable,
+Dict177KeyHashTable,
+Dict177Contents
 };
 
 // ----- AMI StudyExtensions_01 -----
 
-DictEntry Dict172Contents[] = {
-{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "Last Released Annot Label" },
+const DictEntry Dict178Contents[] = {
+{ 0x3111, 0x0001, 0, VR::UL, VM::M1, "LastReleasedAnnotLabel" },
 };
 
-unsigned short Dict172TagHashTable[] = {
+const unsigned short Dict178TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict172KeyHashTable[] = {
-    2,     0,     1,     0, 56990,
+const unsigned short Dict178KeyHashTable[] = {
+    2,     0,     1,     0,  5022,
 };
 
-vtkDICOMDictionary::Dict Dict172Data = {
+vtkDICOMDictionary::Dict Dict178Data = {
 "AMI StudyExtensions_01",
 1,
 1,
-Dict172TagHashTable,
-Dict172KeyHashTable,
-Dict172Contents
+Dict178TagHashTable,
+Dict178KeyHashTable,
+Dict178Contents
 };
 
 // ----- SPI-P-Private-DCI Release 1 -----
 
-DictEntry Dict173Contents[] = {
+const DictEntry Dict179Contents[] = {
 { 0x0019, 0x0010, 0, VR::UN, VM::M1, "ECGTimeMapDataBitsAllocated" },
 { 0x0019, 0x0011, 0, VR::UN, VM::M1, "ECGTimeMapDataBitsStored" },
 { 0x0019, 0x0012, 0, VR::UN, VM::M1, "ECGTimeMapDataHighBit" },
@@ -10386,31 +10963,31 @@ DictEntry Dict173Contents[] = {
 { 0x0019, 0x0017, 0, VR::UN, VM::M1, "ECGTimeMapData" },
 };
 
-unsigned short Dict173TagHashTable[] = {
+const unsigned short Dict179TagHashTable[] = {
     9,    12,    15,    18,    21,    24,    27,    30,     0,     1,
     1,    17,     1,     0,    16,     1,     3,    19,     1,     2,
    18,     1,     5,    21,     1,     4,    20,     1,     7,    23,
     1,     6,    22,
 };
 
-unsigned short Dict173KeyHashTable[] = {
+const unsigned short Dict179KeyHashTable[] = {
     8,     8,     9,    12,    17,     8,    20,    27,     0,     1,
     2, 29379,     2,     6,  7908,     7, 35587,     1,     5, 27872,
     3,     0, 64646,     1,  8751,     3, 48465,     1,     4,  9486,
 };
 
-vtkDICOMDictionary::Dict Dict173Data = {
+vtkDICOMDictionary::Dict Dict179Data = {
 "SPI-P-Private-DCI Release 1",
 8,
 8,
-Dict173TagHashTable,
-Dict173KeyHashTable,
-Dict173Contents
+Dict179TagHashTable,
+Dict179KeyHashTable,
+Dict179Contents
 };
 
 // ----- GEMS_FALCON_03 -----
 
-DictEntry Dict174Contents[] = {
+const DictEntry Dict180Contents[] = {
 { 0x0045, 0x0055, 0, VR::DS, VM::M8, "A_Coefficients" },
 { 0x0045, 0x0062, 0, VR::IS, VM::M1, "UserWindowCenter" },
 { 0x0045, 0x0063, 0, VR::IS, VM::M1, "UserWindowWidth" },
@@ -10421,30 +10998,30 @@ DictEntry Dict174Contents[] = {
 { 0x0045, 0x0073, 0, VR::IS, VM::M1, "CollimatorHeight" },
 };
 
-unsigned short Dict174TagHashTable[] = {
+const unsigned short Dict180TagHashTable[] = {
     9,     8,    14,     8,    17,     8,    20,    25,     0,     2,
     0,    85,     3,   101,     1,     4,   103,     1,     5,   105,
     2,     2,    99,     7,   115,     2,     1,    98,     6,   114,
 };
 
-unsigned short Dict174KeyHashTable[] = {
+const unsigned short Dict180KeyHashTable[] = {
     8,     8,     8,     9,    16,    23,     8,    26,     0,     3,
     4,  5352,     5, 13265,     6, 22843,     3,     2, 29079,     3,
 16921,     7,  6426,     1,     1, 25135,     1,     0, 59138,
 };
 
-vtkDICOMDictionary::Dict Dict174Data = {
+vtkDICOMDictionary::Dict Dict180Data = {
 "GEMS_FALCON_03",
 8,
 8,
-Dict174TagHashTable,
-Dict174KeyHashTable,
-Dict174Contents
+Dict180TagHashTable,
+Dict180KeyHashTable,
+Dict180Contents
 };
 
 // ----- SIEMENS CM VA0  CMS -----
 
-DictEntry Dict175Contents[] = {
+const DictEntry Dict181Contents[] = {
 { 0x0009, 0x0000, 0, VR::DS, VM::M1, "NumberOfMeasurements" },
 { 0x0009, 0x0010, 0, VR::CS, VM::M1, "StorageMode" },
 { 0x0009, 0x0012, 0, VR::UL, VM::M1, "EvaluationMaskImage" },
@@ -10517,7 +11094,7 @@ DictEntry Dict175Contents[] = {
 { 0x7fe1, 0x0000, 0, VR::OB, VM::M1TN, "BinaryData" },
 };
 
-unsigned short Dict175TagHashTable[] = {
+const unsigned short Dict181TagHashTable[] = {
    71,    76,    85,    90,    97,   100,    70,   105,    70,   108,
   115,   122,   127,    70,   130,   133,   136,   141,    70,   144,
    70,   151,    70,   154,    70,   157,    70,   160,    70,    70,
@@ -10546,7 +11123,7 @@ unsigned short Dict175TagHashTable[] = {
    86,     1,    49,   101,
 };
 
-unsigned short Dict175KeyHashTable[] = {
+const unsigned short Dict181KeyHashTable[] = {
    71,    70,    76,    79,    86,    70,    89,    92,    70,    70,
    70,    70,    70,    95,   106,   113,    70,   116,    70,   119,
   122,    70,    70,   125,    70,   128,   131,    70,   134,    70,
@@ -10575,67 +11152,67 @@ unsigned short Dict175KeyHashTable[] = {
     1,     9, 24952,
 };
 
-vtkDICOMDictionary::Dict Dict175Data = {
+vtkDICOMDictionary::Dict Dict181Data = {
 "SIEMENS CM VA0  CMS",
 70,
 70,
-Dict175TagHashTable,
-Dict175KeyHashTable,
-Dict175Contents
+Dict181TagHashTable,
+Dict181KeyHashTable,
+Dict181Contents
 };
 
 // ----- PHILIPS MR/PART 7 -----
 
-DictEntry Dict176Contents[] = {
+const DictEntry Dict182Contents[] = {
 { 0x0019, 0x0000, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict176TagHashTable[] = {
+const unsigned short Dict182TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict176KeyHashTable[] = {
+const unsigned short Dict182KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict176Data = {
+vtkDICOMDictionary::Dict Dict182Data = {
 "PHILIPS MR/PART 7",
 1,
 1,
-Dict176TagHashTable,
-Dict176KeyHashTable,
-Dict176Contents
+Dict182TagHashTable,
+Dict182KeyHashTable,
+Dict182Contents
 };
 
 // ----- PHILIPS MR/PART 6 -----
 
-DictEntry Dict177Contents[] = {
+const DictEntry Dict183Contents[] = {
 { 0x0019, 0x0010, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict177TagHashTable[] = {
+const unsigned short Dict183TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict177KeyHashTable[] = {
+const unsigned short Dict183KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict177Data = {
+vtkDICOMDictionary::Dict Dict183Data = {
 "PHILIPS MR/PART 6",
 1,
 1,
-Dict177TagHashTable,
-Dict177KeyHashTable,
-Dict177Contents
+Dict183TagHashTable,
+Dict183KeyHashTable,
+Dict183Contents
 };
 
 // ----- PHILIPS MR/PART -----
 
-DictEntry Dict178Contents[] = {
+const DictEntry Dict184Contents[] = {
 { 0x0019, 0x0000, 0, VR::IS, VM::M1, "NumberOfStacks" },
 { 0x0019, 0x0001, 0, VR::IS, VM::M1TN, "StackType" },
-{ 0x0019, 0x0002, 0, VR::IS, VM::M1TN, "" },
+{ 0x0019, 0x0002, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0003, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0005, 0, VR::DS, VM::M1, "CCAngulation" },
 { 0x0019, 0x0006, 0, VR::DS, VM::M1, "APAngulation" },
@@ -10659,10 +11236,10 @@ DictEntry Dict178Contents[] = {
 { 0x0019, 0x001c, 0, VR::CS, VM::M1, "" },
 { 0x0019, 0x001d, 0, VR::CS, VM::M1, "" },
 { 0x0019, 0x001e, 0, VR::DS, VM::M1, "" },
-{ 0x0019, 0x0021, 0, VR::DS, VM::M1TN, "" },
+{ 0x0019, 0x0021, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0022, 0, VR::DS, VM::M1, "DynamicScanTimeBegin" },
 { 0x0019, 0x0023, 0, VR::DS, VM::M1TN, "" },
-{ 0x0019, 0x0024, 0, VR::IS, VM::M1, "" },
+{ 0x0019, 0x0024, 0, VR::DS, VM::M1TN, "" },
 { 0x0019, 0x0025, 0, VR::DS, VM::M1TN, "" },
 { 0x0019, 0x0026, 0, VR::DS, VM::M1TN, "" },
 { 0x0019, 0x0027, 0, VR::DS, VM::M1TN, "" },
@@ -10672,7 +11249,7 @@ DictEntry Dict178Contents[] = {
 { 0x0019, 0x0031, 0, VR::DS, VM::M1TN, "" },
 { 0x0019, 0x0040, 0, VR::US, VM::M1, "" },
 { 0x0019, 0x0045, 0, VR::IS, VM::M1, "ReconstructionResolution" },
-{ 0x0019, 0x0050, 0, VR::IS, VM::M1, "" },
+{ 0x0019, 0x0050, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0051, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0052, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0053, 0, VR::IS, VM::M1, "" },
@@ -10686,7 +11263,7 @@ DictEntry Dict178Contents[] = {
 { 0x0019, 0x0061, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0062, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0063, 0, VR::DS, VM::M1, "" },
-{ 0x0019, 0x0064, 0, VR::IS, VM::M1, "" },
+{ 0x0019, 0x0064, 0, VR::DS, VM::M1, "RepetitionTimeSE" },
 { 0x0019, 0x0065, 0, VR::DS, VM::M1, "RepetitionTimeIR" },
 { 0x0019, 0x0066, 0, VR::US, VM::M1, "" },
 { 0x0019, 0x0067, 0, VR::US, VM::M1, "" },
@@ -10748,10 +11325,10 @@ DictEntry Dict178Contents[] = {
 { 0x0019, 0x00da, 0, VR::IS, VM::M1, "TurboFactor" },
 { 0x0019, 0x00db, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x00e0, 0, VR::IS, VM::M1, "PrepulseType" },
-{ 0x0019, 0x00e1, 0, VR::IS, VM::M1, "" },
+{ 0x0019, 0x00e1, 0, VR::DS, VM::M1, "PrepulseDelay" },
 { 0x0019, 0x00e3, 0, VR::DS, VM::M1, "PhaseContrastVelocity" },
 { 0x0019, 0x00fc, 0, VR::IS, VM::M1, "ResonanceFrequency" },
-{ 0x0021, 0x0000, 0, VR::IS, VM::M1, "ReconstructionNumber" },
+{ 0x0021, 0x0000, 0, VR::DA, VM::M1, "SeriesDate" },
 { 0x0021, 0x0006, 0, VR::LO, VM::M1, "" },
 { 0x0021, 0x0008, 0, VR::LO, VM::M1, "" },
 { 0x0021, 0x0009, 0, VR::CS, VM::M1, "" },
@@ -10786,7 +11363,7 @@ DictEntry Dict178Contents[] = {
 { 0x0029, 0x00d5, 0, VR::LT, VM::M1, "SliceThickness" },
 };
 
-unsigned short Dict178TagHashTable[] = {
+const unsigned short Dict184TagHashTable[] = {
   152,   159,   164,   167,   172,   177,   151,   180,   185,   190,
   151,   151,   195,   198,   151,   151,   201,   206,   211,   214,
   217,   222,   225,   230,   235,   242,   245,   248,   253,   151,
@@ -10845,7 +11422,7 @@ unsigned short Dict178TagHashTable[] = {
    72,   142,     1,    71,   141,
 };
 
-unsigned short Dict178KeyHashTable[] = {
+const unsigned short Dict184KeyHashTable[] = {
   151,   152,   151,   151,   151,   151,   151,   151,   151,   151,
   151,   151,   151,   151,   151,   151,   151,   151,   151,   155,
   151,   151,   151,   151,   160,   151,   163,   151,   166,   151,
@@ -10855,11 +11432,11 @@ unsigned short Dict178KeyHashTable[] = {
   151,   151,   201,   204,   207,   151,   151,   151,   151,   151,
   210,   151,   151,   151,   215,   151,   218,   151,   151,   151,
   221,   224,   151,   229,   151,   151,   236,   151,   151,   239,
-  151,   151,   151,   244,   151,   247,   250,   151,   427,   151,
-  151,   151,   151,   430,   151,   151,   151,   151,   151,   439,
-  442,   445,   448,   451,   151,   151,   151,   151,   454,   459,
-  151,   151,   151,   151,   462,   151,   151,   151,   465,   468,
-  151,   471,   151,   151,   151,   474,   477,   482,   151,   485,
+  151,   151,   151,   244,   151,   247,   250,   151,   423,   151,
+  151,   151,   151,   426,   151,   151,   151,   151,   151,   435,
+  440,   443,   446,   449,   151,   151,   151,   151,   452,   457,
+  151,   151,   151,   151,   460,   151,   151,   151,   463,   466,
+  151,   469,   151,   151,   151,   474,   477,   482,   151,   485,
   151,   151,   151,   490,   495,   498,   501,   151,   151,   151,
   151,     0,     1,    18, 49582,     2,    67, 44003,   134, 46911,
     1,    19,  2734,     1,     1,   757,     1,    57, 46573,     1,
@@ -10871,46 +11448,46 @@ unsigned short Dict178KeyHashTable[] = {
 16359,     1,   110, 12083,     2,   116, 36718,   150, 62416,     3,
     7, 38884,    97, 27911,   105,  4802,     1,    62, 39687,     2,
     9,  1016,   117, 48580,     1,    60, 65032,     1,    98, 38247,
-   88,     2,    35,     3,    35,    13,    35,    17,    35,    23,
+   86,     2,    35,     3,    35,    13,    35,    17,    35,    23,
    35,    24,    35,    25,    35,    26,    35,    28,    35,    29,
    35,    30,    35,    31,    35,    32,    35,    33,    35,    34,
    35,    35,    35,    36,    35,    37,    35,    39,    35,    40,
    35,    41,    35,    42,    35,    43,    35,    44,    35,    45,
    35,    46,    35,    47,    35,    48,    35,    49,    35,    50,
-   35,    51,    35,    52,    35,    53,    35,    55,    35,    56,
-   35,    63,    35,    68,    35,    69,    35,    70,    35,    71,
-   35,    72,    35,    73,    35,    76,    35,    77,    35,    78,
-   35,    79,    35,    80,    35,    81,    35,    82,    35,    83,
-   35,    84,    35,    85,    35,    86,    35,    87,    35,    88,
-   35,    89,    35,    90,    35,    91,    35,    92,    35,    93,
-   35,    94,    35,    96,    35,   100,    35,   101,    35,   102,
-   35,   107,    35,   108,    35,   113,    35,   115,    35,   119,
-   35,   120,    35,   121,    35,   122,    35,   123,    35,   125,
-   35,   126,    35,   136,    35,   137,    35,   138,    35,   139,
-   35,   140,    35,   141,    35,   142,    35,   143,    35,   144,
-   35,   145,    35,   146,    35,   147,    35,     1,    27, 54183,
-    4,    59, 57414,   104, 43137,   124, 24126,   148, 43137,     1,
-  135,  8815,     1,    22, 15995,     1,    75, 33723,     1,   103,
-42470,     1,    58, 28443,     2,    61, 18544,   109, 58878,     1,
-    8, 56009,     1,    54, 29050,     1,     0,   724,     1,    16,
-36067,     1,    99, 16766,     1,     5,  8583,     2,     6, 10939,
-  129, 57091,     1,   132, 56346,     2,    12, 11601,   118,  4387,
+   35,    51,    35,    52,    35,    55,    35,    56,    35,    63,
+   35,    68,    35,    69,    35,    70,    35,    71,    35,    72,
+   35,    73,    35,    76,    35,    77,    35,    78,    35,    79,
+   35,    80,    35,    81,    35,    82,    35,    83,    35,    84,
+   35,    85,    35,    86,    35,    87,    35,    88,    35,    89,
+   35,    90,    35,    91,    35,    92,    35,    93,    35,    94,
+   35,    96,    35,   100,    35,   101,    35,   102,    35,   107,
+   35,   108,    35,   113,    35,   119,    35,   120,    35,   121,
+   35,   122,    35,   123,    35,   125,    35,   126,    35,   136,
+   35,   137,    35,   138,    35,   139,    35,   140,    35,   141,
+   35,   142,    35,   143,    35,   144,    35,   145,    35,   146,
+   35,   147,    35,     1,    27, 54183,     4,    59, 57414,   104,
+43137,   124, 24126,   148, 43137,     2,   118, 39591,   135,  8815,
+    1,    22, 15995,     1,    75, 33723,     1,   103, 42470,     1,
+   58, 28443,     2,    61, 18544,   109, 58878,     1,     8, 56009,
+    1,    54, 29050,     1,     0,   724,     1,    16, 36067,     2,
+   99, 16766,   115, 26215,     1,     5,  8583,     2,     6, 10939,
+  129, 57091,     1,   132, 56346,     2,    12, 11601,    53, 29052,
     2,   130, 52465,   131, 24101,     1,    21, 61928,     1,   106,
  7113,     1,   133,  5770,
 };
 
-vtkDICOMDictionary::Dict Dict178Data = {
+vtkDICOMDictionary::Dict Dict184Data = {
 "PHILIPS MR/PART",
 151,
 151,
-Dict178TagHashTable,
-Dict178KeyHashTable,
-Dict178Contents
+Dict184TagHashTable,
+Dict184KeyHashTable,
+Dict184Contents
 };
 
 // ----- GEMS_DL_IMG_01 -----
 
-DictEntry Dict179Contents[] = {
+const DictEntry Dict185Contents[] = {
 { 0x0019, 0x000B, 0, VR::DS, VM::M1T2, "FOVDimensionDouble" },
 { 0x0019, 0x002B, 0, VR::FL, VM::M1, "DistanceToTableTop" },
 { 0x0019, 0x0030, 0, VR::LO, VM::M1, "ImageFileName" },
@@ -11040,7 +11617,7 @@ DictEntry Dict179Contents[] = {
 { 0x0019, 0x00ef, 0, VR::FL, VM::M1, "" },
 };
 
-unsigned short Dict179TagHashTable[] = {
+const unsigned short Dict185TagHashTable[] = {
   128,   131,   134,   137,   140,   143,   146,   149,   152,   155,
   158,   161,   164,   167,   170,   173,   176,   179,   182,   187,
   190,   193,   196,   199,   202,   205,   208,   211,   214,   217,
@@ -11092,7 +11669,7 @@ unsigned short Dict179TagHashTable[] = {
    42,   100,     1,    43,   101,     1,    44,   102,
 };
 
-unsigned short Dict179KeyHashTable[] = {
+const unsigned short Dict185KeyHashTable[] = {
   128,   127,   131,   134,   139,   127,   127,   127,   142,   145,
   127,   127,   127,   148,   155,   160,   165,   168,   127,   173,
   176,   181,   127,   184,   127,   187,   190,   195,   200,   127,
@@ -11141,64 +11718,64 @@ unsigned short Dict179KeyHashTable[] = {
   100, 35521,     2,    10,  8739,    11, 61602,     1,    78, 46024,
 };
 
-vtkDICOMDictionary::Dict Dict179Data = {
+vtkDICOMDictionary::Dict Dict185Data = {
 "GEMS_DL_IMG_01",
 127,
 127,
-Dict179TagHashTable,
-Dict179KeyHashTable,
-Dict179Contents
+Dict185TagHashTable,
+Dict185KeyHashTable,
+Dict185Contents
 };
 
 // ----- ESOFT_DICOM_ECAT_OWNERCODE -----
 
-DictEntry Dict180Contents[] = {
+const DictEntry Dict186Contents[] = {
 { 0x0015, 0x0000, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict180TagHashTable[] = {
+const unsigned short Dict186TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict180KeyHashTable[] = {
+const unsigned short Dict186KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict180Data = {
+vtkDICOMDictionary::Dict Dict186Data = {
 "ESOFT_DICOM_ECAT_OWNERCODE",
 1,
 1,
-Dict180TagHashTable,
-Dict180KeyHashTable,
-Dict180Contents
+Dict186TagHashTable,
+Dict186KeyHashTable,
+Dict186Contents
 };
 
 // ----- KINETDX_GRAPHICS -----
 
-DictEntry Dict181Contents[] = {
+const DictEntry Dict187Contents[] = {
 { 0x0021, 0x00a4, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict181TagHashTable[] = {
+const unsigned short Dict187TagHashTable[] = {
     2,     0,     1,     0,   164,
 };
 
-unsigned short Dict181KeyHashTable[] = {
+const unsigned short Dict187KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict181Data = {
+vtkDICOMDictionary::Dict Dict187Data = {
 "KINETDX_GRAPHICS",
 1,
 1,
-Dict181TagHashTable,
-Dict181KeyHashTable,
-Dict181Contents
+Dict187TagHashTable,
+Dict187KeyHashTable,
+Dict187Contents
 };
 
 // ----- GEMS_PETD_01 -----
 
-DictEntry Dict182Contents[] = {
+const DictEntry Dict188Contents[] = {
 { 0x0009, 0x0001, 0, VR::LO, VM::M2, "ImplementationVersionName" },
 { 0x0009, 0x0002, 0, VR::LO, VM::M1, "PatientID" },
 { 0x0009, 0x0003, 0, VR::SH, VM::M1, "PatientCompatibleVersion" },
@@ -11536,7 +12113,7 @@ DictEntry Dict182Contents[] = {
 { 0x5005, 0x000d, 0, VR::LO, VM::M1, "PointColor" },
 };
 
-unsigned short Dict182TagHashTable[] = {
+const unsigned short Dict188TagHashTable[] = {
   336,   339,   342,   345,   348,   351,   354,   357,   360,   365,
   370,   375,   380,   385,   390,   395,   400,   409,   416,   425,
   432,   439,   446,   453,   458,   463,   466,   473,   480,   487,
@@ -11664,7 +12241,7 @@ unsigned short Dict182TagHashTable[] = {
   229,
 };
 
-unsigned short Dict182KeyHashTable[] = {
+const unsigned short Dict188KeyHashTable[] = {
   336,   341,   344,   347,   335,   335,   352,   355,   360,   363,
   376,   335,   335,   335,   379,   386,   391,   335,   335,   335,
   394,   399,   335,   414,   417,   335,   335,   420,   423,   426,
@@ -11789,41 +12366,41 @@ unsigned short Dict182KeyHashTable[] = {
   162,  7261,     2,    21, 55087,    23, 53378,
 };
 
-vtkDICOMDictionary::Dict Dict182Data = {
+vtkDICOMDictionary::Dict Dict188Data = {
 "GEMS_PETD_01",
 335,
 335,
-Dict182TagHashTable,
-Dict182KeyHashTable,
-Dict182Contents
+Dict188TagHashTable,
+Dict188KeyHashTable,
+Dict188Contents
 };
 
 // ----- ISI -----
 
-DictEntry Dict183Contents[] = {
+const DictEntry Dict189Contents[] = {
 { 0x0009, 0x0001, 0, VR::UN, VM::M1, "SIENETGeneralPurposeIMGEF" },
 };
 
-unsigned short Dict183TagHashTable[] = {
+const unsigned short Dict189TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict183KeyHashTable[] = {
+const unsigned short Dict189KeyHashTable[] = {
     2,     0,     1,     0,  1153,
 };
 
-vtkDICOMDictionary::Dict Dict183Data = {
+vtkDICOMDictionary::Dict Dict189Data = {
 "ISI",
 1,
 1,
-Dict183TagHashTable,
-Dict183KeyHashTable,
-Dict183Contents
+Dict189TagHashTable,
+Dict189KeyHashTable,
+Dict189Contents
 };
 
 // ----- GEMS_DRS_1 -----
 
-DictEntry Dict184Contents[] = {
+const DictEntry Dict190Contents[] = {
 { 0x0037, 0x0010, 0, VR::LO, VM::M1, "ReferringDepartment" },
 { 0x0037, 0x0020, 0, VR::US, VM::M1, "ScreenNumber" },
 { 0x0037, 0x0040, 0, VR::SH, VM::M1, "LeftOrientation" },
@@ -11832,103 +12409,103 @@ DictEntry Dict184Contents[] = {
 { 0x0037, 0x0060, 0, VR::US, VM::M1, "DSA" },
 };
 
-unsigned short Dict184TagHashTable[] = {
+const unsigned short Dict190TagHashTable[] = {
     7,     6,    10,    15,    18,    21,     0,     1,     4,    80,
     2,     3,    66,     5,    96,     1,     0,    16,     1,     2,
    64,     1,     1,    32,
 };
 
-unsigned short Dict184KeyHashTable[] = {
+const unsigned short Dict190KeyHashTable[] = {
     7,    10,     6,    13,    16,    21,     0,     1,     1, 59757,
     1,     3, 23101,     1,     0, 49695,     2,     2, 62532,     4,
 11413,     1,     5, 64132,
 };
 
-vtkDICOMDictionary::Dict Dict184Data = {
+vtkDICOMDictionary::Dict Dict190Data = {
 "GEMS_DRS_1",
 6,
 6,
-Dict184TagHashTable,
-Dict184KeyHashTable,
-Dict184Contents
+Dict190TagHashTable,
+Dict190KeyHashTable,
+Dict190Contents
 };
 
 // ----- RamSoft Race Identifier -----
 
-DictEntry Dict185Contents[] = {
+const DictEntry Dict191Contents[] = {
 { 0x3129, 0x0010, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict185TagHashTable[] = {
+const unsigned short Dict191TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict185KeyHashTable[] = {
+const unsigned short Dict191KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict185Data = {
+vtkDICOMDictionary::Dict Dict191Data = {
 "RamSoft Race Identifier",
 1,
 1,
-Dict185TagHashTable,
-Dict185KeyHashTable,
-Dict185Contents
+Dict191TagHashTable,
+Dict191KeyHashTable,
+Dict191Contents
 };
 
 // ----- TOSHIBA MDW NON-IMAGE -----
 
-DictEntry Dict186Contents[] = {
+const DictEntry Dict192Contents[] = {
 { 0x0029, 0x0008, 0, VR::CS, VM::M1, "NonImageHeaderType" },
 { 0x0029, 0x0009, 0, VR::LO, VM::M1, "NonImageHeaderVersion" },
 { 0x0029, 0x0020, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict186TagHashTable[] = {
+const unsigned short Dict192TagHashTable[] = {
     4,     3,     9,     0,     2,     0,     8,     2,    32,     1,
     1,     9,
 };
 
-unsigned short Dict186KeyHashTable[] = {
+const unsigned short Dict192KeyHashTable[] = {
     3,     4,     7,     0,     1,     0, 30143,     2,     1, 59488,
     2,  1793,
 };
 
-vtkDICOMDictionary::Dict Dict186Data = {
+vtkDICOMDictionary::Dict Dict192Data = {
 "TOSHIBA MDW NON-IMAGE",
 3,
 3,
-Dict186TagHashTable,
-Dict186KeyHashTable,
-Dict186Contents
+Dict192TagHashTable,
+Dict192KeyHashTable,
+Dict192Contents
 };
 
 // ----- SIEMENS MED OCS PUBLIC RT PLAN ATTRIBUTES -----
 
-DictEntry Dict187Contents[] = {
+const DictEntry Dict193Contents[] = {
 { 0x0039, 0x0001, 0, VR::UT, VM::M1, "ExternalAttributes" },
 };
 
-unsigned short Dict187TagHashTable[] = {
+const unsigned short Dict193TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict187KeyHashTable[] = {
+const unsigned short Dict193KeyHashTable[] = {
     2,     0,     1,     0, 18287,
 };
 
-vtkDICOMDictionary::Dict Dict187Data = {
+vtkDICOMDictionary::Dict Dict193Data = {
 "SIEMENS MED OCS PUBLIC RT PLAN ATTRIBUTES",
 1,
 1,
-Dict187TagHashTable,
-Dict187KeyHashTable,
-Dict187Contents
-};
+Dict193TagHashTable,
+Dict193KeyHashTable,
+Dict193Contents
+};
 
 // ----- DR Systems, Inc. -----
 
-DictEntry Dict188Contents[] = {
+const DictEntry Dict194Contents[] = {
 { 0x4453, 0x0001, 0, VR::LO, VM::M1, "ExamID" },
 { 0x4453, 0x0002, 0, VR::LO, VM::M1, "ImageType" },
 { 0x4453, 0x0004, 0, VR::LO, VM::M1, "FileType" },
@@ -11937,30 +12514,30 @@ DictEntry Dict188Contents[] = {
 { 0x4453, 0x000C, 0, VR::SQ, VM::M1, "OriginalInstanceUIDSequence" },
 };
 
-unsigned short Dict188TagHashTable[] = {
+const unsigned short Dict194TagHashTable[] = {
     7,    12,     6,     6,    15,    20,     0,     2,     4,    10,
     5,    12,     1,     0,     1,     2,     1,     2,     2,     4,
     1,     3,     5,
 };
 
-unsigned short Dict188KeyHashTable[] = {
+const unsigned short Dict194KeyHashTable[] = {
     7,    14,    19,     6,     6,     6,     0,     3,     1, 28071,
     3, 29887,     5, 30295,     2,     0, 16330,     2, 14801,     1,
     4, 50688,
 };
 
-vtkDICOMDictionary::Dict Dict188Data = {
+vtkDICOMDictionary::Dict Dict194Data = {
 "DR Systems, Inc.",
 6,
 6,
-Dict188TagHashTable,
-Dict188KeyHashTable,
-Dict188Contents
+Dict194TagHashTable,
+Dict194KeyHashTable,
+Dict194Contents
 };
 
 // ----- SCHICK TECHNOLOGIES - Change Item Creator ID -----
 
-DictEntry Dict189Contents[] = {
+const DictEntry Dict195Contents[] = {
 { 0x0021, 0x0001, 0, VR::UI, VM::M1, "" },
 { 0x0021, 0x0002, 0, VR::US, VM::M1, "" },
 { 0x0021, 0x0003, 0, VR::DT, VM::M1, "" },
@@ -11968,52 +12545,52 @@ DictEntry Dict189Contents[] = {
 { 0x0021, 0x0005, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict189TagHashTable[] = {
+const unsigned short Dict195TagHashTable[] = {
     6,     9,    12,     5,    17,     0,     1,     1,     2,     1,
     4,     5,     2,     0,     1,     3,     4,     1,     2,     3,
 };
 
-unsigned short Dict189KeyHashTable[] = {
+const unsigned short Dict195KeyHashTable[] = {
     5,     6,     5,     5,     5,     0,     5,     0,  1076,     1,
  1076,     2,  1076,     3,  1076,     4,  1076,
 };
 
-vtkDICOMDictionary::Dict Dict189Data = {
+vtkDICOMDictionary::Dict Dict195Data = {
 "SCHICK TECHNOLOGIES - Change Item Creator ID",
 5,
 5,
-Dict189TagHashTable,
-Dict189KeyHashTable,
-Dict189Contents
+Dict195TagHashTable,
+Dict195KeyHashTable,
+Dict195Contents
 };
 
 // ----- SIEMENS AX INSPACE_EP -----
 
-DictEntry Dict190Contents[] = {
+const DictEntry Dict196Contents[] = {
 { 0x0009, 0x0050, 0, VR::UI, VM::M1, "" },
 { 0x0009, 0x0051, 0, VR::UI, VM::M1, "" },
 };
 
-unsigned short Dict190TagHashTable[] = {
+const unsigned short Dict196TagHashTable[] = {
     3,     6,     0,     1,     0,    80,     1,     1,    81,
 };
 
-unsigned short Dict190KeyHashTable[] = {
+const unsigned short Dict196KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict190Data = {
+vtkDICOMDictionary::Dict Dict196Data = {
 "SIEMENS AX INSPACE_EP",
 2,
 2,
-Dict190TagHashTable,
-Dict190KeyHashTable,
-Dict190Contents
+Dict196TagHashTable,
+Dict196KeyHashTable,
+Dict196Contents
 };
 
 // ----- AGFA-AG_HPState -----
 
-DictEntry Dict191Contents[] = {
+const DictEntry Dict197Contents[] = {
 { 0x0011, 0x0011, 0, VR::SH, VM::M1, "" },
 { 0x0019, 0x00a0, 0, VR::SQ, VM::M1, "" },
 { 0x0019, 0x00a1, 0, VR::FL, VM::M1, "" },
@@ -12048,7 +12625,7 @@ DictEntry Dict191Contents[] = {
 { 0x0087, 0x0008, 0, VR::FD, VM::M2, "" },
 };
 
-unsigned short Dict191TagHashTable[] = {
+const unsigned short Dict197TagHashTable[] = {
    33,    38,    41,    44,    47,    32,    52,    55,    58,    61,
    64,    32,    67,    70,    73,    32,    76,    81,    86,    89,
    92,    32,    95,    32,    98,   101,   104,   109,   114,   117,
@@ -12064,7 +12641,7 @@ unsigned short Dict191TagHashTable[] = {
     1,     5,   164,
 };
 
-unsigned short Dict191KeyHashTable[] = {
+const unsigned short Dict197KeyHashTable[] = {
    32,    32,    32,    32,    32,    33,    32,    32,    32,    32,
    32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
    32,    32,    32,    32,    32,    32,    32,    32,    32,    32,
@@ -12077,18 +12654,18 @@ unsigned short Dict191KeyHashTable[] = {
    28,   168,    29,   168,    30,   168,    31,   168,
 };
 
-vtkDICOMDictionary::Dict Dict191Data = {
+vtkDICOMDictionary::Dict Dict197Data = {
 "AGFA-AG_HPState",
 32,
 32,
-Dict191TagHashTable,
-Dict191KeyHashTable,
-Dict191Contents
+Dict197TagHashTable,
+Dict197KeyHashTable,
+Dict197Contents
 };
 
 // ----- SPI-P-Private_ICS Release 1 -----
 
-DictEntry Dict192Contents[] = {
+const DictEntry Dict198Contents[] = {
 { 0x0019, 0x0030, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0031, 0, VR::LO, VM::M1, "" },
 { 0x0029, 0x000d, 0, VR::SQ, VM::M1, "" },
@@ -12116,7 +12693,7 @@ DictEntry Dict192Contents[] = {
 { 0x0029, 0x0091, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict192TagHashTable[] = {
+const unsigned short Dict198TagHashTable[] = {
    26,    31,    34,    39,    44,    47,    25,    50,    53,    56,
    25,    61,    25,    66,    69,    74,    79,    84,    25,    25,
    87,    90,    25,    25,    25,     0,     2,     7,    27,    13,
@@ -12129,7 +12706,7 @@ unsigned short Dict192TagHashTable[] = {
     1,    18,    81,
 };
 
-unsigned short Dict192KeyHashTable[] = {
+const unsigned short Dict198KeyHashTable[] = {
    25,    25,    25,    25,    25,    25,    26,    25,    25,    25,
    25,    25,    25,    25,    25,    25,    25,    25,    25,    25,
    25,    25,    25,    25,    25,     0,    25,     0,   215,     1,
@@ -12140,90 +12717,99 @@ unsigned short Dict192KeyHashTable[] = {
   215,    22,   215,    23,   215,    24,   215,
 };
 
-vtkDICOMDictionary::Dict Dict192Data = {
+vtkDICOMDictionary::Dict Dict198Data = {
 "SPI-P-Private_ICS Release 1",
 25,
 25,
-Dict192TagHashTable,
-Dict192KeyHashTable,
-Dict192Contents
+Dict198TagHashTable,
+Dict198KeyHashTable,
+Dict198Contents
 };
 
 // ----- RadWorksTBR -----
 
-DictEntry Dict193Contents[] = {
+const DictEntry Dict199Contents[] = {
 { 0x3111, 0x0002, 0, VR::CS, VM::M1, "CompressionType" },
 { 0x3111, 0x00FF, 0, VR::SQ, VM::M1, "QueryResult" },
 };
 
-unsigned short Dict193TagHashTable[] = {
+const unsigned short Dict199TagHashTable[] = {
     2,     3,     0,     2,     0,     2,     1,   255,
 };
 
-unsigned short Dict193KeyHashTable[] = {
+const unsigned short Dict199KeyHashTable[] = {
     3,     6,     0,     1,     1, 42557,     1,     0, 44844,
 };
 
-vtkDICOMDictionary::Dict Dict193Data = {
+vtkDICOMDictionary::Dict Dict199Data = {
 "RadWorksTBR",
 2,
 2,
-Dict193TagHashTable,
-Dict193KeyHashTable,
-Dict193Contents
+Dict199TagHashTable,
+Dict199KeyHashTable,
+Dict199Contents
 };
 
-// ----- SIEMENS SYNGO REGISTRATION -----
+// ----- Riverain Medical -----
 
-DictEntry Dict194Contents[] = {
-{ 0x0071, 0x0020, 0, VR::SQ, VM::M1, "RegisteredImageSequence" },
-{ 0x0071, 0x0021, 0, VR::CS, VM::M1, "RegistrationIsValidatedFlag" },
+const DictEntry Dict200Contents[] = {
+{ 0x0203, 0x0000, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x0001, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x0002, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x0003, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x0010, 0, VR::LO, VM::M1, "" },
+{ 0x0203, 0x00f0, 0, VR::UI, VM::M1, "" },
+{ 0x0203, 0x00f1, 0, VR::UI, VM::M1, "" },
 };
 
-unsigned short Dict194TagHashTable[] = {
-    3,     6,     0,     1,     0,    32,     1,     1,    33,
+const unsigned short Dict200TagHashTable[] = {
+    8,     7,    11,    14,    17,    22,     7,     0,     1,     4,
+   16,     1,     3,     3,     1,     2,     2,     2,     1,     1,
+    5,   240,     2,     0,     0,     6,   241,
 };
 
-unsigned short Dict194KeyHashTable[] = {
-    3,     6,     0,     1,     1, 65362,     1,     0, 53639,
+const unsigned short Dict200KeyHashTable[] = {
+    7,     7,     7,     7,     7,     8,     7,     0,     7,     0,
+  768,     1,   768,     2,   768,     3,   768,     4,   768,     5,
+  768,     6,   768,
 };
 
-vtkDICOMDictionary::Dict Dict194Data = {
-"SIEMENS SYNGO REGISTRATION",
-2,
-2,
-Dict194TagHashTable,
-Dict194KeyHashTable,
-Dict194Contents
+vtkDICOMDictionary::Dict Dict200Data = {
+"Riverain Medical",
+7,
+7,
+Dict200TagHashTable,
+Dict200KeyHashTable,
+Dict200Contents
 };
 
 // ----- AMI Sequence AnnotElements_01 -----
 
-DictEntry Dict195Contents[] = {
+const DictEntry Dict201Contents[] = {
 { 0x3105, 0x0010, 0, VR::DS, VM::M1TN, "AnnotationElementPosition" },
 { 0x3105, 0x0020, 0, VR::LT, VM::M1, "AnnotationElementText" },
 };
 
-unsigned short Dict195TagHashTable[] = {
+const unsigned short Dict201TagHashTable[] = {
     2,     3,     0,     2,     0,    16,     1,    32,
 };
 
-unsigned short Dict195KeyHashTable[] = {
+const unsigned short Dict201KeyHashTable[] = {
     2,     3,     0,     2,     0, 22223,     1, 63671,
 };
 
-vtkDICOMDictionary::Dict Dict195Data = {
+vtkDICOMDictionary::Dict Dict201Data = {
 "AMI Sequence AnnotElements_01",
 2,
 2,
-Dict195TagHashTable,
-Dict195KeyHashTable,
-Dict195Contents
+Dict201TagHashTable,
+Dict201KeyHashTable,
+Dict201Contents
 };
 
 // ----- AMI ImageTransform_01 -----
 
-DictEntry Dict196Contents[] = {
+const DictEntry Dict202Contents[] = {
 { 0x3107, 0x0010, 0, VR::DS, VM::M1TN, "TransformationMatrix" },
 { 0x3107, 0x0020, 0, VR::DS, VM::M1, "CenterOffset" },
 { 0x3107, 0x0030, 0, VR::DS, VM::M1, "Magnification" },
@@ -12232,82 +12818,82 @@ DictEntry Dict196Contents[] = {
 { 0x3107, 0x0060, 0, VR::DS, VM::M1, "CalibrationFactor" },
 };
 
-unsigned short Dict196TagHashTable[] = {
+const unsigned short Dict202TagHashTable[] = {
     7,    10,    13,    16,    19,    22,     0,     1,     4,    80,
     1,     2,    48,     1,     3,    64,     1,     1,    32,     1,
     5,    96,     1,     0,    16,
 };
 
-unsigned short Dict196KeyHashTable[] = {
+const unsigned short Dict202KeyHashTable[] = {
     7,    12,    17,     6,     6,    20,     0,     2,     3, 18224,
     5,  9826,     2,     0,  2792,     1, 49378,     1,     2, 47562,
     1,     4, 25284,
 };
 
-vtkDICOMDictionary::Dict Dict196Data = {
+vtkDICOMDictionary::Dict Dict202Data = {
 "AMI ImageTransform_01",
 6,
 6,
-Dict196TagHashTable,
-Dict196KeyHashTable,
-Dict196Contents
+Dict202TagHashTable,
+Dict202KeyHashTable,
+Dict202Contents
 };
 
 // ----- SECTRA_ImageInfo_01 -----
 
-DictEntry Dict197Contents[] = {
+const DictEntry Dict203Contents[] = {
 { 0x0029, 0x0001, 0, VR::OB, VM::M1, "ImageInfo" },
 { 0x0029, 0x0002, 0, VR::CS, VM::M1, "Marking" },
 { 0x0029, 0x0003, 0, VR::LO, VM::M1, "NoDecompression" },
 { 0x0029, 0x0004, 0, VR::OB, VM::M1, "ImageInfoNew" },
 };
 
-unsigned short Dict197TagHashTable[] = {
+const unsigned short Dict203TagHashTable[] = {
     5,     8,    11,    14,     0,     1,     0,     1,     1,     3,
     4,     1,     2,     3,     1,     1,     2,
 };
 
-unsigned short Dict197KeyHashTable[] = {
+const unsigned short Dict203KeyHashTable[] = {
     5,     8,    11,     4,     0,     1,     0, 38509,     1,     2,
 36303,     2,     1, 60139,     3, 61855,
 };
 
-vtkDICOMDictionary::Dict Dict197Data = {
+vtkDICOMDictionary::Dict Dict203Data = {
 "SECTRA_ImageInfo_01",
 4,
 4,
-Dict197TagHashTable,
-Dict197KeyHashTable,
-Dict197Contents
+Dict203TagHashTable,
+Dict203KeyHashTable,
+Dict203Contents
 };
 
 // ----- HMC - CT - ID -----
 
-DictEntry Dict198Contents[] = {
+const DictEntry Dict204Contents[] = {
 { 0x0009, 0x0000, 0, VR::OB, VM::M1, "ImageIDInformationPatientNameID" },
 { 0x0009, 0x0001, 0, VR::OB, VM::M1, "ImageIDInformationPatientComment" },
 };
 
-unsigned short Dict198TagHashTable[] = {
+const unsigned short Dict204TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict198KeyHashTable[] = {
+const unsigned short Dict204KeyHashTable[] = {
     3,     6,     0,     1,     0, 17343,     1,     1, 63969,
 };
 
-vtkDICOMDictionary::Dict Dict198Data = {
+vtkDICOMDictionary::Dict Dict204Data = {
 "HMC - CT - ID",
 2,
 2,
-Dict198TagHashTable,
-Dict198KeyHashTable,
-Dict198Contents
+Dict204TagHashTable,
+Dict204KeyHashTable,
+Dict204Contents
 };
 
 // ----- VEPRO DICOM RECEIVE DATA 1.0 -----
 
-DictEntry Dict199Contents[] = {
+const DictEntry Dict205Contents[] = {
 { 0x0059, 0x0040, 0, VR::DA, VM::M1, "ReceiveDate" },
 { 0x0059, 0x0041, 0, VR::TM, VM::M1, "ReceiveTime" },
 { 0x0059, 0x0042, 0, VR::ST, VM::M1, "ReceiveNode" },
@@ -12319,123 +12905,144 @@ DictEntry Dict199Contents[] = {
 { 0x0059, 0x0070, 0, VR::UI, VM::M1, "ReceiveOriginalTransferSyntax" },
 };
 
-unsigned short Dict199TagHashTable[] = {
+const unsigned short Dict205TagHashTable[] = {
    10,     9,    15,    18,     9,    21,    24,    27,    30,     0,
     2,     2,    66,     4,    80,     1,     7,    97,     1,     6,
    96,     1,     8,   112,     1,     1,    65,     1,     0,    64,
     2,     3,    67,     5,    81,
 };
 
-unsigned short Dict199KeyHashTable[] = {
+const unsigned short Dict205KeyHashTable[] = {
    10,    13,    16,    21,     9,    26,    29,     9,    32,     0,
     1,     5, 34915,     1,     4,  8601,     2,     1, 28845,     2,
  5580,     2,     7, 51377,     8, 62294,     1,     3, 16927,     1,
     6, 42133,     1,     0, 29550,
 };
 
-vtkDICOMDictionary::Dict Dict199Data = {
+vtkDICOMDictionary::Dict Dict205Data = {
 "VEPRO DICOM RECEIVE DATA 1.0",
 9,
 9,
-Dict199TagHashTable,
-Dict199KeyHashTable,
-Dict199Contents
+Dict205TagHashTable,
+Dict205KeyHashTable,
+Dict205Contents
 };
 
 // ----- ADAC_IMG -----
 
-DictEntry Dict200Contents[] = {
+const DictEntry Dict206Contents[] = {
 { 0x0019, 0x0002, 0, VR::IS, VM::M1, "ADACPegasysFileSize" },
 { 0x0019, 0x0021, 0, VR::US, VM::M1, "NumberOfADACHeaders" },
 { 0x0019, 0x0041, 0, VR::IS, VM::M1TN, "ADACHeaderImageSize" },
 { 0x0019, 0x0061, 0, VR::OB, VM::M1, "ADACPegasysHeaders" },
 };
 
-unsigned short Dict200TagHashTable[] = {
+const unsigned short Dict206TagHashTable[] = {
     5,     8,     4,    13,     0,     1,     1,    33,     2,     2,
    65,     3,    97,     1,     0,     2,
 };
 
-unsigned short Dict200KeyHashTable[] = {
+const unsigned short Dict206KeyHashTable[] = {
     5,     8,    13,     4,     0,     1,     1, 22938,     2,     0,
  7665,     2, 36501,     1,     3, 58761,
 };
 
-vtkDICOMDictionary::Dict Dict200Data = {
+vtkDICOMDictionary::Dict Dict206Data = {
 "ADAC_IMG",
 4,
 4,
-Dict200TagHashTable,
-Dict200KeyHashTable,
-Dict200Contents
+Dict206TagHashTable,
+Dict206KeyHashTable,
+Dict206Contents
 };
 
 // ----- SIEMENS MEDCOM HEADER2 -----
 
-DictEntry Dict201Contents[] = {
+const DictEntry Dict207Contents[] = {
 { 0x0029, 0x0060, 0, VR::LO, VM::M1, "SeriesWorkFlowStatus" },
 };
 
-unsigned short Dict201TagHashTable[] = {
+const unsigned short Dict207TagHashTable[] = {
     2,     0,     1,     0,    96,
 };
 
-unsigned short Dict201KeyHashTable[] = {
+const unsigned short Dict207KeyHashTable[] = {
     2,     0,     1,     0, 26191,
 };
 
-vtkDICOMDictionary::Dict Dict201Data = {
+vtkDICOMDictionary::Dict Dict207Data = {
 "SIEMENS MEDCOM HEADER2",
 1,
 1,
-Dict201TagHashTable,
-Dict201KeyHashTable,
-Dict201Contents
+Dict207TagHashTable,
+Dict207KeyHashTable,
+Dict207Contents
 };
 
 // ----- Philips MR Imaging DD 002 -----
 
-DictEntry Dict202Contents[] = {
-{ 0x2005, 0x0032, 0, VR::SQ, VM::M1, "" },
-{ 0x2005, 0x0034, 0, VR::LT, VM::M1, "" },
-{ 0x2005, 0x0037, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0038, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0039, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0040, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0041, 0, VR::LO, VM::M1, "" },
-{ 0x2005, 0x0043, 0, VR::SL, VM::M1, "" },
-{ 0x2005, 0x0044, 0, VR::OW, VM::M1, "" },
-{ 0x2005, 0x0047, 0, VR::CS, VM::M1, "" },
-{ 0x2005, 0x0099, 0, VR::UL, VM::M1, "" },
-};
-
-unsigned short Dict202TagHashTable[] = {
-   11,    11,    12,    11,    15,    18,    23,    26,    11,    29,
-   36,     0,     1,     8,    68,     1,     0,    50,     2,     9,
-   71,    10,   153,     1,     5,    64,     1,     6,    65,     3,
-    1,    52,     4,    57,     7,    67,     2,     2,    55,     3,
-   56,
-};
-
-unsigned short Dict202KeyHashTable[] = {
-   11,    11,    12,    11,    11,    11,    11,    11,    11,    11,
-   11,     0,    11,     0,   489,     1,   489,     2,   489,     3,
-  489,     4,   489,     5,   489,     6,   489,     7,   489,     8,
-  489,     9,   489,    10,   489,
+const DictEntry Dict208Contents[] = {
+{ 0x2005, 0x0015, 0, VR::LO, VM::M1, "UserName" },
+{ 0x2005, 0x0016, 0, VR::LO, VM::M1, "PassWord" },
+{ 0x2005, 0x0017, 0, VR::LO, VM::M1, "ServerName" },
+{ 0x2005, 0x0018, 0, VR::LO, VM::M1, "DataBaseName" },
+{ 0x2005, 0x0019, 0, VR::LO, VM::M1, "RootName" },
+{ 0x2005, 0x0020, 0, VR::LO, VM::M1, "DMIApplicationName" },
+{ 0x2005, 0x002D, 0, VR::LO, VM::M1, "RootId" },
+{ 0x2005, 0x0032, 0, VR::SQ, VM::M1, "BlobDataObjectArray" },
+{ 0x2005, 0x0034, 0, VR::LT, VM::M1, "SeriesTransactionUID" },
+{ 0x2005, 0x0035, 0, VR::IS, VM::M1, "ParentID" },
+{ 0x2005, 0x0036, 0, VR::LO, VM::M1, "ParentType" },
+{ 0x2005, 0x0037, 0, VR::LO, VM::M1, "BlobName" },
+{ 0x2005, 0x0038, 0, VR::LO, VM::M1, "ApplicationName" },
+{ 0x2005, 0x0039, 0, VR::LO, VM::M1, "TypeName" },
+{ 0x2005, 0x0040, 0, VR::LO, VM::M1, "VersionStr" },
+{ 0x2005, 0x0041, 0, VR::LO, VM::M1, "CommentStr" },
+{ 0x2005, 0x0042, 0, VR::CS, VM::M1, "BlobInFile" },
+{ 0x2005, 0x0043, 0, VR::SL, VM::M1, "ActualBlobSize" },
+{ 0x2005, 0x0044, 0, VR::OW, VM::M1, "BlobData" },
+{ 0x2005, 0x0045, 0, VR::LO, VM::M1, "BlobFilename" },
+{ 0x2005, 0x0046, 0, VR::SL, VM::M1, "BlobOffset" },
+{ 0x2005, 0x0047, 0, VR::CS, VM::M1, "BlobFlag" },
+{ 0x2005, 0x0099, 0, VR::UL, VM::M1, "NumberOfRequestExcerpts" },
+};
+
+const unsigned short Dict208TagHashTable[] = {
+   24,    23,    23,    27,    23,    23,    23,    23,    30,    35,
+   38,    41,    46,    51,    56,    59,    62,    65,    68,    71,
+   76,    79,    82,     0,     1,     3,    24,     1,     7,    50,
+    2,     5,    32,    13,    57,     1,    12,    56,     1,     0,
+   21,     2,     6,    45,    22,   153,     2,     2,    23,    18,
+   68,     2,     1,    22,    19,    69,     1,    20,    70,     1,
+   21,    71,     1,    14,    64,     1,    15,    65,     1,    16,
+   66,     2,     9,    53,    17,    67,     1,     8,    52,     1,
+   11,    55,     2,     4,    25,    10,    54,
+};
+
+const unsigned short Dict208KeyHashTable[] = {
+   24,    29,    23,    23,    36,    39,    44,    23,    47,    50,
+   53,    60,    63,    23,    23,    23,    66,    23,    69,    23,
+   72,    75,    82,     0,     2,     3, 54397,    18, 64850,     3,
+    4, 54079,    14, 52277,    20, 13446,     1,     8, 18028,     2,
+   12, 42963,    22, 55251,     1,     9, 42394,     1,    15, 56895,
+    1,    10,  9976,     3,     2, 39013,     5, 20102,    17, 36841,
+    1,    16, 22288,     1,     1,  4852,     1,     6, 44138,     1,
+   21,  2932,     1,    19, 38231,     3,     0, 10384,     7,  7545,
+   11, 14928,     1,    13, 16350,
 };
 
-vtkDICOMDictionary::Dict Dict202Data = {
+vtkDICOMDictionary::Dict Dict208Data = {
 "Philips MR Imaging DD 002",
-11,
-11,
-Dict202TagHashTable,
-Dict202KeyHashTable,
-Dict202Contents
+23,
+23,
+Dict208TagHashTable,
+Dict208KeyHashTable,
+Dict208Contents
 };
 
 // ----- SIEMENS CSA HEADER -----
 
-DictEntry Dict203Contents[] = {
+const DictEntry Dict209Contents[] = {
 { 0x0029, 0x0008, 0, VR::CS, VM::M1, "CSAImageHeaderType" },
 { 0x0029, 0x0009, 0, VR::LO, VM::M1, "CSAImageHeaderVersion" },
 { 0x0029, 0x0010, 0, VR::OB, VM::M1, "CSAImageHeaderInfo" },
@@ -12444,80 +13051,177 @@ DictEntry Dict203Contents[] = {
 { 0x0029, 0x0020, 0, VR::OB, VM::M1, "CSASeriesHeaderInfo" },
 };
 
-unsigned short Dict203TagHashTable[] = {
+const unsigned short Dict209TagHashTable[] = {
     7,    10,    13,    16,     6,     6,     0,     1,     4,    25,
     1,     3,    24,     1,     1,     9,     3,     0,     8,     2,
    16,     5,    32,
 };
 
-unsigned short Dict203KeyHashTable[] = {
+const unsigned short Dict209KeyHashTable[] = {
     7,     6,    12,     6,    15,     6,     0,     2,     0, 16775,
     5,  1386,     1,     3,  3784,     3,     1, 53655,     2, 14376,
     4, 20995,
 };
 
-vtkDICOMDictionary::Dict Dict203Data = {
+vtkDICOMDictionary::Dict Dict209Data = {
 "SIEMENS CSA HEADER",
 6,
 6,
-Dict203TagHashTable,
-Dict203KeyHashTable,
-Dict203Contents
+Dict209TagHashTable,
+Dict209KeyHashTable,
+Dict209Contents
+};
+
+// ----- MEDISO-1 -----
+
+const DictEntry Dict210Contents[] = {
+{ 0x0009, 0x0030, 0, VR::DT, VM::M1, "" },
+{ 0x0009, 0x0036, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00c0, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00c1, 0, VR::OB, VM::M1, "" },
+{ 0x0009, 0x00c4, 0, VR::OB, VM::M1, "" },
+{ 0x0009, 0x00d2, 0, VR::LO, VM::M1, "" },
+{ 0x0009, 0x00d5, 0, VR::LO, VM::M1, "" },
+{ 0x0009, 0x00dc, 0, VR::SQ, VM::M1, "" },
+{ 0x0009, 0x00de, 0, VR::UL, VM::M1, "" },
+{ 0x0009, 0x00df, 0, VR::UL, VM::M1, "" },
+{ 0x0009, 0x00e0, 0, VR::US, VM::M1, "" },
+{ 0x0009, 0x00e1, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00e6, 0, VR::OB, VM::M1, "" },
+{ 0x0009, 0x00e9, 0, VR::UI, VM::M1TN, "" },
+{ 0x0009, 0x00ee, 0, VR::DT, VM::M1, "" },
+{ 0x0009, 0x00ef, 0, VR::DT, VM::M1, "" },
+{ 0x0009, 0x00f0, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00f1, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00f2, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00f3, 0, VR::FD, VM::M1, "" },
+{ 0x0009, 0x00fa, 0, VR::ST, VM::M1, "" },
+{ 0x0009, 0x00fb, 0, VR::US, VM::M1, "" },
+{ 0x0011, 0x0006, 0, VR::LO, VM::M1, "" },
+};
+
+const unsigned short Dict210TagHashTable[] = {
+   24,    23,    23,    23,    27,    30,    35,    40,    23,    43,
+   46,    49,    23,    23,    23,    23,    54,    57,    60,    65,
+   70,    75,    80,     0,     1,    22,     6,     1,    10,   224,
+    2,     8,   222,    11,   225,     2,     9,   223,    12,   230,
+    1,     7,   220,     1,     5,   210,     1,    20,   250,     2,
+    0,    48,    21,   251,     1,     6,   213,     1,     1,    54,
+    2,     2,   192,    18,   242,     2,     3,   193,    19,   243,
+    2,    13,   233,    16,   240,     2,    14,   238,    17,   241,
+    2,     4,   196,    15,   239,
+};
+
+const unsigned short Dict210KeyHashTable[] = {
+   23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+   23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
+   23,    23,    24,     0,    23,     0,   233,     1,   233,     2,
+  233,     3,   233,     4,   233,     5,   233,     6,   233,     7,
+  233,     8,   233,     9,   233,    10,   233,    11,   233,    12,
+  233,    13,   233,    14,   233,    15,   233,    16,   233,    17,
+  233,    18,   233,    19,   233,    20,   233,    21,   233,    22,
+  233,
+};
+
+vtkDICOMDictionary::Dict Dict210Data = {
+"MEDISO-1",
+23,
+23,
+Dict210TagHashTable,
+Dict210KeyHashTable,
+Dict210Contents
 };
 
 // ----- MeVis eD: Geometry Information -----
 
-DictEntry Dict204Contents[] = {
+const DictEntry Dict211Contents[] = {
 { 0x0021, 0x0010, 0, VR::UN, VM::M1, "GeometryScannerOrigin" },
 };
 
-unsigned short Dict204TagHashTable[] = {
+const unsigned short Dict211TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict204KeyHashTable[] = {
+const unsigned short Dict211KeyHashTable[] = {
     2,     0,     1,     0, 24355,
 };
 
-vtkDICOMDictionary::Dict Dict204Data = {
+vtkDICOMDictionary::Dict Dict211Data = {
 "MeVis eD: Geometry Information",
 1,
 1,
-Dict204TagHashTable,
-Dict204KeyHashTable,
-Dict204Contents
+Dict211TagHashTable,
+Dict211KeyHashTable,
+Dict211Contents
 };
 
 // ----- SIEMENS SYNGO 3D FUSION MATRIX -----
 
-DictEntry Dict205Contents[] = {
+const DictEntry Dict212Contents[] = {
 { 0x0029, 0x0008, 0, VR::UI, VM::M1, "ObjectSeriesInstanceUID" },
 { 0x0029, 0x0009, 0, VR::UI, VM::M1, "ModelSeriesInstanceUID" },
 { 0x0029, 0x0010, 0, VR::UI, VM::M1, "MatrixReferencedSeriesInstanceUID" },
 };
 
-unsigned short Dict205TagHashTable[] = {
+const unsigned short Dict212TagHashTable[] = {
     4,     3,     9,     0,     2,     0,     8,     2,    16,     1,
     1,     9,
 };
 
-unsigned short Dict205KeyHashTable[] = {
+const unsigned short Dict212KeyHashTable[] = {
     4,     9,     3,     0,     2,     1, 51112,     2, 20485,     1,
     0, 40511,
 };
 
-vtkDICOMDictionary::Dict Dict205Data = {
+vtkDICOMDictionary::Dict Dict212Data = {
 "SIEMENS SYNGO 3D FUSION MATRIX",
 3,
 3,
-Dict205TagHashTable,
-Dict205KeyHashTable,
-Dict205Contents
+Dict212TagHashTable,
+Dict212KeyHashTable,
+Dict212Contents
 };
 
 // ----- GEMS_3D_INTVL_01 -----
 
-DictEntry Dict206Contents[] = {
+const DictEntry Dict213Contents[] = {
+{ 0x0023, 0x0001, 0, VR::SQ, VM::M1, "XRayMarkerSequence" },
+{ 0x0023, 0x0002, 0, VR::SH, VM::M1, "MarkerID" },
+{ 0x0023, 0x0003, 0, VR::CS, VM::M1, "MarkerType" },
+{ 0x0023, 0x0004, 0, VR::FL, VM::M1, "MarkerSize" },
+{ 0x0023, 0x0005, 0, VR::US, VM::M3, "MarkerColorCIELabValue" },
+{ 0x0023, 0x0006, 0, VR::LO, VM::M1, "MarkerLabel" },
+{ 0x0023, 0x0007, 0, VR::CS, VM::M1, "MarkerVisibleState" },
+{ 0x0023, 0x0008, 0, VR::LO, VM::M1, "MarkerDescription" },
+{ 0x0023, 0x0010, 0, VR::SQ, VM::M1, "MarkerPointsSequence" },
+{ 0x0023, 0x0011, 0, VR::SH, VM::M1, "MarkerPointID" },
+{ 0x0023, 0x0012, 0, VR::FL, VM::M3, "MarkerPointPosition" },
+{ 0x0023, 0x0013, 0, VR::FL, VM::M1, "MarkerPointSize" },
+{ 0x0023, 0x0014, 0, VR::US, VM::M3, "MarkerPointColorCIELabValue" },
+{ 0x0023, 0x0016, 0, VR::CS, VM::M1, "MarkerPointVisibleState" },
+{ 0x0023, 0x0017, 0, VR::IS, VM::M1, "MarkerPointOrder" },
+{ 0x0023, 0x0018, 0, VR::FL, VM::M3, "VolumeManualRegistration" },
+{ 0x0023, 0x0020, 0, VR::IS, VM::M1TN, "VolumesThreshold" },
+{ 0x0023, 0x0025, 0, VR::CS, VM::M1, "CutPlaneActivationFlag" },
+{ 0x0023, 0x0026, 0, VR::IS, VM::M1, "CutPlanePositionValue" },
+{ 0x0023, 0x0027, 0, VR::FL, VM::M3, "CutPlaneNormalValue" },
+{ 0x0023, 0x0028, 0, VR::FL, VM::M1, "VolumeScalingFactor" },
+{ 0x0023, 0x0029, 0, VR::FL, VM::M1, "ROIToTableTopDistance" },
+{ 0x0023, 0x0030, 0, VR::IS, VM::M1TN, "DRRThreshold" },
+{ 0x0023, 0x0031, 0, VR::FL, VM::M3, "VolumeTablePosition" },
+{ 0x0023, 0x0032, 0, VR::IS, VM::M1, "RenderingMode" },
+{ 0x0023, 0x0033, 0, VR::IS, VM::M1, "ThreeDObjectOpacity" },
+{ 0x0023, 0x0034, 0, VR::IS, VM::M1, "InvertImage" },
+{ 0x0023, 0x0035, 0, VR::IS, VM::M1, "EnhanceFull" },
+{ 0x0023, 0x0036, 0, VR::FL, VM::M1, "Zoom" },
+{ 0x0023, 0x0037, 0, VR::IS, VM::M2, "Roam" },
+{ 0x0023, 0x0038, 0, VR::IS, VM::M1, "WindowLevel" },
+{ 0x0023, 0x0039, 0, VR::IS, VM::M1, "WindowWidth" },
+{ 0x0023, 0x0040, 0, VR::CS, VM::M1, "BMCSetting" },
+{ 0x0023, 0x0041, 0, VR::CS, VM::M1, "BackViewSetting" },
+{ 0x0023, 0x0042, 0, VR::CS, VM::M1TN, "SubVolumeVisibility" },
+{ 0x0023, 0x0043, 0, VR::CS, VM::M1, "ThreeDLandmarksVisibility" },
+{ 0x0023, 0x0044, 0, VR::CS, VM::M1, "AblationPointVisibility" },
 { 0x0023, 0x0001, 0, VR::SQ, VM::M1, "XRayMarkerSequence" },
 { 0x0023, 0x0002, 0, VR::SH, VM::M1, "MarkerID" },
 { 0x0023, 0x0003, 0, VR::CS, VM::M1, "MarkerType" },
@@ -12557,53 +13261,76 @@ DictEntry Dict206Contents[] = {
 { 0x0023, 0x0044, 0, VR::CS, VM::M1, "AblationPointVisibility" },
 };
 
-unsigned short Dict206TagHashTable[] = {
-   38,    41,    44,    47,    50,    53,    56,    37,    37,    37,
-   61,    64,    69,    72,    75,    78,    81,    86,    89,    94,
-   97,   100,   103,   110,   115,   118,   121,   124,   127,    37,
-   37,    37,   130,   133,   136,    37,   139,     0,     1,     5,
-    6,     1,     4,     5,     1,     3,     4,     1,    16,    32,
-    1,    19,    39,     1,    18,    38,     2,     7,     8,    17,
-   37,     1,    21,    41,     2,    11,    19,    20,    40,     1,
-   10,    18,     1,     9,    17,     1,     8,    16,     1,    14,
-   23,     2,    13,    22,    25,    51,     1,    24,    50,     2,
-   12,    20,    23,    49,     1,    22,    48,     1,    29,    55,
-    1,    28,    54,     3,    15,    24,    27,    53,    34,    66,
-    2,    26,    52,    35,    67,     1,    32,    64,     1,    33,
-   65,     1,    31,    57,     1,    30,    56,     1,    36,    68,
-    1,     2,     3,     1,     1,     2,     1,     0,     1,     1,
-    6,     7,
-};
-
-unsigned short Dict206KeyHashTable[] = {
-   37,    38,    41,    46,    37,    49,    58,    61,    64,    37,
-   67,    37,    70,    73,    76,    79,    82,    37,    85,    88,
-   91,    37,    94,    37,   105,    37,    37,   112,   117,   120,
-  123,   128,    37,   131,    37,    37,    37,     0,     1,     2,
-45352,     2,    10, 51252,    14,  2895,     1,    33, 51772,     4,
-   20, 28632,    24, 36359,    29, 47683,    30, 55824,     1,    17,
-24731,     1,     4,  9996,     1,    34, 45435,     1,     1, 63746,
-    1,    15, 33346,     1,    36, 21668,     1,    35, 31448,     1,
-   27,   767,     1,     5, 33291,     1,     8, 28111,     1,    18,
-30144,     1,    11,  6840,     5,     0, 35286,     7, 39569,     9,
-58920,    21, 48218,    32,  3955,     3,    16, 39873,    22, 52602,
-   26, 24424,     2,    12, 16970,    23, 39699,     1,     3, 43918,
-    1,    28, 55465,     2,    19, 40885,    31, 18547,     1,    25,
-27498,     2,     6, 50609,    13, 63859,
+const unsigned short Dict213TagHashTable[] = {
+   74,    74,    74,    75,    80,    85,    90,    74,    74,    74,
+   95,   100,    74,    74,    74,    74,   105,   110,   115,   120,
+  125,   130,   135,   144,   153,   158,   163,   168,   173,    74,
+   74,    74,   178,   183,   188,    74,   193,   198,   203,   208,
+   74,    74,    74,   213,    74,    74,    74,    74,   218,   223,
+  228,   233,   238,   243,    74,   248,    74,    74,    74,   253,
+   74,    74,    74,    74,    74,    74,    74,    74,    74,    74,
+   74,    74,    74,    74,     0,     2,    16,    32,    53,    32,
+    2,    19,    39,    56,    39,     2,    18,    38,    55,    38,
+    2,    17,    37,    54,    37,     2,    21,    41,    58,    41,
+    2,    20,    40,    57,    40,     2,    25,    51,    62,    51,
+    2,    24,    50,    61,    50,     2,    23,    49,    60,    49,
+    2,    22,    48,    59,    48,     2,    29,    55,    66,    55,
+    2,    28,    54,    65,    54,     4,    27,    53,    34,    66,
+   64,    53,    71,    66,     4,    26,    52,    35,    67,    63,
+   52,    72,    67,     2,    32,    64,    69,    64,     2,    33,
+   65,    70,    65,     2,    31,    57,    68,    57,     2,    30,
+   56,    67,    56,     2,    36,    68,    73,    68,     2,     2,
+    3,    39,     3,     2,     1,     2,    38,     2,     2,     0,
+    1,    37,     1,     2,     6,     7,    43,     7,     2,     5,
+    6,    42,     6,     2,     4,     5,    41,     5,     2,     3,
+    4,    40,     4,     2,     7,     8,    44,     8,     2,    11,
+   19,    48,    19,     2,    10,    18,    47,    18,     2,     9,
+   17,    46,    17,     2,     8,    16,    45,    16,     2,    14,
+   23,    51,    23,     2,    13,    22,    50,    22,     2,    12,
+   20,    49,    20,     2,    15,    24,    52,    24,
+};
+
+const unsigned short Dict213KeyHashTable[] = {
+   74,    75,    80,    85,    74,    90,    74,    99,    74,    74,
+  104,    74,   109,   114,   119,    74,    74,    74,    74,   124,
+  129,    74,   134,    74,   147,    74,    74,   156,   161,    74,
+   74,   166,    74,    74,    74,    74,    74,    74,    74,   171,
+   74,    74,   176,   185,    74,   190,    74,    74,    74,    74,
+   74,    74,   195,   200,    74,   205,    74,    74,    74,   210,
+   74,   219,    74,    74,   224,    74,   229,   234,    74,    74,
+  243,    74,    74,    74,     0,     2,     2, 55444,    39, 55444,
+    2,    10, 25626,    47, 25626,     2,    33, 58654,    70, 58654,
+    4,    20, 47084,    30, 27912,    57, 47084,    67, 27912,     2,
+    4,  4998,    41,  4998,     2,     1, 64641,    38, 64641,     2,
+   15, 16673,    52, 16673,     2,    36, 43602,    73, 43602,     2,
+   35, 15724,    72, 15724,     2,    18, 47840,    55, 47840,     2,
+   11, 36188,    48, 36188,     6,     0, 17643,     9, 62228,    21,
+24109,    37, 17643,    46, 62228,    58, 24109,     4,    22, 26301,
+   26, 44980,    59, 26301,    63, 44980,     2,    12, 41253,    49,
+41253,     2,     3, 54727,    40, 54727,     2,    25, 13749,    62,
+13749,     2,    14, 34215,    51, 34215,     4,    24, 18179,    29,
+56609,    61, 18179,    66, 56609,     2,    17, 45133,    54, 45133,
+    2,    34, 22717,    71, 22717,     2,    27, 33151,    64, 33151,
+    2,     5, 49413,    42, 49413,     2,     8, 46823,    45, 46823,
+    4,     7, 52552,    32, 34745,    44, 52552,    69, 34745,     2,
+   16, 52704,    53, 52704,     2,    23, 52617,    60, 52617,     2,
+   28, 60500,    65, 60500,     4,    19, 53210,    31,  9273,    56,
+53210,    68,  9273,     4,     6, 58072,    13, 31929,    43, 58072,
+   50, 31929,
 };
 
-vtkDICOMDictionary::Dict Dict206Data = {
+vtkDICOMDictionary::Dict Dict213Data = {
 "GEMS_3D_INTVL_01",
-37,
-37,
-Dict206TagHashTable,
-Dict206KeyHashTable,
-Dict206Contents
+74,
+74,
+Dict213TagHashTable,
+Dict213KeyHashTable,
+Dict213Contents
 };
 
 // ----- Philips Imaging DD 002 -----
 
-DictEntry Dict207Contents[] = {
+const DictEntry Dict214Contents[] = {
 { 0x2001, 0x0001, 0, VR::US, VM::M1, "" },
 { 0x2001, 0x0002, 0, VR::FD, VM::M1, "" },
 { 0x2001, 0x0013, 0, VR::SS, VM::M1, "" },
@@ -12655,7 +13382,7 @@ DictEntry Dict207Contents[] = {
 { 0x2001, 0x0073, 0, VR::FL, VM::M2, "" },
 };
 
-unsigned short Dict207TagHashTable[] = {
+const unsigned short Dict214TagHashTable[] = {
    50,    53,    56,    59,    62,    65,    68,    71,    74,    49,
    77,    80,    83,    86,    89,    92,    95,    98,   101,   104,
   107,   110,   113,   116,   119,   122,   125,   128,   131,   134,
@@ -12678,7 +13405,7 @@ unsigned short Dict207TagHashTable[] = {
    39,    57,     1,    41,    59,
 };
 
-unsigned short Dict207KeyHashTable[] = {
+const unsigned short Dict214KeyHashTable[] = {
    49,    49,    49,    49,    49,    49,    49,    49,    49,    49,
    49,    49,    49,    49,    49,    49,    49,    49,    49,    49,
    49,    49,    49,    49,    49,    49,    49,    49,    49,    49,
@@ -12696,18 +13423,18 @@ unsigned short Dict207KeyHashTable[] = {
   109,    45,   109,    46,   109,    47,   109,    48,   109,
 };
 
-vtkDICOMDictionary::Dict Dict207Data = {
+vtkDICOMDictionary::Dict Dict214Data = {
 "Philips Imaging DD 002",
 49,
 49,
-Dict207TagHashTable,
-Dict207KeyHashTable,
-Dict207Contents
+Dict214TagHashTable,
+Dict214KeyHashTable,
+Dict214Contents
 };
 
 // ----- KONICA1.0 -----
 
-DictEntry Dict208Contents[] = {
+const DictEntry Dict215Contents[] = {
 { 0x0031, 0x0000, 0, VR::LO, VM::M1, "" },
 { 0x0031, 0x0001, 0, VR::US, VM::M1, "" },
 { 0x0031, 0x0005, 0, VR::US, VM::M1, "" },
@@ -12902,7 +13629,7 @@ DictEntry Dict208Contents[] = {
 { 0x0031, 0x00ff, 0, VR::SQ, VM::M1, "PrivateDataSequence" },
 };
 
-unsigned short Dict208TagHashTable[] = {
+const unsigned short Dict215TagHashTable[] = {
   193,   196,   199,   204,   207,   210,   213,   216,   219,   222,
   225,   228,   231,   234,   239,   242,   245,   250,   255,   260,
   265,   270,   273,   278,   283,   286,   289,   292,   295,   298,
@@ -12979,7 +13706,7 @@ unsigned short Dict208TagHashTable[] = {
   141,     1,   116,   140,
 };
 
-unsigned short Dict208KeyHashTable[] = {
+const unsigned short Dict215KeyHashTable[] = {
   192,   192,   192,   192,   192,   193,   192,   192,   192,   192,
   192,   192,   192,   192,   192,   192,   192,   192,   192,   192,
   192,   192,   192,   192,   192,   192,   192,   192,   192,   192,
@@ -13040,69 +13767,69 @@ unsigned short Dict208KeyHashTable[] = {
   188,    28,   189,    28,   190,    28,     1,   191,  5825,
 };
 
-vtkDICOMDictionary::Dict Dict208Data = {
+vtkDICOMDictionary::Dict Dict215Data = {
 "KONICA1.0",
 192,
 192,
-Dict208TagHashTable,
-Dict208KeyHashTable,
-Dict208Contents
+Dict215TagHashTable,
+Dict215KeyHashTable,
+Dict215Contents
 };
 
 // ----- Applicare/Centricity Radiology Web/Version 1.0 -----
 
-DictEntry Dict209Contents[] = {
+const DictEntry Dict216Contents[] = {
 { 0x4109, 0x0001, 0, VR::SH, VM::M1, "MammographyLaterality" },
 { 0x4109, 0x0002, 0, VR::SH, VM::M1, "MammographyViewName" },
 { 0x4109, 0x0003, 0, VR::SH, VM::M1, "MammographyViewModifier" },
 };
 
-unsigned short Dict209TagHashTable[] = {
+const unsigned short Dict216TagHashTable[] = {
     4,     7,     3,     0,     1,     2,     3,     2,     0,     1,
     1,     2,
 };
 
-unsigned short Dict209KeyHashTable[] = {
+const unsigned short Dict216KeyHashTable[] = {
     4,     9,     3,     0,     2,     1,  5633,     2, 59419,     1,
     0, 24043,
 };
 
-vtkDICOMDictionary::Dict Dict209Data = {
+vtkDICOMDictionary::Dict Dict216Data = {
 "Applicare/Centricity Radiology Web/Version 1.0",
 3,
 3,
-Dict209TagHashTable,
-Dict209KeyHashTable,
-Dict209Contents
+Dict216TagHashTable,
+Dict216KeyHashTable,
+Dict216Contents
 };
 
 // ----- SIEMENS Ultrasound S2000 -----
 
-DictEntry Dict210Contents[] = {
+const DictEntry Dict217Contents[] = {
 { 0x0021, 0x0000, 0, VR::US, VM::M1, "NipplePosition" },
 { 0x0021, 0x0001, 0, VR::US, VM::M1, "ABVSClipDerivedFromVolume" },
 };
 
-unsigned short Dict210TagHashTable[] = {
+const unsigned short Dict217TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict210KeyHashTable[] = {
+const unsigned short Dict217KeyHashTable[] = {
     3,     2,     0,     2,     0, 64705,     1, 21012,
 };
 
-vtkDICOMDictionary::Dict Dict210Data = {
+vtkDICOMDictionary::Dict Dict217Data = {
 "SIEMENS Ultrasound S2000",
 2,
-2,
-Dict210TagHashTable,
-Dict210KeyHashTable,
-Dict210Contents
+2,
+Dict217TagHashTable,
+Dict217KeyHashTable,
+Dict217Contents
 };
 
 // ----- 1.2.840.113708.794.1.1.2.0 -----
 
-DictEntry Dict211Contents[] = {
+const DictEntry Dict218Contents[] = {
 { 0x0087, 0x0010, 0, VR::CS, VM::M1, "MediaType" },
 { 0x0087, 0x0020, 0, VR::CS, VM::M1, "MediaLocation" },
 { 0x0087, 0x0030, 0, VR::ST, VM::M1, "StorageFileID" },
@@ -13110,28 +13837,28 @@ DictEntry Dict211Contents[] = {
 { 0x0087, 0x0050, 0, VR::IS, VM::M1, "EstimatedRetrieveTime" },
 };
 
-unsigned short Dict211TagHashTable[] = {
+const unsigned short Dict218TagHashTable[] = {
     6,     9,    14,     5,    17,     0,     1,     1,    32,     2,
     2,    48,     3,    64,     1,     4,    80,     1,     0,    16,
 };
 
-unsigned short Dict211KeyHashTable[] = {
+const unsigned short Dict218KeyHashTable[] = {
     6,     5,    13,     5,     5,     0,     3,     0, 43643,     1,
 27878,     4, 54482,     2,     2, 32513,     3,  1965,
 };
 
-vtkDICOMDictionary::Dict Dict211Data = {
+vtkDICOMDictionary::Dict Dict218Data = {
 "1.2.840.113708.794.1.1.2.0",
 5,
 5,
-Dict211TagHashTable,
-Dict211KeyHashTable,
-Dict211Contents
+Dict218TagHashTable,
+Dict218KeyHashTable,
+Dict218Contents
 };
 
 // ----- TOSHIBA MDW HEADER -----
 
-DictEntry Dict212Contents[] = {
+const DictEntry Dict219Contents[] = {
 { 0x0029, 0x0008, 0, VR::CS, VM::M1, "ImageHeaderType" },
 { 0x0029, 0x0009, 0, VR::LO, VM::M1, "ImageHeaderVersion" },
 { 0x0029, 0x0010, 0, VR::OB, VM::M1, "ImageHeaderInfo" },
@@ -13140,53 +13867,53 @@ DictEntry Dict212Contents[] = {
 { 0x0029, 0x0020, 0, VR::OB, VM::M1, "SeriesHeaderInfo" },
 };
 
-unsigned short Dict212TagHashTable[] = {
+const unsigned short Dict219TagHashTable[] = {
     7,    10,    13,    16,     6,     6,     0,     1,     4,    25,
     1,     3,    24,     1,     1,     9,     3,     0,     8,     2,
    16,     5,    32,
 };
 
-unsigned short Dict212KeyHashTable[] = {
+const unsigned short Dict219KeyHashTable[] = {
     6,     7,     6,    10,     6,    15,     0,     1,     2, 58538,
     2,     0, 60936,     5, 16923,     3,     1, 43859,     3, 19321,
     4,  3567,
 };
 
-vtkDICOMDictionary::Dict Dict212Data = {
+vtkDICOMDictionary::Dict Dict219Data = {
 "TOSHIBA MDW HEADER",
 6,
 6,
-Dict212TagHashTable,
-Dict212KeyHashTable,
-Dict212Contents
+Dict219TagHashTable,
+Dict219KeyHashTable,
+Dict219Contents
 };
 
 // ----- GEMS_IQTB_IDEN_47 -----
 
-DictEntry Dict213Contents[] = {
+const DictEntry Dict220Contents[] = {
 { 0x0047, 0x0002, 0, VR::UL, VM::M1, "" },
 };
 
-unsigned short Dict213TagHashTable[] = {
+const unsigned short Dict220TagHashTable[] = {
     2,     0,     1,     0,     2,
 };
 
-unsigned short Dict213KeyHashTable[] = {
+const unsigned short Dict220KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict213Data = {
+vtkDICOMDictionary::Dict Dict220Data = {
 "GEMS_IQTB_IDEN_47",
 1,
 1,
-Dict213TagHashTable,
-Dict213KeyHashTable,
-Dict213Contents
+Dict220TagHashTable,
+Dict220KeyHashTable,
+Dict220Contents
 };
 
 // ----- GEMS_ACQU_01 -----
 
-DictEntry Dict214Contents[] = {
+const DictEntry Dict221Contents[] = {
 { 0x0009, 0x0024, 0, VR::DS, VM::M1, "" },
 { 0x0009, 0x0025, 0, VR::US, VM::M1, "" },
 { 0x0009, 0x003e, 0, VR::US, VM::M1, "" },
@@ -13374,7 +14101,7 @@ DictEntry Dict214Contents[] = {
 { 0x0019, 0x00f9, 0, VR::DS, VM::M1, "TransmitGain" },
 };
 
-unsigned short Dict214TagHashTable[] = {
+const unsigned short Dict221TagHashTable[] = {
   186,   191,   196,   201,   185,   206,   209,   212,   217,   222,
   225,   230,   235,   240,   245,   250,   255,   258,   185,   261,
   264,   267,   270,   275,   280,   285,   288,   293,   298,   303,
@@ -13448,7 +14175,7 @@ unsigned short Dict214TagHashTable[] = {
   163,
 };
 
-unsigned short Dict214KeyHashTable[] = {
+const unsigned short Dict221KeyHashTable[] = {
   185,   185,   185,   186,   185,   185,   185,   189,   185,   185,
   185,   194,   199,   185,   202,   205,   208,   185,   185,   295,
   298,   185,   301,   185,   304,   185,   307,   312,   315,   318,
@@ -13517,69 +14244,69 @@ unsigned short Dict214KeyHashTable[] = {
 45150,     2,    11, 54484,    31, 16389,
 };
 
-vtkDICOMDictionary::Dict Dict214Data = {
+vtkDICOMDictionary::Dict Dict221Data = {
 "GEMS_ACQU_01",
 185,
 185,
-Dict214TagHashTable,
-Dict214KeyHashTable,
-Dict214Contents
+Dict221TagHashTable,
+Dict221KeyHashTable,
+Dict221Contents
 };
 
 // ----- GEMS_IT_US_REPORT -----
 
-DictEntry Dict215Contents[] = {
+const DictEntry Dict222Contents[] = {
 { 0x0045, 0x0111, 0, VR::OW, VM::M1, "VividExcelFile" },
 { 0x0045, 0x0112, 0, VR::OW, VM::M1, "VividCHMFile" },
 { 0x0045, 0x0113, 0, VR::OW, VM::M1, "VividPDFFile" },
 };
 
-unsigned short Dict215TagHashTable[] = {
+const unsigned short Dict222TagHashTable[] = {
     4,     7,    10,     0,     1,     2,   275,     1,     0,   273,
     1,     1,   274,
 };
 
-unsigned short Dict215KeyHashTable[] = {
+const unsigned short Dict222KeyHashTable[] = {
     4,     7,     3,     0,     1,     2, 55563,     2,     0, 34973,
     1, 60362,
 };
 
-vtkDICOMDictionary::Dict Dict215Data = {
+vtkDICOMDictionary::Dict Dict222Data = {
 "GEMS_IT_US_REPORT",
 3,
 3,
-Dict215TagHashTable,
-Dict215KeyHashTable,
-Dict215Contents
+Dict222TagHashTable,
+Dict222KeyHashTable,
+Dict222Contents
 };
 
 // ----- SCHICK TECHNOLOGIES - Change List Creator ID -----
 
-DictEntry Dict216Contents[] = {
+const DictEntry Dict223Contents[] = {
 { 0x0021, 0x0001, 0, VR::UI, VM::M1, "" },
 { 0x0021, 0x0002, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict216TagHashTable[] = {
+const unsigned short Dict223TagHashTable[] = {
     3,     6,     0,     1,     0,     1,     1,     1,     2,
 };
 
-unsigned short Dict216KeyHashTable[] = {
+const unsigned short Dict223KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict216Data = {
+vtkDICOMDictionary::Dict Dict223Data = {
 "SCHICK TECHNOLOGIES - Change List Creator ID",
 2,
 2,
-Dict216TagHashTable,
-Dict216KeyHashTable,
-Dict216Contents
+Dict223TagHashTable,
+Dict223KeyHashTable,
+Dict223Contents
 };
 
 // ----- astm.org/diconde/iod/NdeCtDetector -----
 
-DictEntry Dict217Contents[] = {
+const DictEntry Dict224Contents[] = {
 { 0x0009, 0x0011, 0, VR::DS, VM::M1, "InternalDetectorFrameTime" },
 { 0x0009, 0x0012, 0, VR::DS, VM::M1, "NumberOfFramesIntegrated" },
 { 0x0009, 0x0020, 0, VR::SQ, VM::M1, "DetectorTemperatureSequence" },
@@ -13589,53 +14316,53 @@ DictEntry Dict217Contents[] = {
 { 0x0009, 0x0028, 0, VR::DS, VM::M1, "SensorTemperature" },
 };
 
-unsigned short Dict217TagHashTable[] = {
+const unsigned short Dict224TagHashTable[] = {
     7,     8,     7,    11,     7,    16,    21,     0,     1,     3,
    34,     2,     0,    17,     4,    36,     2,     5,    38,     6,
    40,     2,     1,    18,     2,    32,
 };
 
-unsigned short Dict217KeyHashTable[] = {
+const unsigned short Dict224KeyHashTable[] = {
     8,     7,    13,    16,     7,    19,    24,     0,     2,     0,
 20186,     6, 21387,     1,     3, 20978,     1,     5, 52094,     2,
     1, 53765,     2,  8567,     1,     4,  7561,
 };
 
-vtkDICOMDictionary::Dict Dict217Data = {
+vtkDICOMDictionary::Dict Dict224Data = {
 "astm.org/diconde/iod/NdeCtDetector",
 7,
 7,
-Dict217TagHashTable,
-Dict217KeyHashTable,
-Dict217Contents
+Dict224TagHashTable,
+Dict224KeyHashTable,
+Dict224Contents
 };
 
 // ----- DLX_PATNT_01 -----
 
-DictEntry Dict218Contents[] = {
+const DictEntry Dict225Contents[] = {
 { 0x0011, 0x0001, 0, VR::LT, VM::M1, "PatientDOB" },
 };
 
-unsigned short Dict218TagHashTable[] = {
+const unsigned short Dict225TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict218KeyHashTable[] = {
+const unsigned short Dict225KeyHashTable[] = {
     2,     0,     1,     0, 49839,
 };
 
-vtkDICOMDictionary::Dict Dict218Data = {
+vtkDICOMDictionary::Dict Dict225Data = {
 "DLX_PATNT_01",
 1,
 1,
-Dict218TagHashTable,
-Dict218KeyHashTable,
-Dict218Contents
+Dict225TagHashTable,
+Dict225KeyHashTable,
+Dict225Contents
 };
 
 // ----- MEDIFACE -----
 
-DictEntry Dict219Contents[] = {
+const DictEntry Dict226Contents[] = {
 { 0x0029, 0x0001, 0, VR::UL, VM::M1, "" },
 { 0x0029, 0x0010, 0, VR::DS, VM::M1, "" },
 { 0x0029, 0x0011, 0, VR::DS, VM::M1, "" },
@@ -13645,30 +14372,30 @@ DictEntry Dict219Contents[] = {
 { 0x0029, 0x0030, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict219TagHashTable[] = {
+const unsigned short Dict226TagHashTable[] = {
     8,    11,    16,     7,    19,    24,     7,     0,     1,     2,
    17,     2,     1,    16,     4,    33,     1,     3,    32,     2,
     5,    34,     6,    48,     1,     0,     1,
 };
 
-unsigned short Dict219KeyHashTable[] = {
+const unsigned short Dict226KeyHashTable[] = {
     7,     7,     7,     7,     7,     8,     7,     0,     7,     0,
   768,     1,   768,     2,   768,     3,   768,     4,   768,     5,
   768,     6,   768,
 };
 
-vtkDICOMDictionary::Dict Dict219Data = {
+vtkDICOMDictionary::Dict Dict226Data = {
 "MEDIFACE",
 7,
 7,
-Dict219TagHashTable,
-Dict219KeyHashTable,
-Dict219Contents
+Dict226TagHashTable,
+Dict226KeyHashTable,
+Dict226Contents
 };
 
 // ----- MITRA OBJECT ATTRIBUTES 1.0 -----
 
-DictEntry Dict220Contents[] = {
+const DictEntry Dict227Contents[] = {
 { 0x0033, 0x0002, 0, VR::LO, VM::M1, "" },
 { 0x0033, 0x0004, 0, VR::LO, VM::M1, "" },
 { 0x0033, 0x0006, 0, VR::LO, VM::M1, "" },
@@ -13676,28 +14403,28 @@ DictEntry Dict220Contents[] = {
 { 0x0033, 0x000a, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict220TagHashTable[] = {
+const unsigned short Dict227TagHashTable[] = {
     6,     5,     9,    12,    15,     0,     1,     1,     4,     1,
     4,    10,     1,     2,     6,     2,     0,     2,     3,     8,
 };
 
-unsigned short Dict220KeyHashTable[] = {
+const unsigned short Dict227KeyHashTable[] = {
     5,     6,     5,     5,     5,     0,     5,     0,  1076,     1,
  1076,     2,  1076,     3,  1076,     4,  1076,
 };
 
-vtkDICOMDictionary::Dict Dict220Data = {
+vtkDICOMDictionary::Dict Dict227Data = {
 "MITRA OBJECT ATTRIBUTES 1.0",
 5,
 5,
-Dict220TagHashTable,
-Dict220KeyHashTable,
-Dict220Contents
+Dict227TagHashTable,
+Dict227KeyHashTable,
+Dict227Contents
 };
 
 // ----- SIEMENS MR DATAMAPPING ATTRIBUTES -----
 
-DictEntry Dict221Contents[] = {
+const DictEntry Dict228Contents[] = {
 { 0x0011, 0x0001, 0, VR::ST, VM::M1, "ReprocessingInfo" },
 { 0x0011, 0x0002, 0, VR::CS, VM::M1TN, "DataRoleType" },
 { 0x0011, 0x0003, 0, VR::ST, VM::M1, "DataRoleName" },
@@ -13715,7 +14442,7 @@ DictEntry Dict221Contents[] = {
 { 0x0011, 0x000F, 0, VR::ST, VM::M1, "IsInternalDataRole" },
 };
 
-unsigned short Dict221TagHashTable[] = {
+const unsigned short Dict228TagHashTable[] = {
    16,    19,    15,    24,    27,    30,    33,    36,    39,    42,
    45,    48,    51,    54,    57,     0,     1,    14,    15,     2,
     0,     1,    13,    14,     1,     2,     3,     1,     1,     2,
@@ -13724,7 +14451,7 @@ unsigned short Dict221TagHashTable[] = {
    11,     1,     9,    10,     1,    12,    13,     1,    11,    12,
 };
 
-unsigned short Dict221KeyHashTable[] = {
+const unsigned short Dict228KeyHashTable[] = {
    15,    16,    15,    19,    24,    15,    27,    30,    15,    15,
    15,    35,    46,    51,    15,     0,     1,    14, 46599,     2,
     7,  7781,    13, 43440,     1,     1, 53729,     1,     3, 63044,
@@ -13733,70 +14460,70 @@ unsigned short Dict221KeyHashTable[] = {
 60941,     1,     6, 52096,
 };
 
-vtkDICOMDictionary::Dict Dict221Data = {
+vtkDICOMDictionary::Dict Dict228Data = {
 "SIEMENS MR DATAMAPPING ATTRIBUTES",
 15,
 15,
-Dict221TagHashTable,
-Dict221KeyHashTable,
-Dict221Contents
+Dict228TagHashTable,
+Dict228KeyHashTable,
+Dict228Contents
 };
 
 // ----- SET WINDOW -----
 
-DictEntry Dict222Contents[] = {
+const DictEntry Dict229Contents[] = {
 { 0x0019, 0x0000, 0, VR::SH, VM::M1, "SetWindowImageFilter" },
 { 0x0019, 0x0001, 0, VR::US, VM::M1, "SetWindowMagnificationPower" },
 };
 
-unsigned short Dict222TagHashTable[] = {
+const unsigned short Dict229TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict222KeyHashTable[] = {
+const unsigned short Dict229KeyHashTable[] = {
     3,     6,     0,     1,     0,  4537,     1,     1, 59799,
 };
 
-vtkDICOMDictionary::Dict Dict222Data = {
+vtkDICOMDictionary::Dict Dict229Data = {
 "SET WINDOW",
 2,
 2,
-Dict222TagHashTable,
-Dict222KeyHashTable,
-Dict222Contents
+Dict229TagHashTable,
+Dict229KeyHashTable,
+Dict229Contents
 };
 
 // ----- SIEMENS CSA NON-IMAGE -----
 
-DictEntry Dict223Contents[] = {
+const DictEntry Dict230Contents[] = {
 { 0x0029, 0x0008, 0, VR::CS, VM::M1, "CSADataType" },
 { 0x0029, 0x0009, 0, VR::LO, VM::M1, "CSADataVersion" },
 { 0x0029, 0x0010, 0, VR::OB, VM::M1, "CSADataInfo" },
 { 0x7fe1, 0x0010, 0, VR::OB, VM::M1, "CSAData" },
 };
 
-unsigned short Dict223TagHashTable[] = {
+const unsigned short Dict230TagHashTable[] = {
     5,     8,    13,     4,     0,     1,     1,     9,     2,     0,
     8,     2,    16,     1,     3,    16,
 };
 
-unsigned short Dict223KeyHashTable[] = {
+const unsigned short Dict230KeyHashTable[] = {
     5,     4,    10,     4,     0,     2,     0, 38590,     1, 50215,
     2,     2,  2224,     3, 14245,
 };
 
-vtkDICOMDictionary::Dict Dict223Data = {
+vtkDICOMDictionary::Dict Dict230Data = {
 "SIEMENS CSA NON-IMAGE",
 4,
 4,
-Dict223TagHashTable,
-Dict223KeyHashTable,
-Dict223Contents
+Dict230TagHashTable,
+Dict230KeyHashTable,
+Dict230Contents
 };
 
 // ----- GEMS_ADWSoft_DPO -----
 
-DictEntry Dict224Contents[] = {
+const DictEntry Dict231Contents[] = {
 { 0x0039, 0x0080, 0, VR::IS, VM::M1, "PrivateEntityNumber" },
 { 0x0039, 0x0085, 0, VR::DA, VM::M1, "PrivateEntityDate" },
 { 0x0039, 0x0090, 0, VR::TM, VM::M1, "PrivateEntityTime" },
@@ -13804,103 +14531,103 @@ DictEntry Dict224Contents[] = {
 { 0x0039, 0x00AA, 0, VR::CS, VM::M1, "PrivateEntityType" },
 };
 
-unsigned short Dict224TagHashTable[] = {
+const unsigned short Dict231TagHashTable[] = {
     6,    11,    14,     5,    17,     0,     2,     1,   133,     4,
   170,     1,     2,   144,     1,     0,   128,     1,     3,   149,
 };
 
-unsigned short Dict224KeyHashTable[] = {
+const unsigned short Dict231KeyHashTable[] = {
     6,     5,     9,    14,    17,     0,     1,     2, 10204,     2,
     1, 24581,     3, 50609,     1,     4, 13708,     1,     0, 26074,
 };
 
-vtkDICOMDictionary::Dict Dict224Data = {
+vtkDICOMDictionary::Dict Dict231Data = {
 "GEMS_ADWSoft_DPO",
 5,
 5,
-Dict224TagHashTable,
-Dict224KeyHashTable,
-Dict224Contents
+Dict231TagHashTable,
+Dict231KeyHashTable,
+Dict231Contents
 };
 
 // ----- EMAGEON STUDY HOME -----
 
-DictEntry Dict225Contents[] = {
+const DictEntry Dict232Contents[] = {
 { 0x0009, 0x0000, 0, VR::LO, VM::M1, "" },
 { 0x0009, 0x0001, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict225TagHashTable[] = {
+const unsigned short Dict232TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict225KeyHashTable[] = {
+const unsigned short Dict232KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict225Data = {
+vtkDICOMDictionary::Dict Dict232Data = {
 "EMAGEON STUDY HOME",
 2,
 2,
-Dict225TagHashTable,
-Dict225KeyHashTable,
-Dict225Contents
+Dict232TagHashTable,
+Dict232KeyHashTable,
+Dict232Contents
 };
 
 // ----- SIEMENS MR IMA -----
 
-DictEntry Dict226Contents[] = {
+const DictEntry Dict233Contents[] = {
 { 0x0021, 0x0001, 0, VR::SQ, VM::M1, "MRImageSequence" },
 };
 
-unsigned short Dict226TagHashTable[] = {
+const unsigned short Dict233TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict226KeyHashTable[] = {
+const unsigned short Dict233KeyHashTable[] = {
     2,     0,     1,     0, 11488,
 };
 
-vtkDICOMDictionary::Dict Dict226Data = {
+vtkDICOMDictionary::Dict Dict233Data = {
 "SIEMENS MR IMA",
 1,
 1,
-Dict226TagHashTable,
-Dict226KeyHashTable,
-Dict226Contents
+Dict233TagHashTable,
+Dict233KeyHashTable,
+Dict233Contents
 };
 
 // ----- SIEMENS MED PT -----
 
-DictEntry Dict227Contents[] = {
+const DictEntry Dict234Contents[] = {
 { 0x0071, 0x0021, 0, VR::UI, VM::M1, "RegistrationMatrixUID" },
 { 0x0071, 0x0022, 0, VR::DT, VM::M1, "DecayCorrectionDateTime" },
 { 0x0071, 0x0023, 0, VR::US, VM::M1, "VolumeIndex" },
 { 0x0071, 0x0024, 0, VR::IS, VM::M1, "TimeSliceDuration" },
 };
 
-unsigned short Dict227TagHashTable[] = {
+const unsigned short Dict234TagHashTable[] = {
     5,     8,    11,    14,     0,     1,     3,    36,     1,     0,
    33,     1,     1,    34,     1,     2,    35,
 };
 
-unsigned short Dict227KeyHashTable[] = {
+const unsigned short Dict234KeyHashTable[] = {
     5,     8,    11,    14,     0,     1,     1, 31052,     1,     2,
 24277,     1,     3, 35418,     1,     0, 14317,
 };
 
-vtkDICOMDictionary::Dict Dict227Data = {
+vtkDICOMDictionary::Dict Dict234Data = {
 "SIEMENS MED PT",
 4,
 4,
-Dict227TagHashTable,
-Dict227KeyHashTable,
-Dict227Contents
+Dict234TagHashTable,
+Dict234KeyHashTable,
+Dict234Contents
 };
 
 // ----- SIEMENS MED -----
 
-DictEntry Dict228Contents[] = {
+const DictEntry Dict235Contents[] = {
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "RecognitionCode" },
 { 0x0009, 0x0030, 0, VR::US, VM::M1, "ByteOffsetOfOriginalHeader" },
 { 0x0009, 0x0031, 0, VR::UL, VM::M1, "LengthOfOriginalHeader" },
@@ -13919,7 +14646,7 @@ DictEntry Dict228Contents[] = {
 { 0x7005, 0x0010, 0, VR::LO, VM::M1, "Dummy" },
 };
 
-unsigned short Dict228TagHashTable[] = {
+const unsigned short Dict235TagHashTable[] = {
    17,    20,    16,    27,    16,    32,    16,    16,    35,    42,
    16,    16,    51,    16,    16,    54,     0,     1,    10,    17,
     3,     9,    16,    12,    32,    13,    16,     2,    11,    18,
@@ -13928,7 +14655,7 @@ unsigned short Dict228TagHashTable[] = {
    81,     1,     8,   246,     1,     7,   245,
 };
 
-unsigned short Dict228KeyHashTable[] = {
+const unsigned short Dict235KeyHashTable[] = {
    16,    17,    16,    28,    16,    31,    36,    16,    16,    16,
    39,    44,    47,    16,    54,    16,     0,     5,     0, 24778,
     4, 31907,     7, 62752,    13, 63631,    15, 63631,     1,     1,
@@ -13937,46 +14664,46 @@ unsigned short Dict228KeyHashTable[] = {
    10, 48788,    11, 10273,     1,    14, 53320,
 };
 
-vtkDICOMDictionary::Dict Dict228Data = {
+vtkDICOMDictionary::Dict Dict235Data = {
 "SIEMENS MED",
 16,
 16,
-Dict228TagHashTable,
-Dict228KeyHashTable,
-Dict228Contents
+Dict235TagHashTable,
+Dict235KeyHashTable,
+Dict235Contents
 };
 
 // ----- GEMS_AWSoft_SB1 -----
 
-DictEntry Dict229Contents[] = {
+const DictEntry Dict236Contents[] = {
 { 0x0039, 0x0050, 0, VR::UI, VM::M1, "ReferenceToStudyUID" },
 { 0x0039, 0x0051, 0, VR::UI, VM::M1, "ReferenceToSeriesUID" },
 { 0x0039, 0x0052, 0, VR::IS, VM::M1, "ReferenceToOriginalInstance" },
 { 0x0039, 0x0095, 0, VR::LO, VM::M1, "PrivateEntityLaunchCommand" },
 };
 
-unsigned short Dict229TagHashTable[] = {
+const unsigned short Dict236TagHashTable[] = {
     5,     8,    11,     4,     0,     1,     0,    80,     1,     1,
    81,     2,     2,    82,     3,   149,
 };
 
-unsigned short Dict229KeyHashTable[] = {
+const unsigned short Dict236KeyHashTable[] = {
     5,     8,    11,    14,     0,     1,     1, 29625,     1,     2,
 39160,     1,     0, 57324,     1,     3, 63261,
 };
 
-vtkDICOMDictionary::Dict Dict229Data = {
+vtkDICOMDictionary::Dict Dict236Data = {
 "GEMS_AWSoft_SB1",
 4,
 4,
-Dict229TagHashTable,
-Dict229KeyHashTable,
-Dict229Contents
+Dict236TagHashTable,
+Dict236KeyHashTable,
+Dict236Contents
 };
 
 // ----- ShowcaseAppearance -----
 
-DictEntry Dict230Contents[] = {
+const DictEntry Dict237Contents[] = {
 { 0x0029, 0x0010, 0, VR::DS, VM::M1, "" },
 { 0x0029, 0x0011, 0, VR::DS, VM::M1, "" },
 { 0x0029, 0x0012, 0, VR::DS, VM::M1, "" },
@@ -13984,52 +14711,52 @@ DictEntry Dict230Contents[] = {
 { 0x0029, 0x0014, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict230TagHashTable[] = {
+const unsigned short Dict237TagHashTable[] = {
     5,     6,    11,    14,    17,     0,     2,     1,    17,     4,
    20,     1,     0,    16,     1,     3,    19,     1,     2,    18,
 };
 
-unsigned short Dict230KeyHashTable[] = {
+const unsigned short Dict237KeyHashTable[] = {
     5,     6,     5,     5,     5,     0,     5,     0,  1076,     1,
  1076,     2,  1076,     3,  1076,     4,  1076,
 };
 
-vtkDICOMDictionary::Dict Dict230Data = {
+vtkDICOMDictionary::Dict Dict237Data = {
 "ShowcaseAppearance",
 5,
 5,
-Dict230TagHashTable,
-Dict230KeyHashTable,
-Dict230Contents
+Dict237TagHashTable,
+Dict237KeyHashTable,
+Dict237Contents
 };
 
 // ----- SIEMENS SYNGO INSTANCE MANIFEST -----
 
-DictEntry Dict231Contents[] = {
+const DictEntry Dict238Contents[] = {
 { 0x0009, 0x0000, 0, VR::SQ, VM::M1, "TemporaryOriginalHeaderSequence" },
 { 0x0009, 0x0010, 0, VR::AE, VM::M1, "syngoIndexSourceAETitle" },
 };
 
-unsigned short Dict231TagHashTable[] = {
+const unsigned short Dict238TagHashTable[] = {
     2,     3,     0,     2,     0,     0,     1,    16,
 };
 
-unsigned short Dict231KeyHashTable[] = {
+const unsigned short Dict238KeyHashTable[] = {
     3,     6,     0,     1,     1, 21619,     1,     0, 18847,
 };
 
-vtkDICOMDictionary::Dict Dict231Data = {
+vtkDICOMDictionary::Dict Dict238Data = {
 "SIEMENS SYNGO INSTANCE MANIFEST",
 2,
 2,
-Dict231TagHashTable,
-Dict231KeyHashTable,
-Dict231Contents
+Dict238TagHashTable,
+Dict238KeyHashTable,
+Dict238Contents
 };
 
 // ----- Image (ID, Version, Size, Dump, GUID) -----
 
-DictEntry Dict232Contents[] = {
+const DictEntry Dict239Contents[] = {
 { 0x8003, 0x0000, 0, VR::LO, VM::M1, "ID" },
 { 0x8003, 0x0010, 0, VR::LO, VM::M1, "Version" },
 { 0x8003, 0x0020, 0, VR::UL, VM::M1, "Size" },
@@ -14037,55 +14764,55 @@ DictEntry Dict232Contents[] = {
 { 0x8003, 0x0040, 0, VR::LO, VM::M1, "GUID" },
 };
 
-unsigned short Dict232TagHashTable[] = {
+const unsigned short Dict239TagHashTable[] = {
     6,     9,     5,    14,    17,     0,     1,     2,    32,     2,
     3,    48,     4,    64,     1,     0,     0,     1,     1,    16,
 };
 
-unsigned short Dict232KeyHashTable[] = {
+const unsigned short Dict239KeyHashTable[] = {
     6,     9,     5,    12,    17,     0,     1,     1, 10863,     1,
     0, 58365,     2,     2, 57433,     3, 17688,     1,     4, 32034,
 };
 
-vtkDICOMDictionary::Dict Dict232Data = {
+vtkDICOMDictionary::Dict Dict239Data = {
 "Image (ID, Version, Size, Dump, GUID)",
 5,
 5,
-Dict232TagHashTable,
-Dict232KeyHashTable,
-Dict232Contents
+Dict239TagHashTable,
+Dict239KeyHashTable,
+Dict239Contents
 };
 
 // ----- SIEMENS SYNGO ENHANCED IDATASET API -----
 
-DictEntry Dict233Contents[] = {
+const DictEntry Dict240Contents[] = {
 { 0x0027, 0x0001, 0, VR::CS, VM::M1, "BusinessUnitCode" },
 { 0x0027, 0x0002, 0, VR::LO, VM::M1, "ApplicationType" },
 { 0x0027, 0x0003, 0, VR::SQ, VM::M1, "ApplicationAttributesSequence" },
 };
 
-unsigned short Dict233TagHashTable[] = {
+const unsigned short Dict240TagHashTable[] = {
     4,     7,    10,     0,     1,     2,     3,     1,     1,     2,
     1,     0,     1,
 };
 
-unsigned short Dict233KeyHashTable[] = {
+const unsigned short Dict240KeyHashTable[] = {
     4,     7,    10,     0,     1,     0, 43524,     1,     1, 60478,
     1,     2, 14077,
 };
 
-vtkDICOMDictionary::Dict Dict233Data = {
+vtkDICOMDictionary::Dict Dict240Data = {
 "SIEMENS SYNGO ENHANCED IDATASET API",
 3,
 3,
-Dict233TagHashTable,
-Dict233KeyHashTable,
-Dict233Contents
+Dict240TagHashTable,
+Dict240KeyHashTable,
+Dict240Contents
 };
 
 // ----- astm.org/diconde/iod/NdeUsEquipmentSettings -----
 
-DictEntry Dict234Contents[] = {
+const DictEntry Dict241Contents[] = {
 { 0x0009, 0x0020, 0, VR::SQ, VM::M1, "PulserSettingsSequence" },
 { 0x0009, 0x0022, 0, VR::DS, VM::M1, "PulseWidth" },
 { 0x0009, 0x0024, 0, VR::DS, VM::M1, "ExcitationFrequency" },
@@ -14125,7 +14852,7 @@ DictEntry Dict234Contents[] = {
 { 0x0009, 0x007E, 0, VR::DA, VM::M1TN, "CalibrationDate" },
 };
 
-unsigned short Dict234TagHashTable[] = {
+const unsigned short Dict241TagHashTable[] = {
    37,    38,    37,    41,    44,    47,    50,    55,    60,    65,
    68,    73,    76,    79,    82,    87,    92,    37,    97,   100,
   103,   108,   113,   116,   119,    37,   122,    37,    37,    37,
@@ -14142,7 +14869,7 @@ unsigned short Dict234TagHashTable[] = {
    98,     1,     4,    40,     1,    28,   100,     1,    15,    64,
 };
 
-unsigned short Dict234KeyHashTable[] = {
+const unsigned short Dict241KeyHashTable[] = {
    37,    38,    43,    46,    53,    56,    37,    59,    64,    67,
    70,    37,    73,    76,    79,    84,    37,    89,    98,   101,
   104,   107,   112,    37,   115,    37,   118,    37,   121,    37,
@@ -14159,18 +14886,18 @@ unsigned short Dict234KeyHashTable[] = {
    29, 10968,     1,    26,  2544,     1,    36, 13077,
 };
 
-vtkDICOMDictionary::Dict Dict234Data = {
+vtkDICOMDictionary::Dict Dict241Data = {
 "astm.org/diconde/iod/NdeUsEquipmentSettings",
 37,
 37,
-Dict234TagHashTable,
-Dict234KeyHashTable,
-Dict234Contents
+Dict241TagHashTable,
+Dict241KeyHashTable,
+Dict241Contents
 };
 
 // ----- SIEMENS MR HEADER -----
 
-DictEntry Dict235Contents[] = {
+const DictEntry Dict242Contents[] = {
 { 0x0019, 0x0008, 0, VR::CS, VM::M1, "" },
 { 0x0019, 0x0009, 0, VR::LO, VM::M1, "" },
 { 0x0019, 0x000A, 0, VR::US, VM::M1, "NumberOfImagesInMosaic" },
@@ -14211,7 +14938,7 @@ DictEntry Dict235Contents[] = {
 { 0x0051, 0x0019, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict235TagHashTable[] = {
+const unsigned short Dict242TagHashTable[] = {
    38,    39,    38,    38,    38,    38,    38,    38,    42,    38,
    45,    50,    55,    60,    65,    70,    75,    80,    85,    90,
    95,   100,   103,   108,   111,   114,    38,   117,   120,   123,
@@ -14229,7 +14956,7 @@ unsigned short Dict235TagHashTable[] = {
    25,
 };
 
-unsigned short Dict235KeyHashTable[] = {
+const unsigned short Dict242KeyHashTable[] = {
    39,    42,    45,    38,    48,    38,    38,    38,    53,    38,
    56,    61,    38,    38,    38,    38,    38,    38,    66,    71,
    38,    38,    74,    77,    38,   112,    38,    38,    38,    38,
@@ -14246,93 +14973,93 @@ unsigned short Dict235KeyHashTable[] = {
  8471,
 };
 
-vtkDICOMDictionary::Dict Dict235Data = {
+vtkDICOMDictionary::Dict Dict242Data = {
 "SIEMENS MR HEADER",
 38,
 38,
-Dict235TagHashTable,
-Dict235KeyHashTable,
-Dict235Contents
+Dict242TagHashTable,
+Dict242KeyHashTable,
+Dict242Contents
 };
 
 // ----- AGFA KOSD 1.0 -----
 
-DictEntry Dict236Contents[] = {
+const DictEntry Dict243Contents[] = {
 { 0x0035, 0x0000, 0, VR::SH, VM::M1, "" },
 { 0x0035, 0x0003, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict236TagHashTable[] = {
+const unsigned short Dict243TagHashTable[] = {
     3,     6,     0,     1,     1,     3,     1,     0,     0,
 };
 
-unsigned short Dict236KeyHashTable[] = {
+const unsigned short Dict243KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict236Data = {
+vtkDICOMDictionary::Dict Dict243Data = {
 "AGFA KOSD 1.0",
 2,
 2,
-Dict236TagHashTable,
-Dict236KeyHashTable,
-Dict236Contents
+Dict243TagHashTable,
+Dict243KeyHashTable,
+Dict243Contents
 };
 
 // ----- Siemens: Thorax/Multix FD Version -----
 
-DictEntry Dict237Contents[] = {
+const DictEntry Dict244Contents[] = {
 { 0x0017, 0x0000, 0, VR::LO, VM::M1, "" },
 { 0x0017, 0x0001, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict237TagHashTable[] = {
+const unsigned short Dict244TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict237KeyHashTable[] = {
+const unsigned short Dict244KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict237Data = {
+vtkDICOMDictionary::Dict Dict244Data = {
 "Siemens: Thorax/Multix FD Version",
 2,
 2,
-Dict237TagHashTable,
-Dict237KeyHashTable,
-Dict237Contents
+Dict244TagHashTable,
+Dict244KeyHashTable,
+Dict244Contents
 };
 
 // ----- SPI-P-Private-DiDi Release 1 -----
 
-DictEntry Dict238Contents[] = {
+const DictEntry Dict245Contents[] = {
 { 0x0019, 0x0000, 0, VR::LT, VM::M1, "PostModeString" },
 { 0x0019, 0x0001, 0, VR::LT, VM::M1, "PostData" },
 { 0x0019, 0x0010, 0, VR::LT, VM::M1, "ImageHeader" },
 };
 
-unsigned short Dict238TagHashTable[] = {
+const unsigned short Dict245TagHashTable[] = {
     4,     9,     3,     0,     2,     1,     1,     2,    16,     1,
     0,     0,
 };
 
-unsigned short Dict238KeyHashTable[] = {
+const unsigned short Dict245KeyHashTable[] = {
     4,     9,     3,     0,     2,     0, 33837,     2, 58907,     1,
     1, 10284,
 };
 
-vtkDICOMDictionary::Dict Dict238Data = {
+vtkDICOMDictionary::Dict Dict245Data = {
 "SPI-P-Private-DiDi Release 1",
 3,
 3,
-Dict238TagHashTable,
-Dict238KeyHashTable,
-Dict238Contents
+Dict245TagHashTable,
+Dict245KeyHashTable,
+Dict245Contents
 };
 
 // ----- SIEMENS SMS-AX  ORIGINAL IMAGE INFO 1.0 -----
 
-DictEntry Dict239Contents[] = {
+const DictEntry Dict246Contents[] = {
 { 0x0025, 0x0000, 0, VR::US, VM::M1, "ViewNative" },
 { 0x0025, 0x0001, 0, VR::US, VM::M1, "OriginalSeriesNumber" },
 { 0x0025, 0x0002, 0, VR::US, VM::M1, "OriginalImageNumber" },
@@ -14358,7 +15085,7 @@ DictEntry Dict239Contents[] = {
 { 0x0025, 0x0016, 0, VR::IS, VM::M1, "ReadyProcessingStatus" },
 };
 
-unsigned short Dict239TagHashTable[] = {
+const unsigned short Dict246TagHashTable[] = {
    24,    27,    30,    33,    23,    36,    39,    42,    45,    48,
    53,    56,    59,    62,    65,    68,    71,    74,    77,    80,
    83,    86,    89,     0,     1,    11,    11,     1,    10,    10,
@@ -14371,7 +15098,7 @@ unsigned short Dict239TagHashTable[] = {
     8,     8,
 };
 
-unsigned short Dict239KeyHashTable[] = {
+const unsigned short Dict246KeyHashTable[] = {
    23,    24,    27,    23,    34,    23,    39,    44,    47,    50,
    23,    23,    59,    62,    23,    65,    68,    71,    23,    74,
    77,    80,    83,     0,     1,     7, 14171,     3,     1, 45204,
@@ -14383,18 +15110,18 @@ unsigned short Dict239KeyHashTable[] = {
     1,     9, 12229,     1,     6,  3597,
 };
 
-vtkDICOMDictionary::Dict Dict239Data = {
+vtkDICOMDictionary::Dict Dict246Data = {
 "SIEMENS SMS-AX  ORIGINAL IMAGE INFO 1.0",
 23,
 23,
-Dict239TagHashTable,
-Dict239KeyHashTable,
-Dict239Contents
+Dict246TagHashTable,
+Dict246KeyHashTable,
+Dict246Contents
 };
 
 // ----- SIENET -----
 
-DictEntry Dict240Contents[] = {
+const DictEntry Dict247Contents[] = {
 { 0x0009, 0x0001, 0, VR::US, VM::M1, "SIENETCommandField" },
 { 0x0009, 0x0014, 0, VR::LO, VM::M1, "ReceiverPLA" },
 { 0x0009, 0x0016, 0, VR::US, VM::M1, "TransferPriority" },
@@ -14420,7 +15147,7 @@ DictEntry Dict240Contents[] = {
 { 0x00A5, 0x0005, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict240TagHashTable[] = {
+const unsigned short Dict247TagHashTable[] = {
    23,    24,    23,    23,    23,    27,    30,    39,    42,    51,
    60,    23,    63,    23,    23,    68,    23,    71,    74,    23,
    77,    23,    80,     0,     1,    22,     5,     1,     4,   112,
@@ -14432,7 +15159,7 @@ unsigned short Dict240TagHashTable[] = {
     1,    17,    32,
 };
 
-unsigned short Dict240KeyHashTable[] = {
+const unsigned short Dict247KeyHashTable[] = {
    23,    24,    23,    23,    23,    23,    27,    30,    23,    23,
    33,    23,    36,    39,    44,    23,    23,    23,    49,    52,
    23,    23,    55,     0,     1,    12,  9350,     1,    14,  2362,
@@ -14443,18 +15170,18 @@ unsigned short Dict240KeyHashTable[] = {
    16,   233,    18,   233,    19,   233,    21,   233,    22,   233,
 };
 
-vtkDICOMDictionary::Dict Dict240Data = {
+vtkDICOMDictionary::Dict Dict247Data = {
 "SIENET",
 23,
 23,
-Dict240TagHashTable,
-Dict240KeyHashTable,
-Dict240Contents
+Dict247TagHashTable,
+Dict247KeyHashTable,
+Dict247Contents
 };
 
 // ----- TOSHIBA_MEC_CT3 -----
 
-DictEntry Dict241Contents[] = {
+const DictEntry Dict248Contents[] = {
 { 0x7005, 0x0000, 0, VR::OB, VM::M1, "CTPrivateData1" },
 { 0x7005, 0x0003, 0, VR::SH, VM::M1, "CardiacRRMeanTime" },
 { 0x7005, 0x0004, 0, VR::SH, VM::M1, "CardiacReconstructionGettingPhaseInPercent" },
@@ -14520,78 +15247,79 @@ DictEntry Dict241Contents[] = {
 { 0x7005, 0x006b, 0, VR::DS, VM::M3, "ImagePositionOf4DVolumeTopEquipment" },
 { 0x7005, 0x006c, 0, VR::UI, VM::M1, "SOPInstanceUIDOf4DVolume" },
 { 0x7005, 0x006d, 0, VR::UI, VM::M1, "SeriesInstanceUIDOf4DVolume" },
+{ 0x7005, 0x0079, 0, VR::SH, VM::M1, "InjectorElapsedTime" },
 { 0x7005, 0x00F1, 0, VR::CS, VM::M1, "ProtectMarkForStudyRecord" },
 };
 
-unsigned short Dict241TagHashTable[] = {
-   66,    67,    66,    66,    66,    66,    66,    66,    70,    73,
-   66,    66,    66,    66,    78,    81,    84,    89,    94,    97,
-  102,   107,   110,   115,   120,   123,   126,   129,   132,   137,
-  142,   145,   148,   151,   154,   157,   160,   163,   166,   169,
-  172,   175,   178,   181,   184,   187,   190,   193,    66,   196,
-  199,   202,   207,   210,   215,   218,   221,   224,   227,   230,
-  233,   236,   239,   244,   247,   250,     0,     1,    39,    48,
-    1,    44,    57,     2,    43,    56,    65,   241,     1,     3,
-    5,     1,     2,     4,     2,     5,     7,    49,    68,     2,
-    4,     6,    50,    69,     1,    51,    70,     2,     0,     0,
-   52,    71,     2,     1,     3,    45,    64,     1,    46,    65,
-    2,    11,    13,    47,    66,     2,    10,    12,    48,    67,
-    1,    13,    15,     1,    12,    14,     1,     7,     9,     1,
-    6,     8,     2,     9,    11,    53,    72,     2,     8,    10,
-   54,    73,     1,    19,    21,     1,    18,    20,     1,    21,
-   23,     1,    20,    22,     1,    15,    17,     1,    14,    16,
-    1,    17,    19,     1,    16,    18,     1,    27,    29,     1,
-   26,    28,     1,    29,    31,     1,    28,    30,     1,    23,
-   25,     1,    22,    24,     1,    25,    27,     1,    24,    26,
-    1,    35,    37,     1,    34,    36,     1,    36,    38,     1,
-   31,    33,     2,    30,    32,    58,   103,     1,    33,    35,
-    2,    32,    34,    55,    97,     1,    56,    98,     1,    57,
-   99,     1,    63,   108,     1,    64,   109,     1,    38,    41,
-    1,    37,    40,     1,    59,   104,     1,    60,   105,     2,
-   40,    53,    61,   106,     1,    62,   107,     1,    42,    55,
-    1,    41,    54,
-};
-
-unsigned short Dict241KeyHashTable[] = {
-   67,    70,    73,    80,    87,    66,    66,    66,    90,   101,
-  104,   107,    66,    66,   110,   113,   118,   121,   124,   127,
-   66,    66,   132,   135,   138,   145,   148,   153,   156,   159,
-   66,   164,   167,    66,    66,    66,   170,    66,    66,   173,
-   66,   176,    66,    66,   179,   184,   187,   192,   197,   202,
-   66,    66,   205,    66,   208,    66,   213,    66,    66,   216,
-  219,   222,   225,   228,   233,   240,     0,     1,    41, 17458,
-    1,    40, 61467,     3,    30, 22097,    35, 41118,    43,  6094,
-    3,    20, 47934,    62, 24709,    63, 49672,     1,    54,  3083,
-    5,     1,  4076,    29, 18111,    32, 12642,    37, 64111,    48,
-12708,     1,    10, 34540,     1,    59,  8269,     1,     9, 39104,
-    1,     8, 35304,     2,    25, 48740,    36, 42766,     1,     3,
- 6412,     1,    42, 15643,     1,    18, 25668,     2,     2, 38163,
-   39, 47429,     1,    57,  6597,     1,     7, 53816,     3,    12,
-54866,    24, 57566,    51, 61399,     1,    22, 25248,     2,    28,
-40604,    64, 24329,     1,    49, 13202,     1,    26, 50046,     2,
-   21, 34712,    55, 15446,     1,    17,  3625,     1,    16, 64413,
-    1,    56, 44466,     1,    46, 21478,     1,    15, 11085,     2,
-   33, 55432,    52, 48323,     1,    50,  9211,     2,    11, 42535,
-   34, 17130,     2,    23, 58825,    45, 47531,     2,     5, 26492,
-   27, 19968,     1,     4, 26561,     1,    38, 43903,     2,    31,
-  203,    47, 40967,     1,    19, 27641,     1,    53, 40151,     1,
-   13, 17717,     1,    61, 36172,     1,    60, 45185,     2,     6,
-54302,    44, 30308,     3,     0, 17457,    58,  9682,    65, 25672,
-    1,    14, 17457,
+const unsigned short Dict248TagHashTable[] = {
+   68,    71,    74,    77,    80,    83,    86,    89,    92,    67,
+   95,    98,   101,   104,   109,   112,   115,   118,   121,   124,
+  129,    67,   132,   135,   140,   143,   148,    67,   151,    67,
+   67,    67,    67,    67,    67,   154,   157,    67,    67,   160,
+   67,    67,   165,   168,   171,   174,   179,   182,   187,   192,
+  195,   200,   205,   210,   213,   216,   219,   222,   227,   232,
+  235,   238,   241,   244,   247,   250,   253,     0,     1,    26,
+   28,     1,    29,    31,     1,    28,    30,     1,    23,    25,
+    1,    22,    24,     1,    25,    27,     1,    24,    26,     1,
+   35,    37,     1,    34,    36,     1,    36,    38,     1,    31,
+   33,     1,    30,    32,     2,    33,    35,    58,   103,     1,
+   32,    34,     1,    55,    97,     1,    56,    98,     1,    57,
+   99,     1,    63,   108,     2,    38,    41,    64,   109,     1,
+   37,    40,     1,    59,   104,     2,    40,    53,    60,   105,
+    1,    61,   106,     2,    42,    55,    62,   107,     1,    41,
+   54,     1,    39,    48,     1,    44,    57,     1,    43,    56,
+    2,    65,   121,    66,   241,     1,     3,     5,     1,     2,
+    4,     1,     5,     7,     2,     4,     6,    49,    68,     1,
+   50,    69,     2,     0,     0,    51,    70,     2,     1,     3,
+   52,    71,     1,    45,    64,     2,    11,    13,    46,    65,
+    2,    10,    12,    47,    66,     2,    13,    15,    48,    67,
+    1,    12,    14,     1,     7,     9,     1,     6,     8,     1,
+    9,    11,     2,     8,    10,    53,    72,     2,    19,    21,
+   54,    73,     1,    18,    20,     1,    21,    23,     1,    20,
+   22,     1,    15,    17,     1,    14,    16,     1,    17,    19,
+    1,    16,    18,     1,    27,    29,
+};
+
+const unsigned short Dict248KeyHashTable[] = {
+   67,    68,    67,    67,    71,    74,    81,    86,    89,    67,
+   67,    92,    97,   100,   103,    67,    67,   106,    67,   109,
+   67,   112,   117,    67,   122,   125,    67,   128,    67,    67,
+   67,    67,   135,    67,   140,    67,   143,    67,   146,   149,
+  152,    67,   157,    67,   164,   169,   172,   177,   182,   185,
+  196,   199,    67,    67,   202,   207,    67,    67,    67,    67,
+  214,    67,   217,   224,   231,   234,   237,     0,     1,     3,
+35661,     1,    22, 61063,     3,     0, 54367,    60, 41577,    64,
+16141,     2,     9, 16023,    14, 54367,     1,    41, 54367,     1,
+   37, 23050,     2,    18, 25285,    21,  6806,     1,     8, 40646,
+    1,     7, 20734,     1,     2,  8249,     1,    36,  4958,     1,
+   47,  7099,     2,    33, 54605,    38, 35423,     2,     6, 32951,
+   65, 58942,     1,    16, 38998,     1,    10, 19352,     3,    15,
+25592,    29, 21753,    57, 23127,     2,    20, 26677,    63, 41105,
+    1,    44, 62135,     1,    55, 25975,     1,    26, 43430,     1,
+   58, 30079,     2,    30, 56980,    40, 60549,     3,    24, 40078,
+   28, 15544,    42, 14431,     2,    23,  5127,    43, 29478,     1,
+   19, 42879,     2,    35, 29744,    61, 26829,     2,    12,  3183,
+   56, 62387,     1,    45,  3783,     5,     4, 48662,    34, 60891,
+   50, 25702,    52, 29995,    59,  8145,     1,    32, 60382,     1,
+   49,  9092,     2,    27, 59774,    66,  5726,     3,    39,  3682,
+   46, 13332,    54, 34337,     1,    48, 15452,     3,    11, 55594,
+   13,   824,    62, 61509,     3,     1, 60747,    25,  9864,    31,
+47151,     1,     5, 36856,     1,    53, 28792,     2,    17, 33893,
+   51, 21356,
 };
 
-vtkDICOMDictionary::Dict Dict241Data = {
+vtkDICOMDictionary::Dict Dict248Data = {
 "TOSHIBA_MEC_CT3",
-66,
-66,
-Dict241TagHashTable,
-Dict241KeyHashTable,
-Dict241Contents
+67,
+67,
+Dict248TagHashTable,
+Dict248KeyHashTable,
+Dict248Contents
 };
 
 // ----- Silhouette Annot V1.0 -----
 
-DictEntry Dict242Contents[] = {
+const DictEntry Dict249Contents[] = {
 { 0x0029, 0x0011, 0, VR::IS, VM::M1, "AnnotationName" },
 { 0x0029, 0x0012, 0, VR::LT, VM::M1, "AnnotationFont" },
 { 0x0029, 0x0013, 0, VR::LT, VM::M1, "AnnotationTextForegroundColor" },
@@ -14629,7 +15357,7 @@ DictEntry Dict242Contents[] = {
 { 0x0029, 0x0045, 0, VR::UL, VM::M1, "AnnotationDontSave" },
 };
 
-unsigned short Dict242TagHashTable[] = {
+const unsigned short Dict249TagHashTable[] = {
    36,    41,    46,    49,    52,    35,    35,    35,    55,    58,
    61,    64,    67,    70,    75,    80,    83,    86,    35,    35,
    35,    89,    35,    92,    95,   100,   105,   110,   115,   120,
@@ -14646,7 +15374,7 @@ unsigned short Dict242TagHashTable[] = {
    29,    64,
 };
 
-unsigned short Dict242KeyHashTable[] = {
+const unsigned short Dict249KeyHashTable[] = {
    36,    39,    35,    35,    42,    35,    45,    48,    51,    56,
    59,    62,    35,    69,    72,    77,    35,    80,    83,    86,
    35,    35,    91,    96,    99,   106,    35,    35,   109,   114,
@@ -14662,92 +15390,92 @@ unsigned short Dict242KeyHashTable[] = {
     0, 61697,    12, 32355,     2,    17,  6091,    29, 37795,
 };
 
-vtkDICOMDictionary::Dict Dict242Data = {
+vtkDICOMDictionary::Dict Dict249Data = {
 "Silhouette Annot V1.0",
 35,
 35,
-Dict242TagHashTable,
-Dict242KeyHashTable,
-Dict242Contents
+Dict249TagHashTable,
+Dict249KeyHashTable,
+Dict249Contents
 };
 
 // ----- SIEMENS CT APPL MEASUREMENT -----
 
-DictEntry Dict243Contents[] = {
+const DictEntry Dict250Contents[] = {
 { 0x0029, 0x0000, 0, VR::UT, VM::M1, "OncologySegmentationMeasurementValues" },
 { 0x0029, 0x0001, 0, VR::ST, VM::M1, "OncologyMeasurementRecistStandard" },
 { 0x0029, 0x0010, 0, VR::CS, VM::M1, "DualEnergyROIAnnotationMode" },
 };
 
-unsigned short Dict243TagHashTable[] = {
+const unsigned short Dict250TagHashTable[] = {
     4,     7,    10,     0,     1,     2,    16,     1,     1,     1,
     1,     0,     0,
 };
 
-unsigned short Dict243KeyHashTable[] = {
+const unsigned short Dict250KeyHashTable[] = {
     3,     3,     4,     0,     3,     0, 61627,     1,  7898,     2,
 27039,
 };
 
-vtkDICOMDictionary::Dict Dict243Data = {
+vtkDICOMDictionary::Dict Dict250Data = {
 "SIEMENS CT APPL MEASUREMENT",
 3,
 3,
-Dict243TagHashTable,
-Dict243KeyHashTable,
-Dict243Contents
+Dict250TagHashTable,
+Dict250KeyHashTable,
+Dict250Contents
 };
 
 // ----- GEMS_CT_FLRO_1 -----
 
-DictEntry Dict244Contents[] = {
+const DictEntry Dict251Contents[] = {
 { 0x0029, 0x0001, 0, VR::SS, VM::M1, "CTIntFluoro" },
 { 0x0029, 0x0002, 0, VR::DS, VM::M1, "ImagePreciseLocation" },
 };
 
-unsigned short Dict244TagHashTable[] = {
+const unsigned short Dict251TagHashTable[] = {
     3,     6,     0,     1,     0,     1,     1,     1,     2,
 };
 
-unsigned short Dict244KeyHashTable[] = {
+const unsigned short Dict251KeyHashTable[] = {
     3,     2,     0,     2,     0, 51487,     1, 30694,
 };
 
-vtkDICOMDictionary::Dict Dict244Data = {
+vtkDICOMDictionary::Dict Dict251Data = {
 "GEMS_CT_FLRO_1",
 2,
 2,
-Dict244TagHashTable,
-Dict244KeyHashTable,
-Dict244Contents
+Dict251TagHashTable,
+Dict251KeyHashTable,
+Dict251Contents
 };
 
 // ----- RadWorksMarconi -----
 
-DictEntry Dict245Contents[] = {
+const DictEntry Dict252Contents[] = {
 { 0x0029, 0x0024, 0, VR::US, VM::M1TN, "KeyFrameIndices" },
 };
 
-unsigned short Dict245TagHashTable[] = {
+const unsigned short Dict252TagHashTable[] = {
     2,     0,     1,     0,    36,
 };
 
-unsigned short Dict245KeyHashTable[] = {
+const unsigned short Dict252KeyHashTable[] = {
     2,     0,     1,     0, 35992,
 };
 
-vtkDICOMDictionary::Dict Dict245Data = {
+vtkDICOMDictionary::Dict Dict252Data = {
 "RadWorksMarconi",
 1,
 1,
-Dict245TagHashTable,
-Dict245KeyHashTable,
-Dict245Contents
+Dict252TagHashTable,
+Dict252KeyHashTable,
+Dict252Contents
 };
 
 // ----- A.L.I. Technologies, Inc. -----
 
-DictEntry Dict246Contents[] = {
+const DictEntry Dict253Contents[] = {
 { 0x3711, 0x0001, 0, VR::LO, VM::M1, "Filename" },
 { 0x3711, 0x0002, 0, VR::OB, VM::M1, "DataBlobOfAVisit" },
 { 0x3711, 0x0003, 0, VR::US, VM::M1, "RevisionNumber" },
@@ -14761,7 +15489,7 @@ DictEntry Dict246Contents[] = {
 { 0x3711, 0x0097, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict246TagHashTable[] = {
+const unsigned short Dict253TagHashTable[] = {
    12,    11,    17,    20,    11,    23,    26,    31,    34,    39,
    11,     0,     2,     9,    48,    10,   151,     1,     4,     5,
     1,     3,     4,     1,     6,    13,     2,     0,     1,     5,
@@ -14769,7 +15497,7 @@ unsigned short Dict246TagHashTable[] = {
     1,     2,
 };
 
-unsigned short Dict246KeyHashTable[] = {
+const unsigned short Dict253KeyHashTable[] = {
    11,    11,    12,    15,    20,    27,    30,    11,    11,    35,
    38,     0,     1,    10,   489,     2,     5, 40854,     8, 65259,
     3,     4, 43240,     7,  7295,     9, 13293,     1,     2, 27112,
@@ -14777,93 +15505,93 @@ unsigned short Dict246KeyHashTable[] = {
 27161,
 };
 
-vtkDICOMDictionary::Dict Dict246Data = {
+vtkDICOMDictionary::Dict Dict253Data = {
 "A.L.I. Technologies, Inc.",
 11,
 11,
-Dict246TagHashTable,
-Dict246KeyHashTable,
-Dict246Contents
+Dict253TagHashTable,
+Dict253KeyHashTable,
+Dict253Contents
 };
 
 // ----- SEGAMI MIML -----
 
-DictEntry Dict247Contents[] = {
+const DictEntry Dict254Contents[] = {
 { 0x0031, 0x0098, 0, VR::OW, VM::M1, "" },
 };
 
-unsigned short Dict247TagHashTable[] = {
+const unsigned short Dict254TagHashTable[] = {
     2,     0,     1,     0,   152,
 };
 
-unsigned short Dict247KeyHashTable[] = {
+const unsigned short Dict254KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict247Data = {
+vtkDICOMDictionary::Dict Dict254Data = {
 "SEGAMI MIML",
 1,
 1,
-Dict247TagHashTable,
-Dict247KeyHashTable,
-Dict247Contents
+Dict254TagHashTable,
+Dict254KeyHashTable,
+Dict254Contents
 };
 
 // ----- EMAGEON JPEG2K INFO -----
 
-DictEntry Dict248Contents[] = {
+const DictEntry Dict255Contents[] = {
 { 0x0009, 0x0000, 0, VR::SQ, VM::M1, "" },
 { 0x0009, 0x0001, 0, VR::DT, VM::M1, "" },
 };
 
-unsigned short Dict248TagHashTable[] = {
+const unsigned short Dict255TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict248KeyHashTable[] = {
+const unsigned short Dict255KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict248Data = {
+vtkDICOMDictionary::Dict Dict255Data = {
 "EMAGEON JPEG2K INFO",
 2,
 2,
-Dict248TagHashTable,
-Dict248KeyHashTable,
-Dict248Contents
+Dict255TagHashTable,
+Dict255KeyHashTable,
+Dict255Contents
 };
 
 // ----- FOEM 1.0 -----
 
-DictEntry Dict249Contents[] = {
+const DictEntry Dict256Contents[] = {
 { 0x0019, 0x0050, 0, VR::IS, VM::M1, "" },
 { 0x0025, 0x0010, 0, VR::US, VM::M1, "" },
 { 0x0025, 0x0012, 0, VR::US, VM::M1, "" },
 { 0x0029, 0x0020, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict249TagHashTable[] = {
+const unsigned short Dict256TagHashTable[] = {
     5,     8,     4,    13,     0,     1,     0,    80,     2,     1,
    16,     3,    32,     1,     2,    18,
 };
 
-unsigned short Dict249KeyHashTable[] = {
+const unsigned short Dict256KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict249Data = {
+vtkDICOMDictionary::Dict Dict256Data = {
 "FOEM 1.0",
 4,
 4,
-Dict249TagHashTable,
-Dict249KeyHashTable,
-Dict249Contents
+Dict256TagHashTable,
+Dict256KeyHashTable,
+Dict256Contents
 };
 
 // ----- MeVis eD: Timepoint Information -----
 
-DictEntry Dict250Contents[] = {
+const DictEntry Dict257Contents[] = {
 { 0x0021, 0x0010, 0, VR::LT, VM::M1, "TimepointDateTime" },
 { 0x0021, 0x0011, 0, VR::CS, VM::M1, "TimepointDateTimeType" },
 { 0x0021, 0x0012, 0, VR::UN, VM::M1, "TimepointSeriesDescription" },
@@ -14871,28 +15599,28 @@ DictEntry Dict250Contents[] = {
 { 0x0021, 0x0071, 0, VR::UN, VM::M1, "TimepointEmptyFrames" },
 };
 
-unsigned short Dict250TagHashTable[] = {
+const unsigned short Dict257TagHashTable[] = {
     6,     9,     5,    14,    17,     0,     1,     3,    19,     2,
     2,    18,     4,   113,     1,     1,    17,     1,     0,    16,
 };
 
-unsigned short Dict250KeyHashTable[] = {
+const unsigned short Dict257KeyHashTable[] = {
     6,     5,    11,    14,     5,     0,     2,     0, 20911,     1,
 25769,     1,     2,  4175,     2,     3, 13689,     4, 63720,
 };
 
-vtkDICOMDictionary::Dict Dict250Data = {
+vtkDICOMDictionary::Dict Dict257Data = {
 "MeVis eD: Timepoint Information",
 5,
 5,
-Dict250TagHashTable,
-Dict250KeyHashTable,
-Dict250Contents
+Dict257TagHashTable,
+Dict257KeyHashTable,
+Dict257Contents
 };
 
 // ----- Harmony R2.0 -----
 
-DictEntry Dict251Contents[] = {
+const DictEntry Dict258Contents[] = {
 { 0x0019, 0x0079, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x007c, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x007d, 0, VR::UN, VM::M1, "" },
@@ -14920,7 +15648,7 @@ DictEntry Dict251Contents[] = {
 { 0x0019, 0x0099, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict251TagHashTable[] = {
+const unsigned short Dict258TagHashTable[] = {
    26,    31,    36,    39,    42,    45,    48,    51,    54,    57,
    25,    60,    63,    66,    69,    72,    75,    78,    81,    25,
    84,    87,    90,    95,    25,     0,     2,     1,   124,    14,
@@ -14933,7 +15661,7 @@ unsigned short Dict251TagHashTable[] = {
     2,     0,   121,    10,   136,     1,    15,   143,
 };
 
-unsigned short Dict251KeyHashTable[] = {
+const unsigned short Dict258KeyHashTable[] = {
    25,    25,    25,    25,    25,    25,    26,    25,    25,    25,
    25,    25,    25,    25,    25,    25,    25,    25,    25,    25,
    25,    25,    25,    25,    25,     0,    25,     0,   215,     1,
@@ -14944,18 +15672,18 @@ unsigned short Dict251KeyHashTable[] = {
   215,    22,   215,    23,   215,    24,   215,
 };
 
-vtkDICOMDictionary::Dict Dict251Data = {
+vtkDICOMDictionary::Dict Dict258Data = {
 "Harmony R2.0",
 25,
 25,
-Dict251TagHashTable,
-Dict251KeyHashTable,
-Dict251Contents
+Dict258TagHashTable,
+Dict258KeyHashTable,
+Dict258Contents
 };
 
 // ----- PAPYRUS -----
 
-DictEntry Dict252Contents[] = {
+const DictEntry Dict259Contents[] = {
 { 0x0009, 0x0000, 0, VR::LT, VM::M1, "OriginalFileName" },
 { 0x0009, 0x0010, 0, VR::LT, VM::M1, "OriginalFileLocation" },
 { 0x0009, 0x0018, 0, VR::LT, VM::M1, "DataSetIdentifier" },
@@ -14981,7 +15709,7 @@ DictEntry Dict252Contents[] = {
 { 0x0041, 0x00b3, 0, VR::UL, VM::M1TN, "InternalOffsetToImage" },
 };
 
-unsigned short Dict252TagHashTable[] = {
+const unsigned short Dict259TagHashTable[] = {
    23,    24,    29,    32,    35,    23,    23,    23,    23,    38,
    41,    46,    51,    58,    23,    23,    23,    61,    68,    73,
    76,    23,    81,     0,     2,     9,    52,    11,    64,     1,
@@ -14993,7 +15721,7 @@ unsigned short Dict252TagHashTable[] = {
   161,     1,     8,    50,
 };
 
-unsigned short Dict252KeyHashTable[] = {
+const unsigned short Dict259KeyHashTable[] = {
    24,    23,    27,    23,    23,    30,    33,    23,    36,    47,
    23,    23,    52,    55,    23,    23,    58,    61,    64,    69,
    74,    79,    23,     0,     1,     7, 24168,     1,     2, 54676,
@@ -15005,18 +15733,18 @@ unsigned short Dict252KeyHashTable[] = {
    11, 65124,    20, 22909,
 };
 
-vtkDICOMDictionary::Dict Dict252Data = {
+vtkDICOMDictionary::Dict Dict259Data = {
 "PAPYRUS",
 23,
 23,
-Dict252TagHashTable,
-Dict252KeyHashTable,
-Dict252Contents
+Dict259TagHashTable,
+Dict259KeyHashTable,
+Dict259Contents
 };
 
 // ----- Philips Imaging DD 070 -----
 
-DictEntry Dict253Contents[] = {
+const DictEntry Dict260Contents[] = {
 { 0x4001, 0x0010, 0, VR::SQ, VM::M1, "" },
 { 0x4001, 0x0011, 0, VR::SQ, VM::M1, "" },
 { 0x4001, 0x0012, 0, VR::SQ, VM::M1, "" },
@@ -15028,31 +15756,31 @@ DictEntry Dict253Contents[] = {
 { 0x4001, 0x001d, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict253TagHashTable[] = {
+const unsigned short Dict260TagHashTable[] = {
    10,    15,     9,    18,    21,     9,    24,    29,    32,     0,
     2,     2,    18,     8,    29,     1,     7,    28,     1,     5,
    23,     1,     4,    22,     2,     1,    17,     6,    24,     1,
     0,    16,     1,     3,    19,
 };
 
-unsigned short Dict253KeyHashTable[] = {
+const unsigned short Dict260KeyHashTable[] = {
     9,     9,     9,     9,     9,     9,     9,     9,    10,     0,
     9,     0,   597,     1,   597,     2,   597,     3,   597,     4,
   597,     5,   597,     6,   597,     7,   597,     8,   597,
 };
 
-vtkDICOMDictionary::Dict Dict253Data = {
+vtkDICOMDictionary::Dict Dict260Data = {
 "Philips Imaging DD 070",
 9,
 9,
-Dict253TagHashTable,
-Dict253KeyHashTable,
-Dict253Contents
+Dict260TagHashTable,
+Dict260KeyHashTable,
+Dict260Contents
 };
 
 // ----- TOSHIBA_MEC_XA3 -----
 
-DictEntry Dict254Contents[] = {
+const DictEntry Dict261Contents[] = {
 { 0x7079, 0x0021, 0, VR::SH, VM::M5, "" },
 { 0x7079, 0x0022, 0, VR::IS, VM::M2, "" },
 { 0x7079, 0x0023, 0, VR::IS, VM::M2, "" },
@@ -15144,7 +15872,7 @@ DictEntry Dict254Contents[] = {
 { 0x7079, 0x0080, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict254TagHashTable[] = {
+const unsigned short Dict261TagHashTable[] = {
    89,    89,    89,    89,    89,    89,    89,    89,    89,    89,
    89,    89,    89,    89,    89,    89,    89,    90,    93,    96,
    89,    89,    89,    89,    89,    99,   102,   105,   108,   111,
@@ -15180,7 +15908,7 @@ unsigned short Dict254TagHashTable[] = {
    68,     1,    36,    71,     1,    35,    70,
 };
 
-unsigned short Dict254KeyHashTable[] = {
+const unsigned short Dict261KeyHashTable[] = {
    89,    89,    89,    89,    89,    89,    89,    89,    89,    89,
    89,    89,    89,    89,    89,    89,    89,    89,    89,    89,
    89,    89,    89,    89,    89,    89,    89,    89,    89,    89,
@@ -15210,18 +15938,18 @@ unsigned short Dict254KeyHashTable[] = {
    60,    85,    60,    86,    60,    87,    60,    88,    60,
 };
 
-vtkDICOMDictionary::Dict Dict254Data = {
+vtkDICOMDictionary::Dict Dict261Data = {
 "TOSHIBA_MEC_XA3",
 89,
 89,
-Dict254TagHashTable,
-Dict254KeyHashTable,
-Dict254Contents
+Dict261TagHashTable,
+Dict261KeyHashTable,
+Dict261Contents
 };
 
 // ----- Philips Imaging DD 073 -----
 
-DictEntry Dict255Contents[] = {
+const DictEntry Dict262Contents[] = {
 { 0x4007, 0x0048, 0, VR::FL, VM::M1, "" },
 { 0x4007, 0x004b, 0, VR::FL, VM::M1, "" },
 { 0x4007, 0x004c, 0, VR::LO, VM::M1, "" },
@@ -15230,53 +15958,53 @@ DictEntry Dict255Contents[] = {
 { 0x4007, 0x004f, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict255TagHashTable[] = {
+const unsigned short Dict262TagHashTable[] = {
     6,     7,    10,    15,    18,    21,     0,     1,     1,    75,
     2,     0,    72,     4,    78,     1,     5,    79,     1,     2,
    76,     1,     3,    77,
 };
 
-unsigned short Dict255KeyHashTable[] = {
+const unsigned short Dict262KeyHashTable[] = {
     6,     6,     6,     6,     6,     7,     0,     6,     0,   896,
     1,   896,     2,   896,     3,   896,     4,   896,     5,   896,
 };
 
-vtkDICOMDictionary::Dict Dict255Data = {
+vtkDICOMDictionary::Dict Dict262Data = {
 "Philips Imaging DD 073",
 6,
 6,
-Dict255TagHashTable,
-Dict255KeyHashTable,
-Dict255Contents
+Dict262TagHashTable,
+Dict262KeyHashTable,
+Dict262Contents
 };
 
 // ----- SEGAMI_HEADER -----
 
-DictEntry Dict256Contents[] = {
+const DictEntry Dict263Contents[] = {
 { 0x0029, 0x0031, 0, VR::CS, VM::M1, "" },
 { 0x0029, 0x0032, 0, VR::OW, VM::M1, "" },
 };
 
-unsigned short Dict256TagHashTable[] = {
+const unsigned short Dict263TagHashTable[] = {
     3,     6,     0,     1,     0,    49,     1,     1,    50,
 };
 
-unsigned short Dict256KeyHashTable[] = {
+const unsigned short Dict263KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict256Data = {
+vtkDICOMDictionary::Dict Dict263Data = {
 "SEGAMI_HEADER",
 2,
 2,
-Dict256TagHashTable,
-Dict256KeyHashTable,
-Dict256Contents
+Dict263TagHashTable,
+Dict263KeyHashTable,
+Dict263Contents
 };
 
 // ----- IMS s.r.l. Mammography Private Code -----
 
-DictEntry Dict257Contents[] = {
+const DictEntry Dict264Contents[] = {
 { 0x1271, 0x0001, 0, VR::IS, VM::M1, "Threshold1" },
 { 0x1271, 0x0002, 0, VR::IS, VM::M1, "Threshold2" },
 { 0x1271, 0x0010, 0, VR::IS, VM::M1, "SegmentationLeftBorder" },
@@ -15336,7 +16064,7 @@ DictEntry Dict257Contents[] = {
 { 0x1271, 0x0085, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict257TagHashTable[] = {
+const unsigned short Dict264TagHashTable[] = {
    58,    63,    68,    73,    78,    85,    90,    97,   102,   105,
   108,   113,   118,   121,    57,   124,   127,   130,    57,    57,
    57,    57,   133,   136,   139,   142,    57,    57,    57,    57,
@@ -15361,7 +16089,7 @@ unsigned short Dict257TagHashTable[] = {
    49,   120,
 };
 
-unsigned short Dict257KeyHashTable[] = {
+const unsigned short Dict264KeyHashTable[] = {
    57,    58,    57,    61,    64,    67,    57,    70,    57,    73,
    76,    83,    88,    93,    98,   103,   106,   111,   114,    57,
    57,   119,    57,   124,   127,   130,   135,    57,   138,   143,
@@ -15386,45 +16114,45 @@ unsigned short Dict257KeyHashTable[] = {
 14681,
 };
 
-vtkDICOMDictionary::Dict Dict257Data = {
+vtkDICOMDictionary::Dict Dict264Data = {
 "IMS s.r.l. Mammography Private Code",
 57,
 57,
-Dict257TagHashTable,
-Dict257KeyHashTable,
-Dict257Contents
+Dict264TagHashTable,
+Dict264KeyHashTable,
+Dict264Contents
 };
 
 // ----- Silhouette Sequence Ids V1.0 -----
 
-DictEntry Dict258Contents[] = {
+const DictEntry Dict265Contents[] = {
 { 0x0029, 0x0041, 0, VR::SQ, VM::M1, "" },
 { 0x0029, 0x0042, 0, VR::SQ, VM::M1, "" },
 { 0x0029, 0x0043, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict258TagHashTable[] = {
+const unsigned short Dict265TagHashTable[] = {
     4,     7,    10,     0,     1,     0,    65,     1,     1,    66,
     1,     2,    67,
 };
 
-unsigned short Dict258KeyHashTable[] = {
+const unsigned short Dict265KeyHashTable[] = {
     3,     3,     4,     0,     3,     0,  1793,     1,  1793,     2,
  1793,
 };
 
-vtkDICOMDictionary::Dict Dict258Data = {
+vtkDICOMDictionary::Dict Dict265Data = {
 "Silhouette Sequence Ids V1.0",
 3,
 3,
-Dict258TagHashTable,
-Dict258KeyHashTable,
-Dict258Contents
+Dict265TagHashTable,
+Dict265KeyHashTable,
+Dict265Contents
 };
 
 // ----- SIEMENS SYNGO ADVANCED PRESENTATION -----
 
-DictEntry Dict259Contents[] = {
+const DictEntry Dict266Contents[] = {
 { 0x0029, 0x0000, 0, VR::CS, VM::M1, "PresentationName" },
 { 0x0029, 0x0001, 0, VR::CS, VM::M1, "PresentationType" },
 { 0x0029, 0x0002, 0, VR::SQ, VM::M1, "AdvancedPresentationSequence" },
@@ -15614,7 +16342,7 @@ DictEntry Dict259Contents[] = {
 { 0x0029, 0x00FD, 0, VR::LO, VM::M1, "MeasurementApplicationTypeID" },
 };
 
-unsigned short Dict259TagHashTable[] = {
+const unsigned short Dict266TagHashTable[] = {
   187,   188,   193,   196,   199,   187,   187,   187,   202,   205,
   208,   211,   214,   217,   222,   227,   232,   237,   240,   243,
   246,   249,   254,   259,   264,   269,   272,   275,   280,   285,
@@ -15689,7 +16417,7 @@ unsigned short Dict259TagHashTable[] = {
     1,   112,   147,     1,   111,   146,     1,   110,   145,
 };
 
-unsigned short Dict259KeyHashTable[] = {
+const unsigned short Dict266KeyHashTable[] = {
   188,   193,   187,   198,   201,   204,   187,   207,   187,   187,
   212,   215,   218,   187,   187,   221,   187,   187,   187,   187,
   226,   187,   233,   187,   240,   243,   187,   248,   251,   256,
@@ -15761,18 +16489,18 @@ unsigned short Dict259KeyHashTable[] = {
 62279,
 };
 
-vtkDICOMDictionary::Dict Dict259Data = {
+vtkDICOMDictionary::Dict Dict266Data = {
 "SIEMENS SYNGO ADVANCED PRESENTATION",
 187,
 187,
-Dict259TagHashTable,
-Dict259KeyHashTable,
-Dict259Contents
+Dict266TagHashTable,
+Dict266KeyHashTable,
+Dict266Contents
 };
 
 // ----- MITRA PRESENTATION 1.0 -----
 
-DictEntry Dict260Contents[] = {
+const DictEntry Dict267Contents[] = {
 { 0x0029, 0x0000, 0, VR::CS, VM::M1, "Rotation" },
 { 0x0029, 0x0001, 0, VR::LO, VM::M1, "WindowWidth" },
 { 0x0029, 0x0002, 0, VR::LO, VM::M1, "WindowCentre" },
@@ -15785,7 +16513,7 @@ DictEntry Dict260Contents[] = {
 { 0x0029, 0x0013, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict260TagHashTable[] = {
+const unsigned short Dict267TagHashTable[] = {
    11,    14,    17,    20,    23,    26,    29,    32,    35,    38,
     0,     1,     1,     1,     1,     0,     0,     1,     3,     3,
     1,     2,     2,     1,     5,     5,     1,     4,     4,     1,
@@ -15793,123 +16521,123 @@ unsigned short Dict260TagHashTable[] = {
    18,
 };
 
-unsigned short Dict260KeyHashTable[] = {
+const unsigned short Dict267KeyHashTable[] = {
    10,    11,    24,    29,    10,    10,    10,    10,    10,    32,
     0,     6,     0,  6066,     1, 16198,     6,   538,     7,   538,
     8,   538,     9,   538,     2,     2, 22918,     4, 58278,     1,
     3, 29993,     1,     5, 33367,
 };
 
-vtkDICOMDictionary::Dict Dict260Data = {
+vtkDICOMDictionary::Dict Dict267Data = {
 "MITRA PRESENTATION 1.0",
 10,
 10,
-Dict260TagHashTable,
-Dict260KeyHashTable,
-Dict260Contents
+Dict267TagHashTable,
+Dict267KeyHashTable,
+Dict267Contents
 };
 
 // ----- CAMTRONICS IP -----
 
-DictEntry Dict261Contents[] = {
+const DictEntry Dict268Contents[] = {
 { 0x0029, 0x0010, 0, VR::LT, VM::M1, "" },
 { 0x0029, 0x0020, 0, VR::UN, VM::M1, "" },
 { 0x0029, 0x0030, 0, VR::UN, VM::M1, "" },
 { 0x0029, 0x0040, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict261TagHashTable[] = {
+const unsigned short Dict268TagHashTable[] = {
     5,     8,     4,     4,     0,     1,     3,    64,     3,     0,
    16,     1,    32,     2,    48,
 };
 
-unsigned short Dict261KeyHashTable[] = {
+const unsigned short Dict268KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict261Data = {
+vtkDICOMDictionary::Dict Dict268Data = {
 "CAMTRONICS IP",
 4,
 4,
-Dict261TagHashTable,
-Dict261KeyHashTable,
-Dict261Contents
+Dict268TagHashTable,
+Dict268KeyHashTable,
+Dict268Contents
 };
 
 // ----- GEMS_VXTL_USERDATA_01 -----
 
-DictEntry Dict262Contents[] = {
+const DictEntry Dict269Contents[] = {
 { 0x0047, 0x0011, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict262TagHashTable[] = {
+const unsigned short Dict269TagHashTable[] = {
     2,     0,     1,     0,    17,
 };
 
-unsigned short Dict262KeyHashTable[] = {
+const unsigned short Dict269KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict262Data = {
+vtkDICOMDictionary::Dict Dict269Data = {
 "GEMS_VXTL_USERDATA_01",
 1,
 1,
-Dict262TagHashTable,
-Dict262KeyHashTable,
-Dict262Contents
+Dict269TagHashTable,
+Dict269KeyHashTable,
+Dict269Contents
 };
 
 // ----- MITRA OBJECT DOCUMENT 1.0 -----
 
-DictEntry Dict263Contents[] = {
+const DictEntry Dict270Contents[] = {
 { 0x0029, 0x0000, 0, VR::OB, VM::M1, "IMPAXObjectDocument" },
 { 0x0029, 0x0001, 0, VR::OB, VM::M1, "IMPAXMarkupXMLStored" },
 };
 
-unsigned short Dict263TagHashTable[] = {
+const unsigned short Dict270TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict263KeyHashTable[] = {
+const unsigned short Dict270KeyHashTable[] = {
     3,     2,     0,     2,     0, 48829,     1, 31771,
 };
 
-vtkDICOMDictionary::Dict Dict263Data = {
+vtkDICOMDictionary::Dict Dict270Data = {
 "MITRA OBJECT DOCUMENT 1.0",
 2,
 2,
-Dict263TagHashTable,
-Dict263KeyHashTable,
-Dict263Contents
+Dict270TagHashTable,
+Dict270KeyHashTable,
+Dict270Contents
 };
 
 // ----- QTUltrasound -----
 
-DictEntry Dict264Contents[] = {
+const DictEntry Dict271Contents[] = {
 { 0x0099, 0x0000, 0, VR::SS, VM::M1, "BreastDensityValue" },
 };
 
-unsigned short Dict264TagHashTable[] = {
+const unsigned short Dict271TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict264KeyHashTable[] = {
+const unsigned short Dict271KeyHashTable[] = {
     2,     0,     1,     0, 16835,
 };
 
-vtkDICOMDictionary::Dict Dict264Data = {
+vtkDICOMDictionary::Dict Dict271Data = {
 "QTUltrasound",
 1,
 1,
-Dict264TagHashTable,
-Dict264KeyHashTable,
-Dict264Contents
+Dict271TagHashTable,
+Dict271KeyHashTable,
+Dict271Contents
 };
 
 // ----- SIEMENS MED SMS USG ANTARES -----
 
-DictEntry Dict265Contents[] = {
+const DictEntry Dict272Contents[] = {
 { 0x0019, 0x0000, 0, VR::SH, VM::M1, "" },
 { 0x0019, 0x0003, 0, VR::FD, VM::M1, "" },
 { 0x0019, 0x000c, 0, VR::US, VM::M1, "" },
@@ -15963,7 +16691,7 @@ DictEntry Dict265Contents[] = {
 { 0x0019, 0x00a0, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict265TagHashTable[] = {
+const unsigned short Dict272TagHashTable[] = {
    52,    57,    62,    65,    68,    75,    78,    81,    84,    87,
    90,    93,    98,    51,   103,    51,    51,    51,   106,   109,
   112,   117,    51,   122,   127,   130,   137,    51,    51,   140,
@@ -15986,7 +16714,7 @@ unsigned short Dict265TagHashTable[] = {
   131,
 };
 
-unsigned short Dict265KeyHashTable[] = {
+const unsigned short Dict272KeyHashTable[] = {
    51,    51,    51,    51,    51,    51,    51,    51,    51,    51,
    51,    51,    51,    51,    51,    51,    51,    51,    51,    51,
    51,    51,    51,    51,    51,    51,    52,    51,    51,    51,
@@ -16005,93 +16733,93 @@ unsigned short Dict265KeyHashTable[] = {
   105,    49,   105,    50,   105,
 };
 
-vtkDICOMDictionary::Dict Dict265Data = {
+vtkDICOMDictionary::Dict Dict272Data = {
 "SIEMENS MED SMS USG ANTARES",
 51,
 51,
-Dict265TagHashTable,
-Dict265KeyHashTable,
-Dict265Contents
+Dict272TagHashTable,
+Dict272KeyHashTable,
+Dict272Contents
 };
 
 // ----- PI Private Block (0781:3000 - 0781:30FF) -----
 
-DictEntry Dict266Contents[] = {
+const DictEntry Dict273Contents[] = {
 { 0x0781, 0x0001, 0, VR::US, VM::M1, "" },
 { 0x0781, 0x0002, 0, VR::US, VM::M1, "" },
 { 0x0781, 0x0005, 0, VR::FL, VM::M1, "" },
 { 0x0781, 0x0009, 0, VR::FL, VM::M4, "" },
 };
 
-unsigned short Dict266TagHashTable[] = {
+const unsigned short Dict273TagHashTable[] = {
     4,     5,     8,     4,     0,     1,     1,     2,     3,     0,
     1,     2,     5,     3,     9,
 };
 
-unsigned short Dict266KeyHashTable[] = {
+const unsigned short Dict273KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict266Data = {
+vtkDICOMDictionary::Dict Dict273Data = {
 "PI Private Block (0781:3000 - 0781:30FF)",
 4,
 4,
-Dict266TagHashTable,
-Dict266KeyHashTable,
-Dict266Contents
+Dict273TagHashTable,
+Dict273KeyHashTable,
+Dict273Contents
 };
 
 // ----- SIEMENS MED MAMMO -----
 
-DictEntry Dict267Contents[] = {
+const DictEntry Dict274Contents[] = {
 { 0x0029, 0x005a, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict267TagHashTable[] = {
+const unsigned short Dict274TagHashTable[] = {
     2,     0,     1,     0,    90,
 };
 
-unsigned short Dict267KeyHashTable[] = {
+const unsigned short Dict274KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict267Data = {
+vtkDICOMDictionary::Dict Dict274Data = {
 "SIEMENS MED MAMMO",
 1,
 1,
-Dict267TagHashTable,
-Dict267KeyHashTable,
-Dict267Contents
+Dict274TagHashTable,
+Dict274KeyHashTable,
+Dict274Contents
 };
 
 // ----- PM -----
 
-DictEntry Dict268Contents[] = {
+const DictEntry Dict275Contents[] = {
 { 0x0101, 0x0005, 0, VR::LO, VM::M1TN, "ImageEnhancementParameterFile" },
 { 0x0101, 0x0006, 0, VR::IS, VM::M1, "OriginalSigmoidRatio" },
 };
 
-unsigned short Dict268TagHashTable[] = {
+const unsigned short Dict275TagHashTable[] = {
     3,     6,     0,     1,     0,     5,     1,     1,     6,
 };
 
-unsigned short Dict268KeyHashTable[] = {
+const unsigned short Dict275KeyHashTable[] = {
     2,     3,     0,     2,     0, 39543,     1, 33778,
 };
 
-vtkDICOMDictionary::Dict Dict268Data = {
+vtkDICOMDictionary::Dict Dict275Data = {
 "PM",
 2,
 2,
-Dict268TagHashTable,
-Dict268KeyHashTable,
-Dict268Contents
+Dict275TagHashTable,
+Dict275KeyHashTable,
+Dict275Contents
 };
 
 // ----- MITRA MARKUP 1.0 -----
 
-DictEntry Dict269Contents[] = {
+const DictEntry Dict276Contents[] = {
 { 0x0029, 0x0000, 0, VR::OB, VM::M1TN, "Markup1" },
 { 0x0029, 0x0001, 0, VR::OB, VM::M1TN, "Markup2" },
 { 0x0029, 0x0002, 0, VR::OB, VM::M1TN, "Markup3" },
@@ -16109,7 +16837,7 @@ DictEntry Dict269Contents[] = {
 { 0x0029, 0x0014, 0, VR::OB, VM::M1TN, "Markup15" },
 };
 
-unsigned short Dict269TagHashTable[] = {
+const unsigned short Dict276TagHashTable[] = {
    16,    19,    24,    29,    15,    15,    15,    15,    15,    15,
    32,    35,    40,    45,    50,     0,     1,     4,     4,     2,
     7,     7,    14,    20,     2,     6,     6,     9,     9,     1,
@@ -16118,7 +16846,7 @@ unsigned short Dict269TagHashTable[] = {
     2,     5,     5,    12,    18,
 };
 
-unsigned short Dict269KeyHashTable[] = {
+const unsigned short Dict276KeyHashTable[] = {
    16,    15,    15,    19,    22,    25,    28,    31,    34,    37,
    40,    45,    50,    53,    56,     0,     1,    14, 24981,     1,
     0, 16909,     1,     1, 16909,     1,     2, 16909,     1,     3,
@@ -16127,18 +16855,18 @@ unsigned short Dict269KeyHashTable[] = {
     1,    11, 24980,     1,    12, 24980,     1,    13, 24980,
 };
 
-vtkDICOMDictionary::Dict Dict269Data = {
+vtkDICOMDictionary::Dict Dict276Data = {
 "MITRA MARKUP 1.0",
 15,
 15,
-Dict269TagHashTable,
-Dict269KeyHashTable,
-Dict269Contents
+Dict276TagHashTable,
+Dict276KeyHashTable,
+Dict276Contents
 };
 
 // ----- SIEMENS_FLCOMPACT_VA01A_PROC -----
 
-DictEntry Dict270Contents[] = {
+const DictEntry Dict277Contents[] = {
 { 0x0017, 0x000a, 0, VR::SS, VM::M1, "" },
 { 0x0017, 0x000b, 0, VR::SS, VM::M1, "" },
 { 0x0017, 0x000c, 0, VR::SS, VM::M1, "" },
@@ -16206,7 +16934,7 @@ DictEntry Dict270Contents[] = {
 { 0x0017, 0x00c0, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict270TagHashTable[] = {
+const unsigned short Dict277TagHashTable[] = {
    66,    69,    74,    77,    82,    85,    88,    93,    96,    99,
    65,   104,   107,   110,   113,   118,   121,   124,    65,    65,
    65,    65,   129,   132,   137,   144,   149,   156,   161,   166,
@@ -16233,7 +16961,7 @@ unsigned short Dict270TagHashTable[] = {
     1,    27,    41,     1,    26,    40,
 };
 
-unsigned short Dict270KeyHashTable[] = {
+const unsigned short Dict277KeyHashTable[] = {
    65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
    65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
    65,    65,    65,    65,    65,    65,    65,    65,    65,    65,
@@ -16256,18 +16984,18 @@ unsigned short Dict270KeyHashTable[] = {
    82,    62,    82,    63,    82,    64,    82,
 };
 
-vtkDICOMDictionary::Dict Dict270Data = {
+vtkDICOMDictionary::Dict Dict277Data = {
 "SIEMENS_FLCOMPACT_VA01A_PROC",
 65,
 65,
-Dict270TagHashTable,
-Dict270KeyHashTable,
-Dict270Contents
+Dict277TagHashTable,
+Dict277KeyHashTable,
+Dict277Contents
 };
 
 // ----- Applicare/RadStore/Version 1.0 -----
 
-DictEntry Dict271Contents[] = {
+const DictEntry Dict278Contents[] = {
 { 0x3113, 0x0001, 0, VR::SL, VM::M1, "" },
 { 0x3113, 0x0002, 0, VR::SL, VM::M1, "Id1" },
 { 0x3113, 0x0003, 0, VR::SL, VM::M1, "Id2" },
@@ -16310,7 +17038,7 @@ DictEntry Dict271Contents[] = {
 { 0x3113, 0x0069, 0, VR::AT, VM::M1TN, "DeletedTags" },
 };
 
-unsigned short Dict271TagHashTable[] = {
+const unsigned short Dict278TagHashTable[] = {
    40,    40,    40,    40,    40,    40,    41,    40,    44,    47,
    50,    40,    53,    56,    59,    62,    65,    68,    71,    76,
    81,    86,    91,    96,    40,    99,   102,   105,   108,   113,
@@ -16328,7 +17056,7 @@ unsigned short Dict271TagHashTable[] = {
    33,    82,     2,     1,     2,    34,    83,     1,     0,     1,
 };
 
-unsigned short Dict271KeyHashTable[] = {
+const unsigned short Dict278KeyHashTable[] = {
    41,    40,    48,    51,    56,    59,    62,    65,    68,    40,
    73,    76,    81,    40,    84,    40,    40,    40,    87,    90,
    40,    95,    40,    40,    40,   110,    40,    40,    40,    40,
@@ -16346,18 +17074,18 @@ unsigned short Dict271KeyHashTable[] = {
     1,    14, 12256,
 };
 
-vtkDICOMDictionary::Dict Dict271Data = {
+vtkDICOMDictionary::Dict Dict278Data = {
 "Applicare/RadStore/Version 1.0",
 40,
 40,
-Dict271TagHashTable,
-Dict271KeyHashTable,
-Dict271Contents
+Dict278TagHashTable,
+Dict278KeyHashTable,
+Dict278Contents
 };
 
 // ----- Siemens: Thorax/Multix FD Post Processing -----
 
-DictEntry Dict272Contents[] = {
+const DictEntry Dict279Contents[] = {
 { 0x0021, 0x0000, 0, VR::US, VM::M1, "" },
 { 0x0021, 0x0001, 0, VR::SS, VM::M1, "" },
 { 0x0021, 0x0002, 0, VR::FL, VM::M1, "" },
@@ -16387,7 +17115,7 @@ DictEntry Dict272Contents[] = {
 { 0x0021, 0x0031, 0, VR::US, VM::M1, "AcquisitionSortNumber" },
 };
 
-unsigned short Dict272TagHashTable[] = {
+const unsigned short Dict279TagHashTable[] = {
    28,    31,    27,    34,    27,    37,    40,    43,    46,    49,
    52,    55,    58,    61,    64,    67,    70,    75,    80,    83,
    86,    89,    92,    95,    98,   101,   104,     0,     1,    23,
@@ -16401,7 +17129,7 @@ unsigned short Dict272TagHashTable[] = {
    18,     1,    21,    21,     1,    20,    20,
 };
 
-unsigned short Dict272KeyHashTable[] = {
+const unsigned short Dict279KeyHashTable[] = {
    28,    31,    27,    34,    37,    27,    27,    27,    42,    27,
    73,    27,    27,    27,    27,    27,    27,    76,    79,    82,
    27,    27,    27,    27,    85,    27,    27,     0,     1,    22,
@@ -16414,72 +17142,75 @@ unsigned short Dict272KeyHashTable[] = {
    24, 65387,
 };
 
-vtkDICOMDictionary::Dict Dict272Data = {
+vtkDICOMDictionary::Dict Dict279Data = {
 "Siemens: Thorax/Multix FD Post Processing",
 27,
 27,
-Dict272TagHashTable,
-Dict272KeyHashTable,
-Dict272Contents
+Dict279TagHashTable,
+Dict279KeyHashTable,
+Dict279Contents
 };
 
-// ----- SIEMENS MED PT WAVEFORM -----
+// ----- AMICAS0 -----
 
-DictEntry Dict273Contents[] = {
-{ 0x0071, 0x0046, 0, VR::UN, VM::M1, "StartingRespiratoryAmplitude" },
-{ 0x0071, 0x0047, 0, VR::UN, VM::M1, "StartingRespiratoryPhase" },
-{ 0x0071, 0x0048, 0, VR::UN, VM::M1, "EndingRespiratoryAmplitude" },
-{ 0x0071, 0x0049, 0, VR::UN, VM::M1, "EndingRespiratoryPhase" },
-{ 0x0071, 0x0050, 0, VR::CS, VM::M1, "RespiratoryTriggerType" },
+const DictEntry Dict280Contents[] = {
+{ 0x0023, 0x0001, 0, VR::UI, VM::M1, "" },
+{ 0x0023, 0x0008, 0, VR::US, VM::M1, "" },
+{ 0x0023, 0x0010, 0, VR::US, VM::M1, "" },
+{ 0x0023, 0x0016, 0, VR::SL, VM::M1, "" },
+{ 0x0023, 0x0043, 0, VR::US, VM::M1, "" },
+{ 0x0023, 0x0045, 0, VR::US, VM::M1, "" },
+{ 0x0023, 0x0054, 0, VR::ST, VM::M1, "" },
 };
-
-unsigned short Dict273TagHashTable[] = {
-    6,     9,    12,    15,    18,     0,     1,     0,    70,     1,
-    3,    73,     1,     2,    72,     1,     4,    80,     1,     1,
-   71,
+
+const unsigned short Dict280TagHashTable[] = {
+    7,     8,    11,     7,    14,    17,    20,     0,     1,     1,
+    8,     1,     2,    16,     1,     3,    22,     1,     5,    69,
+    3,     0,     1,     4,    67,     6,    84,
 };
 
-unsigned short Dict273KeyHashTable[] = {
-    5,     5,     6,     9,    12,     0,     1,     4, 51609,     1,
-    0, 61035,     3,     1, 15354,     2, 34163,     3, 64847,
+const unsigned short Dict280KeyHashTable[] = {
+    7,     7,     7,     7,     7,     8,     7,     0,     7,     0,
+  768,     1,   768,     2,   768,     3,   768,     4,   768,     5,
+  768,     6,   768,
 };
 
-vtkDICOMDictionary::Dict Dict273Data = {
-"SIEMENS MED PT WAVEFORM",
-5,
-5,
-Dict273TagHashTable,
-Dict273KeyHashTable,
-Dict273Contents
+vtkDICOMDictionary::Dict Dict280Data = {
+"AMICAS0",
+7,
+7,
+Dict280TagHashTable,
+Dict280KeyHashTable,
+Dict280Contents
 };
 
 // ----- RamSoft Custom Report Identifier -----
 
-DictEntry Dict274Contents[] = {
+const DictEntry Dict281Contents[] = {
 { 0x3113, 0x0010, 0, VR::OB, VM::M1, "BinaryDocument" },
 { 0x3113, 0x0020, 0, VR::UL, VM::M1, "BinaryDocumentSize" },
 };
 
-unsigned short Dict274TagHashTable[] = {
+const unsigned short Dict281TagHashTable[] = {
     2,     3,     0,     2,     0,    16,     1,    32,
 };
 
-unsigned short Dict274KeyHashTable[] = {
+const unsigned short Dict281KeyHashTable[] = {
     3,     6,     0,     1,     1, 16338,     1,     0, 28788,
 };
 
-vtkDICOMDictionary::Dict Dict274Data = {
+vtkDICOMDictionary::Dict Dict281Data = {
 "RamSoft Custom Report Identifier",
 2,
 2,
-Dict274TagHashTable,
-Dict274KeyHashTable,
-Dict274Contents
+Dict281TagHashTable,
+Dict281KeyHashTable,
+Dict281Contents
 };
 
 // ----- Applicare/RadWorks/Version 5.0 -----
 
-DictEntry Dict275Contents[] = {
+const DictEntry Dict282Contents[] = {
 { 0x3109, 0x0001, 0, VR::ST, VM::M1, "WorklistFilename" },
 { 0x3109, 0x0002, 0, VR::SH, VM::M1, "NewSeenStatus" },
 { 0x3109, 0x0003, 0, VR::CS, VM::M1, "DeleteLock" },
@@ -16530,7 +17261,7 @@ DictEntry Dict275Contents[] = {
 { 0x3109, 0x00EF, 0, VR::CS, VM::M1, "Action" },
 };
 
-unsigned short Dict275TagHashTable[] = {
+const unsigned short Dict282TagHashTable[] = {
    49,    52,    48,    48,    57,    60,    63,    66,    69,    72,
    75,    78,    81,    86,    91,    96,   101,   104,    48,   107,
   110,   115,   120,   123,   126,   131,   136,   141,   144,   149,
@@ -16551,7 +17282,7 @@ unsigned short Dict275TagHashTable[] = {
    17,     1,    14,    16,     1,    17,    19,     1,    16,    18,
 };
 
-unsigned short Dict275KeyHashTable[] = {
+const unsigned short Dict282KeyHashTable[] = {
    49,    52,    48,    48,    48,    55,    66,    48,    69,    72,
    48,    48,    77,    48,    80,    48,    83,    94,    99,   104,
    48,   107,   110,   113,   120,   125,   134,    48,    48,    48,
@@ -16572,18 +17303,18 @@ unsigned short Dict275KeyHashTable[] = {
 27686,     1,    13, 32764,
 };
 
-vtkDICOMDictionary::Dict Dict275Data = {
+vtkDICOMDictionary::Dict Dict282Data = {
 "Applicare/RadWorks/Version 5.0",
 48,
 48,
-Dict275TagHashTable,
-Dict275KeyHashTable,
-Dict275Contents
+Dict282TagHashTable,
+Dict282KeyHashTable,
+Dict282Contents
 };
 
 // ----- Voxar 2.16.124.113543.6003.1999.12.20.12.5.0 -----
 
-DictEntry Dict276Contents[] = {
+const DictEntry Dict283Contents[] = {
 { 0x1135, 0x0000, 0, VR::UI, VM::M1, "" },
 { 0x1135, 0x0001, 0, VR::OB, VM::M1, "" },
 { 0x1135, 0x0002, 0, VR::SQ, VM::M1, "" },
@@ -16600,7 +17331,7 @@ DictEntry Dict276Contents[] = {
 { 0x1135, 0x0021, 0, VR::UL, VM::M1, "" },
 };
 
-unsigned short Dict276TagHashTable[] = {
+const unsigned short Dict283TagHashTable[] = {
    14,    15,    20,    23,    26,    29,    34,    37,    40,    14,
    14,    43,    46,    51,     0,     2,     2,     2,     9,    20,
     1,    11,    23,     1,    10,    22,     1,     4,     7,     2,
@@ -16609,7 +17340,7 @@ unsigned short Dict276TagHashTable[] = {
    19,     1,     0,     0,
 };
 
-unsigned short Dict276KeyHashTable[] = {
+const unsigned short Dict283KeyHashTable[] = {
    14,    14,    14,    14,    14,    15,    14,    14,    14,    14,
    14,    14,    14,    14,     0,    14,     0,   384,     1,   384,
     2,   384,     3,   384,     4,   384,     5,   384,     6,   384,
@@ -16617,18 +17348,18 @@ unsigned short Dict276KeyHashTable[] = {
    12,   384,    13,   384,
 };
 
-vtkDICOMDictionary::Dict Dict276Data = {
+vtkDICOMDictionary::Dict Dict283Data = {
 "Voxar 2.16.124.113543.6003.1999.12.20.12.5.0",
 14,
 14,
-Dict276TagHashTable,
-Dict276KeyHashTable,
-Dict276Contents
+Dict283TagHashTable,
+Dict283KeyHashTable,
+Dict283Contents
 };
 
 // ----- astm.org/diconde/iod/NDEGeometry -----
 
-DictEntry Dict277Contents[] = {
+const DictEntry Dict284Contents[] = {
 { 0x0021, 0x0002, 0, VR::IS, VM::M1, "CoordinateSystemNumberOfAxes" },
 { 0x0021, 0x0004, 0, VR::SQ, VM::M1, "CoordinateSystemAxesSequence" },
 { 0x0021, 0x0006, 0, VR::ST, VM::M1, "CoordinateSystemAxisDescription" },
@@ -16646,7 +17377,7 @@ DictEntry Dict277Contents[] = {
 { 0x0021, 0x002C, 0, VR::DS, VM::M1TN, "CoordinateSystemTransformTranslationMatrix" },
 };
 
-unsigned short Dict277TagHashTable[] = {
+const unsigned short Dict284TagHashTable[] = {
    16,    19,    22,    25,    28,    31,    15,    36,    15,    41,
    15,    46,    15,    51,    15,     0,     1,     5,    12,     1,
     8,    32,     1,     6,    14,     1,     9,    34,     1,     7,
@@ -16655,7 +17386,7 @@ unsigned short Dict277TagHashTable[] = {
    42,     2,     4,    10,    14,    44,
 };
 
-unsigned short Dict277KeyHashTable[] = {
+const unsigned short Dict284KeyHashTable[] = {
    15,    16,    21,    24,    27,    15,    15,    32,    35,    42,
    15,    45,    15,    15,    50,     0,     2,     2,  8054,    11,
 11934,     1,     5,  5865,     1,     1, 39863,     2,     0, 19315,
@@ -16664,41 +17395,120 @@ unsigned short Dict277KeyHashTable[] = {
     2,     6, 14228,    10, 22782,
 };
 
-vtkDICOMDictionary::Dict Dict277Data = {
+vtkDICOMDictionary::Dict Dict284Data = {
 "astm.org/diconde/iod/NDEGeometry",
 15,
 15,
-Dict277TagHashTable,
-Dict277KeyHashTable,
-Dict277Contents
+Dict284TagHashTable,
+Dict284KeyHashTable,
+Dict284Contents
+};
+
+// ----- BRAINWAVE: 1.2.840.113819.3 -----
+
+const DictEntry Dict285Contents[] = {
+{ 0x2001, 0x0010, 0, VR::UI, VM::M1, "DICOMImplementationUID" },
+{ 0x2001, 0x0011, 0, VR::SH, VM::M1, "DICOMImplementationVersion" },
+{ 0x2001, 0x0012, 0, VR::UI, VM::M1, "WithinDICOMImplementationSOPInstanceUID" },
+{ 0x2001, 0x0013, 0, VR::SH, VM::M1, "ApplicationName" },
+{ 0x2001, 0x0014, 0, VR::SH, VM::M1, "ApplicationVersion" },
+{ 0x2001, 0x0015, 0, VR::SH, VM::M1, "CompatibilityVersion" },
+{ 0x2001, 0x0021, 0, VR::UI, VM::M1TN, "ReferencedSeriesUID" },
+{ 0x2001, 0x0031, 0, VR::US, VM::M1, "NumberOfObjectsAveraged" },
+{ 0x2001, 0x0041, 0, VR::US, VM::M1, "NumberOfExpectedTimePoints" },
+{ 0x2001, 0x0051, 0, VR::US, VM::M1, "NumberOfSlicesPerVolume" },
+{ 0x2001, 0x0060, 0, VR::US, VM::M1, "BWImageType" },
+{ 0x2001, 0x0061, 0, VR::US, VM::M1, "ExperimentType" },
+{ 0x2001, 0x0071, 0, VR::UI, VM::M1, "ParadigmUID" },
+{ 0x2001, 0x0072, 0, VR::LO, VM::M1, "ParadigmName" },
+{ 0x2001, 0x0073, 0, VR::ST, VM::M1, "ParadigmDescription" },
+{ 0x2001, 0x0080, 0, VR::OB, VM::M1, "Contrast" },
+{ 0x2001, 0x0081, 0, VR::FL, VM::M1TN, "RegressorValues" },
+{ 0x2001, 0x0086, 0, VR::US, VM::M1, "NumberOfDegreesOfFreedom" },
+{ 0x2001, 0x008A, 0, VR::FL, VM::M1, "ZThreshold" },
+{ 0x2001, 0x008B, 0, VR::FL, VM::M1, "PThreshold" },
+{ 0x2001, 0x0090, 0, VR::OB, VM::M1, "ProcessingParameters" },
+{ 0x2001, 0x0091, 0, VR::OB, VM::M1, "MotionPlot" },
+{ 0x2001, 0x0092, 0, VR::OB, VM::M1, "ROIs" },
+{ 0x2001, 0x0093, 0, VR::OB, VM::M1, "Tracts" },
+{ 0x2001, 0x0094, 0, VR::OB, VM::M1, "Report" },
+{ 0x2001, 0x0095, 0, VR::OB, VM::M1, "ResponseData" },
+{ 0x2001, 0x0096, 0, VR::OB, VM::M1, "DesignMatrix" },
+{ 0x2001, 0x0097, 0, VR::FL, VM::M1TN, "QualityMetrics" },
+{ 0x2001, 0x00A0, 0, VR::FL, VM::M1TN, "MotionParameters" },
+{ 0x2001, 0x00A1, 0, VR::FL, VM::M1TN, "RegistrationParameters" },
+{ 0x2001, 0x00A2, 0, VR::FL, VM::M1TN, "SubjectData" },
+{ 0x2001, 0x00B0, 0, VR::OB, VM::M1, "DTIParameters" },
+{ 0x2001, 0x00C0, 0, VR::OB, VM::M1, "ParadigmInfo" },
+};
+
+const unsigned short Dict285TagHashTable[] = {
+   33,    34,    37,    40,    33,    33,    33,    33,    45,    50,
+   53,    58,    33,    61,    33,    33,    64,    67,    70,    73,
+   80,    85,    88,    91,    94,    99,   104,   109,   112,   115,
+  118,   121,    33,     0,     1,    10,    96,     1,    11,    97,
+    2,     6,    33,     8,    65,     2,    30,   162,    32,   192,
+    1,    29,   161,     2,    16,   129,    28,   160,     1,    15,
+  128,     1,    17,   134,     1,    19,   139,     1,    18,   138,
+    1,    12,   113,     3,     7,    49,     9,    81,    13,   114,
+    2,     1,    17,    14,   115,     1,     0,    16,     1,     3,
+   19,     1,     2,    18,     2,     5,    21,    23,   147,     2,
+    4,    20,    22,   146,     2,    21,   145,    31,   176,     1,
+   20,   144,     1,    27,   151,     1,    26,   150,     1,    25,
+  149,     1,    24,   148,
+};
+
+const unsigned short Dict285KeyHashTable[] = {
+   34,    37,    33,    33,    42,    33,    51,    33,    54,    33,
+   57,    60,    65,    72,    75,    33,    33,    82,    87,    90,
+   93,    33,    33,    96,    33,    99,   104,   107,   110,   113,
+   33,   116,   119,     0,     1,    18, 60524,     2,    26,   883,
+   31, 24793,     4,     0, 61333,     7, 38376,    27,  4897,    28,
+10251,     1,    32, 51312,     1,    29, 41996,     1,    19, 23448,
+    2,     5, 29882,    11, 46877,     3,    17, 57709,    22, 10678,
+   23, 18186,     1,    24, 13940,     3,     1, 24399,    12, 61310,
+   21, 59116,     2,     4, 37294,     8, 22544,     1,    10,  7665,
+    1,     2, 56256,     1,    25,  2202,     1,    20, 20031,     2,
+    3, 39873,     9, 24844,     1,    15, 37913,     1,    14, 51987,
+    1,    16, 42645,     1,    13, 56334,     1,    30, 33808,     1,
+    6, 56805,
+};
+
+vtkDICOMDictionary::Dict Dict285Data = {
+"BRAINWAVE: 1.2.840.113819.3",
+33,
+33,
+Dict285TagHashTable,
+Dict285KeyHashTable,
+Dict285Contents
 };
 
 // ----- GEMS_CT_VES_01 -----
 
-DictEntry Dict278Contents[] = {
+const DictEntry Dict286Contents[] = {
 { 0x0051, 0x1001, 0, VR::SQ, VM::M1, "CTVESSequence" },
 };
 
-unsigned short Dict278TagHashTable[] = {
+const unsigned short Dict286TagHashTable[] = {
     2,     0,     1,     0,  4097,
 };
 
-unsigned short Dict278KeyHashTable[] = {
+const unsigned short Dict286KeyHashTable[] = {
     2,     0,     1,     0, 32067,
 };
 
-vtkDICOMDictionary::Dict Dict278Data = {
+vtkDICOMDictionary::Dict Dict286Data = {
 "GEMS_CT_VES_01",
 1,
 1,
-Dict278TagHashTable,
-Dict278KeyHashTable,
-Dict278Contents
+Dict286TagHashTable,
+Dict286KeyHashTable,
+Dict286Contents
 };
 
 // ----- AMI Sequence Annotations_01 -----
 
-DictEntry Dict279Contents[] = {
+const DictEntry Dict287Contents[] = {
 { 0x3103, 0x0010, 0, VR::CS, VM::M1, "AnnotationSequence" },
 { 0x3103, 0x0020, 0, VR::UI, VM::M1, "AnnotationUID" },
 { 0x3103, 0x0030, 0, VR::US, VM::M1, "AnnotationColor" },
@@ -16714,7 +17524,7 @@ DictEntry Dict279Contents[] = {
 { 0x3103, 0x00E0, 0, VR::US, VM::M1, "AnnotationFrameNumber" },
 };
 
-unsigned short Dict279TagHashTable[] = {
+const unsigned short Dict287TagHashTable[] = {
    13,    13,    13,    14,    13,    13,    19,    13,    13,    28,
    13,    13,    37,     0,     2,     6,   128,    10,   192,     4,
     0,    16,     3,    80,     7,   144,    11,   208,     4,     1,
@@ -16722,7 +17532,7 @@ unsigned short Dict279TagHashTable[] = {
     5,   112,     9,   176,
 };
 
-unsigned short Dict279KeyHashTable[] = {
+const unsigned short Dict287KeyHashTable[] = {
    13,    14,    17,    20,    23,    28,    31,    34,    13,    37,
    42,    47,    13,     0,     1,     1, 40997,     1,     2,  9937,
     1,     9, 18917,     2,    10,  9359,    12, 45136,     1,     0,
@@ -16730,18 +17540,18 @@ unsigned short Dict279KeyHashTable[] = {
     8, 39570,     2,     4, 58303,     6, 14270,     1,    11, 12683,
 };
 
-vtkDICOMDictionary::Dict Dict279Data = {
+vtkDICOMDictionary::Dict Dict287Data = {
 "AMI Sequence Annotations_01",
 13,
 13,
-Dict279TagHashTable,
-Dict279KeyHashTable,
-Dict279Contents
+Dict287TagHashTable,
+Dict287KeyHashTable,
+Dict287Contents
 };
 
 // ----- AMI Sequence Annotations_02 -----
 
-DictEntry Dict280Contents[] = {
+const DictEntry Dict288Contents[] = {
 { 0x3103, 0x0010, 0, VR::CS, VM::M1, "AnnotationSequence" },
 { 0x3103, 0x0020, 0, VR::UI, VM::M1, "AnnotationUID" },
 { 0x3103, 0x0030, 0, VR::US, VM::M1, "AnnotationColor" },
@@ -16757,7 +17567,7 @@ DictEntry Dict280Contents[] = {
 { 0x3103, 0x00E0, 0, VR::US, VM::M1, "AnnotationFrameNumber" },
 };
 
-unsigned short Dict280TagHashTable[] = {
+const unsigned short Dict288TagHashTable[] = {
    13,    13,    13,    14,    13,    13,    19,    13,    13,    28,
    13,    13,    37,     0,     2,     6,   128,    10,   192,     4,
     0,    16,     3,    80,     7,   144,    11,   208,     4,     1,
@@ -16765,7 +17575,7 @@ unsigned short Dict280TagHashTable[] = {
     5,   112,     9,   176,
 };
 
-unsigned short Dict280KeyHashTable[] = {
+const unsigned short Dict288KeyHashTable[] = {
    13,    14,    19,    22,    25,    30,    33,    36,    13,    39,
    44,    13,    13,     0,     2,     1, 40997,    11, 48691,     1,
     2,  9937,     1,     9, 18917,     2,    10,  9359,    12, 45136,
@@ -16773,41 +17583,41 @@ unsigned short Dict280KeyHashTable[] = {
     7, 55037,     8, 39570,     2,     4, 58303,     6, 14270,
 };
 
-vtkDICOMDictionary::Dict Dict280Data = {
+vtkDICOMDictionary::Dict Dict288Data = {
 "AMI Sequence Annotations_02",
 13,
 13,
-Dict280TagHashTable,
-Dict280KeyHashTable,
-Dict280Contents
+Dict288TagHashTable,
+Dict288KeyHashTable,
+Dict288Contents
 };
 
 // ----- GE LUT Asymmetry Parameter -----
 
-DictEntry Dict281Contents[] = {
+const DictEntry Dict289Contents[] = {
 { 0x0045, 0x0067, 0, VR::DS, VM::M1, "LUTAssymetry" },
 };
 
-unsigned short Dict281TagHashTable[] = {
+const unsigned short Dict289TagHashTable[] = {
     2,     0,     1,     0,   103,
 };
 
-unsigned short Dict281KeyHashTable[] = {
+const unsigned short Dict289KeyHashTable[] = {
     2,     0,     1,     0, 59819,
 };
 
-vtkDICOMDictionary::Dict Dict281Data = {
+vtkDICOMDictionary::Dict Dict289Data = {
 "GE LUT Asymmetry Parameter",
 1,
 1,
-Dict281TagHashTable,
-Dict281KeyHashTable,
-Dict281Contents
+Dict289TagHashTable,
+Dict289KeyHashTable,
+Dict289Contents
 };
 
 // ----- ACUSON:1.2.840.113680.1.0:0910 -----
 
-DictEntry Dict282Contents[] = {
+const DictEntry Dict290Contents[] = {
 { 0x0009, 0x0000, 0, VR::IS, VM::M1, "" },
 { 0x0009, 0x0001, 0, VR::IS, VM::M1, "" },
 { 0x0009, 0x0002, 0, VR::LO, VM::M1, "PatientRegistrationCustomField1" },
@@ -16816,137 +17626,137 @@ DictEntry Dict282Contents[] = {
 { 0x0009, 0x000f, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict282TagHashTable[] = {
+const unsigned short Dict290TagHashTable[] = {
     7,    10,    13,    16,    19,    22,     0,     1,     5,    15,
     1,     4,     4,     1,     1,     1,     1,     0,     0,     1,
     3,     3,     1,     2,     2,
 };
 
-unsigned short Dict282KeyHashTable[] = {
+const unsigned short Dict290KeyHashTable[] = {
     7,     6,     6,     6,    10,    13,     0,     1,     3,  2065,
     1,     4,  8233,     4,     0,   896,     1,   896,     2,  2064,
     5,   896,
 };
 
-vtkDICOMDictionary::Dict Dict282Data = {
+vtkDICOMDictionary::Dict Dict290Data = {
 "ACUSON:1.2.840.113680.1.0:0910",
 6,
 6,
-Dict282TagHashTable,
-Dict282KeyHashTable,
-Dict282Contents
+Dict290TagHashTable,
+Dict290KeyHashTable,
+Dict290Contents
 };
 
 // ----- MATAKINA_10 -----
 
-DictEntry Dict283Contents[] = {
+const DictEntry Dict291Contents[] = {
 { 0x0015, 0x0028, 0, VR::LO, VM::M1, "VolparaDensityGrade" },
 { 0x0015, 0x0029, 0, VR::LT, VM::M1, "VolparaRunInformation" },
 { 0x0015, 0x0030, 0, VR::LO, VM::M1, "VolparaDensityGradeCutoffs" },
 };
 
-unsigned short Dict283TagHashTable[] = {
+const unsigned short Dict291TagHashTable[] = {
     4,     7,     3,     0,     1,     1,    41,     2,     0,    40,
     2,    48,
 };
 
-unsigned short Dict283KeyHashTable[] = {
+const unsigned short Dict291KeyHashTable[] = {
     4,     3,     7,     0,     1,     2, 49309,     2,     0, 48841,
     1, 31377,
 };
 
-vtkDICOMDictionary::Dict Dict283Data = {
+vtkDICOMDictionary::Dict Dict291Data = {
 "MATAKINA_10",
 3,
 3,
-Dict283TagHashTable,
-Dict283KeyHashTable,
-Dict283Contents
+Dict291TagHashTable,
+Dict291KeyHashTable,
+Dict291Contents
 };
 
 // ----- SIEMENS CT VA0  OST -----
 
-DictEntry Dict284Contents[] = {
+const DictEntry Dict292Contents[] = {
 { 0x6021, 0x0000, 0, VR::LO, VM::M1, "OsteoContourComment" },
 { 0x6021, 0x0010, 0, VR::US, VM::M256, "OsteoContourBuffer" },
 };
 
-unsigned short Dict284TagHashTable[] = {
+const unsigned short Dict292TagHashTable[] = {
     2,     3,     0,     2,     0,     0,     1,    16,
 };
 
-unsigned short Dict284KeyHashTable[] = {
+const unsigned short Dict292KeyHashTable[] = {
     3,     6,     0,     1,     0, 64726,     1,     1, 37913,
 };
 
-vtkDICOMDictionary::Dict Dict284Data = {
+vtkDICOMDictionary::Dict Dict292Data = {
 "SIEMENS CT VA0  OST",
 2,
 2,
-Dict284TagHashTable,
-Dict284KeyHashTable,
-Dict284Contents
+Dict292TagHashTable,
+Dict292KeyHashTable,
+Dict292Contents
 };
 
 // ----- SIEMENS MED DISPLAY 0000 -----
 
-DictEntry Dict285Contents[] = {
+const DictEntry Dict293Contents[] = {
 { 0x0029, 0x0099, 0, VR::CS, VM::M1, "" },
 { 0x0029, 0x00b0, 0, VR::US, VM::M1, "" },
 { 0x0029, 0x00b2, 0, VR::US, VM::M1TN, "" },
 { 0x0029, 0x00c1, 0, VR::US, VM::M1TN, "" },
 };
 
-unsigned short Dict285TagHashTable[] = {
+const unsigned short Dict293TagHashTable[] = {
     4,     5,     8,    11,     0,     1,     2,   178,     1,     0,
   153,     2,     1,   176,     3,   193,
 };
 
-unsigned short Dict285KeyHashTable[] = {
+const unsigned short Dict293KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict285Data = {
+vtkDICOMDictionary::Dict Dict293Data = {
 "SIEMENS MED DISPLAY 0000",
 4,
 4,
-Dict285TagHashTable,
-Dict285KeyHashTable,
-Dict285Contents
+Dict293TagHashTable,
+Dict293KeyHashTable,
+Dict293Contents
 };
 
 // ----- SIEMENS MED DISPLAY 0001 -----
 
-DictEntry Dict286Contents[] = {
+const DictEntry Dict294Contents[] = {
 { 0x0029, 0x0099, 0, VR::CS, VM::M1, "" },
 { 0x0029, 0x00a0, 0, VR::US, VM::M1, "" },
 { 0x0029, 0x00a1, 0, VR::US, VM::M1, "" },
 { 0x0029, 0x00a2, 0, VR::US, VM::M1TN, "" },
 };
 
-unsigned short Dict286TagHashTable[] = {
+const unsigned short Dict294TagHashTable[] = {
     4,     5,     8,    13,     0,     1,     3,   162,     2,     0,
   153,     2,   161,     1,     1,   160,
 };
 
-unsigned short Dict286KeyHashTable[] = {
+const unsigned short Dict294KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict286Data = {
+vtkDICOMDictionary::Dict Dict294Data = {
 "SIEMENS MED DISPLAY 0001",
 4,
 4,
-Dict286TagHashTable,
-Dict286KeyHashTable,
-Dict286Contents
+Dict294TagHashTable,
+Dict294KeyHashTable,
+Dict294Contents
 };
 
 // ----- Picker NM Private Group -----
 
-DictEntry Dict287Contents[] = {
+const DictEntry Dict295Contents[] = {
 { 0x7001, 0x0001, 0, VR::UI, VM::M1, "" },
 { 0x7001, 0x0002, 0, VR::OB, VM::M1, "" },
 { 0x7001, 0x0003, 0, VR::OB, VM::M1, "" },
@@ -16965,7 +17775,7 @@ DictEntry Dict287Contents[] = {
 { 0x7001, 0x0017, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict287TagHashTable[] = {
+const unsigned short Dict295TagHashTable[] = {
    17,    22,    25,    30,    35,    38,    43,    48,    53,    56,
    16,    16,    16,    16,    16,    16,     0,     2,     0,     1,
    10,    17,     1,     9,    16,     2,     2,     3,    12,    19,
@@ -16974,7 +17784,7 @@ unsigned short Dict287TagHashTable[] = {
     6,    14,    22,     1,     8,     9,     1,     7,     8,
 };
 
-unsigned short Dict287KeyHashTable[] = {
+const unsigned short Dict295KeyHashTable[] = {
    16,    16,    16,    16,    16,    17,    16,    16,    16,    16,
    16,    16,    16,    16,    16,    16,     0,    16,     0,   336,
     1,   336,     2,   336,     3,   336,     4,   336,     5,   336,
@@ -16982,18 +17792,18 @@ unsigned short Dict287KeyHashTable[] = {
    11,   336,    12,   336,    13,   336,    14,   336,    15,   336,
 };
 
-vtkDICOMDictionary::Dict Dict287Data = {
+vtkDICOMDictionary::Dict Dict295Data = {
 "Picker NM Private Group",
 16,
 16,
-Dict287TagHashTable,
-Dict287KeyHashTable,
-Dict287Contents
+Dict295TagHashTable,
+Dict295KeyHashTable,
+Dict295Contents
 };
 
 // ----- PHILIPS MR SPECTRO;1 -----
 
-DictEntry Dict288Contents[] = {
+const DictEntry Dict296Contents[] = {
 { 0x0019, 0x0001, 0, VR::US, VM::M1, "" },
 { 0x0019, 0x0002, 0, VR::US, VM::M1, "" },
 { 0x0019, 0x0003, 0, VR::US, VM::M1, "" },
@@ -17046,7 +17856,7 @@ DictEntry Dict288Contents[] = {
 { 0x0019, 0x0080, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict288TagHashTable[] = {
+const unsigned short Dict296TagHashTable[] = {
    50,    51,    50,    50,    54,    57,    62,    67,    72,    77,
    82,    89,    96,   101,   106,   109,   112,   115,    50,    50,
   118,   121,   124,    50,   127,    50,   130,   133,   136,   139,
@@ -17068,7 +17878,7 @@ unsigned short Dict288TagHashTable[] = {
     1,    26,    41,     1,    25,    40,
 };
 
-unsigned short Dict288KeyHashTable[] = {
+const unsigned short Dict296KeyHashTable[] = {
    50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
    50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
    50,    50,    50,    50,    50,    50,    50,    50,    50,    50,
@@ -17087,18 +17897,18 @@ unsigned short Dict288KeyHashTable[] = {
    49,   107,
 };
 
-vtkDICOMDictionary::Dict Dict288Data = {
+vtkDICOMDictionary::Dict Dict296Data = {
 "PHILIPS MR SPECTRO;1",
 50,
 50,
-Dict288TagHashTable,
-Dict288KeyHashTable,
-Dict288Contents
+Dict296TagHashTable,
+Dict296KeyHashTable,
+Dict296Contents
 };
 
 // ----- astm.org/diconde/iod/NdeIndication -----
 
-DictEntry Dict289Contents[] = {
+const DictEntry Dict297Contents[] = {
 { 0x0021, 0x0002, 0, VR::SQ, VM::M1, "EvaluatorSequence" },
 { 0x0021, 0x0004, 0, VR::IS, VM::M1, "EvaluatorNumber" },
 { 0x0021, 0x0006, 0, VR::PN, VM::M1, "EvaluatorName" },
@@ -17114,7 +17924,7 @@ DictEntry Dict289Contents[] = {
 { 0x0021, 0x0032, 0, VR::SH, VM::M1, "PropertyLabel" },
 };
 
-unsigned short Dict289TagHashTable[] = {
+const unsigned short Dict297TagHashTable[] = {
    14,    17,    20,    23,    26,    29,    32,    35,    13,    38,
    13,    43,    48,     0,     1,     2,     6,     1,     5,    20,
     1,     3,     8,     1,     6,    22,     1,    11,    48,     1,
@@ -17123,7 +17933,7 @@ unsigned short Dict289TagHashTable[] = {
    18,
 };
 
-unsigned short Dict289KeyHashTable[] = {
+const unsigned short Dict297KeyHashTable[] = {
    14,    13,    17,    22,    13,    13,    31,    34,    39,    42,
    13,    13,    45,     0,     1,     4, 37280,     2,     5, 46406,
    11, 43872,     4,     0, 15814,     1, 23990,     7, 58856,     8,
@@ -17131,46 +17941,46 @@ unsigned short Dict289KeyHashTable[] = {
     9, 35076,     1,     3, 33727,     1,     2, 53665,
 };
 
-vtkDICOMDictionary::Dict Dict289Data = {
+vtkDICOMDictionary::Dict Dict297Data = {
 "astm.org/diconde/iod/NdeIndication",
 13,
 13,
-Dict289TagHashTable,
-Dict289KeyHashTable,
-Dict289Contents
+Dict297TagHashTable,
+Dict297KeyHashTable,
+Dict297Contents
 };
 
 // ----- GEMS_LUNAR_RAW -----
 
-DictEntry Dict290Contents[] = {
+const DictEntry Dict298Contents[] = {
 { 0x7003, 0x0001, 0, VR::ST, VM::M1, "enCOREFileName" },
 { 0x7003, 0x0002, 0, VR::OB, VM::M1, "enCOREFileData" },
 { 0x7003, 0x0003, 0, VR::UL, VM::M1, "enCOREFileLength" },
 { 0x7003, 0x0004, 0, VR::LO, VM::M1, "enCOREFileModifiedTime" },
 };
 
-unsigned short Dict290TagHashTable[] = {
+const unsigned short Dict298TagHashTable[] = {
     5,     8,    11,    14,     0,     1,     2,     3,     1,     1,
     2,     1,     0,     1,     1,     3,     4,
 };
 
-unsigned short Dict290KeyHashTable[] = {
+const unsigned short Dict298KeyHashTable[] = {
     4,     5,     8,    11,     0,     1,     3, 47668,     1,     0,
 24392,     2,     1,   142,     2,   168,
 };
 
-vtkDICOMDictionary::Dict Dict290Data = {
+vtkDICOMDictionary::Dict Dict298Data = {
 "GEMS_LUNAR_RAW",
 4,
 4,
-Dict290TagHashTable,
-Dict290KeyHashTable,
-Dict290Contents
+Dict298TagHashTable,
+Dict298KeyHashTable,
+Dict298Contents
 };
 
 // ----- PRIVATE_CODE_STRING_3007 -----
 
-DictEntry Dict291Contents[] = {
+const DictEntry Dict299Contents[] = {
 { 0x3007, 0x0000, 0, VR::FD, VM::M16, "VolumeToPatientMatrix" },
 { 0x3007, 0x0001, 0, VR::FD, VM::M16, "VolumeResolutionConversion" },
 { 0x3007, 0x0002, 0, VR::FD, VM::M16, "VolumeDataConversion" },
@@ -17178,29 +17988,52 @@ DictEntry Dict291Contents[] = {
 { 0x3007, 0x0004, 0, VR::FD, VM::M16, "DICOMDataConversion" },
 };
 
-unsigned short Dict291TagHashTable[] = {
+const unsigned short Dict299TagHashTable[] = {
     6,     9,    12,    15,    18,     0,     1,     2,     2,     1,
     1,     1,     1,     0,     0,     1,     4,     4,     1,     3,
     3,
 };
 
-unsigned short Dict291KeyHashTable[] = {
+const unsigned short Dict299KeyHashTable[] = {
     6,    11,    14,     5,    17,     0,     2,     2, 61209,     4,
 10045,     1,     0, 45781,     1,     1, 59953,     1,     3, 41758,
 };
 
-vtkDICOMDictionary::Dict Dict291Data = {
+vtkDICOMDictionary::Dict Dict299Data = {
 "PRIVATE_CODE_STRING_3007",
 5,
 5,
-Dict291TagHashTable,
-Dict291KeyHashTable,
-Dict291Contents
+Dict299TagHashTable,
+Dict299KeyHashTable,
+Dict299Contents
+};
+
+// ----- TELEMIS -----
+
+const DictEntry Dict300Contents[] = {
+{ 0x0029, 0x0004, 0, VR::US, VM::M1, "" },
+};
+
+const unsigned short Dict300TagHashTable[] = {
+    2,     0,     1,     0,     4,
+};
+
+const unsigned short Dict300KeyHashTable[] = {
+    2,     0,     1,     0,  5381,
+};
+
+vtkDICOMDictionary::Dict Dict300Data = {
+"TELEMIS",
+1,
+1,
+Dict300TagHashTable,
+Dict300KeyHashTable,
+Dict300Contents
 };
 
 // ----- SIEMENS Selma -----
 
-DictEntry Dict292Contents[] = {
+const DictEntry Dict301Contents[] = {
 { 0x0019, 0x0006, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0007, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0008, 0, VR::IS, VM::M1, "" },
@@ -17214,7 +18047,7 @@ DictEntry Dict292Contents[] = {
 { 0x0019, 0x0035, 0, VR::US, VM::M1, "" },
 };
 
-unsigned short Dict292TagHashTable[] = {
+const unsigned short Dict301TagHashTable[] = {
    12,    15,    11,    11,    18,    11,    21,    24,    27,    34,
    39,     0,     1,    10,    53,     1,     9,    52,     1,     4,
    41,     1,     2,     8,     1,     6,    49,     3,     1,     7,
@@ -17222,76 +18055,76 @@ unsigned short Dict292TagHashTable[] = {
     7,    50,
 };
 
-unsigned short Dict292KeyHashTable[] = {
+const unsigned short Dict301KeyHashTable[] = {
    11,    11,    12,    11,    11,    11,    11,    11,    11,    11,
    11,     0,    11,     0,   489,     1,   489,     2,   489,     3,
   489,     4,   489,     5,   489,     6,   489,     7,   489,     8,
   489,     9,   489,    10,   489,
 };
 
-vtkDICOMDictionary::Dict Dict292Data = {
+vtkDICOMDictionary::Dict Dict301Data = {
 "SIEMENS Selma",
 11,
 11,
-Dict292TagHashTable,
-Dict292KeyHashTable,
-Dict292Contents
+Dict301TagHashTable,
+Dict301KeyHashTable,
+Dict301Contents
 };
 
 // ----- ETIAM DICOMDIR -----
 
-DictEntry Dict293Contents[] = {
+const DictEntry Dict302Contents[] = {
 { 0x0859, 0x0040, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict293TagHashTable[] = {
+const unsigned short Dict302TagHashTable[] = {
     2,     0,     1,     0,    64,
 };
 
-unsigned short Dict293KeyHashTable[] = {
+const unsigned short Dict302KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict293Data = {
+vtkDICOMDictionary::Dict Dict302Data = {
 "ETIAM DICOMDIR",
 1,
 1,
-Dict293TagHashTable,
-Dict293KeyHashTable,
-Dict293Contents
+Dict302TagHashTable,
+Dict302KeyHashTable,
+Dict302Contents
 };
 
 // ----- MAROTECH Inc. -----
 
-DictEntry Dict294Contents[] = {
+const DictEntry Dict303Contents[] = {
 { 0x0037, 0x0001, 0, VR::LO, VM::M1, "" },
 { 0x0037, 0x0021, 0, VR::US, VM::M1, "" },
 { 0x0037, 0x0022, 0, VR::US, VM::M1, "" },
 { 0x0037, 0x0023, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict294TagHashTable[] = {
+const unsigned short Dict303TagHashTable[] = {
     5,     8,    11,     4,     0,     1,     3,    35,     1,     2,
    34,     2,     0,     1,     1,    33,
 };
 
-unsigned short Dict294KeyHashTable[] = {
+const unsigned short Dict303KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict294Data = {
+vtkDICOMDictionary::Dict Dict303Data = {
 "MAROTECH Inc.",
 4,
 4,
-Dict294TagHashTable,
-Dict294KeyHashTable,
-Dict294Contents
+Dict303TagHashTable,
+Dict303KeyHashTable,
+Dict303Contents
 };
 
 // ----- GEMS_DL_FRAME_01 -----
 
-DictEntry Dict295Contents[] = {
+const DictEntry Dict304Contents[] = {
 { 0x0025, 0x0002, 0, VR::IS, VM::M1, "FrameID" },
 { 0x0025, 0x0003, 0, VR::DS, VM::M1, "DistanceSourceToDetector" },
 { 0x0025, 0x0004, 0, VR::DS, VM::M1, "DistanceSourceToPatient" },
@@ -17305,7 +18138,7 @@ DictEntry Dict295Contents[] = {
 { 0x0025, 0x001A, 0, VR::DS, VM::M1, "ArcAngle" },
 { 0x0025, 0x001B, 0, VR::DS, VM::M1, "TableVerticalPosition" },
 { 0x0025, 0x001C, 0, VR::DS, VM::M1, "TableLongitudinalPosition" },
-{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "Table Lateral Position" },
+{ 0x0025, 0x001D, 0, VR::DS, VM::M1, "TableLateralPosition" },
 { 0x0025, 0x001E, 0, VR::IS, VM::M1, "BeamCoverArea" },
 { 0x0025, 0x001F, 0, VR::DS, VM::M1, "kVPActual" },
 { 0x0025, 0x0020, 0, VR::DS, VM::M1, "mASActual" },
@@ -17337,7 +18170,7 @@ DictEntry Dict295Contents[] = {
 { 0x0025, 0x003C, 0, VR::CS, VM::M1, "InternalLabelFrame" },
 };
 
-unsigned short Dict295TagHashTable[] = {
+const unsigned short Dict304TagHashTable[] = {
    44,    47,    52,    57,    60,    65,    68,    71,    74,    77,
    80,    85,    88,    91,    96,   101,   106,   111,   114,   117,
   122,   125,   128,    43,    43,   131,    43,    43,   134,   137,
@@ -17357,16 +18190,16 @@ unsigned short Dict295TagHashTable[] = {
     3,     1,     0,     2,
 };
 
-unsigned short Dict295KeyHashTable[] = {
+const unsigned short Dict304KeyHashTable[] = {
    44,    47,    50,    43,    55,    43,    60,    63,    43,    43,
-   43,    66,    69,    72,    79,    43,    82,    43,    85,    88,
+   66,    69,    72,    75,    82,    43,    43,    43,    85,    88,
    91,    94,    99,   104,   113,    43,   116,   119,   122,    43,
   127,   132,    43,   135,   138,   141,   144,   147,   150,   153,
    43,   158,    43,     0,     1,     7, 13416,     1,    38, 17788,
     2,     4, 42862,    19, 45860,     2,    24, 39748,    39, 43540,
-    1,    34, 47277,     1,    15, 54363,     1,    37, 25091,     1,
-   33, 49284,     3,    27, 43570,    29, 54804,    30,  8248,     1,
-    2, 34881,     1,    13, 48517,     1,     3, 27637,     1,    17,
+    1,    34, 47277,     1,    15, 54363,     1,    13, 55351,     1,
+   37, 25091,     1,    33, 49284,     3,    27, 43570,    29, 54804,
+   30,  8248,     1,     2, 34881,     1,     3, 27637,     1,    17,
  1305,     1,    12,  3080,     2,    10, 47879,    41, 28484,     2,
     0, 39765,    42, 39045,     4,    18,  6901,    22, 34119,    25,
 56972,    31, 54562,     1,    32, 46650,     1,    28, 10917,     1,
@@ -17377,41 +18210,41 @@ unsigned short Dict295KeyHashTable[] = {
 46905,
 };
 
-vtkDICOMDictionary::Dict Dict295Data = {
+vtkDICOMDictionary::Dict Dict304Data = {
 "GEMS_DL_FRAME_01",
 43,
 43,
-Dict295TagHashTable,
-Dict295KeyHashTable,
-Dict295Contents
+Dict304TagHashTable,
+Dict304KeyHashTable,
+Dict304Contents
 };
 
 // ----- PHILIPS MR/PART 12 -----
 
-DictEntry Dict296Contents[] = {
+const DictEntry Dict305Contents[] = {
 { 0x0009, 0x0010, 0, VR::US, VM::M1, "" },
 };
 
-unsigned short Dict296TagHashTable[] = {
+const unsigned short Dict305TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict296KeyHashTable[] = {
+const unsigned short Dict305KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict296Data = {
+vtkDICOMDictionary::Dict Dict305Data = {
 "PHILIPS MR/PART 12",
 1,
 1,
-Dict296TagHashTable,
-Dict296KeyHashTable,
-Dict296Contents
+Dict305TagHashTable,
+Dict305KeyHashTable,
+Dict305Contents
 };
 
 // ----- SIEMENS MR N3D -----
 
-DictEntry Dict297Contents[] = {
+const DictEntry Dict306Contents[] = {
 { 0x0021, 0x0030, 0, VR::SQ, VM::M1, "BackgroundColorDRSequence" },
 { 0x0021, 0x0031, 0, VR::DS, VM::M3, "BackgroundColor" },
 { 0x0021, 0x0036, 0, VR::SQ, VM::M1, "FieldMapDRSequence" },
@@ -17524,7 +18357,7 @@ DictEntry Dict297Contents[] = {
 { 0x0021, 0x00C2, 0, VR::CS, VM::M1, "CurrentActivePlane" },
 };
 
-unsigned short Dict297TagHashTable[] = {
+const unsigned short Dict306TagHashTable[] = {
   111,   110,   114,   117,   120,   125,   128,   133,   138,   141,
   144,   147,   150,   153,   110,   110,   156,   159,   162,   165,
   168,   171,   174,   179,   184,   189,   194,   199,   204,   207,
@@ -17569,7 +18402,7 @@ unsigned short Dict297TagHashTable[] = {
     1,    14,    75,     1,    15,    76,     1,    16,    77,
 };
 
-unsigned short Dict297KeyHashTable[] = {
+const unsigned short Dict306KeyHashTable[] = {
   111,   114,   119,   122,   131,   134,   139,   110,   110,   110,
   110,   110,   142,   110,   147,   110,   152,   110,   155,   158,
   161,   110,   164,   167,   170,   173,   110,   176,   179,   188,
@@ -17613,18 +18446,18 @@ unsigned short Dict297KeyHashTable[] = {
 16233,    25, 10468,    63, 36589,
 };
 
-vtkDICOMDictionary::Dict Dict297Data = {
+vtkDICOMDictionary::Dict Dict306Data = {
 "SIEMENS MR N3D",
 110,
 110,
-Dict297TagHashTable,
-Dict297KeyHashTable,
-Dict297Contents
+Dict306TagHashTable,
+Dict306KeyHashTable,
+Dict306Contents
 };
 
 // ----- Camtronics image level data -----
 
-DictEntry Dict298Contents[] = {
+const DictEntry Dict307Contents[] = {
 { 0x0009, 0x0004, 0, VR::IS, VM::M1, "" },
 { 0x0009, 0x0006, 0, VR::IS, VM::M1, "" },
 { 0x0009, 0x0009, 0, VR::LO, VM::M1, "" },
@@ -17633,29 +18466,29 @@ DictEntry Dict298Contents[] = {
 { 0x0009, 0x0018, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict298TagHashTable[] = {
+const unsigned short Dict307TagHashTable[] = {
     7,    12,     6,    17,     6,    20,     0,     2,     2,     9,
     4,    23,     2,     0,     4,     3,    22,     1,     1,     6,
     1,     5,    24,
 };
 
-unsigned short Dict298KeyHashTable[] = {
+const unsigned short Dict307KeyHashTable[] = {
     6,     6,     6,     6,     6,     7,     0,     6,     0,   896,
     1,   896,     2,   896,     3,   896,     4,   896,     5,   896,
 };
 
-vtkDICOMDictionary::Dict Dict298Data = {
+vtkDICOMDictionary::Dict Dict307Data = {
 "Camtronics image level data",
 6,
 6,
-Dict298TagHashTable,
-Dict298KeyHashTable,
-Dict298Contents
+Dict307TagHashTable,
+Dict307KeyHashTable,
+Dict307Contents
 };
 
 // ----- SIEMENS MED HG -----
 
-DictEntry Dict299Contents[] = {
+const DictEntry Dict308Contents[] = {
 { 0x0029, 0x0010, 0, VR::US, VM::M1, "ListOfGroupNumbers" },
 { 0x0029, 0x0015, 0, VR::LO, VM::M1, "ListOfShadowOwnerCodes" },
 { 0x0029, 0x0020, 0, VR::US, VM::M1, "ListOfElementNumbers" },
@@ -17666,31 +18499,31 @@ DictEntry Dict299Contents[] = {
 { 0x0029, 0x0070, 0, VR::LO, VM::M1, "ListOfTextConcatenation" },
 };
 
-unsigned short Dict299TagHashTable[] = {
+const unsigned short Dict308TagHashTable[] = {
     9,    18,     8,     8,    25,     8,     8,     8,     0,     4,
     4,    64,     5,    80,     6,    96,     7,   112,     3,     0,
    16,     2,    32,     3,    48,     1,     1,    21,
 };
 
-unsigned short Dict299KeyHashTable[] = {
+const unsigned short Dict308KeyHashTable[] = {
     9,    12,    17,     8,    22,    25,     8,    28,     0,     1,
     6, 28194,     2,     5, 28059,     7,  2168,     2,     3, 16906,
     4, 43179,     1,     2, 50495,     1,     1,  4798,     1,     0,
 31019,
 };
 
-vtkDICOMDictionary::Dict Dict299Data = {
+vtkDICOMDictionary::Dict Dict308Data = {
 "SIEMENS MED HG",
 8,
 8,
-Dict299TagHashTable,
-Dict299KeyHashTable,
-Dict299Contents
+Dict308TagHashTable,
+Dict308KeyHashTable,
+Dict308Contents
 };
 
 // ----- SCIVIS-1 -----
 
-DictEntry Dict300Contents[] = {
+const DictEntry Dict309Contents[] = {
 { 0x6001, 0x00a0, 0, VR::DS, VM::M1, "" },
 { 0x6001, 0x00a1, 0, VR::DS, VM::M1, "" },
 { 0x6001, 0x00a2, 0, VR::US, VM::M1, "" },
@@ -17705,7 +18538,7 @@ DictEntry Dict300Contents[] = {
 { 0x6001, 0x00ab, 0, VR::ST, VM::M1, "" },
 };
 
-unsigned short Dict300TagHashTable[] = {
+const unsigned short Dict309TagHashTable[] = {
    13,    16,    19,    22,    25,    28,    31,    34,    37,    40,
    43,    46,     0,     1,     3,   163,     1,     2,   162,     1,
     1,   161,     1,     0,   160,     1,     7,   167,     1,     6,
@@ -17713,49 +18546,49 @@ unsigned short Dict300TagHashTable[] = {
     1,    10,   170,     1,     9,   169,     1,     8,   168,
 };
 
-unsigned short Dict300KeyHashTable[] = {
+const unsigned short Dict309KeyHashTable[] = {
    12,    12,    12,    12,    12,    13,    12,    12,    12,    12,
    12,    12,     0,    12,     0,   448,     1,   448,     2,   448,
     3,   448,     4,   448,     5,   448,     6,   448,     7,   448,
     8,   448,     9,   448,    10,   448,    11,   448,
 };
 
-vtkDICOMDictionary::Dict Dict300Data = {
+vtkDICOMDictionary::Dict Dict309Data = {
 "SCIVIS-1",
 12,
 12,
-Dict300TagHashTable,
-Dict300KeyHashTable,
-Dict300Contents
+Dict309TagHashTable,
+Dict309KeyHashTable,
+Dict309Contents
 };
 
 // ----- BrainLAB_PatientSetup -----
 
-DictEntry Dict301Contents[] = {
+const DictEntry Dict310Contents[] = {
 { 0x3273, 0x0000, 0, VR::DS, VM::M3, "IsocenterPosition" },
 { 0x3273, 0x0001, 0, VR::CS, VM::M1, "PatientPosition" },
 };
 
-unsigned short Dict301TagHashTable[] = {
+const unsigned short Dict310TagHashTable[] = {
     3,     6,     0,     1,     0,     0,     1,     1,     1,
 };
 
-unsigned short Dict301KeyHashTable[] = {
+const unsigned short Dict310KeyHashTable[] = {
     3,     6,     0,     1,     0, 61443,     1,     1, 52199,
 };
 
-vtkDICOMDictionary::Dict Dict301Data = {
+vtkDICOMDictionary::Dict Dict310Data = {
 "BrainLAB_PatientSetup",
 2,
 2,
-Dict301TagHashTable,
-Dict301KeyHashTable,
-Dict301Contents
+Dict310TagHashTable,
+Dict310KeyHashTable,
+Dict310Contents
 };
 
 // ----- GEMS_CT_CARDIAC_001 -----
 
-DictEntry Dict302Contents[] = {
+const DictEntry Dict311Contents[] = {
 { 0x0049, 0x0001, 0, VR::SQ, VM::M1, "CTCardiacSequence" },
 { 0x0049, 0x0002, 0, VR::CS, VM::M1, "HeartRateAtConfirm" },
 { 0x0049, 0x0003, 0, VR::FL, VM::M1, "AvgHeartRatePriorToConfirm" },
@@ -17777,7 +18610,7 @@ DictEntry Dict302Contents[] = {
 { 0x0049, 0x0026, 0, VR::CS, VM::M1, "CompressionAlg" },
 };
 
-unsigned short Dict302TagHashTable[] = {
+const unsigned short Dict311TagHashTable[] = {
    20,    23,    26,    29,    19,    19,    19,    32,    37,    40,
    43,    46,    51,    54,    57,    60,    63,    66,    69,     0,
     1,     3,     4,     1,     4,     5,     1,     5,     6,     1,
@@ -17788,7 +18621,7 @@ unsigned short Dict302TagHashTable[] = {
     2,     3,    12,    22,
 };
 
-unsigned short Dict302KeyHashTable[] = {
+const unsigned short Dict311KeyHashTable[] = {
    20,    23,    28,    33,    19,    19,    19,    36,    43,    46,
    19,    53,    56,    19,    59,    19,    19,    19,    66,     0,
     1,    12, 19816,     2,    16, 65086,    18, 45230,     2,    15,
@@ -17798,18 +18631,18 @@ unsigned short Dict302KeyHashTable[] = {
     0, 19450,     2, 21766,     8, 12075,     1,    13, 16609,
 };
 
-vtkDICOMDictionary::Dict Dict302Data = {
+vtkDICOMDictionary::Dict Dict311Data = {
 "GEMS_CT_CARDIAC_001",
 19,
 19,
-Dict302TagHashTable,
-Dict302KeyHashTable,
-Dict302Contents
+Dict311TagHashTable,
+Dict311KeyHashTable,
+Dict311Contents
 };
 
 // ----- MMCPrivate -----
 
-DictEntry Dict303Contents[] = {
+const DictEntry Dict312Contents[] = {
 { 0x0009, 0x0001, 0, VR::LO, VM::M1, "Technologist" },
 { 0x0009, 0x0002, 0, VR::LO, VM::M1, "ScheduledStudyDateTime" },
 { 0x0009, 0x0003, 0, VR::OB, VM::M1, "StudyAppData" },
@@ -18063,7 +18896,7 @@ DictEntry Dict303Contents[] = {
 { 0x0029, 0x00d7, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict303TagHashTable[] = {
+const unsigned short Dict312TagHashTable[] = {
   252,   257,   264,   271,   276,   283,   288,   291,   296,   303,
   308,   315,   322,   327,   332,   337,   342,   349,   354,   361,
   368,   375,   382,   389,   396,   401,   404,   409,   414,   419,
@@ -18161,7 +18994,7 @@ unsigned short Dict303TagHashTable[] = {
   197,     1,   247,   211,     1,   246,   208,
 };
 
-unsigned short Dict303KeyHashTable[] = {
+const unsigned short Dict312KeyHashTable[] = {
   251,   251,   252,   255,   251,   251,   258,   261,   251,   264,
   269,   274,   279,   292,   299,   251,   251,   302,   307,   312,
   315,   251,   318,   321,   324,   327,   332,   251,   337,   251,
@@ -18255,68 +19088,68 @@ unsigned short Dict303KeyHashTable[] = {
   176, 12982,
 };
 
-vtkDICOMDictionary::Dict Dict303Data = {
+vtkDICOMDictionary::Dict Dict312Data = {
 "MMCPrivate",
 251,
 251,
-Dict303TagHashTable,
-Dict303KeyHashTable,
-Dict303Contents
+Dict312TagHashTable,
+Dict312KeyHashTable,
+Dict312Contents
 };
 
 // ----- IDEXX -----
 
-DictEntry Dict304Contents[] = {
+const DictEntry Dict313Contents[] = {
 { 0x0011, 0x0000, 0, VR::LO, VM::M1, "BreedName" },
 { 0x0011, 0x0001, 0, VR::LO, VM::M1, "SpeciesName" },
 { 0x0011, 0x0002, 0, VR::PN, VM::M1, "Owner" },
 };
 
-unsigned short Dict304TagHashTable[] = {
+const unsigned short Dict313TagHashTable[] = {
     3,     4,     9,     0,     2,     1,     1,     2,     2,     1,
     0,     0,
 };
 
-unsigned short Dict304KeyHashTable[] = {
+const unsigned short Dict313KeyHashTable[] = {
     4,     3,     9,     0,     2,     0, 32408,     1, 51206,     1,
     2, 15226,
 };
 
-vtkDICOMDictionary::Dict Dict304Data = {
+vtkDICOMDictionary::Dict Dict313Data = {
 "IDEXX",
 3,
 3,
-Dict304TagHashTable,
-Dict304KeyHashTable,
-Dict304Contents
+Dict313TagHashTable,
+Dict313KeyHashTable,
+Dict313Contents
 };
 
 // ----- VEPRO DICOM TRANSFER 1.0 -----
 
-DictEntry Dict305Contents[] = {
+const DictEntry Dict314Contents[] = {
 { 0x0059, 0x0010, 0, VR::SQ, VM::M1, "DicomTransferInfo" },
 };
 
-unsigned short Dict305TagHashTable[] = {
+const unsigned short Dict314TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict305KeyHashTable[] = {
+const unsigned short Dict314KeyHashTable[] = {
     2,     0,     1,     0,   610,
 };
 
-vtkDICOMDictionary::Dict Dict305Data = {
+vtkDICOMDictionary::Dict Dict314Data = {
 "VEPRO DICOM TRANSFER 1.0",
 1,
 1,
-Dict305TagHashTable,
-Dict305KeyHashTable,
-Dict305Contents
+Dict314TagHashTable,
+Dict314KeyHashTable,
+Dict314Contents
 };
 
 // ----- SPI-P Release 1 -----
 
-DictEntry Dict306Contents[] = {
+const DictEntry Dict315Contents[] = {
 { 0x0009, 0x0000, 0, VR::LT, VM::M1, "DataObjectRecognitionCode" },
 { 0x0009, 0x0004, 0, VR::LO, VM::M1, "ImageDataConsistency" },
 { 0x0009, 0x0008, 0, VR::US, VM::M1, "" },
@@ -18410,7 +19243,7 @@ DictEntry Dict306Contents[] = {
 { 0x7FE1, 0x0010, 0, VR::OW, VM::M1, "PixelData" },
 };
 
-unsigned short Dict306TagHashTable[] = {
+const unsigned short Dict315TagHashTable[] = {
    91,    92,    91,    91,    97,   104,    91,    91,    91,   109,
    91,    91,   116,   119,   124,   129,    91,   132,    91,    91,
    91,    91,    91,    91,   137,   140,    91,   147,   152,   155,
@@ -18446,7 +19279,7 @@ unsigned short Dict306TagHashTable[] = {
    78,   159,     1,    66,   114,
 };
 
-unsigned short Dict306KeyHashTable[] = {
+const unsigned short Dict315KeyHashTable[] = {
    92,    91,    91,    91,    91,    99,    91,    91,   102,    91,
   107,    91,   112,   193,   196,    91,    91,    91,    91,   201,
   206,    91,    91,    91,    91,    91,    91,   209,   212,    91,
@@ -18481,111 +19314,111 @@ unsigned short Dict306KeyHashTable[] = {
    89, 39565,
 };
 
-vtkDICOMDictionary::Dict Dict306Data = {
+vtkDICOMDictionary::Dict Dict315Data = {
 "SPI-P Release 1",
 91,
 91,
-Dict306TagHashTable,
-Dict306KeyHashTable,
-Dict306Contents
+Dict315TagHashTable,
+Dict315KeyHashTable,
+Dict315Contents
 };
 
 // ----- Philips EV Imaging DD 022 -----
 
-DictEntry Dict307Contents[] = {
+const DictEntry Dict316Contents[] = {
 { 0x2007, 0x0000, 0, VR::ST, VM::M1, "" },
 };
 
-unsigned short Dict307TagHashTable[] = {
+const unsigned short Dict316TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict307KeyHashTable[] = {
+const unsigned short Dict316KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict307Data = {
+vtkDICOMDictionary::Dict Dict316Data = {
 "Philips EV Imaging DD 022",
 1,
 1,
-Dict307TagHashTable,
-Dict307KeyHashTable,
-Dict307Contents
+Dict316TagHashTable,
+Dict316KeyHashTable,
+Dict316Contents
 };
 
 // ----- TOSHIBA ENCRYPTED SR DATA -----
 
-DictEntry Dict308Contents[] = {
+const DictEntry Dict317Contents[] = {
 { 0x7015, 0x0000, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict308TagHashTable[] = {
+const unsigned short Dict317TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict308KeyHashTable[] = {
+const unsigned short Dict317KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict308Data = {
+vtkDICOMDictionary::Dict Dict317Data = {
 "TOSHIBA ENCRYPTED SR DATA",
 1,
 1,
-Dict308TagHashTable,
-Dict308KeyHashTable,
-Dict308Contents
+Dict317TagHashTable,
+Dict317KeyHashTable,
+Dict317Contents
 };
 
 // ----- SECTRA_OverlayInfo_01 -----
 
-DictEntry Dict309Contents[] = {
+const DictEntry Dict318Contents[] = {
 { 0x6001, 0x0001, 0, VR::LO, VM::M1, "SectraOverlay" },
 };
 
-unsigned short Dict309TagHashTable[] = {
+const unsigned short Dict318TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict309KeyHashTable[] = {
+const unsigned short Dict318KeyHashTable[] = {
     2,     0,     1,     0, 38985,
 };
 
-vtkDICOMDictionary::Dict Dict309Data = {
+vtkDICOMDictionary::Dict Dict318Data = {
 "SECTRA_OverlayInfo_01",
 1,
 1,
-Dict309TagHashTable,
-Dict309KeyHashTable,
-Dict309Contents
+Dict318TagHashTable,
+Dict318KeyHashTable,
+Dict318Contents
 };
 
 // ----- SIEMENS CSA ENVELOPE -----
 
-DictEntry Dict310Contents[] = {
+const DictEntry Dict319Contents[] = {
 { 0x0029, 0x0010, 0, VR::OB, VM::M1, "syngoReportData" },
 { 0x0029, 0x0011, 0, VR::OB, VM::M1, "syngoReportPresentation" },
 };
 
-unsigned short Dict310TagHashTable[] = {
+const unsigned short Dict319TagHashTable[] = {
     3,     6,     0,     1,     1,    17,     1,     0,    16,
 };
 
-unsigned short Dict310KeyHashTable[] = {
+const unsigned short Dict319KeyHashTable[] = {
     2,     3,     0,     2,     0, 22501,     1, 44118,
 };
 
-vtkDICOMDictionary::Dict Dict310Data = {
+vtkDICOMDictionary::Dict Dict319Data = {
 "SIEMENS CSA ENVELOPE",
 2,
 2,
-Dict310TagHashTable,
-Dict310KeyHashTable,
-Dict310Contents
+Dict319TagHashTable,
+Dict319KeyHashTable,
+Dict319Contents
 };
 
 // ----- SIEMENS RA PLANE A -----
 
-DictEntry Dict311Contents[] = {
+const DictEntry Dict320Contents[] = {
 { 0x0011, 0x0028, 0, VR::UL, VM::M1, "" },
 { 0x0011, 0x0029, 0, VR::UL, VM::M1, "" },
 { 0x0011, 0x002a, 0, VR::UL, VM::M1, "" },
@@ -18721,7 +19554,7 @@ DictEntry Dict311Contents[] = {
 { 0x0019, 0x00e0, 0, VR::UL, VM::M1, "" },
 };
 
-unsigned short Dict311TagHashTable[] = {
+const unsigned short Dict320TagHashTable[] = {
   134,   139,   142,   147,   150,   155,   158,   163,   166,   133,
   169,   133,   172,   133,   177,   133,   180,   133,   183,   133,
   186,   133,   189,   133,   192,   133,   195,   198,   133,   201,
@@ -18775,7 +19608,7 @@ unsigned short Dict311TagHashTable[] = {
   152,
 };
 
-unsigned short Dict311KeyHashTable[] = {
+const unsigned short Dict320KeyHashTable[] = {
   133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
   133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
   133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
@@ -18819,18 +19652,18 @@ unsigned short Dict311KeyHashTable[] = {
    40,
 };
 
-vtkDICOMDictionary::Dict Dict311Data = {
+vtkDICOMDictionary::Dict Dict320Data = {
 "SIEMENS RA PLANE A",
 133,
 133,
-Dict311TagHashTable,
-Dict311KeyHashTable,
-Dict311Contents
+Dict320TagHashTable,
+Dict320KeyHashTable,
+Dict320Contents
 };
 
 // ----- SIEMENS RA PLANE B -----
 
-DictEntry Dict312Contents[] = {
+const DictEntry Dict321Contents[] = {
 { 0x0011, 0x0028, 0, VR::UL, VM::M1, "" },
 { 0x0011, 0x0029, 0, VR::UL, VM::M1, "" },
 { 0x0011, 0x002a, 0, VR::UL, VM::M1, "" },
@@ -18966,7 +19799,7 @@ DictEntry Dict312Contents[] = {
 { 0x0019, 0x00e0, 0, VR::UL, VM::M1, "" },
 };
 
-unsigned short Dict312TagHashTable[] = {
+const unsigned short Dict321TagHashTable[] = {
   134,   139,   142,   147,   150,   155,   158,   163,   166,   133,
   169,   133,   172,   133,   177,   133,   180,   133,   183,   133,
   186,   133,   189,   133,   192,   133,   195,   198,   133,   201,
@@ -19020,7 +19853,7 @@ unsigned short Dict312TagHashTable[] = {
   152,
 };
 
-unsigned short Dict312KeyHashTable[] = {
+const unsigned short Dict321KeyHashTable[] = {
   133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
   133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
   133,   133,   133,   133,   133,   133,   133,   133,   133,   133,
@@ -19064,18 +19897,18 @@ unsigned short Dict312KeyHashTable[] = {
    40,
 };
 
-vtkDICOMDictionary::Dict Dict312Data = {
+vtkDICOMDictionary::Dict Dict321Data = {
 "SIEMENS RA PLANE B",
 133,
 133,
-Dict312TagHashTable,
-Dict312KeyHashTable,
-Dict312Contents
+Dict321TagHashTable,
+Dict321KeyHashTable,
+Dict321Contents
 };
 
 // ----- Silhouette V1.0 -----
 
-DictEntry Dict313Contents[] = {
+const DictEntry Dict322Contents[] = {
 { 0x0029, 0x0013, 0, VR::UL, VM::M1, "" },
 { 0x0029, 0x0014, 0, VR::UL, VM::M1, "" },
 { 0x0029, 0x0017, 0, VR::UN, VM::M1, "" },
@@ -19114,7 +19947,7 @@ DictEntry Dict313Contents[] = {
 { 0x0029, 0x0091, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict313TagHashTable[] = {
+const unsigned short Dict322TagHashTable[] = {
    37,    40,    43,    46,    36,    36,    49,    52,    55,    36,
    60,    63,    66,    71,    76,    83,    88,    93,    98,   103,
   112,    36,   115,   118,   121,   124,   129,    36,    36,    36,
@@ -19131,7 +19964,7 @@ unsigned short Dict313TagHashTable[] = {
     2,    23,
 };
 
-unsigned short Dict313KeyHashTable[] = {
+const unsigned short Dict322KeyHashTable[] = {
    36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
    36,    36,    36,    36,    36,    36,    36,    37,    36,    36,
    36,    36,    36,    36,    36,    36,    36,    36,    36,    36,
@@ -19145,18 +19978,48 @@ unsigned short Dict313KeyHashTable[] = {
    31,   149,    32,   149,    33,   149,    34,   149,    35,   149,
 };
 
-vtkDICOMDictionary::Dict Dict313Data = {
+vtkDICOMDictionary::Dict Dict322Data = {
 "Silhouette V1.0",
 36,
 36,
-Dict313TagHashTable,
-Dict313KeyHashTable,
-Dict313Contents
+Dict322TagHashTable,
+Dict322KeyHashTable,
+Dict322Contents
+};
+
+// ----- SIEMENS MED PT WAVEFORM -----
+
+const DictEntry Dict323Contents[] = {
+{ 0x0071, 0x0046, 0, VR::UN, VM::M1, "StartingRespiratoryAmplitude" },
+{ 0x0071, 0x0047, 0, VR::UN, VM::M1, "StartingRespiratoryPhase" },
+{ 0x0071, 0x0048, 0, VR::UN, VM::M1, "EndingRespiratoryAmplitude" },
+{ 0x0071, 0x0049, 0, VR::UN, VM::M1, "EndingRespiratoryPhase" },
+{ 0x0071, 0x0050, 0, VR::CS, VM::M1, "RespiratoryTriggerType" },
+};
+
+const unsigned short Dict323TagHashTable[] = {
+    6,     9,    12,    15,    18,     0,     1,     0,    70,     1,
+    3,    73,     1,     2,    72,     1,     4,    80,     1,     1,
+   71,
+};
+
+const unsigned short Dict323KeyHashTable[] = {
+    5,     5,     6,     9,    12,     0,     1,     4, 51609,     1,
+    0, 61035,     3,     1, 15354,     2, 34163,     3, 64847,
+};
+
+vtkDICOMDictionary::Dict Dict323Data = {
+"SIEMENS MED PT WAVEFORM",
+5,
+5,
+Dict323TagHashTable,
+Dict323KeyHashTable,
+Dict323Contents
 };
 
 // ----- GEMS_STDY_01 -----
 
-DictEntry Dict314Contents[] = {
+const DictEntry Dict324Contents[] = {
 { 0x0023, 0x0001, 0, VR::SL, VM::M1, "NumberOfSeriesInStudy" },
 { 0x0023, 0x0002, 0, VR::SL, VM::M1, "NumberOfUnarchivedSeries" },
 { 0x0023, 0x0010, 0, VR::SS, VM::M1, "ReferenceImageField" },
@@ -19167,30 +20030,30 @@ DictEntry Dict314Contents[] = {
 { 0x0023, 0x0080, 0, VR::SQ, VM::M1, "PPSDataSequence" },
 };
 
-unsigned short Dict314TagHashTable[] = {
+const unsigned short Dict324TagHashTable[] = {
     8,     9,    14,    21,     8,     8,    24,    27,     0,     2,
     1,     2,     7,   128,     3,     0,     1,     3,    80,     4,
   112,     1,     2,    16,     1,     5,   116,     1,     6,   125,
 };
 
-unsigned short Dict314KeyHashTable[] = {
+const unsigned short Dict324KeyHashTable[] = {
     8,     8,     9,    12,     8,    17,    20,    27,     0,     1,
     6,  5368,     2,     2, 41255,     7, 57601,     1,     5, 42112,
     3,     0, 19343,     3, 33850,     4,  6019,     1,     1, 29474,
 };
 
-vtkDICOMDictionary::Dict Dict314Data = {
+vtkDICOMDictionary::Dict Dict324Data = {
 "GEMS_STDY_01",
 8,
 8,
-Dict314TagHashTable,
-Dict314KeyHashTable,
-Dict314Contents
+Dict324TagHashTable,
+Dict324KeyHashTable,
+Dict324Contents
 };
 
 // ----- TOSHIBA COMAPL HEADER -----
 
-DictEntry Dict315Contents[] = {
+const DictEntry Dict325Contents[] = {
 { 0x0029, 0x0008, 0, VR::CS, VM::M1, "COMAPLHeaderType" },
 { 0x0029, 0x0009, 0, VR::LO, VM::M1, "COMAPLHeaderVersion" },
 { 0x0029, 0x0010, 0, VR::OB, VM::M1, "COMAPLHeaderInfo" },
@@ -19199,30 +20062,30 @@ DictEntry Dict315Contents[] = {
 { 0x0029, 0x0034, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict315TagHashTable[] = {
+const unsigned short Dict325TagHashTable[] = {
     7,     6,    10,    13,     6,    20,     0,     1,     4,    49,
     1,     1,     9,     3,     0,     8,     2,    16,     3,    32,
     1,     5,    52,
 };
 
-unsigned short Dict315KeyHashTable[] = {
+const unsigned short Dict325KeyHashTable[] = {
     6,     7,    10,     6,    15,    18,     0,     1,     3, 16724,
     2,     1,  6957,     2, 61854,     1,     0, 64252,     2,     4,
   896,     5,   896,
 };
 
-vtkDICOMDictionary::Dict Dict315Data = {
+vtkDICOMDictionary::Dict Dict325Data = {
 "TOSHIBA COMAPL HEADER",
 6,
 6,
-Dict315TagHashTable,
-Dict315KeyHashTable,
-Dict315Contents
+Dict325TagHashTable,
+Dict325KeyHashTable,
+Dict325Contents
 };
 
 // ----- GEMS_GDXE_FALCON_04 -----
 
-DictEntry Dict316Contents[] = {
+const DictEntry Dict326Contents[] = {
 { 0x0011, 0x0003, 0, VR::UI, VM::M1, "ProcessedSeriesUID" },
 { 0x0011, 0x0004, 0, VR::CS, VM::M1, "AcquisitionType" },
 { 0x0011, 0x0005, 0, VR::UI, VM::M1, "AcquisitionUID" },
@@ -19264,7 +20127,7 @@ DictEntry Dict316Contents[] = {
 { 0x0011, 0x006d, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict316TagHashTable[] = {
+const unsigned short Dict326TagHashTable[] = {
    40,    45,    50,    57,    62,    67,    72,    77,    80,    87,
    39,    39,    39,    39,    39,    90,    39,    93,    96,    39,
   101,   104,   107,   110,   113,   116,    39,    39,    39,    39,
@@ -19282,7 +20145,7 @@ unsigned short Dict316TagHashTable[] = {
    52,     1,    26,    55,
 };
 
-unsigned short Dict316KeyHashTable[] = {
+const unsigned short Dict326KeyHashTable[] = {
    40,    43,    48,    39,    39,    53,    39,    39,    56,    59,
    62,    39,    39,    39,    39,    39,    67,    39,    70,    39,
    39,    73,    78,    81,    39,    39,    39,    39,    84,    39,
@@ -19299,29 +20162,29 @@ unsigned short Dict316KeyHashTable[] = {
    35,   137,    36,   137,    37,   137,    38,   137,
 };
 
-vtkDICOMDictionary::Dict Dict316Data = {
+vtkDICOMDictionary::Dict Dict326Data = {
 "GEMS_GDXE_FALCON_04",
 39,
 39,
-Dict316TagHashTable,
-Dict316KeyHashTable,
-Dict316Contents
+Dict326TagHashTable,
+Dict326KeyHashTable,
+Dict326Contents
 };
 
 // ----- PHILIPS IMAGING DD 001 -----
 
-DictEntry Dict317Contents[] = {
+const DictEntry Dict327Contents[] = {
 { 0x2001, 0x0001, 0, VR::FL, VM::M1, "ChemicalShift" },
 { 0x2001, 0x0002, 0, VR::IS, VM::M1, "ChemicalShiftNumberMR" },
 { 0x2001, 0x0003, 0, VR::FL, VM::M1, "DiffusionBFactor" },
 { 0x2001, 0x0004, 0, VR::CS, VM::M1, "DiffusionDirection" },
-{ 0x2001, 0x0005, 0, VR::SS, VM::M1, "" },
+{ 0x2001, 0x0005, 0, VR::SS, VM::M1, "GraphicAnnotationParentID" },
 { 0x2001, 0x0006, 0, VR::CS, VM::M1, "ImageEnhanced" },
 { 0x2001, 0x0007, 0, VR::CS, VM::M1, "ImageTypeEDES" },
 { 0x2001, 0x0008, 0, VR::IS, VM::M1, "PhaseNumber" },
 { 0x2001, 0x0009, 0, VR::FL, VM::M1, "ImagePrepulseDelay" },
-{ 0x2001, 0x000a, 0, VR::IS, VM::M1, "SliceNumberMR" },
-{ 0x2001, 0x000b, 0, VR::CS, VM::M1, "SliceOrientation" },
+{ 0x2001, 0x000a, 0, VR::IS, VM::M1, "ImagePlaneNumber" },
+{ 0x2001, 0x000b, 0, VR::CS, VM::M1, "ImageOrientation" },
 { 0x2001, 0x000c, 0, VR::CS, VM::M1, "ArrhythmiaRejection" },
 { 0x2001, 0x000e, 0, VR::CS, VM::M1, "CardiacCycled" },
 { 0x2001, 0x000f, 0, VR::SS, VM::M1, "CardiacGateWidth" },
@@ -19332,14 +20195,14 @@ DictEntry Dict317Contents[] = {
 { 0x2001, 0x0014, 0, VR::SL, VM::M1, "NumberOfEchoes" },
 { 0x2001, 0x0015, 0, VR::SS, VM::M1, "NumberOfLocations" },
 { 0x2001, 0x0016, 0, VR::SS, VM::M1, "NumberOfPCDirections" },
-{ 0x2001, 0x0017, 0, VR::SL, VM::M1, "NumberOfPhasesMR" },
-{ 0x2001, 0x0018, 0, VR::SL, VM::M1, "NumberOfSlicesMR" },
+{ 0x2001, 0x0017, 0, VR::SL, VM::M1, "NumberOfPhases" },
+{ 0x2001, 0x0018, 0, VR::SL, VM::M1, "NumberOfSlices" },
 { 0x2001, 0x0019, 0, VR::CS, VM::M1, "PartialMatrixScanned" },
 { 0x2001, 0x001a, 0, VR::FL, VM::M3, "PCVelocity" },
 { 0x2001, 0x001b, 0, VR::FL, VM::M1, "PrepulseDelay" },
 { 0x2001, 0x001c, 0, VR::CS, VM::M1, "PrepulseType" },
-{ 0x2001, 0x001d, 0, VR::IS, VM::M1, "ReconstructionNumberMR" },
-{ 0x2001, 0x001e, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x001d, 0, VR::IS, VM::M1, "ReconstructionNumber" },
+{ 0x2001, 0x001e, 0, VR::CS, VM::M1, "ReformatAccuracy" },
 { 0x2001, 0x001f, 0, VR::CS, VM::M1, "RespirationSync" },
 { 0x2001, 0x0020, 0, VR::LO, VM::M1, "ScanningTechnique" },
 { 0x2001, 0x0021, 0, VR::CS, VM::M1, "SPIR" },
@@ -19347,187 +20210,202 @@ DictEntry Dict317Contents[] = {
 { 0x2001, 0x0023, 0, VR::DS, VM::M1, "FlipAngle" },
 { 0x2001, 0x0024, 0, VR::CS, VM::M1, "SeriesIsInteractive" },
 { 0x2001, 0x0025, 0, VR::SH, VM::M1, "EchoTimeDisplay" },
-{ 0x2001, 0x0026, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x0026, 0, VR::CS, VM::M1, "PresentationStateSubtractionActive" },
 { 0x2001, 0x0029, 0, VR::FL, VM::M1, "" },
 { 0x2001, 0x002b, 0, VR::CS, VM::M1, "" },
 { 0x2001, 0x002d, 0, VR::SS, VM::M1, "NumberOfSlicesInStack" },
 { 0x2001, 0x0032, 0, VR::FL, VM::M1, "StackRadialAngle" },
 { 0x2001, 0x0033, 0, VR::CS, VM::M1, "StackRadialAxis" },
 { 0x2001, 0x0035, 0, VR::SS, VM::M1, "StackSliceNumber" },
-{ 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackSliceType" },
+{ 0x2001, 0x0036, 0, VR::CS, VM::M1, "StackType" },
 { 0x2001, 0x0039, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x003d, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x003f, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0046, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0047, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x0048, 0, VR::SS, VM::M1, "" },
-{ 0x2001, 0x004b, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004c, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004d, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x004e, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0050, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0051, 0, VR::IS, VM::M1, "" },
-{ 0x2001, 0x0052, 0, VR::UI, VM::M1, "" },
-{ 0x2001, 0x0053, 0, VR::CS, VM::M1, "" },
-{ 0x2001, 0x0054, 0, VR::FL, VM::M1, "" },
-{ 0x2001, 0x0055, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x0056, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x003d, 0, VR::UL, VM::M1, "ContourFillColor" },
+{ 0x2001, 0x003f, 0, VR::CS, VM::M1, "DisplayedAreaZoomInterpolationMeth" },
+{ 0x2001, 0x0043, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxFrstEndPnt" },
+{ 0x2001, 0x0044, 0, VR::IS, VM::M2, "EllipsDisplShutMajorAxScndEndPnt" },
+{ 0x2001, 0x0045, 0, VR::IS, VM::M2, "EllipsDisplShutOtherAxFrstEndPnt" },
+{ 0x2001, 0x0046, 0, VR::CS, VM::M1, "GraphicLineStyle" },
+{ 0x2001, 0x0047, 0, VR::FL, VM::M1, "GraphicLineWidth" },
+{ 0x2001, 0x0048, 0, VR::SS, VM::M1, "GraphicAnnotationID" },
+{ 0x2001, 0x004b, 0, VR::CS, VM::M1, "InterpolationMethod" },
+{ 0x2001, 0x004c, 0, VR::CS, VM::M1, "PolyLineBeginPointStyle" },
+{ 0x2001, 0x004d, 0, VR::CS, VM::M1, "PolyLineEndPointStyle" },
+{ 0x2001, 0x004e, 0, VR::CS, VM::M1, "WindowSmoothingTaste" },
+{ 0x2001, 0x0050, 0, VR::LO, VM::M1, "GraphicMarkerType" },
+{ 0x2001, 0x0051, 0, VR::IS, VM::M1, "OverlayPlaneID" },
+{ 0x2001, 0x0052, 0, VR::UI, VM::M1, "ImagePresentationStateUID" },
+{ 0x2001, 0x0053, 0, VR::CS, VM::M1, "PresentationGLTrafoInvert" },
+{ 0x2001, 0x0054, 0, VR::FL, VM::M1, "ContourFillTransparency" },
+{ 0x2001, 0x0055, 0, VR::UL, VM::M1, "GraphicLineColor" },
+{ 0x2001, 0x0056, 0, VR::CS, VM::M1, "GraphicType" },
 { 0x2001, 0x0058, 0, VR::UL, VM::M1, "ContrastTransferTaste" },
-{ 0x2001, 0x005a, 0, VR::ST, VM::M1, "" },
+{ 0x2001, 0x005a, 0, VR::ST, VM::M1, "GraphicAnnotationModel" },
+{ 0x2001, 0x005d, 0, VR::ST, VM::M1, "MeasurementTextUnits" },
+{ 0x2001, 0x005e, 0, VR::ST, VM::M1, "MeasurementTextType" },
 { 0x2001, 0x005f, 0, VR::SQ, VM::M1, "StackSequence" },
 { 0x2001, 0x0060, 0, VR::SL, VM::M1, "NumberOfStacks" },
 { 0x2001, 0x0061, 0, VR::CS, VM::M1, "SeriesTransmitted" },
 { 0x2001, 0x0062, 0, VR::CS, VM::M1, "SeriesCommitted" },
 { 0x2001, 0x0063, 0, VR::CS, VM::M1, "ExaminationSource" },
-{ 0x2001, 0x0064, 0, VR::SH, VM::M1, "" },
-{ 0x2001, 0x0065, 0, VR::SQ, VM::M1, "" },
+{ 0x2001, 0x0064, 0, VR::SH, VM::M1, "TextType" },
+{ 0x2001, 0x0065, 0, VR::SQ, VM::M1, "GraphicOverlayPlane" },
 { 0x2001, 0x0067, 0, VR::CS, VM::M1, "LinearPresentationGLTrafoShapeSub" },
-{ 0x2001, 0x0068, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x0069, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x006a, 0, VR::SQ, VM::M1, "" },
+{ 0x2001, 0x0068, 0, VR::SQ, VM::M1, "LinearModalityGLTrafo" },
+{ 0x2001, 0x0069, 0, VR::SQ, VM::M1, "DisplayShutter" },
+{ 0x2001, 0x006a, 0, VR::SQ, VM::M1, "SpatialTransformation" },
 { 0x2001, 0x006b, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x006d, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x006d, 0, VR::LO, VM::M1, "TextFont" },
 { 0x2001, 0x006e, 0, VR::SH, VM::M1, "SeriesType" },
-{ 0x2001, 0x0071, 0, VR::CS, VM::M1, "" },
+{ 0x2001, 0x0071, 0, VR::CS, VM::M1, "GraphicConstraint" },
+{ 0x2001, 0x0072, 0, VR::IS, VM::M1, "EllipsDisplShutOtherAxScndEndPnt" },
 { 0x2001, 0x0074, 0, VR::DS, VM::M1, "" },
 { 0x2001, 0x0075, 0, VR::DS, VM::M1, "" },
-{ 0x2001, 0x0076, 0, VR::UL, VM::M1, "" },
+{ 0x2001, 0x0076, 0, VR::UL, VM::M1, "NumberOfFrames" },
 { 0x2001, 0x0077, 0, VR::CS, VM::M1, "GLTrafoType" },
-{ 0x2001, 0x007a, 0, VR::FL, VM::M1, "" },
+{ 0x2001, 0x007a, 0, VR::FL, VM::M1, "WindowRoundingFactor" },
 { 0x2001, 0x007b, 0, VR::IS, VM::M1, "AcquisitionNumber" },
+{ 0x2001, 0x007c, 0, VR::US, VM::M1, "FrameNumber" },
 { 0x2001, 0x0080, 0, VR::LO, VM::M1, "" },
 { 0x2001, 0x0081, 0, VR::IS, VM::M1, "NumberOfDynamicScans" },
 { 0x2001, 0x0082, 0, VR::IS, VM::M1, "EchoTrainLength" },
 { 0x2001, 0x0083, 0, VR::DS, VM::M1, "ImagingFrequency" },
 { 0x2001, 0x0084, 0, VR::DS, VM::M1, "InversionTime" },
 { 0x2001, 0x0085, 0, VR::DS, VM::M1, "MagneticFieldStrength" },
-{ 0x2001, 0x0086, 0, VR::IS, VM::M1, "" },
+{ 0x2001, 0x0086, 0, VR::IS, VM::M1, "NrOfPhaseEncodingSteps" },
 { 0x2001, 0x0087, 0, VR::SH, VM::M1, "ImagedNucleus" },
 { 0x2001, 0x0088, 0, VR::DS, VM::M1, "NumberOfAverages" },
 { 0x2001, 0x0089, 0, VR::DS, VM::M1, "PhaseFOVPercent" },
 { 0x2001, 0x008a, 0, VR::DS, VM::M1, "SamplingPercent" },
-{ 0x2001, 0x008b, 0, VR::SH, VM::M1, "" },
-{ 0x2001, 0x0090, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0091, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0092, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x0093, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x008b, 0, VR::SH, VM::M1, "TransmittingCoil" },
+{ 0x2001, 0x0090, 0, VR::LO, VM::M1, "TextForegroundColor" },
+{ 0x2001, 0x0091, 0, VR::LO, VM::M1, "TextBackgroundColor" },
+{ 0x2001, 0x0092, 0, VR::LO, VM::M1, "TextShadowColor" },
+{ 0x2001, 0x0093, 0, VR::LO, VM::M1, "TextStyle" },
 { 0x2001, 0x009a, 0, VR::SQ, VM::M1, "" },
-{ 0x2001, 0x009b, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x009c, 0, VR::LO, VM::M1, "" },
+{ 0x2001, 0x009b, 0, VR::UL, VM::M1, "GraphicNumber" },
+{ 0x2001, 0x009c, 0, VR::LO, VM::M1, "GraphicAnnotationLabel" },
 { 0x2001, 0x009f, 0, VR::US, VM::M2, "PixelProcessingKernelSize" },
 { 0x2001, 0x00a1, 0, VR::CS, VM::M1, "IsRawImage" },
-{ 0x2001, 0x00a3, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00a4, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00a5, 0, VR::UL, VM::M1, "" },
-{ 0x2001, 0x00c1, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x00c8, 0, VR::LO, VM::M1, "" },
-{ 0x2001, 0x00cc, 0, VR::ST, VM::M1, "" },
+{ 0x2001, 0x00a3, 0, VR::UL, VM::M1, "TextColorForeground" },
+{ 0x2001, 0x00a4, 0, VR::UL, VM::M1, "TextColorBackground" },
+{ 0x2001, 0x00a5, 0, VR::UL, VM::M1, "TextColorShadow" },
+{ 0x2001, 0x00c1, 0, VR::LO, VM::M1, "LinearModalityGLTrafo" },
+{ 0x2001, 0x00c8, 0, VR::LO, VM::M1, "ExamCardName" },
+{ 0x2001, 0x00cc, 0, VR::ST, VM::M1, "DerivationDescription" },
 { 0x2001, 0x00da, 0, VR::CS, VM::M1, "" },
 { 0x2001, 0x00f1, 0, VR::FL, VM::M1TN, "ProspectiveMotionCorrection" },
 { 0x2001, 0x00f2, 0, VR::FL, VM::M1TN, "RetrospectiveMotionCorrection" },
 };
 
-unsigned short Dict317TagHashTable[] = {
-  115,   122,   129,   136,   143,   146,   149,   154,   159,   164,
-  114,   169,   172,   177,   180,   183,   188,   193,   196,   201,
-  204,   207,   210,   215,   220,   223,   226,   229,   232,   235,
-  238,   241,   244,   247,   250,   253,   114,   256,   259,   114,
-  262,   114,   265,   114,   114,   114,   114,   114,   268,   271,
-  274,   277,   114,   280,   283,   114,   114,   114,   286,   114,
-  291,   114,   294,   114,   114,   114,   114,   114,   297,   300,
-  303,   114,   306,   309,   312,   315,   318,   114,   321,   324,
-  327,   330,   333,   336,   339,   114,   342,   114,   345,   114,
-  114,   114,   114,   348,   351,   354,   357,   362,   365,   370,
-  377,   380,   385,   390,   395,   400,   405,   408,   413,   418,
-  114,   421,   424,   114,     0,     3,     2,     3,    78,   116,
-   99,   147,     3,     1,     2,    79,   117,    98,   146,     3,
-    4,     5,    80,   118,    97,   145,     3,     3,     4,    81,
-  119,    96,   144,     1,     6,     7,     1,     5,     6,     2,
-    8,     9,    82,   122,     2,     7,     8,    83,   123,     2,
-   10,    11,   101,   155,     2,     9,    10,   100,   154,     1,
-   11,    12,     2,    13,    15,   103,   159,     1,    12,    14,
-    1,    15,    17,     2,    14,    16,   102,   156,     2,    17,
-   19,   105,   163,     1,    16,    18,     2,    19,    21,   104,
-  161,     1,    18,    20,     1,    21,    23,     1,    20,    22,
-    2,    23,    25,   107,   165,     2,    22,    24,   106,   164,
-    1,    25,    27,     1,    24,    26,     1,    27,    29,     1,
-   26,    28,     1,    29,    31,     1,    28,    30,     1,    31,
-   33,     1,    30,    32,     1,    33,    35,     1,    32,    34,
-    1,    35,    37,     1,    34,    36,     1,    36,    38,     1,
-   37,    41,     1,    38,    43,     1,    39,    45,     1,    41,
-   51,     1,    40,    50,     1,    42,    53,     1,   108,   193,
-    1,    43,    54,     1,    44,    57,     2,    45,    61,   109,
-  200,     1,    46,    63,     1,   110,   204,     1,    47,    70,
-    1,    48,    71,     1,    49,    72,     1,   111,   218,     1,
-   50,    75,     1,    51,    76,     1,    52,    77,     1,    53,
-   78,     1,    54,    80,     1,    55,    81,     1,    56,    82,
-    1,    57,    83,     1,    58,    84,     1,    59,    85,     1,
-   60,    86,     1,    61,    88,     1,    62,    90,     1,    63,
-   95,     1,    64,    96,     1,    65,    97,     2,    66,    98,
-  113,   242,     1,    67,    99,     2,    68,   100,    87,   131,
-    3,    69,   101,    86,   130,   112,   241,     1,    85,   129,
-    2,    70,   103,    84,   128,     2,    71,   104,    91,   135,
-    2,    72,   105,    90,   134,     2,    73,   106,    89,   133,
-    2,    74,   107,    88,   132,     1,    95,   139,     2,    75,
-  109,    94,   138,     2,    76,   110,    93,   137,     1,    92,
-  136,     1,    77,   113,     1,     0,     1,
-};
-
-unsigned short Dict317KeyHashTable[] = {
-  114,   114,   114,   115,   114,   118,   114,   127,   130,   114,
-  133,   114,   114,   114,   136,   139,   144,   114,   114,   114,
-  147,   150,   114,   155,   114,   260,   263,   114,   114,   266,
-  114,   269,   274,   114,   277,   114,   280,   283,   114,   286,
-  114,   289,   292,   114,   295,   298,   301,   114,   114,   114,
-  114,   114,   114,   114,   304,   114,   114,   307,   114,   310,
-  114,   313,   114,   316,   321,   324,   331,   334,   337,   340,
-  114,   343,   114,   114,   114,   114,   114,   346,   114,   114,
-  114,   114,   114,   349,   352,   355,   358,   363,   114,   114,
-  114,   368,   371,   374,   114,   114,   114,   114,   114,   377,
-  114,   114,   380,   114,   114,   114,   383,   114,   114,   114,
-  386,   114,   389,   114,     0,     1,    35, 44603,     4,    22,
-25792,    24, 36873,    61,  6746,    88,  1638,     1,    41, 39763,
-    1,    76, 27245,     1,    64, 61897,     1,    15, 14726,     2,
-   27, 25264,    67, 34658,     1,    93, 15513,     1,   103, 14054,
-    2,     7,  7949,     9, 42244,    52,     4,    47,    28,    47,
-   36,    47,    37,    47,    38,    47,    44,    47,    45,    47,
-   46,    47,    47,    47,    48,    47,    49,    47,    50,    47,
-   51,    47,    52,    47,    53,    47,    54,    47,    55,    47,
-   56,    47,    57,    47,    58,    47,    59,    47,    60,    47,
-   62,    47,    68,    47,    69,    47,    71,    47,    72,    47,
-   73,    47,    74,    47,    75,    47,    77,    47,    78,    47,
-   79,    47,    80,    47,    82,    47,    84,    47,    90,    47,
-   95,    47,    96,    47,    97,    47,    98,    47,    99,    47,
-  100,    47,   101,    47,   102,    47,   105,    47,   106,    47,
-  107,    47,   108,    47,   109,    47,   110,    47,   111,    47,
-    1,    13, 50394,     1,    89, 53003,     1,    11, 24290,     2,
-    2, 32047,     3,  5791,     1,    86, 61266,     1,   104,  7782,
-    1,    63, 38600,     1,    92, 61334,     1,    19, 22852,     1,
-   39, 10237,     1,    21, 30286,     1,    30, 19784,     1,    23,
-48739,     1,    17, 31914,     1,   113, 33126,     1,    40, 21283,
-    1,    83, 44798,     1,   112, 17885,     2,    14, 42573,    94,
-56145,     1,    25, 43922,     3,    26, 63427,    32, 51776,    33,
-23139,     1,    81, 12058,     1,    10, 15143,     1,    18, 53955,
-    1,     8, 18745,     1,     0, 47521,     1,    16, 20660,     1,
-   65,  6566,     1,    66, 18073,     1,    87, 34679,     2,    20,
-42170,    29, 31678,     2,     6, 17514,    31, 44806,     1,     1,
-28283,     1,    70, 30781,     1,    91, 13295,     1,    43, 59773,
-    1,    42, 38927,     1,    34, 48912,     1,    12, 12337,     2,
-    5, 14799,    85, 49784,
+const unsigned short Dict327TagHashTable[] = {
+  122,   125,   128,   133,   138,   141,   144,   147,   150,   121,
+  153,   156,   121,   159,   121,   162,   121,   121,   121,   121,
+  121,   165,   168,   171,   121,   121,   174,   177,   121,   121,
+  121,   180,   121,   185,   121,   121,   121,   121,   188,   193,
+  196,   199,   202,   207,   121,   121,   210,   213,   216,   219,
+  121,   222,   225,   230,   233,   236,   239,   242,   121,   245,
+  121,   248,   121,   121,   251,   254,   257,   260,   263,   266,
+  269,   272,   275,   121,   278,   281,   284,   289,   292,   295,
+  298,   301,   121,   121,   304,   307,   312,   315,   320,   325,
+  330,   335,   338,   343,   348,   355,   362,   367,   370,   373,
+  376,   379,   384,   389,   394,   397,   400,   403,   406,   409,
+  414,   419,   422,   425,   430,   433,   436,   441,   446,   449,
+  454,     0,     1,    26,    28,     1,    29,    31,     2,    28,
+   30,   114,   165,     2,    31,    33,   113,   164,     1,    30,
+   32,     1,    33,    35,     1,    32,    34,     1,    35,    37,
+    1,    34,    36,     1,    36,    38,     1,    37,    41,     1,
+   38,    43,     1,    39,    45,     1,    41,    51,     1,    40,
+   50,     1,    42,    53,     1,    43,    54,     1,    44,    57,
+    2,    45,    61,   115,   193,     1,    46,    63,     2,    47,
+   67,   116,   200,     1,    48,    68,     1,    49,    69,     1,
+   50,    70,     2,    51,    71,   117,   204,     1,    52,    72,
+    1,    53,    75,     1,    54,    76,     1,    55,    77,     1,
+   56,    78,     1,    57,    80,     2,    58,    81,   118,   218,
+    1,    59,    82,     1,    60,    83,     1,    61,    84,     1,
+   62,    85,     1,    63,    86,     1,    64,    88,     1,    65,
+   90,     1,    66,    93,     1,    67,    94,     1,    68,    95,
+    1,    69,    96,     1,    70,    97,     1,    71,    98,     1,
+   72,    99,     1,    73,   100,     1,    74,   101,     1,    75,
+  103,     1,    76,   104,     2,    77,   105,   120,   242,     1,
+   78,   106,     1,    79,   107,     1,   119,   241,     1,    80,
+  109,     1,    81,   110,     1,    82,   113,     2,    83,   114,
+   94,   131,     1,    93,   130,     2,    84,   116,    92,   129,
+    2,    85,   117,    91,   128,     2,    86,   118,    98,   135,
+    2,    87,   119,    97,   134,     1,    96,   133,     2,     0,
+    1,    95,   132,     2,    88,   122,   102,   139,     3,     2,
+    3,    89,   123,   101,   138,     3,     1,     2,    90,   124,
+  100,   137,     2,     4,     5,    99,   136,     1,     3,     4,
+    1,     6,     7,     1,     5,     6,     1,     8,     9,     2,
+    7,     8,   106,   147,     2,    10,    11,   105,   146,     2,
+    9,    10,   104,   145,     1,   103,   144,     1,    11,    12,
+    1,    13,    15,     1,    12,    14,     1,    15,    17,     2,
+   14,    16,   108,   155,     2,    17,    19,   107,   154,     1,
+   16,    18,     1,    19,    21,     2,    18,    20,   110,   159,
+    1,    21,    23,     1,    20,    22,     2,    23,    25,   109,
+  156,     2,    22,    24,   112,   163,     1,    25,    27,     2,
+   24,    26,   111,   161,     1,    27,    29,
+};
+
+const unsigned short Dict327KeyHashTable[] = {
+  121,   121,   121,   121,   121,   122,   125,   132,   137,   121,
+  121,   140,   143,   146,   149,   154,   159,   162,   165,   168,
+  121,   121,   121,   121,   171,   121,   174,   177,   121,   121,
+  121,   182,   185,   121,   188,   121,   191,   196,   121,   201,
+  206,   211,   121,   121,   214,   217,   121,   121,   222,   225,
+  234,   237,   244,   247,   121,   121,   121,   252,   271,   274,
+  121,   279,   282,   121,   287,   292,   121,   121,   297,   300,
+  303,   121,   306,   309,   312,   317,   324,   327,   330,   333,
+  338,   121,   343,   348,   121,   121,   121,   351,   354,   361,
+  364,   367,   121,   374,   121,   377,   382,   385,   388,   391,
+  396,   121,   399,   402,   407,   121,   410,   121,   121,   415,
+  418,   423,   426,   429,   121,   121,   432,   435,   121,   121,
+  438,     0,     1,    36, 38495,     3,    67, 48876,    74, 48231,
+   96, 36938,     2,    61, 25073,   101,  3610,     1,    93,  6268,
+    1,    80, 29542,     1,    31, 33007,     1,   102, 40571,     2,
+   90, 37603,    97, 26027,     2,    14, 26570,    15, 60995,     1,
+   54, 13865,     1,     4, 53828,     1,    19, 11781,     1,    94,
+40256,     1,    40, 35759,     1,    99,  1999,     2,    60, 13301,
+   83, 37303,     1,    58, 23725,     1,    25, 48964,     1,    20,
+49480,     2,    21, 53787,    22, 16946,     2,     8, 27410,    24,
+56946,     2,    41, 26630,    49, 18458,     2,    33, 44007,   116,
+10747,     1,   104, 51872,     1,    62,  9966,     2,    29, 53677,
+   32, 47156,     1,    34, 44458,     4,    16, 35172,    65, 11534,
+  109, 63093,   113, 14616,     1,    23,  3673,     3,     5, 25859,
+   68, 30409,    82,  4893,     1,   103, 33584,     2,     6, 63622,
+   50, 37311,     9,    37,    44,    38,    44,    44,    44,    79,
+   44,    84,    44,    85,    44,    91,    44,   107,    44,   118,
+   44,     1,   105, 30749,     2,    27, 28765,    66, 14024,     1,
+   11, 52132,     2,    30, 26222,    73, 33790,     2,    46, 59320,
+   63, 54477,     2,    87,  4861,    89, 11334,     1,    57, 52379,
+    1,   119, 31474,     1,     3,  9247,     1,    71, 61982,     1,
+   98, 55314,     2,    39, 23185,    72, 46193,     3,    10,  9553,
+   17, 16527,    78, 61047,     1,    92, 18740,     1,    43, 15568,
+    1,    51,  7525,     2,    42, 19885,   110, 49529,     2,     1,
+40729,    77, 22250,     2,    28,  5198,    75, 40916,     1,     7,
+34028,     1,    53, 62351,     3,    45, 45029,    55, 23907,   111,
+57702,     1,   108, 40875,     1,    56, 46044,     3,    70, 14852,
+   76, 61743,   115, 61743,     1,     0, 10108,     2,    18, 28627,
+   86, 38226,     1,    59, 37023,     1,    13, 13356,     1,    64,
+29103,     2,    95, 10750,   100, 40071,     1,    48, 45173,     1,
+   26,  6137,     2,   106, 60724,   117,  9487,     1,    12,  7832,
+    2,     2, 35067,   120, 64248,     1,   112, 34383,     2,     9,
+31243,    81, 25668,     1,    88, 59755,     1,    47, 26328,     1,
+   69, 27443,     1,    35,   317,     1,   114, 37450,     1,    52,
+45035,
 };
 
-vtkDICOMDictionary::Dict Dict317Data = {
+vtkDICOMDictionary::Dict Dict327Data = {
 "PHILIPS IMAGING DD 001",
-114,
-114,
-Dict317TagHashTable,
-Dict317KeyHashTable,
-Dict317Contents
+121,
+121,
+Dict327TagHashTable,
+Dict327KeyHashTable,
+Dict327Contents
 };
 
 // ----- NQRight -----
 
-DictEntry Dict318Contents[] = {
+const DictEntry Dict328Contents[] = {
 { 0x0299, 0x0001, 0, VR::FL, VM::M1, "RightCorticalWhiteMatter" },
 { 0x0299, 0x0002, 0, VR::FL, VM::M1, "RightCorticalGrayMatter" },
 { 0x0299, 0x0003, 0, VR::FL, VM::M1, "Right3rdVentricle" },
@@ -19588,7 +20466,7 @@ DictEntry Dict318Contents[] = {
 { 0x0299, 0x003a, 0, VR::FL, VM::M1, "RightMeningie" },
 };
 
-unsigned short Dict318TagHashTable[] = {
+const unsigned short Dict328TagHashTable[] = {
    59,    62,    65,    70,    75,    80,    85,    90,    95,    98,
   101,   104,   107,   110,   113,   116,   119,   122,   125,   128,
   131,    58,   134,   137,   140,   143,   146,   149,   152,   155,
@@ -19614,7 +20492,7 @@ unsigned short Dict318TagHashTable[] = {
    38,     1,    36,    37,     1,    35,    36,
 };
 
-unsigned short Dict318KeyHashTable[] = {
+const unsigned short Dict328KeyHashTable[] = {
    58,    58,    59,    58,    62,    65,    72,    58,    75,    58,
    78,    83,    86,    58,    58,    89,    58,    92,    58,    95,
    98,   105,   108,    58,   115,   118,    58,   125,   128,    58,
@@ -19639,18 +20517,18 @@ unsigned short Dict318KeyHashTable[] = {
 23833,    46, 24728,     1,    27, 12877,
 };
 
-vtkDICOMDictionary::Dict Dict318Data = {
+vtkDICOMDictionary::Dict Dict328Data = {
 "NQRight",
 58,
 58,
-Dict318TagHashTable,
-Dict318KeyHashTable,
-Dict318Contents
+Dict328TagHashTable,
+Dict328KeyHashTable,
+Dict328Contents
 };
 
 // ----- Siemens: Thorax/Multix FD Lab Settings -----
 
-DictEntry Dict319Contents[] = {
+const DictEntry Dict329Contents[] = {
 { 0x0019, 0x0000, 0, VR::LO, VM::M1, "" },
 { 0x0019, 0x0001, 0, VR::LO, VM::M1, "" },
 { 0x0019, 0x0002, 0, VR::LO, VM::M1, "TotalDoseAreaProduct" },
@@ -19672,7 +20550,7 @@ DictEntry Dict319Contents[] = {
 { 0x0021, 0x0031, 0, VR::SH, VM::M1, "AcquisitionSortNumber" },
 };
 
-unsigned short Dict319TagHashTable[] = {
+const unsigned short Dict329TagHashTable[] = {
    19,    19,    20,    23,    26,    29,    34,    37,    40,    43,
    46,    49,    52,    19,    55,    58,    61,    66,    19,     0,
     1,    10,     9,     1,     9,     8,     1,    12,    11,     2,
@@ -19683,7 +20561,7 @@ unsigned short Dict319TagHashTable[] = {
    22,    17,    48,
 };
 
-unsigned short Dict319KeyHashTable[] = {
+const unsigned short Dict329KeyHashTable[] = {
    20,    23,    26,    19,    31,    42,    45,    19,    48,    19,
    19,    19,    53,    56,    59,    19,    19,    62,    65,     0,
     1,    14, 27708,     1,     9, 58517,     2,    10, 21495,    11,
@@ -19693,74 +20571,79 @@ unsigned short Dict319KeyHashTable[] = {
     2, 33760,     1,     6, 55050,     2,    15, 46275,    17, 55280,
 };
 
-vtkDICOMDictionary::Dict Dict319Data = {
+vtkDICOMDictionary::Dict Dict329Data = {
 "Siemens: Thorax/Multix FD Lab Settings",
 19,
 19,
-Dict319TagHashTable,
-Dict319KeyHashTable,
-Dict319Contents
+Dict329TagHashTable,
+Dict329KeyHashTable,
+Dict329Contents
 };
 
 // ----- CAD Sciences -----
 
-DictEntry Dict320Contents[] = {
+const DictEntry Dict330Contents[] = {
 { 0x3335, 0x0000, 0, VR::UN, VM::M1, "" },
 { 0x3335, 0x0006, 0, VR::UN, VM::M1, "" },
 { 0x3335, 0x0007, 0, VR::UN, VM::M1, "" },
 { 0x3335, 0x0008, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict320TagHashTable[] = {
+const unsigned short Dict330TagHashTable[] = {
     4,     5,    10,    13,     0,     2,     0,     0,     3,     8,
     1,     2,     7,     1,     1,     6,
 };
 
-unsigned short Dict320KeyHashTable[] = {
+const unsigned short Dict330KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict320Data = {
+vtkDICOMDictionary::Dict Dict330Data = {
 "CAD Sciences",
 4,
 4,
-Dict320TagHashTable,
-Dict320KeyHashTable,
-Dict320Contents
+Dict330TagHashTable,
+Dict330KeyHashTable,
+Dict330Contents
 };
 
 // ----- V1 -----
 
-DictEntry Dict321Contents[] = {
+const DictEntry Dict331Contents[] = {
 { 0x0011, 0x0001, 0, VR::OB, VM::M1, "UserData" },
 { 0x0011, 0x0002, 0, VR::DS, VM::M1, "NormalizationCoefficient" },
 { 0x0011, 0x0003, 0, VR::DS, VM::M1TN, "ReceivingGain" },
 { 0x0011, 0x0004, 0, VR::DS, VM::M1, "MeanImageNoise" },
+{ 0x0011, 0x0005, 0, VR::LT, VM::M1, "" },
+{ 0x0011, 0x0006, 0, VR::LT, VM::M1, "" },
+{ 0x0011, 0x0007, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict321TagHashTable[] = {
-    5,     8,    11,    14,     0,     1,     0,     1,     1,     3,
-    4,     1,     2,     3,     1,     1,     2,
+const unsigned short Dict331TagHashTable[] = {
+    8,    11,    14,     7,    19,    22,    25,     0,     1,     3,
+    4,     1,     6,     7,     2,     0,     1,     5,     6,     1,
+    2,     3,     1,     1,     2,     1,     4,     5,
 };
 
-unsigned short Dict321KeyHashTable[] = {
-    5,     4,     8,    11,     0,     1,     2, 47152,     1,     0,
-51847,     2,     1,  7530,     3, 17937,
+const unsigned short Dict331KeyHashTable[] = {
+    8,     7,    11,     7,     7,    14,    21,     0,     1,     1,
+60477,     1,     3, 47699,     3,     4,   768,     5,   768,     6,
+  768,     2,     0, 20264,     2, 55030,
 };
 
-vtkDICOMDictionary::Dict Dict321Data = {
+vtkDICOMDictionary::Dict Dict331Data = {
 "V1",
-4,
-4,
-Dict321TagHashTable,
-Dict321KeyHashTable,
-Dict321Contents
+7,
+7,
+Dict331TagHashTable,
+Dict331KeyHashTable,
+Dict331Contents
 };
 
 // ----- GEMS_SERS_01 -----
 
-DictEntry Dict322Contents[] = {
+const DictEntry Dict332Contents[] = {
 { 0x0025, 0x0006, 0, VR::SS, VM::M1, "LastPulseSequenceUsed" },
 { 0x0025, 0x0007, 0, VR::SL, VM::M1, "ImagesInSeries" },
 { 0x0025, 0x0010, 0, VR::SL, VM::M1, "LandmarkCounter" },
@@ -19773,32 +20656,32 @@ DictEntry Dict322Contents[] = {
 { 0x0025, 0x001b, 0, VR::OB, VM::M1, "ProtocolDataBlockCompressed" },
 };
 
-unsigned short Dict322TagHashTable[] = {
+const unsigned short Dict332TagHashTable[] = {
    11,    16,    19,    24,    29,    32,    10,    10,    10,    35,
     0,     2,     5,    23,     7,    25,     1,     6,    24,     2,
     3,    17,     9,    27,     2,     2,    16,     8,    26,     1,
     1,     7,     1,     0,     6,     1,     4,    20,
 };
 
-unsigned short Dict322KeyHashTable[] = {
+const unsigned short Dict332KeyHashTable[] = {
    11,    10,    10,    14,    17,    20,    10,    27,    10,    30,
     0,     1,     0, 48638,     1,     4, 38095,     1,     7, 10378,
     3,     5, 57651,     6, 44233,     8, 31186,     1,     9, 20657,
     3,     1, 31090,     2, 30503,     3, 40239,
 };
 
-vtkDICOMDictionary::Dict Dict322Data = {
+vtkDICOMDictionary::Dict Dict332Data = {
 "GEMS_SERS_01",
 10,
 10,
-Dict322TagHashTable,
-Dict322KeyHashTable,
-Dict322Contents
+Dict332TagHashTable,
+Dict332KeyHashTable,
+Dict332Contents
 };
 
 // ----- astm.org/diconde/iod/NdeUsEquipment -----
 
-DictEntry Dict323Contents[] = {
+const DictEntry Dict333Contents[] = {
 { 0x0009, 0x0002, 0, VR::SQ, VM::M1, "PulserEquipmentSequence" },
 { 0x0009, 0x0004, 0, VR::CS, VM::M1, "PulserType" },
 { 0x0009, 0x0006, 0, VR::LT, VM::M1, "PulserNotes" },
@@ -19822,7 +20705,7 @@ DictEntry Dict323Contents[] = {
 { 0x0009, 0x001C, 0, VR::DS, VM::M1, "MeasuredBandwidth" },
 };
 
-unsigned short Dict323TagHashTable[] = {
+const unsigned short Dict333TagHashTable[] = {
    22,    25,    21,    28,    33,    36,    41,    46,    51,    54,
    57,    60,    21,    63,    21,    66,    69,    72,    75,    78,
    21,     0,     1,    20,    28,     1,     3,     8,     2,     4,
@@ -19834,7 +20717,7 @@ unsigned short Dict323TagHashTable[] = {
    26,
 };
 
-unsigned short Dict323KeyHashTable[] = {
+const unsigned short Dict333KeyHashTable[] = {
    21,    21,    22,    25,    21,    30,    35,    40,    21,    43,
    48,    21,    55,    58,    21,    21,    21,    21,    61,    72,
    21,     0,     1,    12, 26724,     2,     5, 26272,    13, 26724,
@@ -19845,18 +20728,18 @@ unsigned short Dict323KeyHashTable[] = {
    15, 51153,     1,    16, 51153,
 };
 
-vtkDICOMDictionary::Dict Dict323Data = {
+vtkDICOMDictionary::Dict Dict333Data = {
 "astm.org/diconde/iod/NdeUsEquipment",
 21,
 21,
-Dict323TagHashTable,
-Dict323KeyHashTable,
-Dict323Contents
+Dict333TagHashTable,
+Dict333KeyHashTable,
+Dict333Contents
 };
 
 // ----- AMI ImageContext_01 -----
 
-DictEntry Dict324Contents[] = {
+const DictEntry Dict334Contents[] = {
 { 0x3109, 0x0010, 0, VR::CS, VM::M1, "WindowInvert" },
 { 0x3109, 0x0020, 0, VR::IS, VM::M1, "WindowCenter" },
 { 0x3109, 0x0030, 0, VR::IS, VM::M1, "WindowWidth" },
@@ -19868,32 +20751,32 @@ DictEntry Dict324Contents[] = {
 { 0x3109, 0x0090, 0, VR::CS, VM::M1, "ShowImageOverlay" },
 };
 
-unsigned short Dict324TagHashTable[] = {
+const unsigned short Dict334TagHashTable[] = {
     9,    10,     9,    15,     9,    22,    25,     9,    28,     0,
     2,     1,    32,     4,    80,     3,     0,    16,     3,    64,
     8,   144,     1,     7,   128,     1,     6,   112,     2,     2,
    48,     5,    96,
 };
 
-unsigned short Dict324KeyHashTable[] = {
+const unsigned short Dict334KeyHashTable[] = {
     9,     9,    10,    13,    18,    23,    28,    31,     9,     0,
     1,     4, 14990,     2,     0,  3266,     2,  3434,     2,     1,
 25418,     3, 28245,     2,     5, 12513,     7,  9639,     1,     6,
 34690,     1,     8, 62020,
 };
 
-vtkDICOMDictionary::Dict Dict324Data = {
+vtkDICOMDictionary::Dict Dict334Data = {
 "AMI ImageContext_01",
 9,
 9,
-Dict324TagHashTable,
-Dict324KeyHashTable,
-Dict324Contents
+Dict334TagHashTable,
+Dict334KeyHashTable,
+Dict334Contents
 };
 
 // ----- SPI-P-XSB-VISUB Release 1 -----
 
-DictEntry Dict325Contents[] = {
+const DictEntry Dict335Contents[] = {
 { 0x0019, 0x0000, 0, VR::UN, VM::M1, "" },
 { 0x0019, 0x0010, 0, VR::UN, VM::M1, "" },
 { 0x0019, 0x0011, 0, VR::UN, VM::M1, "" },
@@ -19919,7 +20802,7 @@ DictEntry Dict325Contents[] = {
 { 0x0029, 0x003f, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict325TagHashTable[] = {
+const unsigned short Dict335TagHashTable[] = {
    23,    24,    27,    32,    35,    23,    38,    23,    41,    48,
    53,    56,    23,    65,    23,    68,    23,    71,    74,    77,
    80,    23,    83,     0,     1,    20,    49,     2,     0,     0,
@@ -19931,7 +20814,7 @@ unsigned short Dict325TagHashTable[] = {
     1,     9,     2,     1,    22,    63,
 };
 
-unsigned short Dict325KeyHashTable[] = {
+const unsigned short Dict335KeyHashTable[] = {
    23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
    23,    23,    23,    23,    23,    23,    23,    23,    23,    23,
    23,    23,    24,     0,    23,     0,   233,     1,   233,     2,
@@ -19942,18 +20825,18 @@ unsigned short Dict325KeyHashTable[] = {
   233,
 };
 
-vtkDICOMDictionary::Dict Dict325Data = {
+vtkDICOMDictionary::Dict Dict335Data = {
 "SPI-P-XSB-VISUB Release 1",
 23,
 23,
-Dict325TagHashTable,
-Dict325KeyHashTable,
-Dict325Contents
+Dict335TagHashTable,
+Dict335KeyHashTable,
+Dict335Contents
 };
 
 // ----- 2.16.840.1.114059.1.1.6.1.50.1 -----
 
-DictEntry Dict326Contents[] = {
+const DictEntry Dict336Contents[] = {
 { 0x0029, 0x0020, 0, VR::LT, VM::M1, "" },
 { 0x0029, 0x0021, 0, VR::ST, VM::M1, "" },
 { 0x0029, 0x0022, 0, VR::ST, VM::M1, "" },
@@ -19964,31 +20847,31 @@ DictEntry Dict326Contents[] = {
 { 0x0029, 0x0027, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict326TagHashTable[] = {
+const unsigned short Dict336TagHashTable[] = {
     9,    12,    15,    18,    21,    24,    27,    30,     0,     1,
     1,    33,     1,     0,    32,     1,     3,    35,     1,     2,
    34,     1,     5,    37,     1,     4,    36,     1,     7,    39,
     1,     6,    38,
 };
 
-unsigned short Dict326KeyHashTable[] = {
+const unsigned short Dict336KeyHashTable[] = {
     8,     8,     8,     8,     8,     9,     8,     8,     0,     8,
     0,   672,     1,   672,     2,   672,     3,   672,     4,   672,
     5,   672,     6,   672,     7,   672,
 };
 
-vtkDICOMDictionary::Dict Dict326Data = {
+vtkDICOMDictionary::Dict Dict336Data = {
 "2.16.840.1.114059.1.1.6.1.50.1",
 8,
 8,
-Dict326TagHashTable,
-Dict326KeyHashTable,
-Dict326Contents
+Dict336TagHashTable,
+Dict336KeyHashTable,
+Dict336Contents
 };
 
 // ----- SIEMENS RIS -----
 
-DictEntry Dict327Contents[] = {
+const DictEntry Dict337Contents[] = {
 { 0x0011, 0x0010, 0, VR::LO, VM::M1, "PatientUID" },
 { 0x0011, 0x0011, 0, VR::LO, VM::M1, "PatientID" },
 { 0x0011, 0x0020, 0, VR::DA, VM::M1, "PatientRegistrationDate" },
@@ -20004,7 +20887,7 @@ DictEntry Dict327Contents[] = {
 { 0x0033, 0x0010, 0, VR::LO, VM::M1, "PatientStudyUID" },
 };
 
-unsigned short Dict327TagHashTable[] = {
+const unsigned short Dict337TagHashTable[] = {
    14,    19,    22,    25,    28,    31,    34,    37,    13,    42,
    47,    13,    13,     0,     2,     1,    17,    10,    69,     1,
     0,    16,     1,     6,    64,     1,     7,    65,     1,     8,
@@ -20012,7 +20895,7 @@ unsigned short Dict327TagHashTable[] = {
     9,    16,     2,     3,    33,    12,    16,     1,     2,    32,
 };
 
-unsigned short Dict327KeyHashTable[] = {
+const unsigned short Dict337KeyHashTable[] = {
    14,    17,    20,    13,    23,    26,    13,    31,    38,    13,
    13,    13,    43,     0,     1,    11,  3643,     1,     2, 61210,
     1,     1,  8377,     1,     6, 50806,     2,     7, 47106,     8,
@@ -20020,42 +20903,42 @@ unsigned short Dict327KeyHashTable[] = {
 45572,     3, 40556,     2,     4, 46545,    12, 32781,
 };
 
-vtkDICOMDictionary::Dict Dict327Data = {
+vtkDICOMDictionary::Dict Dict337Data = {
 "SIEMENS RIS",
 13,
 13,
-Dict327TagHashTable,
-Dict327KeyHashTable,
-Dict327Contents
+Dict337TagHashTable,
+Dict337KeyHashTable,
+Dict337Contents
 };
 
 // ----- GEMS_YMHD_01 -----
 
-DictEntry Dict328Contents[] = {
+const DictEntry Dict338Contents[] = {
 { 0x0033, 0x0005, 0, VR::UN, VM::M1, "" },
 { 0x0033, 0x0006, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict328TagHashTable[] = {
+const unsigned short Dict338TagHashTable[] = {
     3,     6,     0,     1,     0,     5,     1,     1,     6,
 };
 
-unsigned short Dict328KeyHashTable[] = {
+const unsigned short Dict338KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict328Data = {
+vtkDICOMDictionary::Dict Dict338Data = {
 "GEMS_YMHD_01",
 2,
 2,
-Dict328TagHashTable,
-Dict328KeyHashTable,
-Dict328Contents
+Dict338TagHashTable,
+Dict338KeyHashTable,
+Dict338Contents
 };
 
 // ----- SPI-P-CTBE Release 1 -----
 
-DictEntry Dict329Contents[] = {
+const DictEntry Dict339Contents[] = {
 { 0x0019, 0x0000, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0002, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0003, 0, VR::DS, VM::M1, "" },
@@ -20072,7 +20955,7 @@ DictEntry Dict329Contents[] = {
 { 0x0019, 0x001d, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict329TagHashTable[] = {
+const unsigned short Dict339TagHashTable[] = {
    15,    20,    25,    28,    31,    36,    14,    39,    14,    14,
    14,    42,    45,    48,     0,     2,     4,     5,     9,    25,
     2,     3,     4,     8,    24,     1,    11,    27,     1,    10,
@@ -20081,7 +20964,7 @@ unsigned short Dict329TagHashTable[] = {
     2,     7,    20,
 };
 
-unsigned short Dict329KeyHashTable[] = {
+const unsigned short Dict339KeyHashTable[] = {
    14,    14,    14,    14,    14,    15,    14,    14,    14,    14,
    14,    14,    14,    14,     0,    14,     0,   384,     1,   384,
     2,   384,     3,   384,     4,   384,     5,   384,     6,   384,
@@ -20089,105 +20972,96 @@ unsigned short Dict329KeyHashTable[] = {
    12,   384,    13,   384,
 };
 
-vtkDICOMDictionary::Dict Dict329Data = {
+vtkDICOMDictionary::Dict Dict339Data = {
 "SPI-P-CTBE Release 1",
 14,
 14,
-Dict329TagHashTable,
-Dict329KeyHashTable,
-Dict329Contents
+Dict339TagHashTable,
+Dict339KeyHashTable,
+Dict339Contents
 };
 
 // ----- ISG shadow -----
 
-DictEntry Dict330Contents[] = {
+const DictEntry Dict340Contents[] = {
 { 0x0029, 0x0070, 0, VR::IS, VM::M1, "" },
 { 0x0029, 0x0080, 0, VR::IS, VM::M1, "" },
 { 0x0029, 0x0090, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict330TagHashTable[] = {
+const unsigned short Dict340TagHashTable[] = {
     4,     7,     3,     0,     1,     1,   128,     2,     0,   112,
     2,   144,
 };
 
-unsigned short Dict330KeyHashTable[] = {
+const unsigned short Dict340KeyHashTable[] = {
     3,     3,     4,     0,     3,     0,  1793,     1,  1793,     2,
  1793,
 };
 
-vtkDICOMDictionary::Dict Dict330Data = {
+vtkDICOMDictionary::Dict Dict340Data = {
 "ISG shadow",
 3,
 3,
-Dict330TagHashTable,
-Dict330KeyHashTable,
-Dict330Contents
+Dict340TagHashTable,
+Dict340KeyHashTable,
+Dict340Contents
 };
 
 // ----- METAEMOTION GINKGO RETINAL -----
 
-DictEntry Dict331Contents[] = {
+const DictEntry Dict341Contents[] = {
 { 0x0011, 0x0001, 0, VR::LT, VM::M1, "KeyFileIndicator" },
 { 0x0011, 0x000B, 0, VR::LT, VM::M1, "SerializedDiagnoseAndMarkers" },
 { 0x0011, 0x000C, 0, VR::UN, VM::M1, "VirtualAneritraContrastImage" },
 };
 
-unsigned short Dict331TagHashTable[] = {
+const unsigned short Dict341TagHashTable[] = {
     3,     4,     7,     0,     1,     0,     1,     2,     1,    11,
     2,    12,
 };
 
-unsigned short Dict331KeyHashTable[] = {
+const unsigned short Dict341KeyHashTable[] = {
     4,     9,     3,     0,     2,     0, 32761,     2, 48753,     1,
     1,  8406,
 };
 
-vtkDICOMDictionary::Dict Dict331Data = {
+vtkDICOMDictionary::Dict Dict341Data = {
 "METAEMOTION GINKGO RETINAL",
 3,
 3,
-Dict331TagHashTable,
-Dict331KeyHashTable,
-Dict331Contents
+Dict341TagHashTable,
+Dict341KeyHashTable,
+Dict341Contents
 };
 
-// ----- Riverain Medical -----
+// ----- SIEMENS SYNGO REGISTRATION -----
 
-DictEntry Dict332Contents[] = {
-{ 0x0203, 0x0000, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x0001, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x0002, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x0003, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x0010, 0, VR::LO, VM::M1, "" },
-{ 0x0203, 0x00f0, 0, VR::UI, VM::M1, "" },
-{ 0x0203, 0x00f1, 0, VR::UI, VM::M1, "" },
+const DictEntry Dict342Contents[] = {
+{ 0x0071, 0x0020, 0, VR::SQ, VM::M1, "RegisteredImageSequence" },
+{ 0x0071, 0x0021, 0, VR::CS, VM::M1, "RegistrationIsValidatedFlag" },
 };
 
-unsigned short Dict332TagHashTable[] = {
-    8,     7,    11,    14,    17,    22,     7,     0,     1,     4,
-   16,     1,     3,     3,     1,     2,     2,     2,     1,     1,
-    5,   240,     2,     0,     0,     6,   241,
+const unsigned short Dict342TagHashTable[] = {
+    3,     6,     0,     1,     0,    32,     1,     1,    33,
 };
 
-unsigned short Dict332KeyHashTable[] = {
-    7,     7,     7,     7,     7,     8,     7,     0,     7,     0,
-  768,     1,   768,     2,   768,     3,   768,     4,   768,     5,
-  768,     6,   768,
+const unsigned short Dict342KeyHashTable[] = {
+    3,     6,     0,     1,     1, 65362,     1,     0, 53639,
 };
 
-vtkDICOMDictionary::Dict Dict332Data = {
-"Riverain Medical",
-7,
-7,
-Dict332TagHashTable,
-Dict332KeyHashTable,
-Dict332Contents
+vtkDICOMDictionary::Dict Dict342Data = {
+"SIEMENS SYNGO REGISTRATION",
+2,
+2,
+Dict342TagHashTable,
+Dict342KeyHashTable,
+Dict342Contents
 };
 
 // ----- HOLOGIC -----
 
-DictEntry Dict333Contents[] = {
+const DictEntry Dict343Contents[] = {
 { 0x0011, 0x0000, 0, VR::OB, VM::M1, "HxQuestionnaire" },
 { 0x0013, 0x0000, 0, VR::LO, VM::M1, "IVAResultsFlag" },
 { 0x0019, 0x0000, 0, VR::UT, VM::M1, "ReportData" },
@@ -20202,7 +21076,7 @@ DictEntry Dict333Contents[] = {
 { 0x0029, 0x0001, 0, VR::UL, VM::M1, "GraphBitmapSize" },
 };
 
-unsigned short Dict333TagHashTable[] = {
+const unsigned short Dict343TagHashTable[] = {
    12,    13,    16,    19,    22,    25,    12,    30,    33,    38,
    41,    44,     0,     1,     2,     0,     1,     9,     5,     1,
     8,     4,     1,    11,     1,     2,     0,     0,    10,     0,
@@ -20210,7 +21084,7 @@ unsigned short Dict333TagHashTable[] = {
     2,     1,     5,     1,     1,     4,     0,
 };
 
-unsigned short Dict333KeyHashTable[] = {
+const unsigned short Dict343KeyHashTable[] = {
    12,    13,    12,    18,    21,    12,    24,    27,    12,    30,
    33,    38,     0,     2,     8, 19844,     9, 18946,     1,     4,
 54723,     1,     0, 12614,     1,     5,  1260,     1,     2, 46831,
@@ -20218,18 +21092,18 @@ unsigned short Dict333KeyHashTable[] = {
 36867,     7, 33057,    11, 10475,
 };
 
-vtkDICOMDictionary::Dict Dict333Data = {
+vtkDICOMDictionary::Dict Dict343Data = {
 "HOLOGIC",
 12,
 12,
-Dict333TagHashTable,
-Dict333KeyHashTable,
-Dict333Contents
+Dict343TagHashTable,
+Dict343KeyHashTable,
+Dict343Contents
 };
 
 // ----- GEMS_ACRQA_2.0 BLOCK1 -----
 
-DictEntry Dict334Contents[] = {
+const DictEntry Dict344Contents[] = {
 { 0x0023, 0x0000, 0, VR::LO, VM::M1, "CRExposureMenuCode" },
 { 0x0023, 0x0010, 0, VR::LO, VM::M1, "CRExposureMenuString" },
 { 0x0023, 0x0020, 0, VR::LO, VM::M1, "CREDRMode" },
@@ -20242,32 +21116,32 @@ DictEntry Dict334Contents[] = {
 { 0x0023, 0x0090, 0, VR::LO, VM::M1, "CRSShiftString" },
 };
 
-unsigned short Dict334TagHashTable[] = {
+const unsigned short Dict344TagHashTable[] = {
    10,    11,    16,    19,    22,    25,    28,    31,    34,    37,
     0,     2,     1,    16,     8,   128,     1,     7,   112,     1,
     2,    32,     1,     5,    80,     1,     0,     0,     1,     6,
    96,     1,     9,   144,     1,     4,    64,     1,     3,    48,
 };
 
-unsigned short Dict334KeyHashTable[] = {
+const unsigned short Dict344KeyHashTable[] = {
    11,    14,    17,    22,    27,    10,    30,    35,    10,    10,
     0,     1,     2, 48761,     1,     1, 46224,     2,     3, 41522,
     5, 31050,     2,     6, 39736,     8, 39860,     1,     4, 55886,
     2,     7, 30788,     9, 22214,     1,     0,  6115,
 };
 
-vtkDICOMDictionary::Dict Dict334Data = {
+vtkDICOMDictionary::Dict Dict344Data = {
 "GEMS_ACRQA_2.0 BLOCK1",
 10,
 10,
-Dict334TagHashTable,
-Dict334KeyHashTable,
-Dict334Contents
+Dict344TagHashTable,
+Dict344KeyHashTable,
+Dict344Contents
 };
 
 // ----- GEMS_ACRQA_2.0 BLOCK2 -----
 
-DictEntry Dict335Contents[] = {
+const DictEntry Dict345Contents[] = {
 { 0x0023, 0x0000, 0, VR::US, VM::M1, "CRSShift" },
 { 0x0023, 0x0010, 0, VR::LO, VM::M1, "CRCShift" },
 { 0x0023, 0x0020, 0, VR::LO, VM::M1, "CRGT" },
@@ -20280,32 +21154,32 @@ DictEntry Dict335Contents[] = {
 { 0x0023, 0x0090, 0, VR::DS, VM::M1, "CRDRT" },
 };
 
-unsigned short Dict335TagHashTable[] = {
+const unsigned short Dict345TagHashTable[] = {
    10,    11,    16,    19,    22,    25,    28,    31,    34,    37,
     0,     2,     1,    16,     8,   128,     1,     7,   112,     1,
     2,    32,     1,     5,    80,     1,     0,     0,     1,     6,
    96,     1,     9,   144,     1,     4,    64,     1,     3,    48,
 };
 
-unsigned short Dict335KeyHashTable[] = {
+const unsigned short Dict345KeyHashTable[] = {
    11,    10,    14,    10,    10,    21,    24,    27,    32,    35,
     0,     1,     3, 34077,     3,     4, 34077,     6, 34115,     9,
 36381,     1,     0, 28887,     1,     8, 34114,     2,     1, 64674,
     7, 34113,     1,     5, 34078,     1,     2, 34078,
 };
 
-vtkDICOMDictionary::Dict Dict335Data = {
+vtkDICOMDictionary::Dict Dict345Data = {
 "GEMS_ACRQA_2.0 BLOCK2",
 10,
 10,
-Dict335TagHashTable,
-Dict335KeyHashTable,
-Dict335Contents
+Dict345TagHashTable,
+Dict345KeyHashTable,
+Dict345Contents
 };
 
 // ----- GEMS_ACRQA_2.0 BLOCK3 -----
 
-DictEntry Dict336Contents[] = {
+const DictEntry Dict346Contents[] = {
 { 0x0023, 0x0000, 0, VR::DS, VM::M1, "CRDRE" },
 { 0x0023, 0x0010, 0, VR::US, VM::M1, "CRDRN" },
 { 0x0023, 0x0020, 0, VR::DS, VM::M1, "CRORE" },
@@ -20320,7 +21194,7 @@ DictEntry Dict336Contents[] = {
 { 0x0023, 0x00ff, 0, VR::US, VM::M1, "CRShuttersApplied" },
 };
 
-unsigned short Dict336TagHashTable[] = {
+const unsigned short Dict346TagHashTable[] = {
    12,    12,    13,    16,    21,    24,    27,    32,    12,    37,
    40,    43,     0,     1,     4,    64,     2,     1,    16,     2,
    32,     1,    10,   240,     1,     8,   128,     2,     5,    80,
@@ -20328,7 +21202,7 @@ unsigned short Dict336TagHashTable[] = {
     1,     7,   112,     1,     0,     0,
 };
 
-unsigned short Dict336KeyHashTable[] = {
+const unsigned short Dict346KeyHashTable[] = {
    12,    13,    18,    21,    12,    24,    29,    32,    37,    42,
    12,    12,     0,     2,     5,   508,     7, 36020,     1,     1,
 30317,     1,    11, 14138,     2,     0, 30316,     3, 31315,     1,
@@ -20336,18 +21210,18 @@ unsigned short Dict336KeyHashTable[] = {
     6, 40639,     1,    10, 61249,
 };
 
-vtkDICOMDictionary::Dict Dict336Data = {
+vtkDICOMDictionary::Dict Dict346Data = {
 "GEMS_ACRQA_2.0 BLOCK3",
 12,
 12,
-Dict336TagHashTable,
-Dict336KeyHashTable,
-Dict336Contents
+Dict346TagHashTable,
+Dict346KeyHashTable,
+Dict346Contents
 };
 
 // ----- GEMS_3DSTATE_001 -----
 
-DictEntry Dict337Contents[] = {
+const DictEntry Dict347Contents[] = {
 { 0x0047, 0x00e9, 0, VR::FL, VM::M3, "" },
 { 0x0047, 0x00ea, 0, VR::DS, VM::M3, "" },
 { 0x0047, 0x00eb, 0, VR::DS, VM::M3, "" },
@@ -20355,75 +21229,75 @@ DictEntry Dict337Contents[] = {
 { 0x0047, 0x00ed, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict337TagHashTable[] = {
+const unsigned short Dict347TagHashTable[] = {
     6,     5,     9,    12,    15,     0,     1,     1,   234,     1,
     0,   233,     1,     4,   237,     2,     2,   235,     3,   236,
 };
 
-unsigned short Dict337KeyHashTable[] = {
+const unsigned short Dict347KeyHashTable[] = {
     5,     6,     5,     5,     5,     0,     5,     0,  1076,     1,
  1076,     2,  1076,     3,  1076,     4,  1076,
 };
 
-vtkDICOMDictionary::Dict Dict337Data = {
+vtkDICOMDictionary::Dict Dict347Data = {
 "GEMS_3DSTATE_001",
 5,
 5,
-Dict337TagHashTable,
-Dict337KeyHashTable,
-Dict337Contents
+Dict347TagHashTable,
+Dict347KeyHashTable,
+Dict347Contents
 };
 
 // ----- RamSoft File Kind Identifier -----
 
-DictEntry Dict338Contents[] = {
+const DictEntry Dict348Contents[] = {
 { 0x3111, 0x0010, 0, VR::CS, VM::M1, "BinaryDocumentKind" },
 };
 
-unsigned short Dict338TagHashTable[] = {
+const unsigned short Dict348TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict338KeyHashTable[] = {
+const unsigned short Dict348KeyHashTable[] = {
     2,     0,     1,     0,  6927,
 };
 
-vtkDICOMDictionary::Dict Dict338Data = {
+vtkDICOMDictionary::Dict Dict348Data = {
 "RamSoft File Kind Identifier",
 1,
 1,
-Dict338TagHashTable,
-Dict338KeyHashTable,
-Dict338Contents
+Dict348TagHashTable,
+Dict348KeyHashTable,
+Dict348Contents
 };
 
 // ----- SEGAMI__PAGE -----
 
-DictEntry Dict339Contents[] = {
+const DictEntry Dict349Contents[] = {
 { 0x0033, 0x0097, 0, VR::IS, VM::M1, "" },
 { 0x0033, 0x0098, 0, VR::OW, VM::M1, "" },
 };
 
-unsigned short Dict339TagHashTable[] = {
+const unsigned short Dict349TagHashTable[] = {
     3,     6,     0,     1,     0,   151,     1,     1,   152,
 };
 
-unsigned short Dict339KeyHashTable[] = {
+const unsigned short Dict349KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict339Data = {
+vtkDICOMDictionary::Dict Dict349Data = {
 "SEGAMI__PAGE",
 2,
 2,
-Dict339TagHashTable,
-Dict339KeyHashTable,
-Dict339Contents
+Dict349TagHashTable,
+Dict349KeyHashTable,
+Dict349Contents
 };
 
 // ----- SECTRA_Ident_01 -----
 
-DictEntry Dict340Contents[] = {
+const DictEntry Dict350Contents[] = {
 { 0x0009, 0x0001, 0, VR::SH, VM::M1, "RequestNumber" },
 { 0x0009, 0x0002, 0, VR::SH, VM::M1, "ExaminationNumber" },
 { 0x0009, 0x0004, 0, VR::LO, VM::M1, "SeriesIdentifier" },
@@ -20432,30 +21306,30 @@ DictEntry Dict340Contents[] = {
 { 0x0009, 0x0007, 0, VR::LO, VM::M1, "ImageDataID" },
 };
 
-unsigned short Dict340TagHashTable[] = {
+const unsigned short Dict350TagHashTable[] = {
     7,    10,    13,    18,     6,    21,     0,     1,     3,     5,
     1,     2,     4,     2,     0,     1,     5,     7,     1,     4,
     6,     1,     1,     2,
 };
 
-unsigned short Dict340KeyHashTable[] = {
+const unsigned short Dict350KeyHashTable[] = {
     7,    10,     6,     6,    15,    18,     0,     1,     3, 59522,
     2,     0,  3545,     1, 48247,     1,     4, 40027,     2,     2,
 18701,     5,   359,
 };
 
-vtkDICOMDictionary::Dict Dict340Data = {
+vtkDICOMDictionary::Dict Dict350Data = {
 "SECTRA_Ident_01",
 6,
 6,
-Dict340TagHashTable,
-Dict340KeyHashTable,
-Dict340Contents
+Dict350TagHashTable,
+Dict350KeyHashTable,
+Dict350Contents
 };
 
 // ----- STENTOR -----
 
-DictEntry Dict341Contents[] = {
+const DictEntry Dict351Contents[] = {
 { 0x0073, 0x0001, 0, VR::ST, VM::M1, "" },
 { 0x0073, 0x0002, 0, VR::ST, VM::M1, "" },
 { 0x0073, 0x0003, 0, VR::ST, VM::M1, "" },
@@ -20463,127 +21337,127 @@ DictEntry Dict341Contents[] = {
 { 0x0073, 0x0006, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict341TagHashTable[] = {
+const unsigned short Dict351TagHashTable[] = {
     6,     9,    12,    15,     5,     0,     1,     0,     1,     1,
     4,     6,     1,     1,     2,     2,     2,     3,     3,     4,
 };
 
-unsigned short Dict341KeyHashTable[] = {
+const unsigned short Dict351KeyHashTable[] = {
     5,     6,     5,     5,     5,     0,     5,     0,  1076,     1,
  1076,     2,  1076,     3,  1076,     4,  1076,
 };
 
-vtkDICOMDictionary::Dict Dict341Data = {
+vtkDICOMDictionary::Dict Dict351Data = {
 "STENTOR",
 5,
 5,
-Dict341TagHashTable,
-Dict341KeyHashTable,
-Dict341Contents
+Dict351TagHashTable,
+Dict351KeyHashTable,
+Dict351Contents
 };
 
 // ----- ObjectModel (ID, Version, Place, PlaceDescription) -----
 
-DictEntry Dict342Contents[] = {
+const DictEntry Dict352Contents[] = {
 { 0x8101, 0x0000, 0, VR::LO, VM::M1, "ID" },
 { 0x8101, 0x0010, 0, VR::LO, VM::M1, "Version" },
 };
 
-unsigned short Dict342TagHashTable[] = {
+const unsigned short Dict352TagHashTable[] = {
     2,     3,     0,     2,     0,     0,     1,    16,
 };
 
-unsigned short Dict342KeyHashTable[] = {
+const unsigned short Dict352KeyHashTable[] = {
     3,     6,     0,     1,     0, 47609,     1,     1, 27157,
 };
 
-vtkDICOMDictionary::Dict Dict342Data = {
+vtkDICOMDictionary::Dict Dict352Data = {
 "ObjectModel (ID, Version, Place, PlaceDescription)",
 2,
 2,
-Dict342TagHashTable,
-Dict342KeyHashTable,
-Dict342Contents
+Dict352TagHashTable,
+Dict352KeyHashTable,
+Dict352Contents
 };
 
 // ----- SIEMENS CSA REPORT -----
 
-DictEntry Dict343Contents[] = {
+const DictEntry Dict353Contents[] = {
 { 0x0029, 0x0008, 0, VR::CS, VM::M1, "ReportType" },
 { 0x0029, 0x0009, 0, VR::LO, VM::M1, "ReportVersion" },
 { 0x0029, 0x0015, 0, VR::US, VM::M1, "SRVariant" },
 { 0x0029, 0x0017, 0, VR::UI, VM::M1, "SCSOPInstanceUID" },
 };
 
-unsigned short Dict343TagHashTable[] = {
+const unsigned short Dict353TagHashTable[] = {
     5,    10,    13,     4,     0,     2,     1,     9,     2,    21,
     1,     0,     8,     1,     3,    23,
 };
 
-unsigned short Dict343KeyHashTable[] = {
+const unsigned short Dict353KeyHashTable[] = {
     5,     4,     4,     8,     0,     1,     3, 38633,     3,     0,
 28600,     1,  7209,     2, 38167,
 };
 
-vtkDICOMDictionary::Dict Dict343Data = {
+vtkDICOMDictionary::Dict Dict353Data = {
 "SIEMENS CSA REPORT",
 4,
 4,
-Dict343TagHashTable,
-Dict343KeyHashTable,
-Dict343Contents
+Dict353TagHashTable,
+Dict353KeyHashTable,
+Dict353Contents
 };
 
 // ----- astm.org/diconde/iod/ComponentSeries -----
 
-DictEntry Dict344Contents[] = {
+const DictEntry Dict354Contents[] = {
 { 0x0009, 0x0010, 0, VR::ST, VM::M1, "ActualEnvironmentalConditions" },
 { 0x0009, 0x0040, 0, VR::ST, VM::M1, "EnvironmentalConditions" },
 };
 
-unsigned short Dict344TagHashTable[] = {
+const unsigned short Dict354TagHashTable[] = {
     3,     6,     0,     1,     1,    64,     1,     0,    16,
 };
 
-unsigned short Dict344KeyHashTable[] = {
+const unsigned short Dict354KeyHashTable[] = {
     2,     3,     0,     2,     0,  4141,     1, 11328,
 };
 
-vtkDICOMDictionary::Dict Dict344Data = {
+vtkDICOMDictionary::Dict Dict354Data = {
 "astm.org/diconde/iod/ComponentSeries",
 2,
 2,
-Dict344TagHashTable,
-Dict344KeyHashTable,
-Dict344Contents
+Dict354TagHashTable,
+Dict354KeyHashTable,
+Dict354Contents
 };
 
 // ----- GEMS_0039 -----
 
-DictEntry Dict345Contents[] = {
+const DictEntry Dict355Contents[] = {
 { 0x0039, 0x0095, 0, VR::LO, VM::M1, "SRApplicationName" },
 };
 
-unsigned short Dict345TagHashTable[] = {
+const unsigned short Dict355TagHashTable[] = {
     2,     0,     1,     0,   149,
 };
 
-unsigned short Dict345KeyHashTable[] = {
+const unsigned short Dict355KeyHashTable[] = {
     2,     0,     1,     0, 43423,
 };
 
-vtkDICOMDictionary::Dict Dict345Data = {
+vtkDICOMDictionary::Dict Dict355Data = {
 "GEMS_0039",
 1,
 1,
-Dict345TagHashTable,
-Dict345KeyHashTable,
-Dict345Contents
+Dict355TagHashTable,
+Dict355KeyHashTable,
+Dict355Contents
 };
 
 // ----- PHILIPS MR IMAGING DD 001 -----
 
-DictEntry Dict346Contents[] = {
+const DictEntry Dict356Contents[] = {
 { 0x2005, 0x0000, 0, VR::FL, VM::M1, "ImageAngulationAP" },
 { 0x2005, 0x0001, 0, VR::FL, VM::M1, "ImageAngulationFH" },
 { 0x2005, 0x0002, 0, VR::FL, VM::M1, "ImageAngulationRL" },
@@ -20701,7 +21575,7 @@ DictEntry Dict346Contents[] = {
 { 0x2005, 0x0084, 0, VR::SQ, VM::M1, "SeriesReference" },
 { 0x2005, 0x0085, 0, VR::SQ, VM::M1, "SeriesVolume" },
 { 0x2005, 0x0086, 0, VR::SS, VM::M1, "NumberOfGeometry" },
-{ 0x2005, 0x009e, 0, VR::SQ, VM::M1, "Geometry" },
+{ 0x2005, 0x009e, 0, VR::SQ, VM::M1, "SeriesGeometry" },
 { 0x2005, 0x009f, 0, VR::CS, VM::M1, "SpectralSelectiveExcitationPulse" },
 { 0x2005, 0x00a0, 0, VR::FL, VM::M1, "DynamicScanBeginTime" },
 { 0x2005, 0x00a1, 0, VR::CS, VM::M1, "SyncraScanType" },
@@ -20712,14 +21586,14 @@ DictEntry Dict346Contents[] = {
 { 0x2005, 0x00a6, 0, VR::IS, VM::M1, "StackChannelCombi" },
 { 0x2005, 0x00a7, 0, VR::CS, VM::M1, "StackCoilConnection" },
 { 0x2005, 0x00a8, 0, VR::DS, VM::M1, "InversionTime" },
-{ 0x2005, 0x00a9, 0, VR::CS, VM::M1, "SeriesGeometryCorrection" },
+{ 0x2005, 0x00a9, 0, VR::CS, VM::M1, "GeometryCorrection" },
 { 0x2005, 0x00b0, 0, VR::FL, VM::M1, "DiffusionDirectionRL" },
 { 0x2005, 0x00b1, 0, VR::FL, VM::M1, "DiffusionDirectionAP" },
 { 0x2005, 0x00b2, 0, VR::FL, VM::M1, "DiffusionDirectionFH" },
-{ 0x2005, 0x00c0, 0, VR::CS, VM::M1, "SeriesScanSequence" },
+{ 0x2005, 0x00c0, 0, VR::CS, VM::M1, "ScanSequence" },
 };
 
-unsigned short Dict346TagHashTable[] = {
+const unsigned short Dict356TagHashTable[] = {
   134,   139,   144,   147,   150,   133,   133,   133,   133,   133,
   133,   133,   133,   153,   156,   159,   162,   167,   170,   173,
   176,   179,   182,   185,   188,   191,   194,   197,   200,   203,
@@ -20774,70 +21648,70 @@ unsigned short Dict346TagHashTable[] = {
   131,   178,
 };
 
-unsigned short Dict346KeyHashTable[] = {
-  134,   137,   133,   140,   143,   133,   133,   150,   153,   133,
-  156,   159,   164,   175,   133,   178,   181,   133,   186,   189,
-  192,   133,   195,   133,   198,   133,   133,   201,   208,   211,
-  214,   217,   220,   227,   230,   235,   240,   133,   243,   133,
-  133,   246,   249,   252,   257,   260,   133,   267,   270,   133,
-  275,   278,   283,   288,   133,   133,   291,   296,   305,   133,
-  133,   312,   133,   133,   133,   133,   315,   318,   133,   133,
-  323,   328,   331,   334,   133,   133,   339,   342,   345,   133,
-  350,   353,   358,   361,   364,   133,   133,   369,   133,   133,
-  133,   378,   387,   133,   133,   390,   395,   398,   133,   401,
-  408,   133,   413,   416,   419,   424,   133,   427,   432,   435,
-  133,   442,   445,   133,   448,   451,   454,   133,   133,   133,
-  133,   457,   460,   133,   133,   133,   463,   466,   471,   476,
-  133,   479,   133,     0,     1,    96, 39936,     1,    66, 39939,
-    1,    88, 59884,     3,    45, 58451,    75,  2929,   117, 64905,
-    1,    33, 31035,     1,    43, 57708,     1,   120, 63754,     2,
-    5, 40642,    40, 19746,     5,     7, 13694,    11, 10356,    42,
-19619,    83, 55986,    93, 56767,     1,    94, 56770,     1,    82,
- 1286,     2,    32,  9256,    49, 54045,     1,   109, 59619,     1,
-   91, 33319,     1,    58, 40105,     1,    26, 64726,     1,     9,
-20603,     3,     3, 20547,    99, 23421,   122, 47556,     1,    76,
- 2930,     1,    77,  2933,     1,    90, 52995,     1,     4, 12607,
-    3,    67, 48932,    72, 33440,   112,  6063,     1,    37, 12774,
-    2,    63, 43046,   126, 44880,     2,     6, 40643,    47, 64125,
-    1,    97, 39823,     1,    27, 58571,     1,    70, 63488,     1,
-  123, 54544,     2,   124, 54544,   127, 10766,     1,    39, 46760,
-    3,    21,  7188,    31, 54104,    62, 28498,     1,   111,   317,
-    2,    86, 47189,   103, 37819,     1,    60, 35960,     2,    30,
-20670,   114, 31708,     2,    17, 33176,   119, 59971,     1,     0,
-26174,     2,    68, 48933,    73, 33441,     4,    69, 48936,    74,
-33444,    78,  1533,   110, 49817,     3,     8, 18523,    29, 58137,
-   81, 36609,     1,    19, 60048,     1,    38, 31972,     2,    23,
-59381,   106,  5377,     2,    52, 63139,    56,  4141,     1,    59,
-42688,     1,   104, 37820,     2,    36, 21419,   105, 37823,     1,
-  115, 38092,     1,     1, 26175,     2,     2, 26178,    14, 60396,
-    1,   130, 15542,     2,    48, 62491,    79,  1534,     1,    80,
- 1537,     1,    10, 14600,     2,    15, 13834,    85, 26279,     4,
-   35, 49395,    41,  2784,    53,  6757,    57,  2257,     4,    22,
-27407,   107,  5378,   121, 55532,   128, 12773,     1,   108,  5381,
-    2,    34, 39158,    87,  8835,     1,   116, 36547,     1,    20,
-46856,     3,    44, 56196,    84, 33049,   125,  7391,     2,    28,
- 1338,    61, 51581,     1,   118, 63738,     1,    98, 27477,     2,
-  100, 44990,   131, 15543,     1,   129, 15546,     2,    12,  4183,
-   71, 54844,     1,    25, 60494,     3,    16,  3168,    55, 55530,
-   95, 39934,     1,    18, 34655,     1,    46,  9826,     1,    13,
-54927,     1,    64, 19418,     1,    24, 10054,     1,    92, 56765,
-    1,    89, 20628,     1,   132, 10224,     2,    51,  3354,   113,
- 4247,     2,    65, 26169,   101, 44991,     1,   102, 44994,     2,
-   50, 36577,    54, 60481,
+const unsigned short Dict356KeyHashTable[] = {
+  134,   137,   133,   140,   143,   133,   133,   148,   151,   133,
+  154,   157,   162,   173,   133,   176,   179,   133,   184,   187,
+  190,   133,   193,   133,   196,   133,   133,   199,   206,   209,
+  212,   215,   218,   225,   228,   233,   238,   133,   241,   133,
+  133,   244,   247,   250,   255,   258,   133,   265,   268,   133,
+  273,   276,   281,   286,   133,   133,   289,   294,   303,   133,
+  133,   310,   133,   133,   133,   133,   313,   316,   321,   133,
+  324,   329,   332,   335,   133,   133,   340,   343,   346,   133,
+  351,   354,   359,   362,   365,   133,   133,   370,   133,   133,
+  133,   379,   386,   133,   133,   389,   394,   397,   133,   400,
+  407,   133,   412,   415,   418,   423,   133,   426,   431,   434,
+  133,   441,   444,   133,   447,   450,   455,   133,   133,   133,
+  133,   458,   461,   133,   133,   464,   133,   467,   472,   477,
+  133,   480,   133,     0,     1,    96, 39936,     1,    66, 39939,
+    1,    88, 59884,     2,    45, 58451,    75,  2929,     1,    33,
+31035,     1,    43, 57708,     1,   120, 63754,     2,     5, 40642,
+   40, 19746,     5,     7, 13694,    11, 10356,    42, 19619,    83,
+55986,    93, 56767,     1,    94, 56770,     1,    82,  1286,     2,
+   32,  9256,    49, 54045,     1,   109, 59619,     1,    91, 33319,
+    1,    58, 40105,     1,    26, 64726,     1,     9, 20603,     3,
+    3, 20547,    99, 23421,   122, 47556,     1,    76,  2930,     1,
+   77,  2933,     1,    90, 52995,     1,     4, 12607,     3,    67,
+48932,    72, 33440,   112,  6063,     1,    37, 12774,     2,    63,
+43046,   126, 44880,     2,     6, 40643,    47, 64125,     1,    97,
+39823,     1,    27, 58571,     1,    70, 63488,     1,   123, 54544,
+    2,   124, 54544,   127, 10766,     1,    39, 46760,     3,    21,
+ 7188,    31, 54104,    62, 28498,     1,   111,   317,     2,    86,
+47189,   103, 37819,     1,    60, 35960,     2,    30, 20670,   114,
+31708,     2,    17, 33176,   119, 59971,     1,     0, 26174,     2,
+   68, 48933,    73, 33441,     4,    69, 48936,    74, 33444,    78,
+ 1533,   110, 49817,     3,     8, 18523,    29, 58137,    81, 36609,
+    1,    19, 60048,     1,    38, 31972,     2,    23, 59381,   106,
+ 5377,     1,   132, 14323,     2,    52, 63139,    56,  4141,     1,
+   59, 42688,     1,   104, 37820,     2,    36, 21419,   105, 37823,
+    1,   115, 38092,     1,     1, 26175,     2,     2, 26178,    14,
+60396,     1,   130, 15542,     2,    48, 62491,    79,  1534,     1,
+   80,  1537,     1,    10, 14600,     2,    15, 13834,    85, 26279,
+    4,    35, 49395,    41,  2784,    53,  6757,    57,  2257,     3,
+   22, 27407,   107,  5378,   121, 55532,     1,   108,  5381,     2,
+   34, 39158,    87,  8835,     1,   116, 36547,     1,    20, 46856,
+    3,    44, 56196,    84, 33049,   125,  7391,     2,    28,  1338,
+   61, 51581,     1,   118, 63738,     1,    98, 27477,     2,   100,
+44990,   131, 15543,     1,   129, 15546,     2,    12,  4183,    71,
+54844,     1,    25, 60494,     3,    16,  3168,    55, 55530,    95,
+39934,     1,    18, 34655,     1,    46,  9826,     1,    13, 54927,
+    2,    64, 19418,   117,  9749,     1,    24, 10054,     1,    92,
+56765,     1,    89, 20628,     1,   128, 61180,     2,    51,  3354,
+  113,  4247,     2,    65, 26169,   101, 44991,     1,   102, 44994,
+    2,    50, 36577,    54, 60481,
 };
 
-vtkDICOMDictionary::Dict Dict346Data = {
+vtkDICOMDictionary::Dict Dict356Data = {
 "PHILIPS MR IMAGING DD 001",
 133,
 133,
-Dict346TagHashTable,
-Dict346KeyHashTable,
-Dict346Contents
+Dict356TagHashTable,
+Dict356KeyHashTable,
+Dict356Contents
 };
 
 // ----- GE_GENESIS_REV3.0 -----
 
-DictEntry Dict347Contents[] = {
+const DictEntry Dict357Contents[] = {
 { 0x0019, 0x0039, 0, VR::SS, VM::M1, "AxialType" },
 { 0x0019, 0x008f, 0, VR::SS, VM::M1, "SwapPhaseFrequency" },
 { 0x0019, 0x009c, 0, VR::SS, VM::M1, "PulseSequenceName" },
@@ -20855,7 +21729,7 @@ DictEntry Dict347Contents[] = {
 { 0x0043, 0x0027, 0, VR::SH, VM::M1, "ScanPitchRatio" },
 };
 
-unsigned short Dict347TagHashTable[] = {
+const unsigned short Dict357TagHashTable[] = {
    16,    15,    21,    15,    26,    15,    15,    29,    32,    35,
    15,    38,    43,    48,    51,     0,     2,     2,   156,    11,
   217,     2,     0,    57,    13,    30,     1,     8,   204,     1,
@@ -20864,7 +21738,7 @@ unsigned short Dict347TagHashTable[] = {
   143,     2,     7,   203,    10,   216,
 };
 
-unsigned short Dict347KeyHashTable[] = {
+const unsigned short Dict357KeyHashTable[] = {
    16,    21,    24,    29,    34,    39,    15,    42,    15,    15,
    15,    15,    45,    52,    15,     0,     2,     8, 37446,    13,
  7540,     1,     5, 39961,     2,     3, 45780,    10,  5150,     2,
@@ -20873,18 +21747,18 @@ unsigned short Dict347KeyHashTable[] = {
    14, 42747,     1,    12, 18822,
 };
 
-vtkDICOMDictionary::Dict Dict347Data = {
+vtkDICOMDictionary::Dict Dict357Data = {
 "GE_GENESIS_REV3.0",
 15,
 15,
-Dict347TagHashTable,
-Dict347KeyHashTable,
-Dict347Contents
+Dict357TagHashTable,
+Dict357KeyHashTable,
+Dict357Contents
 };
 
 // ----- SIEMENS MR VA0  COAD -----
 
-DictEntry Dict348Contents[] = {
+const DictEntry Dict358Contents[] = {
 { 0x0019, 0x0012, 0, VR::DS, VM::M1, "MagneticFieldStrength" },
 { 0x0019, 0x0014, 0, VR::DS, VM::M1, "ADCVoltage" },
 { 0x0019, 0x0016, 0, VR::DS, VM::M2, "ADCOffset" },
@@ -20932,7 +21806,7 @@ DictEntry Dict348Contents[] = {
 { 0x0019, 0x00da, 0, VR::CS, VM::M1, "PhaseCodingDirection" },
 };
 
-unsigned short Dict348TagHashTable[] = {
+const unsigned short Dict358TagHashTable[] = {
    45,    45,    46,    49,    52,    55,    58,    61,    45,    64,
    67,    70,    75,    80,    83,    90,    97,    45,   102,    45,
   107,   112,    45,   115,   118,   121,   124,   127,   132,   135,
@@ -20952,7 +21826,7 @@ unsigned short Dict348TagHashTable[] = {
     1,    30,   193,     1,    33,   196,     1,    34,   197,
 };
 
-unsigned short Dict348KeyHashTable[] = {
+const unsigned short Dict358KeyHashTable[] = {
    45,    46,    45,    45,    45,    51,    45,    64,    45,    67,
    70,    77,    82,    85,    88,    45,    95,    45,    45,    45,
    98,   103,    45,    45,    45,    45,    45,   106,    45,   109,
@@ -20971,41 +21845,41 @@ unsigned short Dict348KeyHashTable[] = {
 59617,     1,    31, 61907,     1,    37, 53889,     1,     6, 39638,
 };
 
-vtkDICOMDictionary::Dict Dict348Data = {
+vtkDICOMDictionary::Dict Dict358Data = {
 "SIEMENS MR VA0  COAD",
 45,
 45,
-Dict348TagHashTable,
-Dict348KeyHashTable,
-Dict348Contents
+Dict358TagHashTable,
+Dict358KeyHashTable,
+Dict358Contents
 };
 
 // ----- GEMS_PATI_01 -----
 
-DictEntry Dict349Contents[] = {
+const DictEntry Dict359Contents[] = {
 { 0x0011, 0x0010, 0, VR::SS, VM::M1, "PatientStatus" },
 };
 
-unsigned short Dict349TagHashTable[] = {
+const unsigned short Dict359TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict349KeyHashTable[] = {
+const unsigned short Dict359KeyHashTable[] = {
     2,     0,     1,     0, 24862,
 };
 
-vtkDICOMDictionary::Dict Dict349Data = {
+vtkDICOMDictionary::Dict Dict359Data = {
 "GEMS_PATI_01",
 1,
 1,
-Dict349TagHashTable,
-Dict349KeyHashTable,
-Dict349Contents
+Dict359TagHashTable,
+Dict359KeyHashTable,
+Dict359Contents
 };
 
 // ----- NNT -----
 
-DictEntry Dict350Contents[] = {
+const DictEntry Dict360Contents[] = {
 { 0x0019, 0x0002, 0, VR::US, VM::M1, "" },
 { 0x0019, 0x0003, 0, VR::DS, VM::M1, "" },
 { 0x0019, 0x0004, 0, VR::DS, VM::M1, "" },
@@ -21038,7 +21912,7 @@ DictEntry Dict350Contents[] = {
 { 0x0019, 0x0033, 0, VR::DS, VM::M8, "" },
 };
 
-unsigned short Dict350TagHashTable[] = {
+const unsigned short Dict360TagHashTable[] = {
    31,    36,    41,    44,    30,    30,    47,    50,    30,    30,
    53,    58,    63,    66,    30,    30,    69,    30,    72,    75,
    80,    83,    86,    89,    30,    30,    92,    97,   102,   107,
@@ -21053,7 +21927,7 @@ unsigned short Dict350TagHashTable[] = {
    19,    34,
 };
 
-unsigned short Dict350KeyHashTable[] = {
+const unsigned short Dict360KeyHashTable[] = {
    30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
    30,    31,    30,    30,    30,    30,    30,    30,    30,    30,
    30,    30,    30,    30,    30,    30,    30,    30,    30,    30,
@@ -21066,70 +21940,94 @@ unsigned short Dict350KeyHashTable[] = {
    29,   179,
 };
 
-vtkDICOMDictionary::Dict Dict350Data = {
+vtkDICOMDictionary::Dict Dict360Data = {
 "NNT",
 30,
 30,
-Dict350TagHashTable,
-Dict350KeyHashTable,
-Dict350Contents
+Dict360TagHashTable,
+Dict360KeyHashTable,
+Dict360Contents
 };
 
 // ----- agfa/displayableImages -----
 
-DictEntry Dict351Contents[] = {
+const DictEntry Dict361Contents[] = {
 { 0x2e13, 0x0010, 0, VR::IS, VM::M1, "" },
 { 0x2e13, 0x0011, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict351TagHashTable[] = {
+const unsigned short Dict361TagHashTable[] = {
     3,     6,     0,     1,     1,    17,     1,     0,    16,
 };
 
-unsigned short Dict351KeyHashTable[] = {
+const unsigned short Dict361KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict351Data = {
+vtkDICOMDictionary::Dict Dict361Data = {
 "agfa/displayableImages",
 2,
 2,
-Dict351TagHashTable,
-Dict351KeyHashTable,
-Dict351Contents
+Dict361TagHashTable,
+Dict361KeyHashTable,
+Dict361Contents
+};
+
+// ----- Brainlab-S32-SO -----
+
+const DictEntry Dict362Contents[] = {
+{ 0x0063, 0x0001, 0, VR::LO, VM::M1, "" },
+{ 0x0063, 0x0010, 0, VR::SQ, VM::M1, "" },
+};
+
+const unsigned short Dict362TagHashTable[] = {
+    3,     6,     0,     1,     1,    16,     1,     0,     1,
+};
+
+const unsigned short Dict362KeyHashTable[] = {
+    2,     3,     0,     2,     0,  2690,     1,  2690,
+};
+
+vtkDICOMDictionary::Dict Dict362Data = {
+"Brainlab-S32-SO",
+2,
+2,
+Dict362TagHashTable,
+Dict362KeyHashTable,
+Dict362Contents
 };
 
 // ----- GEMS_Ultrasound_ImageGroup_001 -----
 
-DictEntry Dict352Contents[] = {
+const DictEntry Dict363Contents[] = {
 { 0x6003, 0x0010, 0, VR::SQ, VM::M1, "" },
 { 0x6003, 0x0011, 0, VR::OB, VM::M1, "" },
 { 0x6003, 0x0012, 0, VR::LT, VM::M1, "" },
 { 0x6003, 0x0015, 0, VR::LT, VM::M1TN, "" },
 };
 
-unsigned short Dict352TagHashTable[] = {
+const unsigned short Dict363TagHashTable[] = {
     4,     5,     8,    13,     0,     1,     2,    18,     2,     1,
    17,     3,    21,     1,     0,    16,
 };
 
-unsigned short Dict352KeyHashTable[] = {
+const unsigned short Dict363KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict352Data = {
+vtkDICOMDictionary::Dict Dict363Data = {
 "GEMS_Ultrasound_ImageGroup_001",
 4,
 4,
-Dict352TagHashTable,
-Dict352KeyHashTable,
-Dict352Contents
+Dict363TagHashTable,
+Dict363KeyHashTable,
+Dict363Contents
 };
 
 // ----- SIEMENS MEDCOM HEADER -----
 
-DictEntry Dict353Contents[] = {
+const DictEntry Dict364Contents[] = {
 { 0x0029, 0x0008, 0, VR::CS, VM::M1, "MedComHeaderType" },
 { 0x0029, 0x0009, 0, VR::LO, VM::M1, "MedComHeaderVersion" },
 { 0x0029, 0x0010, 0, VR::OB, VM::M1, "MedComHeaderInfo" },
@@ -21160,7 +22058,7 @@ DictEntry Dict353Contents[] = {
 { 0x0029, 0x0077, 0, VR::UL, VM::M1, "ReferencedObjectOffset" },
 };
 
-unsigned short Dict353TagHashTable[] = {
+const unsigned short Dict364TagHashTable[] = {
    29,    32,    28,    28,    37,    42,    47,    50,    53,    58,
    65,    70,    75,    78,    28,    28,    28,    28,    28,    28,
    81,    84,    87,    90,    93,    28,    98,   101,     0,     1,
@@ -21174,7 +22072,7 @@ unsigned short Dict353TagHashTable[] = {
    51,     1,     5,    50,
 };
 
-unsigned short Dict353KeyHashTable[] = {
+const unsigned short Dict364KeyHashTable[] = {
    29,    28,    32,    28,    39,    28,    28,    42,    47,    50,
    55,    28,    58,    28,    63,    66,    69,    28,    72,    75,
    78,    28,    28,    81,    86,    91,    98,   101,     0,     1,
@@ -21188,18 +22086,18 @@ unsigned short Dict353KeyHashTable[] = {
 39385,     1,     8, 39385,
 };
 
-vtkDICOMDictionary::Dict Dict353Data = {
+vtkDICOMDictionary::Dict Dict364Data = {
 "SIEMENS MEDCOM HEADER",
 28,
 28,
-Dict353TagHashTable,
-Dict353KeyHashTable,
-Dict353Contents
+Dict364TagHashTable,
+Dict364KeyHashTable,
+Dict364Contents
 };
 
 // ----- SIEMENS SYNGO EVIDENCE DOCUMENT DATA -----
 
-DictEntry Dict354Contents[] = {
+const DictEntry Dict365Contents[] = {
 { 0x0077, 0x0010, 0, VR::LO, VM::M1, "EvidenceDocumentTemplateName" },
 { 0x0077, 0x0011, 0, VR::DS, VM::M1, "EvidenceDocumentTemplateVersion" },
 { 0x0077, 0x0020, 0, VR::OB, VM::M1, "ClinicalFindingData" },
@@ -21214,7 +22112,7 @@ DictEntry Dict354Contents[] = {
 { 0x0077, 0x0080, 0, VR::OB, VM::M1, "VolumeCatalog" },
 };
 
-unsigned short Dict354TagHashTable[] = {
+const unsigned short Dict365TagHashTable[] = {
    12,    12,    13,    16,    21,    24,    27,    32,    12,    12,
    39,    42,     0,     1,     2,    32,     2,     3,    33,     6,
    80,     1,    11,   128,     1,    10,   114,     2,     0,    16,
@@ -21222,7 +22120,7 @@ unsigned short Dict354TagHashTable[] = {
     4,    48,     1,     7,    96,
 };
 
-unsigned short Dict354KeyHashTable[] = {
+const unsigned short Dict365KeyHashTable[] = {
    13,    20,    12,    25,    12,    28,    12,    12,    33,    36,
    39,    42,     0,     3,     0, 15331,     5, 22763,     9, 43355,
     2,     6, 43689,    10, 53675,     1,     7, 30572,     2,     2,
@@ -21230,18 +22128,18 @@ unsigned short Dict354KeyHashTable[] = {
     3,  2677,     1,     8, 45714,
 };
 
-vtkDICOMDictionary::Dict Dict354Data = {
+vtkDICOMDictionary::Dict Dict365Data = {
 "SIEMENS SYNGO EVIDENCE DOCUMENT DATA",
 12,
 12,
-Dict354TagHashTable,
-Dict354KeyHashTable,
-Dict354Contents
+Dict365TagHashTable,
+Dict365KeyHashTable,
+Dict365Contents
 };
 
 // ----- GEMS_DL_SERIES_01 -----
 
-DictEntry Dict355Contents[] = {
+const DictEntry Dict366Contents[] = {
 { 0x0015, 0x0085, 0, VR::LO, VM::M1, "SeriesFileName" },
 { 0x0015, 0x0087, 0, VR::IS, VM::M1, "NumberOfImages" },
 { 0x0015, 0x008C, 0, VR::CS, VM::M1, "SentFlag" },
@@ -21250,30 +22148,30 @@ DictEntry Dict355Contents[] = {
 { 0x0019, 0x004d, 0, VR::CS, VM::M1, "BrowserHide" },
 };
 
-unsigned short Dict355TagHashTable[] = {
+const unsigned short Dict366TagHashTable[] = {
     7,    12,    15,     6,    18,    21,     0,     2,     1,   135,
     4,    76,     1,     5,    77,     1,     0,   133,     1,     3,
   141,     1,     2,   140,
 };
 
-unsigned short Dict355KeyHashTable[] = {
+const unsigned short Dict366KeyHashTable[] = {
     7,    10,    17,     6,     6,    20,     0,     1,     3, 45009,
     3,     1, 37972,     2, 22596,     5, 28427,     1,     4,  7152,
     1,     0, 18914,
 };
 
-vtkDICOMDictionary::Dict Dict355Data = {
+vtkDICOMDictionary::Dict Dict366Data = {
 "GEMS_DL_SERIES_01",
 6,
 6,
-Dict355TagHashTable,
-Dict355KeyHashTable,
-Dict355Contents
+Dict366TagHashTable,
+Dict366KeyHashTable,
+Dict366Contents
 };
 
 // ----- Canon Inc. -----
 
-DictEntry Dict356Contents[] = {
+const DictEntry Dict367Contents[] = {
 { 0x0019, 0x0010, 0, VR::UN, VM::M1, "" },
 { 0x0019, 0x0013, 0, VR::UN, VM::M1, "" },
 { 0x0019, 0x0015, 0, VR::DS, VM::M2, "" },
@@ -21289,7 +22187,7 @@ DictEntry Dict356Contents[] = {
 { 0x0019, 0x0021, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict356TagHashTable[] = {
+const unsigned short Dict367TagHashTable[] = {
    14,    17,    22,    27,    30,    33,    36,    39,    13,    42,
    45,    13,    48,     0,     1,     6,    25,     2,     4,    23,
     5,    24,     2,     3,    22,     8,    27,     1,     7,    26,
@@ -21298,7 +22196,7 @@ unsigned short Dict356TagHashTable[] = {
    21,
 };
 
-unsigned short Dict356KeyHashTable[] = {
+const unsigned short Dict367KeyHashTable[] = {
    13,    13,    13,    13,    13,    13,    13,    13,    13,    13,
    13,    13,    14,     0,    13,     0,   413,     1,   413,     2,
   413,     3,   413,     4,   413,     5,   413,     6,   413,     7,
@@ -21306,18 +22204,18 @@ unsigned short Dict356KeyHashTable[] = {
   413,
 };
 
-vtkDICOMDictionary::Dict Dict356Data = {
+vtkDICOMDictionary::Dict Dict367Data = {
 "Canon Inc.",
 13,
 13,
-Dict356TagHashTable,
-Dict356KeyHashTable,
-Dict356Contents
+Dict367TagHashTable,
+Dict367KeyHashTable,
+Dict367Contents
 };
 
 // ----- GEMS_GENIE_1 -----
 
-DictEntry Dict357Contents[] = {
+const DictEntry Dict368Contents[] = {
 { 0x0009, 0x0001, 0, VR::SH, VM::M1, "" },
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "StudyName" },
 { 0x0009, 0x0011, 0, VR::SL, VM::M1, "StudyFlags" },
@@ -21606,7 +22504,7 @@ DictEntry Dict357Contents[] = {
 { 0x5001, 0x0060, 0, VR::LO, VM::M1TN, "DatasetROIMapping" },
 };
 
-unsigned short Dict357TagHashTable[] = {
+const unsigned short Dict368TagHashTable[] = {
   287,   296,   303,   310,   319,   326,   335,   344,   355,   362,
   367,   372,   377,   380,   385,   390,   395,   398,   401,   404,
   286,   286,   286,   407,   412,   415,   418,   421,   426,   429,
@@ -21714,7 +22612,7 @@ unsigned short Dict357TagHashTable[] = {
     1,   252,    58,     1,   255,    61,     1,   254,    60,
 };
 
-unsigned short Dict357KeyHashTable[] = {
+const unsigned short Dict368KeyHashTable[] = {
   286,   287,   290,   286,   295,   286,   286,   298,   301,   286,
   306,   286,   309,   312,   315,   286,   318,   286,   286,   323,
   286,   328,   286,   286,   331,   334,   337,   286,   340,   345,
@@ -21821,41 +22719,117 @@ unsigned short Dict357KeyHashTable[] = {
    30, 61371,
 };
 
-vtkDICOMDictionary::Dict Dict357Data = {
+vtkDICOMDictionary::Dict Dict368Data = {
 "GEMS_GENIE_1",
 286,
 286,
-Dict357TagHashTable,
-Dict357KeyHashTable,
-Dict357Contents
+Dict368TagHashTable,
+Dict368KeyHashTable,
+Dict368Contents
+};
+
+// ----- CT IMG ACQUISITION -----
+
+const DictEntry Dict369Contents[] = {
+{ 0x7029, 0x0002, 0, VR::FL, VM::M1, "DetectorElementTransverseSpacing" },
+{ 0x7029, 0x0006, 0, VR::FL, VM::M1, "DetectorElementAxialSpacing" },
+{ 0x7029, 0x000B, 0, VR::CS, VM::M1, "DetectorShape" },
+{ 0x7029, 0x0010, 0, VR::US, VM::M1, "NumberofDetectorRows" },
+{ 0x7029, 0x0011, 0, VR::US, VM::M1, "NumberofDetectorColumns" },
+{ 0x7031, 0x0001, 0, VR::FL, VM::M1, "DetectorFocalCenterAngularPosition" },
+{ 0x7031, 0x0002, 0, VR::FL, VM::M1, "DetectorFocalCenterAxialPosition" },
+{ 0x7031, 0x0003, 0, VR::FL, VM::M1, "DetectorFocalCenterRadialDistance" },
+{ 0x7031, 0x0031, 0, VR::FL, VM::M1, "ConstantRadialDistance" },
+{ 0x7031, 0x0033, 0, VR::FL, VM::M1TN, "DetectorCentralElement" },
+{ 0x7033, 0x000B, 0, VR::FL, VM::M1, "SourceAxialPositionShift" },
+{ 0x7033, 0x000C, 0, VR::FL, VM::M1, "SourceAngularPositionShift" },
+{ 0x7033, 0x000D, 0, VR::FL, VM::M1, "SourceRadialDistanceShift" },
+{ 0x7033, 0x000E, 0, VR::CS, VM::M1, "FlyingFocalSpotMode" },
+{ 0x7033, 0x0013, 0, VR::US, VM::M1, "NumberofSourceAngularSteps" },
+{ 0x7033, 0x0061, 0, VR::US, VM::M1, "NumberofSources" },
+{ 0x7033, 0x0063, 0, VR::US, VM::M1, "SourceIndex" },
+{ 0x7033, 0x0065, 0, VR::FL, VM::M1TN, "PhotonStatistics" },
+{ 0x7037, 0x0009, 0, VR::CS, VM::M1, "TypeofProjectionData" },
+{ 0x7037, 0x000A, 0, VR::CS, VM::M1, "TypeofProjectionGeometry" },
+{ 0x7039, 0x0003, 0, VR::CS, VM::M1, "BeamHardeningCorrectionFlag" },
+{ 0x7039, 0x0004, 0, VR::CS, VM::M1, "GainCorrectionFlag" },
+{ 0x7039, 0x0005, 0, VR::CS, VM::M1, "DarkFieldCorrectionFlag" },
+{ 0x7039, 0x0006, 0, VR::CS, VM::M1, "FlatFieldCorrectionFlag" },
+{ 0x7039, 0x0007, 0, VR::CS, VM::M1, "BadPixelCorrectionFlag" },
+{ 0x7039, 0x0008, 0, VR::CS, VM::M1, "ScatterCorrectionFlag" },
+{ 0x7039, 0x0009, 0, VR::CS, VM::M1, "LogFlag" },
+{ 0x7041, 0x0003, 0, VR::US, VM::M1, "NumberofLesions" },
+{ 0x7041, 0x0004, 0, VR::ST, VM::M1, "LesionPathologyArray" },
+{ 0x7041, 0x0005, 0, VR::FL, VM::M1TN, "LesionAngularPositionArray" },
+{ 0x7041, 0x0006, 0, VR::FL, VM::M1TN, "LesionAxialPositionArray" },
+{ 0x7041, 0x0007, 0, VR::FL, VM::M1TN, "LesionRadialDistanceArray" },
+};
+
+const unsigned short Dict369TagHashTable[] = {
+   33,    32,    38,    43,    46,    49,    52,    55,    32,    32,
+   32,    58,    32,    32,    32,    61,    64,    69,    74,    77,
+   32,    32,    32,    82,    85,    90,    93,    32,    96,    99,
+  106,   113,     0,     2,     8,    49,    14,    19,     2,     2,
+   11,     9,    51,     1,    27,     3,     1,    28,     4,     1,
+   29,     5,     1,    30,     6,     1,    31,     7,     1,     0,
+    2,     1,     1,     6,     2,     5,     1,    26,     9,     2,
+   16,    99,    25,     8,     1,     7,     3,     2,     6,     2,
+   15,    97,     1,    17,   101,     2,     4,    17,    10,    11,
+    1,     3,    16,     1,    20,     3,     1,    22,     5,     3,
+   13,    14,    19,    10,    21,     4,     3,    12,    13,    18,
+    9,    24,     7,     2,    11,    12,    23,     6,
+};
+
+const unsigned short Dict369KeyHashTable[] = {
+   33,    38,    41,    32,    44,    47,    52,    55,    60,    65,
+   32,    32,    68,    71,    78,    32,    81,    32,    84,    89,
+   32,    32,    94,    32,    97,    32,    32,   100,   103,   106,
+  113,    32,     0,     2,    24, 33915,    27, 55861,     1,    26,
+13018,     1,    23, 40542,     1,     5,  5741,     2,    19, 43492,
+   28, 34785,     1,    31, 55547,     2,     8, 60381,    15, 31635,
+    2,     3, 63269,    17, 12517,     1,     6, 53763,     1,    12,
+ 3316,     3,    14, 62790,    25, 25536,    29, 46276,     1,    16,
+ 7091,     1,     2,  8860,     2,     9, 16138,    30, 21279,     2,
+   11, 20548,    18, 37884,     1,    21,  2742,     1,    10, 29809,
+    1,     0,  5262,     1,    20,  3334,     3,     1, 49312,     7,
+ 6736,    22, 60115,     2,     4, 38638,    13, 25005,
+};
+
+vtkDICOMDictionary::Dict Dict369Data = {
+"CT IMG ACQUISITION",
+32,
+32,
+Dict369TagHashTable,
+Dict369KeyHashTable,
+Dict369Contents
 };
 
 // ----- SCHICK TECHNOLOGIES - Image Security Creator ID -----
 
-DictEntry Dict358Contents[] = {
+const DictEntry Dict370Contents[] = {
 { 0x0029, 0x0001, 0, VR::UL, VM::M1, "" },
 };
 
-unsigned short Dict358TagHashTable[] = {
+const unsigned short Dict370TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict358KeyHashTable[] = {
+const unsigned short Dict370KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict358Data = {
+vtkDICOMDictionary::Dict Dict370Data = {
 "SCHICK TECHNOLOGIES - Image Security Creator ID",
 1,
 1,
-Dict358TagHashTable,
-Dict358KeyHashTable,
-Dict358Contents
+Dict370TagHashTable,
+Dict370KeyHashTable,
+Dict370Contents
 };
 
 // ----- SIEMENS MR VA0  GEN -----
 
-DictEntry Dict359Contents[] = {
+const DictEntry Dict371Contents[] = {
 { 0x0019, 0x0010, 0, VR::DS, VM::M1, "TotalMeasurementTimeNominal" },
 { 0x0019, 0x0011, 0, VR::DS, VM::M1, "TotalMeasurementTimeCurrent" },
 { 0x0019, 0x0012, 0, VR::DS, VM::M1, "StartDelayTime" },
@@ -21939,7 +22913,7 @@ DictEntry Dict359Contents[] = {
 { 0x0021, 0x0096, 0, VR::DS, VM::M1, "EPIChangeValueOfZComponent" },
 };
 
-unsigned short Dict359TagHashTable[] = {
+const unsigned short Dict371TagHashTable[] = {
    82,    85,    94,    97,    81,   100,    81,   103,   106,   111,
   116,   121,   126,   129,   134,   137,   144,   151,   156,   159,
   164,   169,   176,   179,   186,   193,    81,    81,    81,    81,
@@ -21972,7 +22946,7 @@ unsigned short Dict359TagHashTable[] = {
    27,   133,     1,    26,   132,     1,    71,   112,
 };
 
-unsigned short Dict359KeyHashTable[] = {
+const unsigned short Dict371KeyHashTable[] = {
    81,    82,    81,    81,    87,    94,    97,    81,    81,    81,
   100,   109,   114,   119,   122,    81,   127,    81,   130,    81,
   133,    81,   136,   141,    81,   144,   147,    81,    81,    81,
@@ -22005,18 +22979,18 @@ unsigned short Dict359KeyHashTable[] = {
 49082,     1,    21, 15575,
 };
 
-vtkDICOMDictionary::Dict Dict359Data = {
+vtkDICOMDictionary::Dict Dict371Data = {
 "SIEMENS MR VA0  GEN",
 81,
 81,
-Dict359TagHashTable,
-Dict359KeyHashTable,
-Dict359Contents
+Dict371TagHashTable,
+Dict371KeyHashTable,
+Dict371Contents
 };
 
 // ----- Hologic -----
 
-DictEntry Dict360Contents[] = {
+const DictEntry Dict372Contents[] = {
 { 0x0011, 0x0000, 0, VR::OB, VM::M1, "HxQuestionnaire" },
 { 0x0013, 0x0000, 0, VR::LO, VM::M1, "IVAResultsFlag" },
 { 0x0019, 0x0000, 0, VR::UT, VM::M1, "ReportData" },
@@ -22031,7 +23005,7 @@ DictEntry Dict360Contents[] = {
 { 0x0029, 0x0001, 0, VR::UL, VM::M1, "GraphBitmapSize" },
 };
 
-unsigned short Dict360TagHashTable[] = {
+const unsigned short Dict372TagHashTable[] = {
    12,    13,    16,    19,    22,    25,    12,    30,    33,    38,
    41,    44,     0,     1,     2,     0,     1,     9,     5,     1,
     8,     4,     1,    11,     1,     2,     0,     0,    10,     0,
@@ -22039,7 +23013,7 @@ unsigned short Dict360TagHashTable[] = {
     2,     1,     5,     1,     1,     4,     0,
 };
 
-unsigned short Dict360KeyHashTable[] = {
+const unsigned short Dict372KeyHashTable[] = {
    12,    13,    12,    18,    21,    12,    24,    27,    12,    30,
    33,    38,     0,     2,     8, 19844,     9, 18946,     1,     4,
 54723,     1,     0, 12614,     1,     5,  1260,     1,     2, 46831,
@@ -22047,46 +23021,46 @@ unsigned short Dict360KeyHashTable[] = {
 36867,     7, 33057,    11, 10475,
 };
 
-vtkDICOMDictionary::Dict Dict360Data = {
+vtkDICOMDictionary::Dict Dict372Data = {
 "Hologic",
 12,
 12,
-Dict360TagHashTable,
-Dict360KeyHashTable,
-Dict360Contents
+Dict372TagHashTable,
+Dict372KeyHashTable,
+Dict372Contents
 };
 
 // ----- GEMS_DL_PATNT_01 -----
 
-DictEntry Dict361Contents[] = {
+const DictEntry Dict373Contents[] = {
 { 0x0011, 0x0080, 0, VR::UI, VM::M1, "PatientInstanceUid" },
 { 0x0011, 0x0081, 0, VR::IS, VM::M1, "LastStudyNumber" },
 { 0x0011, 0x0082, 0, VR::CS, VM::M1, "PatientRepaired" },
 { 0x0011, 0x0083, 0, VR::CS, VM::M1, "LockDemographics" },
 };
 
-unsigned short Dict361TagHashTable[] = {
+const unsigned short Dict373TagHashTable[] = {
     5,     8,    11,    14,     0,     1,     3,   131,     1,     2,
   130,     1,     1,   129,     1,     0,   128,
 };
 
-unsigned short Dict361KeyHashTable[] = {
+const unsigned short Dict373KeyHashTable[] = {
     5,     8,    11,    14,     0,     1,     3, 21937,     1,     0,
 49412,     1,     2, 12345,     1,     1, 37238,
 };
 
-vtkDICOMDictionary::Dict Dict361Data = {
+vtkDICOMDictionary::Dict Dict373Data = {
 "GEMS_DL_PATNT_01",
 4,
 4,
-Dict361TagHashTable,
-Dict361KeyHashTable,
-Dict361Contents
+Dict373TagHashTable,
+Dict373KeyHashTable,
+Dict373Contents
 };
 
 // ----- SIEMENS SYNGO FRAME SET -----
 
-DictEntry Dict362Contents[] = {
+const DictEntry Dict374Contents[] = {
 { 0x0029, 0x0010, 0, VR::SQ, VM::M1, "ImageFrameSequence" },
 { 0x0029, 0x0012, 0, VR::CS, VM::M1, "TypeOfProgression" },
 { 0x0029, 0x0014, 0, VR::IS, VM::M1, "RepresentationLevel" },
@@ -22095,54 +23069,54 @@ DictEntry Dict362Contents[] = {
 { 0x0029, 0x0020, 0, VR::IS, VM::M1, "RepresentationPixelOffset" },
 };
 
-unsigned short Dict362TagHashTable[] = {
+const unsigned short Dict374TagHashTable[] = {
     6,     7,     6,    12,     6,    19,     0,     2,     2,    20,
     4,    24,     3,     0,    16,     3,    22,     5,    32,     1,
     1,    18,
 };
 
-unsigned short Dict362KeyHashTable[] = {
+const unsigned short Dict374KeyHashTable[] = {
     6,     7,     6,    12,    15,    20,     0,     2,     4, 10332,
     5, 36944,     1,     3, 18894,     2,     0, 45420,     2, 21842,
     1,     1, 34947,
 };
 
-vtkDICOMDictionary::Dict Dict362Data = {
+vtkDICOMDictionary::Dict Dict374Data = {
 "SIEMENS SYNGO FRAME SET",
 6,
 6,
-Dict362TagHashTable,
-Dict362KeyHashTable,
-Dict362Contents
+Dict374TagHashTable,
+Dict374KeyHashTable,
+Dict374Contents
 };
 
 // ----- SIEMENS MR CM 03 -----
 
-DictEntry Dict363Contents[] = {
+const DictEntry Dict375Contents[] = {
 { 0x0021, 0x0001, 0, VR::IS, VM::M1, "" },
 { 0x0021, 0x0002, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict363TagHashTable[] = {
+const unsigned short Dict375TagHashTable[] = {
     3,     6,     0,     1,     0,     1,     1,     1,     2,
 };
 
-unsigned short Dict363KeyHashTable[] = {
+const unsigned short Dict375KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict363Data = {
+vtkDICOMDictionary::Dict Dict375Data = {
 "SIEMENS MR CM 03",
 2,
 2,
-Dict363TagHashTable,
-Dict363KeyHashTable,
-Dict363Contents
+Dict375TagHashTable,
+Dict375KeyHashTable,
+Dict375Contents
 };
 
 // ----- SIEMENS Ultrasound SC2000 -----
 
-DictEntry Dict364Contents[] = {
+const DictEntry Dict376Contents[] = {
 { 0x0019, 0x002D, 0, VR::US, VM::M1, "BModeTintIndex" },
 { 0x0019, 0x0072, 0, VR::US, VM::M1, "DopplerTintIndex" },
 { 0x0019, 0x0088, 0, VR::US, VM::M1, "MModeTintIndex" },
@@ -22187,7 +23161,7 @@ DictEntry Dict364Contents[] = {
 { 0x7FD1, 0x0011, 0, VR::UN, VM::M1, "AfterPayload" },
 };
 
-unsigned short Dict364TagHashTable[] = {
+const unsigned short Dict376TagHashTable[] = {
    42,    42,    43,    46,    49,    52,    42,    57,    60,    63,
    66,    42,    42,    42,    42,    42,    69,    74,    79,    82,
    87,    92,    97,   104,   107,   110,    42,    42,   115,   118,
@@ -22206,7 +23180,7 @@ unsigned short Dict364TagHashTable[] = {
     2,     2,    25,     8,    37,     3,
 };
 
-unsigned short Dict364KeyHashTable[] = {
+const unsigned short Dict376KeyHashTable[] = {
    42,    43,    42,    46,    51,    54,    57,    60,    63,    66,
    69,    42,    42,    76,    42,    79,    82,    87,    90,    93,
    96,    99,   102,    42,    42,   105,    42,   114,    42,   121,
@@ -22225,18 +23199,18 @@ unsigned short Dict364KeyHashTable[] = {
     1,    31,  8093,     2,    18, 23632,    23, 41492,
 };
 
-vtkDICOMDictionary::Dict Dict364Data = {
+vtkDICOMDictionary::Dict Dict376Data = {
 "SIEMENS Ultrasound SC2000",
 42,
 42,
-Dict364TagHashTable,
-Dict364KeyHashTable,
-Dict364Contents
+Dict376TagHashTable,
+Dict376KeyHashTable,
+Dict376Contents
 };
 
 // ----- TOSHIBA_MEC_1.0 -----
 
-DictEntry Dict365Contents[] = {
+const DictEntry Dict377Contents[] = {
 { 0x0009, 0x0001, 0, VR::LT, VM::M1, "" },
 { 0x0009, 0x0002, 0, VR::US, VM::M1TN, "" },
 { 0x0009, 0x0003, 0, VR::US, VM::M1TN, "" },
@@ -22254,7 +23228,7 @@ DictEntry Dict365Contents[] = {
 { 0x7ff1, 0x0010, 0, VR::US, VM::M1TN, "" },
 };
 
-unsigned short Dict365TagHashTable[] = {
+const unsigned short Dict377TagHashTable[] = {
    15,    16,    19,    22,    25,    32,    35,    15,    40,    43,
    46,    49,    52,    55,    15,     0,     1,     4,     1,     1,
     8,     1,     1,    12,     2,     3,     5,     2,    10,     3,
@@ -22263,7 +23237,7 @@ unsigned short Dict365TagHashTable[] = {
     1,     2,     1,     7,     2,     1,     3,     4,
 };
 
-unsigned short Dict365KeyHashTable[] = {
+const unsigned short Dict377KeyHashTable[] = {
    15,    15,    15,    15,    15,    15,    15,    15,    15,    15,
    15,    16,    15,    15,    15,     0,    15,     0,   358,     1,
   358,     2,   358,     3,   358,     4,   358,     5,   358,     6,
@@ -22271,18 +23245,18 @@ unsigned short Dict365KeyHashTable[] = {
   358,    12,   358,    13,   358,    14,   358,
 };
 
-vtkDICOMDictionary::Dict Dict365Data = {
+vtkDICOMDictionary::Dict Dict377Data = {
 "TOSHIBA_MEC_1.0",
 15,
 15,
-Dict365TagHashTable,
-Dict365KeyHashTable,
-Dict365Contents
+Dict377TagHashTable,
+Dict377KeyHashTable,
+Dict377Contents
 };
 
 // ----- SIEMENS MED SMS USG S2000 3D VOLUME -----
 
-DictEntry Dict366Contents[] = {
+const DictEntry Dict378Contents[] = {
 { 0x0039, 0x0050, 0, VR::LO, VM::M1, "PrivateCreatorVersionOfBookmark" },
 { 0x0039, 0x0051, 0, VR::US, VM::M1, "BCutPlaneEnable" },
 { 0x0039, 0x0052, 0, VR::US, VM::M1, "BMprColorMapIndex" },
@@ -22384,7 +23358,7 @@ DictEntry Dict366Contents[] = {
 { 0x0039, 0x00f6, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict366TagHashTable[] = {
+const unsigned short Dict378TagHashTable[] = {
   100,   103,   106,   111,   116,   121,   126,   131,   134,   139,
   144,   149,   152,   157,   160,   163,    99,   166,   169,   172,
   175,   178,   181,   184,   187,   190,    99,    99,    99,    99,
@@ -22424,7 +23398,7 @@ unsigned short Dict366TagHashTable[] = {
    10,    90,
 };
 
-unsigned short Dict366KeyHashTable[] = {
+const unsigned short Dict378KeyHashTable[] = {
   100,   107,    99,   112,   117,   120,   123,    99,    99,    99,
    99,   126,    99,   131,   136,   139,   142,   147,   152,    99,
    99,   157,    99,    99,   162,   165,    99,   168,   173,    99,
@@ -22463,18 +23437,18 @@ unsigned short Dict366KeyHashTable[] = {
    18, 23800,    34, 54477,     1,    46, 24860,
 };
 
-vtkDICOMDictionary::Dict Dict366Data = {
+vtkDICOMDictionary::Dict Dict378Data = {
 "SIEMENS MED SMS USG S2000 3D VOLUME",
 99,
 99,
-Dict366TagHashTable,
-Dict366KeyHashTable,
-Dict366Contents
+Dict378TagHashTable,
+Dict378KeyHashTable,
+Dict378Contents
 };
 
 // ----- Picker MR Private Group -----
 
-DictEntry Dict367Contents[] = {
+const DictEntry Dict379Contents[] = {
 { 0x7101, 0x0000, 0, VR::OB, VM::M1, "" },
 { 0x7101, 0x0001, 0, VR::SL, VM::M1, "" },
 { 0x7101, 0x0002, 0, VR::OB, VM::M1, "" },
@@ -22485,31 +23459,31 @@ DictEntry Dict367Contents[] = {
 { 0x7101, 0x0010, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict367TagHashTable[] = {
+const unsigned short Dict379TagHashTable[] = {
     9,    12,     8,    15,    18,    21,    26,    29,     0,     1,
     5,     5,     1,     4,     4,     1,     6,     6,     1,     1,
     1,     2,     0,     0,     7,    16,     1,     3,     3,     1,
     2,     2,
 };
 
-unsigned short Dict367KeyHashTable[] = {
+const unsigned short Dict379KeyHashTable[] = {
     8,     8,     8,     8,     8,     9,     8,     8,     0,     8,
     0,   672,     1,   672,     2,   672,     3,   672,     4,   672,
     5,   672,     6,   672,     7,   672,
 };
 
-vtkDICOMDictionary::Dict Dict367Data = {
+vtkDICOMDictionary::Dict Dict379Data = {
 "Picker MR Private Group",
 8,
 8,
-Dict367TagHashTable,
-Dict367KeyHashTable,
-Dict367Contents
+Dict379TagHashTable,
+Dict379KeyHashTable,
+Dict379Contents
 };
 
 // ----- DLX_SERIE_01 -----
 
-DictEntry Dict368Contents[] = {
+const DictEntry Dict380Contents[] = {
 { 0x0019, 0x0001, 0, VR::DS, VM::M1, "AngleValueLArm" },
 { 0x0019, 0x0002, 0, VR::DS, VM::M1, "AngleValuePArm" },
 { 0x0019, 0x0003, 0, VR::DS, VM::M1, "AngleValueCArm" },
@@ -22545,7 +23519,7 @@ DictEntry Dict368Contents[] = {
 { 0x0019, 0x1028, 0, VR::DS, VM::M1, "ImageChainFWHMPsfMmMax" },
 };
 
-unsigned short Dict368TagHashTable[] = {
+const unsigned short Dict380TagHashTable[] = {
    34,    37,    40,    43,    46,    49,    52,    55,    58,    61,
    33,    33,    64,    67,    70,    73,    76,    79,    82,    85,
    33,    33,    33,    88,    91,    96,    99,   104,   109,   114,
@@ -22561,7 +23535,7 @@ unsigned short Dict368TagHashTable[] = {
    30,    38,     2,     5,     6,    31,  4135,
 };
 
-unsigned short Dict368KeyHashTable[] = {
+const unsigned short Dict380KeyHashTable[] = {
    34,    33,    33,    33,    33,    33,    33,    33,    33,    33,
    33,    37,    33,    42,    33,    45,    48,    59,    62,    33,
    71,    33,    74,    77,    94,    33,    33,    99,   102,   105,
@@ -22576,135 +23550,119 @@ unsigned short Dict368KeyHashTable[] = {
     2,    11, 38012,    20, 62065,
 };
 
-vtkDICOMDictionary::Dict Dict368Data = {
+vtkDICOMDictionary::Dict Dict380Data = {
 "DLX_SERIE_01",
 33,
 33,
-Dict368TagHashTable,
-Dict368KeyHashTable,
-Dict368Contents
+Dict380TagHashTable,
+Dict380KeyHashTable,
+Dict380Contents
 };
 
 // ----- SIEMENS SYNGO ENCAPSULATED DOCUMENT DATA -----
 
-DictEntry Dict369Contents[] = {
+const DictEntry Dict381Contents[] = {
 { 0x0087, 0x0020, 0, VR::OB, VM::M1, "StudyModel" },
 { 0x0087, 0x0030, 0, VR::OB, VM::M1, "ReportXMLSchema" },
 { 0x0087, 0x0040, 0, VR::OB, VM::M1, "ReportIdentifier" },
 };
 
-unsigned short Dict369TagHashTable[] = {
+const unsigned short Dict381TagHashTable[] = {
     4,     7,     3,     0,     1,     0,    32,     2,     1,    48,
     2,    64,
 };
 
-unsigned short Dict369KeyHashTable[] = {
+const unsigned short Dict381KeyHashTable[] = {
     3,     4,     9,     0,     2,     0,  6778,     2, 17185,     1,
     1, 11691,
 };
 
-vtkDICOMDictionary::Dict Dict369Data = {
+vtkDICOMDictionary::Dict Dict381Data = {
 "SIEMENS SYNGO ENCAPSULATED DOCUMENT DATA",
 3,
 3,
-Dict369TagHashTable,
-Dict369KeyHashTable,
-Dict369Contents
+Dict381TagHashTable,
+Dict381KeyHashTable,
+Dict381Contents
 };
 
 // ----- 1.2.840.113663.1 -----
 
-DictEntry Dict370Contents[] = {
+const DictEntry Dict382Contents[] = {
 { 0x0029, 0x0000, 0, VR::US, VM::M1, "" },
 { 0x0029, 0x0001, 0, VR::US, VM::M1, "" },
 };
 
-unsigned short Dict370TagHashTable[] = {
+const unsigned short Dict382TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict370KeyHashTable[] = {
+const unsigned short Dict382KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict370Data = {
+vtkDICOMDictionary::Dict Dict382Data = {
 "1.2.840.113663.1",
 2,
 2,
-Dict370TagHashTable,
-Dict370KeyHashTable,
-Dict370Contents
+Dict382TagHashTable,
+Dict382KeyHashTable,
+Dict382Contents
 };
 
 // ----- SIEMENS MED OCS BEAM DISPLAY INFO -----
 
-DictEntry Dict371Contents[] = {
+const DictEntry Dict383Contents[] = {
 { 0x0039, 0x0076, 0, VR::CS, VM::M1, "BeamDisplayProperties" },
 };
 
-unsigned short Dict371TagHashTable[] = {
+const unsigned short Dict383TagHashTable[] = {
     2,     0,     1,     0,   118,
 };
 
-unsigned short Dict371KeyHashTable[] = {
+const unsigned short Dict383KeyHashTable[] = {
     2,     0,     1,     0, 57277,
 };
 
-vtkDICOMDictionary::Dict Dict371Data = {
+vtkDICOMDictionary::Dict Dict383Data = {
 "SIEMENS MED OCS BEAM DISPLAY INFO",
 1,
 1,
-Dict371TagHashTable,
-Dict371KeyHashTable,
-Dict371Contents
+Dict383TagHashTable,
+Dict383KeyHashTable,
+Dict383Contents
 };
 
-// ----- ULTRAVISUAL_TAG_SET1 -----
+// ----- CMR42 CIRCLECVI -----
 
-DictEntry Dict372Contents[] = {
-{ 0x0011, 0x0001, 0, VR::CS, VM::M1, "" },
-{ 0x0011, 0x0002, 0, VR::UN, VM::M1, "" },
-{ 0x0011, 0x0003, 0, VR::UN, VM::M1, "" },
-{ 0x0011, 0x0008, 0, VR::LO, VM::M1, "" },
-{ 0x0011, 0x0010, 0, VR::US, VM::M1, "" },
-{ 0x0011, 0x0011, 0, VR::UN, VM::M1, "" },
-{ 0x0011, 0x0012, 0, VR::UI, VM::M1, "" },
-{ 0x0011, 0x0018, 0, VR::UL, VM::M1, "" },
-{ 0x0011, 0x0019, 0, VR::UN, VM::M1, "" },
-{ 0x0011, 0x001a, 0, VR::CS, VM::M1, "" },
-{ 0x0011, 0x001b, 0, VR::IS, VM::M1, "" },
-{ 0x0011, 0x001c, 0, VR::IS, VM::M1, "" },
-{ 0x0011, 0x001d, 0, VR::LO, VM::M1, "" },
+const DictEntry Dict384Contents[] = {
+{ 0x0025, 0x0010, 0, VR::LO, VM::M1, "WorkspaceID" },
+{ 0x0025, 0x0020, 0, VR::LO, VM::M1, "WorkspaceTimeString" },
+{ 0x0025, 0x0030, 0, VR::LO, VM::M1, "WorkspaceStream" },
 };
 
-unsigned short Dict372TagHashTable[] = {
-   14,    19,    13,    22,    13,    27,    30,    13,    33,    36,
-   39,    42,    45,     0,     2,     5,    17,    11,    28,     1,
-    4,    16,     2,     0,     1,     6,    18,     1,     2,     3,
-    1,     1,     2,     1,     8,    25,     1,     7,    24,     1,
-   10,    27,     1,     9,    26,     2,     3,     8,    12,    29,
+const unsigned short Dict384TagHashTable[] = {
+    4,     3,     7,     0,     1,     2,    48,     2,     0,    16,
+    1,    32,
 };
 
-unsigned short Dict372KeyHashTable[] = {
-   13,    13,    13,    13,    13,    13,    13,    13,    13,    13,
-   13,    13,    14,     0,    13,     0,   413,     1,   413,     2,
-  413,     3,   413,     4,   413,     5,   413,     6,   413,     7,
-  413,     8,   413,     9,   413,    10,   413,    11,   413,    12,
-  413,
+const unsigned short Dict384KeyHashTable[] = {
+    4,     3,     7,     0,     1,     2, 28192,     2,     0, 42805,
+    1, 61032,
 };
 
-vtkDICOMDictionary::Dict Dict372Data = {
-"ULTRAVISUAL_TAG_SET1",
-13,
-13,
-Dict372TagHashTable,
-Dict372KeyHashTable,
-Dict372Contents
+vtkDICOMDictionary::Dict Dict384Data = {
+"CMR42 CIRCLECVI",
+3,
+3,
+Dict384TagHashTable,
+Dict384KeyHashTable,
+Dict384Contents
 };
 
 // ----- Applicare/RadWorks/Version 6.0/Summary -----
 
-DictEntry Dict373Contents[] = {
+const DictEntry Dict385Contents[] = {
 { 0x3109, 0x0001, 0, VR::SH, VM::M1, "Status" },
 { 0x3109, 0x0011, 0, VR::ST, VM::M1, "ReceiveOriginSiteName" },
 { 0x3109, 0x0012, 0, VR::ST, VM::M1, "ReceiveOriginDescription" },
@@ -22712,28 +23670,28 @@ DictEntry Dict373Contents[] = {
 { 0x3109, 0x0016, 0, VR::TM, VM::M1, "ReceiveTime" },
 };
 
-unsigned short Dict373TagHashTable[] = {
+const unsigned short Dict385TagHashTable[] = {
     6,     5,     9,    12,    17,     0,     1,     3,    21,     1,
     2,    18,     2,     0,     1,     4,    22,     1,     1,    17,
 };
 
-unsigned short Dict373KeyHashTable[] = {
+const unsigned short Dict385KeyHashTable[] = {
     6,     9,    14,    17,     5,     0,     1,     0, 45525,     2,
     2, 11863,     4, 38814,     1,     1,  5876,     1,     3, 53191,
 };
 
-vtkDICOMDictionary::Dict Dict373Data = {
+vtkDICOMDictionary::Dict Dict385Data = {
 "Applicare/RadWorks/Version 6.0/Summary",
 5,
 5,
-Dict373TagHashTable,
-Dict373KeyHashTable,
-Dict373Contents
+Dict385TagHashTable,
+Dict385KeyHashTable,
+Dict385Contents
 };
 
 // ----- CARDIO-D.R. 1.0 -----
 
-DictEntry Dict374Contents[] = {
+const DictEntry Dict386Contents[] = {
 { 0x0009, 0x0000, 0, VR::UL, VM::M1, "FileLocation" },
 { 0x0009, 0x0001, 0, VR::UL, VM::M1, "FileSize" },
 { 0x0009, 0x0040, 0, VR::SQ, VM::M1, "AlternateImageSequence" },
@@ -22754,7 +23712,7 @@ DictEntry Dict374Contents[] = {
 { 0x0029, 0x00AD, 0, VR::FL, VM::M1, "DisplayedAreaTopLeftHandCornerFractional" },
 };
 
-unsigned short Dict374TagHashTable[] = {
+const unsigned short Dict386TagHashTable[] = {
    19,    18,    18,    18,    22,    25,    30,    33,    38,    43,
    18,    52,    18,    57,    60,    18,    18,    63,     0,     1,
     2,    64,     1,    13,     1,     2,    10,    48,    12,     0,
@@ -22764,7 +23722,7 @@ unsigned short Dict374TagHashTable[] = {
     1,    11,    19,     1,     7,     8,
 };
 
-unsigned short Dict374KeyHashTable[] = {
+const unsigned short Dict386KeyHashTable[] = {
    19,    24,    27,    30,    33,    18,    18,    36,    18,    39,
    18,    46,    18,    18,    51,    18,    54,    63,     0,     2,
    10, 35814,    17, 45961,     1,    16, 47059,     1,    14,  8195,
@@ -22774,18 +23732,18 @@ unsigned short Dict374KeyHashTable[] = {
 49832,    11, 41349,     1,     6, 15396,
 };
 
-vtkDICOMDictionary::Dict Dict374Data = {
+vtkDICOMDictionary::Dict Dict386Data = {
 "CARDIO-D.R. 1.0",
 18,
 18,
-Dict374TagHashTable,
-Dict374KeyHashTable,
-Dict374Contents
+Dict386TagHashTable,
+Dict386KeyHashTable,
+Dict386Contents
 };
 
 // ----- LODOX_STATSCAN -----
 
-DictEntry Dict375Contents[] = {
+const DictEntry Dict387Contents[] = {
 { 0x0019, 0x0001, 0, VR::IS, VM::M1TN, "" },
 { 0x0019, 0x0002, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0003, 0, VR::DS, VM::M1, "" },
@@ -22796,31 +23754,31 @@ DictEntry Dict375Contents[] = {
 { 0x0019, 0x0008, 0, VR::DS, VM::M1, "" },
 };
 
-unsigned short Dict375TagHashTable[] = {
+const unsigned short Dict387TagHashTable[] = {
     9,    12,    15,    18,    21,    24,    27,    30,     0,     1,
     0,     1,     1,     7,     8,     1,     2,     3,     1,     1,
     2,     1,     4,     5,     1,     3,     4,     1,     6,     7,
     1,     5,     6,
 };
 
-unsigned short Dict375KeyHashTable[] = {
+const unsigned short Dict387KeyHashTable[] = {
     8,     8,     8,     8,     8,     9,     8,     8,     0,     8,
     0,   672,     1,   672,     2,   672,     3,   672,     4,   672,
     5,   672,     6,   672,     7,   672,
 };
 
-vtkDICOMDictionary::Dict Dict375Data = {
+vtkDICOMDictionary::Dict Dict387Data = {
 "LODOX_STATSCAN",
 8,
 8,
-Dict375TagHashTable,
-Dict375KeyHashTable,
-Dict375Contents
+Dict387TagHashTable,
+Dict387KeyHashTable,
+Dict387Contents
 };
 
 // ----- SIEMENS MED SMS USG ANTARES 3D VOLUME -----
 
-DictEntry Dict376Contents[] = {
+const DictEntry Dict388Contents[] = {
 { 0x0039, 0x0000, 0, VR::UN, VM::M1, "ReleaseVersion" },
 { 0x0039, 0x0003, 0, VR::UN, VM::M1, "VolumeAcquisitionDuration" },
 { 0x0039, 0x0004, 0, VR::UN, VM::M1, "VolumeRawDataType" },
@@ -22959,7 +23917,7 @@ DictEntry Dict376Contents[] = {
 { 0x0039, 0x00f6, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict376TagHashTable[] = {
+const unsigned short Dict388TagHashTable[] = {
   137,   140,   136,   136,   136,   136,   136,   136,   143,   146,
   149,   152,   155,   158,   161,   136,   164,   167,   170,   173,
   136,   136,   136,   136,   176,   179,   184,   187,   190,   195,
@@ -23013,7 +23971,7 @@ unsigned short Dict376TagHashTable[] = {
    86,     1,    44,    87,     1,    36,    64,
 };
 
-unsigned short Dict376KeyHashTable[] = {
+const unsigned short Dict388KeyHashTable[] = {
   136,   136,   137,   136,   140,   136,   145,   148,   136,   136,
   153,   136,   136,   136,   158,   136,   136,   136,   136,   161,
   166,   136,   136,   136,   136,   169,   136,   172,   136,   175,
@@ -23065,46 +24023,46 @@ unsigned short Dict376KeyHashTable[] = {
    85, 60047,    94, 31579,     1,    60, 44115,     1,     8, 24323,
 };
 
-vtkDICOMDictionary::Dict Dict376Data = {
+vtkDICOMDictionary::Dict Dict388Data = {
 "SIEMENS MED SMS USG ANTARES 3D VOLUME",
 136,
 136,
-Dict376TagHashTable,
-Dict376KeyHashTable,
-Dict376Contents
+Dict388TagHashTable,
+Dict388KeyHashTable,
+Dict388Contents
 };
 
 // ----- 1.2.840.113681 -----
 
-DictEntry Dict377Contents[] = {
+const DictEntry Dict389Contents[] = {
 { 0x0019, 0x0010, 0, VR::ST, VM::M1, "CRImageParamsCommon" },
 { 0x0019, 0x0011, 0, VR::ST, VM::M1, "CRImageIPParamsSingle" },
 { 0x0019, 0x0012, 0, VR::ST, VM::M1, "CRImageIPParamsLeft" },
 { 0x0019, 0x0013, 0, VR::ST, VM::M1, "CRImageIPParamsRight" },
 };
 
-unsigned short Dict377TagHashTable[] = {
+const unsigned short Dict389TagHashTable[] = {
     5,     8,    11,    14,     0,     1,     1,    17,     1,     0,
    16,     1,     3,    19,     1,     2,    18,
 };
 
-unsigned short Dict377KeyHashTable[] = {
+const unsigned short Dict389KeyHashTable[] = {
     5,    10,    13,     4,     0,     2,     1, 31079,     3,  6414,
     1,     2, 26617,     1,     0, 12906,
 };
 
-vtkDICOMDictionary::Dict Dict377Data = {
+vtkDICOMDictionary::Dict Dict389Data = {
 "1.2.840.113681",
 4,
 4,
-Dict377TagHashTable,
-Dict377KeyHashTable,
-Dict377Contents
+Dict389TagHashTable,
+Dict389KeyHashTable,
+Dict389Contents
 };
 
 // ----- Philips PET Private Group -----
 
-DictEntry Dict378Contents[] = {
+const DictEntry Dict390Contents[] = {
 { 0x0511, 0x0000, 0, VR::US, VM::M1, "PrivateData" },
 { 0x0511, 0x0001, 0, VR::US, VM::M1, "PrivateData" },
 { 0x0511, 0x0002, 0, VR::OB, VM::M1, "PrivateData" },
@@ -23134,7 +24092,7 @@ DictEntry Dict378Contents[] = {
 { 0x7053, 0x00c2, 0, VR::UI, VM::M1, "" },
 };
 
-unsigned short Dict378TagHashTable[] = {
+const unsigned short Dict390TagHashTable[] = {
    28,    27,    27,    31,    34,    39,    42,    47,    50,    53,
    56,    59,    62,    65,    68,    73,    76,    79,    82,    27,
    85,    88,    91,    94,    97,   100,   103,     0,     1,    11,
@@ -23148,7 +24106,7 @@ unsigned short Dict378TagHashTable[] = {
     1,    13,     7,     1,    10,     4,
 };
 
-unsigned short Dict378KeyHashTable[] = {
+const unsigned short Dict390KeyHashTable[] = {
    27,    28,    27,    45,    27,    27,    27,    48,    51,    27,
    27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
    27,    84,    27,    27,    27,    27,    27,     0,     8,     0,
@@ -23160,64 +24118,64 @@ unsigned short Dict378KeyHashTable[] = {
    25,   199,    26,   199,     1,    11, 56148,
 };
 
-vtkDICOMDictionary::Dict Dict378Data = {
+vtkDICOMDictionary::Dict Dict390Data = {
 "Philips PET Private Group",
 27,
 27,
-Dict378TagHashTable,
-Dict378KeyHashTable,
-Dict378Contents
+Dict390TagHashTable,
+Dict390KeyHashTable,
+Dict390Contents
 };
 
 // ----- GEMS-IT/Centricity RA600/7.0 -----
 
-DictEntry Dict379Contents[] = {
+const DictEntry Dict391Contents[] = {
 { 0x4113, 0x0010, 0, VR::UI, VM::M1, "NumberOfImagesInStudy" },
 };
 
-unsigned short Dict379TagHashTable[] = {
+const unsigned short Dict391TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict379KeyHashTable[] = {
+const unsigned short Dict391KeyHashTable[] = {
     2,     0,     1,     0, 48361,
 };
 
-vtkDICOMDictionary::Dict Dict379Data = {
+vtkDICOMDictionary::Dict Dict391Data = {
 "GEMS-IT/Centricity RA600/7.0",
 1,
 1,
-Dict379TagHashTable,
-Dict379KeyHashTable,
-Dict379Contents
+Dict391TagHashTable,
+Dict391KeyHashTable,
+Dict391Contents
 };
 
 // ----- syngoDynamics_Reporting -----
 
-DictEntry Dict380Contents[] = {
+const DictEntry Dict392Contents[] = {
 { 0x0021, 0x00AD, 0, VR::OB, VM::M1, "Data" },
 };
 
-unsigned short Dict380TagHashTable[] = {
+const unsigned short Dict392TagHashTable[] = {
     2,     0,     1,     0,   173,
 };
 
-unsigned short Dict380KeyHashTable[] = {
+const unsigned short Dict392KeyHashTable[] = {
     2,     0,     1,     0,  1343,
 };
 
-vtkDICOMDictionary::Dict Dict380Data = {
+vtkDICOMDictionary::Dict Dict392Data = {
 "syngoDynamics_Reporting",
-1,
-1,
-Dict380TagHashTable,
-Dict380KeyHashTable,
-Dict380Contents
+1,
+1,
+Dict392TagHashTable,
+Dict392KeyHashTable,
+Dict392Contents
 };
 
 // ----- Harmony R1.0 C3 -----
 
-DictEntry Dict381Contents[] = {
+const DictEntry Dict393Contents[] = {
 { 0x0019, 0x0000, 0, VR::LO, VM::M1, "" },
 { 0x0019, 0x0003, 0, VR::LO, VM::M1, "" },
 { 0x0019, 0x0007, 0, VR::LO, VM::M1, "" },
@@ -23262,7 +24220,7 @@ DictEntry Dict381Contents[] = {
 { 0x0019, 0x00f2, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict381TagHashTable[] = {
+const unsigned short Dict393TagHashTable[] = {
    43,    46,    49,    52,    42,    55,    42,    42,    42,    42,
    42,    42,    58,    61,    64,    69,    74,    79,    84,    89,
    42,    42,    92,    42,    95,   100,   107,    42,    42,   114,
@@ -23281,7 +24239,7 @@ unsigned short Dict381TagHashTable[] = {
     1,    36,   237,
 };
 
-unsigned short Dict381KeyHashTable[] = {
+const unsigned short Dict393KeyHashTable[] = {
    42,    42,    42,    42,    42,    43,    42,    42,    42,    42,
    42,    42,    42,    42,    42,    42,    42,    42,    42,    42,
    42,    42,    42,    42,    42,    42,    42,    42,    42,    42,
@@ -23297,18 +24255,18 @@ unsigned short Dict381KeyHashTable[] = {
    38,   128,    39,   128,    40,   128,    41,   128,
 };
 
-vtkDICOMDictionary::Dict Dict381Data = {
+vtkDICOMDictionary::Dict Dict393Data = {
 "Harmony R1.0 C3",
 42,
 42,
-Dict381TagHashTable,
-Dict381KeyHashTable,
-Dict381Contents
+Dict393TagHashTable,
+Dict393KeyHashTable,
+Dict393Contents
 };
 
 // ----- Harmony R1.0 C2 -----
 
-DictEntry Dict382Contents[] = {
+const DictEntry Dict394Contents[] = {
 { 0x0019, 0x0000, 0, VR::LO, VM::M1, "" },
 { 0x0019, 0x0001, 0, VR::UN, VM::M1, "" },
 { 0x0019, 0x0002, 0, VR::UN, VM::M1, "" },
@@ -23337,7 +24295,7 @@ DictEntry Dict382Contents[] = {
 { 0x0019, 0x0091, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict382TagHashTable[] = {
+const unsigned short Dict394TagHashTable[] = {
    27,    30,    33,    36,    41,    46,    49,    26,    52,    26,
    55,    26,    58,    61,    64,    26,    67,    70,    73,    76,
    81,    26,    84,    87,    90,    95,     0,     1,     3,     3,
@@ -23350,7 +24308,7 @@ unsigned short Dict382TagHashTable[] = {
     2,     1,     1,    21,   129,     2,     0,     0,    20,   128,
 };
 
-unsigned short Dict382KeyHashTable[] = {
+const unsigned short Dict394KeyHashTable[] = {
    26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
    26,    26,    26,    26,    26,    26,    26,    26,    26,    26,
    26,    26,    26,    26,    26,    27,     0,    26,     0,   206,
@@ -23361,42 +24319,42 @@ unsigned short Dict382KeyHashTable[] = {
    21,   206,    22,   206,    23,   206,    24,   206,    25,   206,
 };
 
-vtkDICOMDictionary::Dict Dict382Data = {
+vtkDICOMDictionary::Dict Dict394Data = {
 "Harmony R1.0 C2",
 26,
 26,
-Dict382TagHashTable,
-Dict382KeyHashTable,
-Dict382Contents
+Dict394TagHashTable,
+Dict394KeyHashTable,
+Dict394Contents
 };
 
 // ----- SEGAMI__MEMO -----
 
-DictEntry Dict383Contents[] = {
+const DictEntry Dict395Contents[] = {
 { 0x0035, 0x0097, 0, VR::SH, VM::M1, "" },
 { 0x0035, 0x0098, 0, VR::LT, VM::M1, "" },
 };
 
-unsigned short Dict383TagHashTable[] = {
+const unsigned short Dict395TagHashTable[] = {
     3,     6,     0,     1,     0,   151,     1,     1,   152,
 };
 
-unsigned short Dict383KeyHashTable[] = {
+const unsigned short Dict395KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict383Data = {
+vtkDICOMDictionary::Dict Dict395Data = {
 "SEGAMI__MEMO",
 2,
 2,
-Dict383TagHashTable,
-Dict383KeyHashTable,
-Dict383Contents
+Dict395TagHashTable,
+Dict395KeyHashTable,
+Dict395Contents
 };
 
 // ----- AGFA -----
 
-DictEntry Dict384Contents[] = {
+const DictEntry Dict396Contents[] = {
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "" },
 { 0x0009, 0x0011, 0, VR::LO, VM::M1, "" },
 { 0x0009, 0x0013, 0, VR::LO, VM::M1, "" },
@@ -23410,7 +24368,7 @@ DictEntry Dict384Contents[] = {
 { 0x0019, 0x0015, 0, VR::LO, VM::M1, "DoseMonitoring" },
 { 0x0019, 0x0016, 0, VR::LO, VM::M1, "OtherInfo" },
 { 0x0019, 0x001a, 0, VR::LO, VM::M1, "ClippedExposureDeviation" },
-{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "Logarithmic PLT Full Scale" },
+{ 0x0019, 0x001b, 0, VR::LO, VM::M1, "LogarithmicPLTFullScale" },
 { 0x0019, 0x0060, 0, VR::US, VM::M1, "TotalNumberSeries" },
 { 0x0019, 0x0061, 0, VR::SH, VM::M1, "SessionNumber" },
 { 0x0019, 0x0062, 0, VR::SH, VM::M1, "IDStationName" },
@@ -23422,7 +24380,7 @@ DictEntry Dict384Contents[] = {
 { 0x0019, 0x0093, 0, VR::CS, VM::M1, "Status" },
 };
 
-unsigned short Dict384TagHashTable[] = {
+const unsigned short Dict396TagHashTable[] = {
    23,    24,    27,    32,    23,    37,    44,    49,    52,    55,
    58,    23,    63,    68,    23,    71,    76,    79,    23,    23,
    23,    82,    23,     0,     1,     1,    17,     2,     0,    16,
@@ -23434,130 +24392,130 @@ unsigned short Dict384TagHashTable[] = {
    19,   128,     1,    22,   147,
 };
 
-unsigned short Dict384KeyHashTable[] = {
-   24,    23,    29,    32,    37,    42,    23,    23,    51,    23,
+const unsigned short Dict396KeyHashTable[] = {
+   24,    23,    27,    32,    37,    42,    23,    23,    51,    23,
    23,    23,    58,    23,    23,    23,    23,    63,    23,    23,
-   23,    23,    66,     0,     2,    13, 45429,    15, 16126,     1,
-   10,  3564,     2,    16,   446,    18, 53827,     2,     5, 61109,
+   23,    23,    66,     0,     1,    15, 16126,     2,    10,  3564,
+   13, 58343,     2,    16,   446,    18, 53827,     2,     5, 61109,
    20, 56072,     4,     7, 15484,     9, 63060,    11, 49602,    12,
 42521,     3,     8, 23404,    17, 16022,    19,  5701,     2,    21,
 30571,    22, 15595,     1,     6, 40216,     6,     0,   233,     1,
   233,     2,   233,     3,   233,     4,   233,    14, 37233,
 };
 
-vtkDICOMDictionary::Dict Dict384Data = {
+vtkDICOMDictionary::Dict Dict396Data = {
 "AGFA",
 23,
 23,
-Dict384TagHashTable,
-Dict384KeyHashTable,
-Dict384Contents
+Dict396TagHashTable,
+Dict396KeyHashTable,
+Dict396Contents
 };
 
 // ----- Philips Imaging DD 067 -----
 
-DictEntry Dict385Contents[] = {
+const DictEntry Dict397Contents[] = {
 { 0x4001, 0x0000, 0, VR::SQ, VM::M1, "" },
 { 0x4001, 0x0001, 0, VR::CS, VM::M1, "" },
 { 0x4001, 0x0008, 0, VR::CS, VM::M1, "" },
 { 0x4001, 0x0009, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict385TagHashTable[] = {
+const unsigned short Dict397TagHashTable[] = {
     5,    10,     4,     4,     0,     2,     1,     1,     3,     9,
     2,     0,     0,     2,     8,
 };
 
-unsigned short Dict385KeyHashTable[] = {
+const unsigned short Dict397KeyHashTable[] = {
     4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
     2,  1345,     3,  1345,
 };
 
-vtkDICOMDictionary::Dict Dict385Data = {
+vtkDICOMDictionary::Dict Dict397Data = {
 "Philips Imaging DD 067",
 4,
 4,
-Dict385TagHashTable,
-Dict385KeyHashTable,
-Dict385Contents
+Dict397TagHashTable,
+Dict397KeyHashTable,
+Dict397Contents
 };
 
 // ----- DLX_EXAMS_01 -----
 
-DictEntry Dict386Contents[] = {
+const DictEntry Dict398Contents[] = {
 { 0x0015, 0x0001, 0, VR::DS, VM::M1, "StenosisCalibrationRatio" },
 { 0x0015, 0x0002, 0, VR::DS, VM::M1, "StenosisMagnification" },
 { 0x0015, 0x0003, 0, VR::DS, VM::M1, "CardiacCalibrationRatio" },
 };
 
-unsigned short Dict386TagHashTable[] = {
+const unsigned short Dict398TagHashTable[] = {
     3,     4,     7,     0,     1,     2,     3,     2,     0,     1,
     1,     2,
 };
 
-unsigned short Dict386KeyHashTable[] = {
+const unsigned short Dict398KeyHashTable[] = {
     3,     4,     9,     0,     2,     0,  7265,     2, 44742,     1,
     1, 40220,
 };
 
-vtkDICOMDictionary::Dict Dict386Data = {
+vtkDICOMDictionary::Dict Dict398Data = {
 "DLX_EXAMS_01",
 3,
 3,
-Dict386TagHashTable,
-Dict386KeyHashTable,
-Dict386Contents
+Dict398TagHashTable,
+Dict398KeyHashTable,
+Dict398Contents
 };
 
 // ----- Philips Imaging DD 065 -----
 
-DictEntry Dict387Contents[] = {
+const DictEntry Dict399Contents[] = {
 { 0x4007, 0x0000, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict387TagHashTable[] = {
+const unsigned short Dict399TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict387KeyHashTable[] = {
+const unsigned short Dict399KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict387Data = {
+vtkDICOMDictionary::Dict Dict399Data = {
 "Philips Imaging DD 065",
 1,
 1,
-Dict387TagHashTable,
-Dict387KeyHashTable,
-Dict387Contents
+Dict399TagHashTable,
+Dict399KeyHashTable,
+Dict399Contents
 };
 
 // ----- GE_GROUP -----
 
-DictEntry Dict388Contents[] = {
+const DictEntry Dict400Contents[] = {
 { 0x6005, 0x0010, 0, VR::UT, VM::M1, "" },
 };
 
-unsigned short Dict388TagHashTable[] = {
+const unsigned short Dict400TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict388KeyHashTable[] = {
+const unsigned short Dict400KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict388Data = {
+vtkDICOMDictionary::Dict Dict400Data = {
 "GE_GROUP",
 1,
 1,
-Dict388TagHashTable,
-Dict388KeyHashTable,
-Dict388Contents
+Dict400TagHashTable,
+Dict400KeyHashTable,
+Dict400Contents
 };
 
 // ----- SIEMENS SYNGO OBJECT GRAPHICS -----
 
-DictEntry Dict389Contents[] = {
+const DictEntry Dict401Contents[] = {
 { 0x0071, 0x0000, 0, VR::SQ, VM::M1, "GraphicObjectSequence" },
 { 0x0071, 0x0001, 0, VR::SL, VM::M1, "FillStyleVersion" },
 { 0x0071, 0x0002, 0, VR::FL, VM::M4, "FillBackgroundColor" },
@@ -23682,7 +24640,7 @@ DictEntry Dict389Contents[] = {
 { 0x0071, 0x00B7, 0, VR::SL, VM::M1, "GraphicObjectReferenceLabel" },
 };
 
-unsigned short Dict389TagHashTable[] = {
+const unsigned short Dict401TagHashTable[] = {
   123,   128,   133,   138,   143,   146,   149,   154,   159,   162,
   122,   122,   122,   122,   122,   122,   165,   168,   171,   174,
   177,   180,   183,   186,   189,   192,   122,   122,   122,   122,
@@ -23732,7 +24690,7 @@ unsigned short Dict389TagHashTable[] = {
   129,
 };
 
-unsigned short Dict389KeyHashTable[] = {
+const unsigned short Dict401KeyHashTable[] = {
   122,   122,   123,   130,   133,   136,   139,   122,   144,   122,
   122,   122,   153,   122,   158,   122,   163,   166,   122,   169,
   176,   122,   122,   179,   186,   122,   191,   194,   197,   200,
@@ -23780,18 +24738,18 @@ unsigned short Dict389KeyHashTable[] = {
     2,    37, 30873,    82, 26040,     1,    12, 21249,
 };
 
-vtkDICOMDictionary::Dict Dict389Data = {
+vtkDICOMDictionary::Dict Dict401Data = {
 "SIEMENS SYNGO OBJECT GRAPHICS",
 122,
 122,
-Dict389TagHashTable,
-Dict389KeyHashTable,
-Dict389Contents
+Dict401TagHashTable,
+Dict401KeyHashTable,
+Dict401Contents
 };
 
 // ----- Visus Change -----
 
-DictEntry Dict390Contents[] = {
+const DictEntry Dict402Contents[] = {
 { 0x5533, 0x0033, 0, VR::SQ, VM::M1, "SaveSequence" },
 { 0x5533, 0x0035, 0, VR::DA, VM::M1, "SaveDate" },
 { 0x5533, 0x0037, 0, VR::LO, VM::M1, "SaveOriginator" },
@@ -23799,28 +24757,28 @@ DictEntry Dict390Contents[] = {
 { 0x5533, 0x003b, 0, VR::TM, VM::M1, "SaveTime" },
 };
 
-unsigned short Dict390TagHashTable[] = {
+const unsigned short Dict402TagHashTable[] = {
     5,     6,     5,    11,    16,     0,     2,     1,    53,     4,
    59,     2,     0,    51,     3,    57,     1,     2,    55,
 };
 
-unsigned short Dict390KeyHashTable[] = {
+const unsigned short Dict402KeyHashTable[] = {
     6,     9,    12,     5,    15,     0,     1,     2, 39946,     1,
     0, 60092,     1,     4, 33901,     2,     1, 48278,     3, 11769,
 };
 
-vtkDICOMDictionary::Dict Dict390Data = {
+vtkDICOMDictionary::Dict Dict402Data = {
 "Visus Change",
 5,
 5,
-Dict390TagHashTable,
-Dict390KeyHashTable,
-Dict390Contents
+Dict402TagHashTable,
+Dict402KeyHashTable,
+Dict402Contents
 };
 
 // ----- SIEMENS ISI -----
 
-DictEntry Dict391Contents[] = {
+const DictEntry Dict403Contents[] = {
 { 0x0003, 0x0008, 0, VR::US, VM::M1, "ISICommandField" },
 { 0x0003, 0x0011, 0, VR::US, VM::M1, "AttachIDApplicationCode" },
 { 0x0003, 0x0012, 0, VR::UL, VM::M1, "AttachIDMessageCount" },
@@ -23863,7 +24821,7 @@ DictEntry Dict391Contents[] = {
 { 0x4009, 0x00e3, 0, VR::LO, VM::M1, "ReportingRadiologist" },
 };
 
-unsigned short Dict391TagHashTable[] = {
+const unsigned short Dict403TagHashTable[] = {
    41,    44,    51,    56,    40,    40,    40,    61,    66,    40,
    71,    78,    85,    40,    40,    88,    91,    94,   101,   110,
    40,   115,    40,   118,    40,    40,    40,   121,    40,    40,
@@ -23881,7 +24839,7 @@ unsigned short Dict391TagHashTable[] = {
    38,   225,
 };
 
-unsigned short Dict391KeyHashTable[] = {
+const unsigned short Dict403KeyHashTable[] = {
    41,    40,    40,    44,    47,    50,    53,    56,    61,    40,
    40,    66,    69,    76,    79,    40,    40,    40,    82,    87,
    92,    97,   100,   105,    40,    40,   108,    40,   111,   116,
@@ -23899,65 +24857,65 @@ unsigned short Dict391KeyHashTable[] = {
     9, 42663,     2,     2, 37434,    21, 41031,
 };
 
-vtkDICOMDictionary::Dict Dict391Data = {
+vtkDICOMDictionary::Dict Dict403Data = {
 "SIEMENS ISI",
 40,
 40,
-Dict391TagHashTable,
-Dict391KeyHashTable,
-Dict391Contents
+Dict403TagHashTable,
+Dict403KeyHashTable,
+Dict403Contents
 };
 
 // ----- PHILIPS MR R5.6/PART -----
 
-DictEntry Dict392Contents[] = {
+const DictEntry Dict404Contents[] = {
 { 0x0019, 0x0000, 0, VR::DS, VM::M1, "FieldOfView" },
 };
 
-unsigned short Dict392TagHashTable[] = {
+const unsigned short Dict404TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict392KeyHashTable[] = {
+const unsigned short Dict404KeyHashTable[] = {
     2,     0,     1,     0, 16313,
 };
 
-vtkDICOMDictionary::Dict Dict392Data = {
+vtkDICOMDictionary::Dict Dict404Data = {
 "PHILIPS MR R5.6/PART",
 1,
 1,
-Dict392TagHashTable,
-Dict392KeyHashTable,
-Dict392Contents
+Dict404TagHashTable,
+Dict404KeyHashTable,
+Dict404Contents
 };
 
 // ----- METAEMOTION GINKGO -----
 
-DictEntry Dict393Contents[] = {
+const DictEntry Dict405Contents[] = {
 { 0x0011, 0x0001, 0, VR::LT, VM::M1, "KeyFileIndicator" },
 { 0x0011, 0x000B, 0, VR::LT, VM::M1, "SerializedDiagnoseAndMarkers" },
 };
 
-unsigned short Dict393TagHashTable[] = {
+const unsigned short Dict405TagHashTable[] = {
     3,     2,     0,     2,     0,     1,     1,    11,
 };
 
-unsigned short Dict393KeyHashTable[] = {
+const unsigned short Dict405KeyHashTable[] = {
     2,     3,     0,     2,     0, 16373,     1, 45377,
 };
 
-vtkDICOMDictionary::Dict Dict393Data = {
+vtkDICOMDictionary::Dict Dict405Data = {
 "METAEMOTION GINKGO",
 2,
 2,
-Dict393TagHashTable,
-Dict393KeyHashTable,
-Dict393Contents
+Dict405TagHashTable,
+Dict405KeyHashTable,
+Dict405Contents
 };
 
 // ----- GEMS_IDEN_01 -----
 
-DictEntry Dict394Contents[] = {
+const DictEntry Dict406Contents[] = {
 { 0x0009, 0x0001, 0, VR::LO, VM::M1, "FullFidelity" },
 { 0x0009, 0x0002, 0, VR::SH, VM::M1, "SuiteId" },
 { 0x0009, 0x0004, 0, VR::SH, VM::M1, "ProductId" },
@@ -23976,7 +24934,7 @@ DictEntry Dict394Contents[] = {
 { 0x0009, 0x00e9, 0, VR::SL, VM::M1, "ActualSeriesDataTimeStamp" },
 };
 
-unsigned short Dict394TagHashTable[] = {
+const unsigned short Dict406TagHashTable[] = {
    16,    16,    17,    20,    16,    16,    25,    16,    28,    35,
    16,    42,    45,    48,    53,    16,     0,     1,    14,   232,
     2,     4,    26,    15,   233,     1,     7,    47,     3,     0,
@@ -23985,7 +24943,7 @@ unsigned short Dict394TagHashTable[] = {
     4,    13,   231,     2,     3,    23,     6,    39,
 };
 
-unsigned short Dict394KeyHashTable[] = {
+const unsigned short Dict406KeyHashTable[] = {
    17,    16,    20,    25,    16,    30,    16,    41,    44,    16,
    16,    16,    47,    50,    16,    53,     0,     1,     6, 45802,
     2,     0, 39865,    13, 31860,     2,     2,  9495,     8,  8204,
@@ -23994,88 +24952,111 @@ unsigned short Dict394KeyHashTable[] = {
     1,    12, 17514,     2,     9, 34293,    11, 62425,
 };
 
-vtkDICOMDictionary::Dict Dict394Data = {
+vtkDICOMDictionary::Dict Dict406Data = {
 "GEMS_IDEN_01",
 16,
 16,
-Dict394TagHashTable,
-Dict394KeyHashTable,
-Dict394Contents
+Dict406TagHashTable,
+Dict406KeyHashTable,
+Dict406Contents
+};
+
+// ----- Silhouette Graphics Export V1.0 -----
+
+const DictEntry Dict407Contents[] = {
+{ 0x0029, 0x0000, 0, VR::UI, VM::M1, "" },
+};
+
+const unsigned short Dict407TagHashTable[] = {
+    2,     0,     1,     0,     0,
+};
+
+const unsigned short Dict407KeyHashTable[] = {
+    2,     0,     1,     0,  5381,
+};
+
+vtkDICOMDictionary::Dict Dict407Data = {
+"Silhouette Graphics Export V1.0",
+1,
+1,
+Dict407TagHashTable,
+Dict407KeyHashTable,
+Dict407Contents
 };
 
 // ----- SIEMENS MED ECAT FILE INFO -----
 
-DictEntry Dict395Contents[] = {
+const DictEntry Dict408Contents[] = {
 { 0x0021, 0x0000, 0, VR::OB, VM::M1, "ECATMainHeader" },
 { 0x0021, 0x0001, 0, VR::OB, VM::M1, "ECATImageSubheader" },
 };
 
-unsigned short Dict395TagHashTable[] = {
+const unsigned short Dict408TagHashTable[] = {
     3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict395KeyHashTable[] = {
+const unsigned short Dict408KeyHashTable[] = {
     3,     2,     0,     2,     0,  2200,     1, 20300,
 };
 
-vtkDICOMDictionary::Dict Dict395Data = {
+vtkDICOMDictionary::Dict Dict408Data = {
 "SIEMENS MED ECAT FILE INFO",
 2,
 2,
-Dict395TagHashTable,
-Dict395KeyHashTable,
-Dict395Contents
+Dict408TagHashTable,
+Dict408KeyHashTable,
+Dict408Contents
 };
 
 // ----- SIEMENS CT APPL EVIDENCEDOCUMENT -----
 
-DictEntry Dict396Contents[] = {
+const DictEntry Dict409Contents[] = {
 { 0x0029, 0x0000, 0, VR::UT, VM::M1, "PrivateTaskDatamodel" },
 };
 
-unsigned short Dict396TagHashTable[] = {
+const unsigned short Dict409TagHashTable[] = {
     2,     0,     1,     0,     0,
 };
 
-unsigned short Dict396KeyHashTable[] = {
+const unsigned short Dict409KeyHashTable[] = {
     2,     0,     1,     0, 45534,
 };
 
-vtkDICOMDictionary::Dict Dict396Data = {
+vtkDICOMDictionary::Dict Dict409Data = {
 "SIEMENS CT APPL EVIDENCEDOCUMENT",
 1,
 1,
-Dict396TagHashTable,
-Dict396KeyHashTable,
-Dict396Contents
+Dict409TagHashTable,
+Dict409KeyHashTable,
+Dict409Contents
 };
 
 // ----- Viewing Protocol -----
 
-DictEntry Dict397Contents[] = {
+const DictEntry Dict410Contents[] = {
 { 0x0065, 0x0093, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict397TagHashTable[] = {
+const unsigned short Dict410TagHashTable[] = {
     2,     0,     1,     0,   147,
 };
 
-unsigned short Dict397KeyHashTable[] = {
+const unsigned short Dict410KeyHashTable[] = {
     2,     0,     1,     0,  5381,
 };
 
-vtkDICOMDictionary::Dict Dict397Data = {
+vtkDICOMDictionary::Dict Dict410Data = {
 "Viewing Protocol",
 1,
 1,
-Dict397TagHashTable,
-Dict397KeyHashTable,
-Dict397Contents
+Dict410TagHashTable,
+Dict410KeyHashTable,
+Dict410Contents
 };
 
 // ----- SIEMENS DFR.01 MANIPULATED -----
 
-DictEntry Dict398Contents[] = {
+const DictEntry Dict411Contents[] = {
 { 0x0017, 0x0011, 0, VR::US, VM::M1, "" },
 { 0x0017, 0x0012, 0, VR::US, VM::M1, "" },
 { 0x0017, 0x0014, 0, VR::US, VM::M1, "" },
@@ -24106,7 +25087,7 @@ DictEntry Dict398Contents[] = {
 { 0x0017, 0x00a3, 0, VR::SH, VM::M1, "ImageNameExtension2" },
 };
 
-unsigned short Dict398TagHashTable[] = {
+const unsigned short Dict411TagHashTable[] = {
    28,    28,    29,    32,    35,    38,    43,    28,    50,    53,
    58,    63,    66,    69,    72,    77,    80,    83,    28,    86,
    91,    28,    94,    28,    97,    28,   100,   103,     0,     1,
@@ -24120,7 +25101,7 @@ unsigned short Dict398TagHashTable[] = {
     1,    19,   120,     1,    20,   121,
 };
 
-unsigned short Dict398KeyHashTable[] = {
+const unsigned short Dict411KeyHashTable[] = {
    28,    29,    28,    28,    32,    35,    28,    28,    28,    28,
    28,    28,    28,    28,    28,    74,    79,    28,    28,    82,
    28,    28,    85,    88,    91,    28,    28,    28,     0,     1,
@@ -24133,18 +25114,18 @@ unsigned short Dict398KeyHashTable[] = {
 55280,     1,    27, 55280,
 };
 
-vtkDICOMDictionary::Dict Dict398Data = {
+vtkDICOMDictionary::Dict Dict411Data = {
 "SIEMENS DFR.01 MANIPULATED",
 28,
 28,
-Dict398TagHashTable,
-Dict398KeyHashTable,
-Dict398Contents
+Dict411TagHashTable,
+Dict411KeyHashTable,
+Dict411Contents
 };
 
 // ----- BioPri -----
 
-DictEntry Dict399Contents[] = {
+const DictEntry Dict412Contents[] = {
 { 0x0009, 0x0000, 0, VR::LO, VM::M1, "" },
 { 0x0009, 0x0001, 0, VR::UN, VM::M1, "" },
 { 0x0009, 0x0002, 0, VR::UN, VM::M1, "" },
@@ -24157,32 +25138,32 @@ DictEntry Dict399Contents[] = {
 { 0x0009, 0x0010, 0, VR::UN, VM::M1, "" },
 };
 
-unsigned short Dict399TagHashTable[] = {
+const unsigned short Dict412TagHashTable[] = {
    11,    16,    21,    24,    27,    30,    10,    10,    33,    36,
     0,     2,     3,     3,     8,     9,     2,     2,     2,     7,
     8,     1,     5,     5,     1,     4,     4,     1,     6,     7,
     1,     9,    16,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict399KeyHashTable[] = {
+const unsigned short Dict412KeyHashTable[] = {
    10,    11,    10,    10,    10,    10,    10,    10,    10,    10,
     0,    10,     0,   538,     1,   538,     2,   538,     3,   538,
     4,   538,     5,   538,     6,   538,     7,   538,     8,   538,
     9,   538,
 };
 
-vtkDICOMDictionary::Dict Dict399Data = {
+vtkDICOMDictionary::Dict Dict412Data = {
 "BioPri",
 10,
 10,
-Dict399TagHashTable,
-Dict399KeyHashTable,
-Dict399Contents
+Dict412TagHashTable,
+Dict412KeyHashTable,
+Dict412Contents
 };
 
 // ----- GEMS_FUNCTOOL_01 -----
 
-DictEntry Dict400Contents[] = {
+const DictEntry Dict413Contents[] = {
 { 0x0051, 0x0001, 0, VR::LO, VM::M1, "GroupName" },
 { 0x0051, 0x0002, 0, VR::LO, VM::M1, "FunctionName" },
 { 0x0051, 0x0003, 0, VR::SL, VM::M1, "Bias" },
@@ -24198,7 +25179,7 @@ DictEntry Dict400Contents[] = {
 { 0x0051, 0x000e, 0, VR::SL, VM::M1, "Hidden" },
 };
 
-unsigned short Dict400TagHashTable[] = {
+const unsigned short Dict413TagHashTable[] = {
    14,    17,    13,    20,    25,    28,    31,    34,    37,    40,
    43,    46,    49,     0,     1,    10,    11,     1,    11,    12,
     2,     0,     1,    12,    14,     1,     1,     2,     1,     2,
@@ -24207,7 +25188,7 @@ unsigned short Dict400TagHashTable[] = {
     9,    10,
 };
 
-unsigned short Dict400KeyHashTable[] = {
+const unsigned short Dict413KeyHashTable[] = {
    13,    14,    19,    13,    22,    29,    32,    13,    13,    35,
    38,    43,    46,     0,     2,     4, 35430,     5, 51288,     1,
     7, 31826,     3,     1, 31080,     3, 19661,     9, 32853,     1,
@@ -24215,18 +25196,18 @@ unsigned short Dict400KeyHashTable[] = {
 19301,    12, 55683,     1,     2, 60733,     1,    11, 39629,
 };
 
-vtkDICOMDictionary::Dict Dict400Data = {
+vtkDICOMDictionary::Dict Dict413Data = {
 "GEMS_FUNCTOOL_01",
 13,
 13,
-Dict400TagHashTable,
-Dict400KeyHashTable,
-Dict400Contents
+Dict413TagHashTable,
+Dict413KeyHashTable,
+Dict413Contents
 };
 
 // ----- Vital Images SW 3.4 -----
 
-DictEntry Dict401Contents[] = {
+const DictEntry Dict414Contents[] = {
 { 0x5653, 0x0010, 0, VR::OB, VM::M1, "SavedWorkflow" },
 { 0x5653, 0x0011, 0, VR::LO, VM::M1, "SavedWorkflowFileName" },
 { 0x5653, 0x0012, 0, VR::OB, VM::M1, "SavedWorkflowFileData" },
@@ -24245,7 +25226,7 @@ DictEntry Dict401Contents[] = {
 { 0x5653, 0x0025, 0, VR::SL, VM::M1, "SavedWorkflowDataLength" },
 };
 
-unsigned short Dict401TagHashTable[] = {
+const unsigned short Dict414TagHashTable[] = {
    16,    16,    17,    20,    16,    16,    16,    16,    23,    28,
    33,    38,    43,    46,    49,    54,     0,     1,     8,    24,
     1,     9,    25,     2,     2,    18,    12,    34,     2,     3,
@@ -24254,7 +25235,7 @@ unsigned short Dict401TagHashTable[] = {
     4,    20,    14,    36,     2,     5,    21,    15,    37,
 };
 
-unsigned short Dict401KeyHashTable[] = {
+const unsigned short Dict414KeyHashTable[] = {
    17,    20,    16,    23,    26,    29,    32,    16,    16,    16,
    16,    35,    38,    41,    50,    55,     0,     1,    11, 42451,
     1,     5, 19824,     1,     0, 43211,     1,     1, 40701,     1,
@@ -24263,41 +25244,41 @@ unsigned short Dict401KeyHashTable[] = {
     2,     8, 14641,    10, 24291,     2,    12, 52573,    15,  3896,
 };
 
-vtkDICOMDictionary::Dict Dict401Data = {
+vtkDICOMDictionary::Dict Dict414Data = {
 "Vital Images SW 3.4",
 16,
 16,
-Dict401TagHashTable,
-Dict401KeyHashTable,
-Dict401Contents
+Dict414TagHashTable,
+Dict414KeyHashTable,
+Dict414Contents
 };
 
 // ----- AMI Annotations_01 -----
 
-DictEntry Dict402Contents[] = {
+const DictEntry Dict415Contents[] = {
 { 0x3101, 0x0010, 0, VR::SQ, VM::M1, "AnnotationSequence" },
 };
 
-unsigned short Dict402TagHashTable[] = {
+const unsigned short Dict415TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict402KeyHashTable[] = {
+const unsigned short Dict415KeyHashTable[] = {
     2,     0,     1,     0, 13593,
 };
 
-vtkDICOMDictionary::Dict Dict402Data = {
+vtkDICOMDictionary::Dict Dict415Data = {
 "AMI Annotations_01",
 1,
 1,
-Dict402TagHashTable,
-Dict402KeyHashTable,
-Dict402Contents
+Dict415TagHashTable,
+Dict415KeyHashTable,
+Dict415Contents
 };
 
 // ----- CAMTRONICS -----
 
-DictEntry Dict403Contents[] = {
+const DictEntry Dict416Contents[] = {
 { 0x0029, 0x0010, 0, VR::LT, VM::M1, "Commentline" },
 { 0x0029, 0x0020, 0, VR::DS, VM::M1, "EdgeEnhancementCoefficient" },
 { 0x0029, 0x0050, 0, VR::LT, VM::M1, "SceneText" },
@@ -24307,30 +25288,30 @@ DictEntry Dict403Contents[] = {
 { 0x0029, 0x0090, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict403TagHashTable[] = {
+const unsigned short Dict416TagHashTable[] = {
     7,     8,    13,    18,    21,    24,     7,     0,     2,     0,
    16,     2,    80,     2,     1,    32,     3,    96,     1,     5,
   128,     1,     4,   112,     1,     6,   144,
 };
 
-unsigned short Dict403KeyHashTable[] = {
+const unsigned short Dict416KeyHashTable[] = {
     7,     8,    11,    16,    19,    22,     7,     0,     1,     5,
 22482,     2,     0, 13618,     2, 13114,     1,     1, 33636,     1,
     3, 30351,     2,     4, 10278,     6,   768,
 };
 
-vtkDICOMDictionary::Dict Dict403Data = {
+vtkDICOMDictionary::Dict Dict416Data = {
 "CAMTRONICS",
 7,
 7,
-Dict403TagHashTable,
-Dict403KeyHashTable,
-Dict403Contents
+Dict416TagHashTable,
+Dict416KeyHashTable,
+Dict416Contents
 };
 
 // ----- Applicare/Print/Version 5.1 -----
 
-DictEntry Dict404Contents[] = {
+const DictEntry Dict417Contents[] = {
 { 0x4101, 0x0001, 0, VR::UL, VM::M1, "MaskState" },
 { 0x4101, 0x0002, 0, VR::SQ, VM::M1, "Annotations" },
 { 0x4101, 0x0003, 0, VR::LO, VM::M1, "Font" },
@@ -24342,32 +25323,32 @@ DictEntry Dict404Contents[] = {
 { 0x4101, 0x0009, 0, VR::US, VM::M1, "ShowCaliper" },
 };
 
-unsigned short Dict404TagHashTable[] = {
+const unsigned short Dict417TagHashTable[] = {
     9,    10,    13,     9,    16,    19,    22,    25,    30,     0,
     1,     2,     3,     1,     1,     2,     1,     4,     5,     1,
     3,     4,     1,     6,     7,     2,     5,     6,     8,     9,
     2,     0,     1,     7,     8,
 };
 
-unsigned short Dict404KeyHashTable[] = {
+const unsigned short Dict417KeyHashTable[] = {
    10,     9,    13,    16,    19,    22,    27,    30,    33,     0,
     1,     4,  7803,     1,     1, 32969,     1,     5, 37252,     1,
     8, 18802,     2,     6, 44289,     7, 40123,     1,     0, 19596,
     1,     2, 60781,     1,     3, 34391,
 };
 
-vtkDICOMDictionary::Dict Dict404Data = {
+vtkDICOMDictionary::Dict Dict417Data = {
 "Applicare/Print/Version 5.1",
 9,
 9,
-Dict404TagHashTable,
-Dict404KeyHashTable,
-Dict404Contents
+Dict417TagHashTable,
+Dict417KeyHashTable,
+Dict417Contents
 };
 
 // ----- GEHC_CT_ADVAPP_001 -----
 
-DictEntry Dict405Contents[] = {
+const DictEntry Dict418Contents[] = {
 { 0x0053, 0x0020, 0, VR::IS, VM::M1, "TableSpeedNotReachesTargetFlag" },
 { 0x0053, 0x0040, 0, VR::SH, VM::M1, "IterativeReconAnnotation" },
 { 0x0053, 0x0041, 0, VR::SH, VM::M1, "IterativeReconMode" },
@@ -24397,7 +25378,7 @@ DictEntry Dict405Contents[] = {
 { 0x0053, 0x0079, 0, VR::LO, VM::M1, "MultiEnergyAcqMethod" },
 { 0x0053, 0x007A, 0, VR::SH, VM::M1, "MultiEnergyFeatAnnotName" },
 { 0x0053, 0x007B, 0, VR::SH, VM::M1, "MultiEnergyNoiseReduced" },
-{ 0x0053, 0x007C, 0, VR::LO, VM::M1, "MultiEnergyNoiseReducdeMethod" },
+{ 0x0053, 0x007C, 0, VR::LO, VM::M1, "MultiEnergyNoiseReduceMethod" },
 { 0x0053, 0x007D, 0, VR::LO, VM::M1, "SubOptimalIQString" },
 { 0x0053, 0x007E, 0, VR::DS, VM::M1, "MultiEnergyHighLowRatio" },
 { 0x0053, 0x007F, 0, VR::DS, VM::M1, "MultiEnergyDutyCycle" },
@@ -24432,7 +25413,7 @@ DictEntry Dict405Contents[] = {
 { 0x0053, 0x009F, 0, VR::LO, VM::M1TN, "MultiEnergyNoiseRedString" },
 };
 
-unsigned short Dict405TagHashTable[] = {
+const unsigned short Dict418TagHashTable[] = {
    62,    62,    62,    62,    62,    62,    62,    62,    63,    66,
    62,    69,    72,    75,    78,    81,    84,    89,    94,    99,
   104,   107,   110,   113,   116,   119,   122,   125,   128,   131,
@@ -24459,68 +25440,68 @@ unsigned short Dict405TagHashTable[] = {
    15,   106,     1,    14,   105,     1,    13,   104,
 };
 
-unsigned short Dict405KeyHashTable[] = {
+const unsigned short Dict418KeyHashTable[] = {
    63,    66,    69,    72,    62,    75,    80,    62,    85,    88,
    62,    93,    96,    62,    62,    99,   102,   105,   110,   113,
-   62,    62,   118,   121,   124,   127,   130,   133,    62,   136,
-   62,    62,   141,    62,    62,   144,   147,   152,   155,   158,
-   62,    62,   165,   170,    62,   175,    62,   180,   183,   190,
-  193,   196,    62,   199,   202,    62,   205,   208,    62,   211,
-  214,   221,     0,     1,    44, 27548,     1,     6, 63239,     1,
+   62,    62,   118,    62,   121,   124,   127,   130,    62,   133,
+   62,    62,   138,    62,    62,   141,   144,   149,   152,   155,
+   62,    62,   162,   167,    62,   172,    62,   177,   180,   187,
+  190,   193,    62,   198,   201,    62,   204,   207,    62,   210,
+  213,   220,     0,     1,    44, 27548,     1,     6, 63239,     1,
    51, 18530,     1,    14, 11761,     2,    15, 21939,    49, 22296,
     2,    12, 35503,    30, 22440,     1,    46, 45856,     2,    11,
 14497,    53, 17487,     1,    25, 46296,     1,    10, 23489,     1,
    42, 52010,     1,    48, 30604,     2,    16, 10503,    27, 15851,
     1,     1, 20951,     2,     3, 39321,    31, 25828,     1,    37,
-25160,     1,    29, 52753,     1,    35, 32349,     1,    36, 11679,
-    1,    26, 24117,     1,    47, 19118,     2,     7, 35629,    18,
-33070,     1,    17, 49494,     1,    22, 51192,     2,    41,  5460,
-   61, 43197,     1,     0, 60877,     1,    23, 16858,     3,     9,
-18183,    24, 16858,    34, 43180,     2,    39, 58808,    54,  1754,
-    2,    33, 37351,    57, 48169,     2,    13, 36912,    59, 27885,
-    1,    52, 24200,     3,     2, 40673,     8, 17968,    32, 23472,
-    1,    40, 41757,     1,     5, 40168,     1,    21, 56836,     1,
-   45, 39096,     1,    58, 62935,     1,    56, 36614,     1,    20,
-46221,     1,     4, 57645,     3,    28, 56356,    50,  7785,    60,
- 8845,     4,    19, 52485,    38,  3709,    43, 27547,    55, 49177,
+25160,     1,    35, 32349,     1,    36, 11679,     1,    26, 24117,
+    1,    47, 19118,     2,     7, 35629,    18, 33070,     1,    17,
+49494,     1,    22, 51192,     2,    41,  5460,    61, 43197,     1,
+    0, 60877,     1,    23, 16858,     3,     9, 18183,    24, 16858,
+   34, 43180,     2,    39, 58808,    54,  1754,     2,    33, 37351,
+   57, 48169,     2,    13, 36912,    59, 27885,     1,    52, 24200,
+    3,     2, 40673,     8, 17968,    32, 23472,     1,    40, 41757,
+    1,     5, 40168,     2,    21, 56836,    29, 40641,     1,    45,
+39096,     1,    58, 62935,     1,    56, 36614,     1,    20, 46221,
+    1,     4, 57645,     3,    28, 56356,    50,  7785,    60,  8845,
+    4,    19, 52485,    38,  3709,    43, 27547,    55, 49177,
 };
 
-vtkDICOMDictionary::Dict Dict405Data = {
+vtkDICOMDictionary::Dict Dict418Data = {
 "GEHC_CT_ADVAPP_001",
 62,
 62,
-Dict405TagHashTable,
-Dict405KeyHashTable,
-Dict405Contents
+Dict418TagHashTable,
+Dict418KeyHashTable,
+Dict418Contents
 };
 
 // ----- NUD_PRIVATE -----
 
-DictEntry Dict406Contents[] = {
+const DictEntry Dict419Contents[] = {
 { 0x7777, 0x0002, 0, VR::UT, VM::M1, "Interfile" },
 { 0x7777, 0x0005, 0, VR::IS, VM::M1, "" },
 };
 
-unsigned short Dict406TagHashTable[] = {
+const unsigned short Dict419TagHashTable[] = {
     3,     6,     0,     1,     0,     2,     1,     1,     5,
 };
 
-unsigned short Dict406KeyHashTable[] = {
+const unsigned short Dict419KeyHashTable[] = {
     2,     3,     0,     2,     0, 47187,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict406Data = {
+vtkDICOMDictionary::Dict Dict419Data = {
 "NUD_PRIVATE",
 2,
 2,
-Dict406TagHashTable,
-Dict406KeyHashTable,
-Dict406Contents
+Dict419TagHashTable,
+Dict419KeyHashTable,
+Dict419Contents
 };
 
 // ----- astm.org/diconde/iod/NdeCtCalibrationData -----
 
-DictEntry Dict407Contents[] = {
+const DictEntry Dict420Contents[] = {
 { 0x0009, 0x0040, 0, VR::SQ, VM::M1, "DarkCurrentSequence" },
 { 0x0009, 0x0050, 0, VR::OW, VM::M1, "DarkCurrentCounts" },
 { 0x0009, 0x0060, 0, VR::SQ, VM::M1, "GainCorrectionReferenceSequence" },
@@ -24536,7 +25517,7 @@ DictEntry Dict407Contents[] = {
 { 0x0009, 0x0099, 0, VR::LT, VM::M1, "CalibrationNotes" },
 };
 
-unsigned short Dict407TagHashTable[] = {
+const unsigned short Dict420TagHashTable[] = {
    14,    13,    13,    17,    22,    25,    28,    31,    36,    39,
    44,    13,    13,     0,     1,     2,    96,     2,     3,   112,
    12,   153,     1,     4,   113,     1,     5,   114,     1,     6,
@@ -24544,7 +25525,7 @@ unsigned short Dict407TagHashTable[] = {
     9,   118,    11,   128,     2,     1,    80,    10,   119,
 };
 
-unsigned short Dict407KeyHashTable[] = {
+const unsigned short Dict420KeyHashTable[] = {
    14,    19,    22,    13,    25,    30,    35,    13,    38,    43,
    13,    13,    13,     0,     2,     7, 25645,    11, 50357,     1,
     3, 29772,     1,     0, 24037,     2,     2, 48192,     5,  8278,
@@ -24552,45 +25533,45 @@ unsigned short Dict407KeyHashTable[] = {
  9334,    10,  7464,     2,     4, 53052,     9,  5902,
 };
 
-vtkDICOMDictionary::Dict Dict407Data = {
+vtkDICOMDictionary::Dict Dict420Data = {
 "astm.org/diconde/iod/NdeCtCalibrationData",
 13,
 13,
-Dict407TagHashTable,
-Dict407KeyHashTable,
-Dict407Contents
+Dict420TagHashTable,
+Dict420KeyHashTable,
+Dict420Contents
 };
 
 // ----- SPI-P-Private-CWS Release 1 -----
 
-DictEntry Dict408Contents[] = {
+const DictEntry Dict421Contents[] = {
 { 0x0021, 0x0000, 0, VR::LT, VM::M1, "WindowOfImagesID" },
 { 0x0021, 0x0001, 0, VR::CS, VM::M1, "WindowOfImagesType" },
 { 0x0021, 0x0002, 0, VR::IS, VM::M1TN, "WindowOfImagesScope" },
 };
 
-unsigned short Dict408TagHashTable[] = {
+const unsigned short Dict421TagHashTable[] = {
     4,     3,     7,     0,     1,     0,     0,     2,     1,     1,
     2,     2,
 };
 
-unsigned short Dict408KeyHashTable[] = {
+const unsigned short Dict421KeyHashTable[] = {
     3,     3,     4,     0,     3,     0, 12497,     1, 65208,     2,
 51040,
 };
 
-vtkDICOMDictionary::Dict Dict408Data = {
+vtkDICOMDictionary::Dict Dict421Data = {
 "SPI-P-Private-CWS Release 1",
 3,
 3,
-Dict408TagHashTable,
-Dict408KeyHashTable,
-Dict408Contents
+Dict421TagHashTable,
+Dict421KeyHashTable,
+Dict421Contents
 };
 
 // ----- GEMS_SENO_02 -----
 
-DictEntry Dict409Contents[] = {
+const DictEntry Dict422Contents[] = {
 { 0x0045, 0x0004, 0, VR::CS, VM::M1, "AES" },
 { 0x0045, 0x0006, 0, VR::DS, VM::M1, "Angulation" },
 { 0x0045, 0x0009, 0, VR::DS, VM::M1, "RealMagnificationFactor" },
@@ -24654,73 +25635,75 @@ DictEntry Dict409Contents[] = {
 { 0x0045, 0x00A6, 0, VR::UI, VM::M1, "SOPInstanceUIDForLossyCompression" },
 { 0x0045, 0x00A7, 0, VR::LT, VM::M1, "ReconstructionParameters" },
 { 0x0045, 0x00A8, 0, VR::DS, VM::M1, "EntranceDoseIndGyForCompleteDBTSequence" },
+{ 0x0045, 0x00AD, 0, VR::LO, VM::M1TN, "" },
+};
+
+const unsigned short Dict422TagHashTable[] = {
+   65,    64,    68,    64,    64,    64,    64,    64,    71,    74,
+   64,    64,    77,    80,    64,    83,    86,    91,    96,   101,
+  104,   107,   112,   119,    64,   124,   127,   130,   133,   136,
+   64,   139,   142,   149,   156,   161,   166,   173,   178,   185,
+   64,    64,    64,   192,   195,   198,   201,   206,    64,    64,
+   64,    64,   209,    64,    64,   212,   215,   218,   221,   224,
+   64,   227,   230,   233,     0,     1,     0,     4,     1,     1,
+    6,     1,     4,    12,     1,     5,    13,     1,    35,    73,
+    1,     2,     9,     1,     3,    11,     2,     9,    20,    41,
+   85,     2,    10,    21,    40,    84,     2,    11,    22,    43,
+   87,     1,    42,    86,     1,    37,    81,     2,     6,    17,
+   36,    80,     3,     7,    18,    39,    83,    55,   144,     2,
+    8,    19,    38,    82,     1,    13,    29,     1,    14,    30,
+    1,    15,    31,     1,    45,    89,     1,    44,    88,     1,
+   12,    27,     3,    20,    36,    51,   101,    60,   166,     3,
+   21,    37,    50,   100,    61,   167,     2,    22,    38,    59,
+  164,     2,    23,    39,    52,   102,     3,    16,    32,    47,
+   97,    58,   162,     2,    17,    33,    46,    96,     3,    18,
+   34,    49,    99,    56,   160,     3,    19,    35,    48,    98,
+   57,   161,     1,    63,   173,     1,    24,    40,     1,    25,
+   41,     2,    26,    42,    62,   168,     1,    27,    43,     1,
+   53,   113,     1,    54,   114,     1,    31,    60,     1,    32,
+   61,     1,    33,    62,     1,    34,    63,     1,    28,    57,
+    1,    29,    58,     1,    30,    59,
+};
+
+const unsigned short Dict422KeyHashTable[] = {
+   65,    68,    64,    71,    64,    74,    81,    84,    87,    90,
+   93,    64,    96,    64,    99,   102,    64,    64,   105,    64,
+   64,   108,   113,    64,   118,    64,   121,   128,   131,   134,
+  139,   144,   149,   154,   157,    64,   160,   163,   166,   171,
+  176,    64,   179,    64,   182,    64,   185,    64,   192,   195,
+  198,    64,   203,    64,   208,   211,   214,    64,   217,   220,
+  227,   230,    64,    64,     0,     1,    14,  2092,     1,     2,
+26934,     1,    13,  3712,     3,     6, 42766,    27, 20105,    63,
+   84,     1,    54, 39771,     1,    19,   190,     1,    46, 63783,
+    1,    47, 63783,     1,    32, 21408,     1,    29, 19452,     1,
+   62, 52307,     1,    25, 44181,     1,    58, 16673,     2,    57,
+44440,    59, 33457,     2,    18, 48831,    28, 41874,     1,     4,
+52391,     3,     9, 55321,    11, 36206,    23,  6887,     1,    35,
+56906,     1,    22, 46780,     2,    43, 19364,    56, 47940,     2,
+    0,  8002,    53,  7442,     2,    12, 28929,    17, 62639,     2,
+   33, 59491,    50,  9218,     1,    60, 26155,     1,    37, 29117,
+    1,    26, 33043,     1,     8, 60324,     2,    30, 52136,    38,
+21624,     2,    34, 21132,    44, 26066,     1,     5, 11847,     1,
+    7, 37129,     1,    36,   710,     3,     3, 58581,    10, 40279,
+   31, 24949,     1,    20, 19146,     1,    52, 26194,     2,    21,
+57911,    45, 20606,     2,    15,  4917,    39, 55896,     1,    40,
+23141,     1,     1, 58911,     1,    41, 52049,     1,    51,  8027,
+    3,    42, 46789,    55, 47343,    61, 17716,     1,    49, 20018,
+    3,    16, 58686,    24, 17156,    48, 27717,
 };
 
-unsigned short Dict409TagHashTable[] = {
-   64,    67,    63,    72,    63,    63,    63,    63,    63,    75,
-   78,    63,    81,    63,    84,    63,    87,    92,    97,   102,
-  107,   110,   113,   118,   123,   126,   129,   132,   135,   140,
-   63,    63,   143,   148,   153,   156,   163,   170,   177,   182,
-  189,   192,   195,    63,    63,   198,   201,   204,   207,   210,
-   63,    63,   213,    63,    63,   216,    63,   219,   222,   225,
-  228,    63,   231,     0,     1,    29,    58,     2,     0,     4,
-   30,    59,     1,     1,     6,     1,     4,    12,     1,     5,
-   13,     1,    35,    73,     1,     2,     9,     2,     3,    11,
-   41,    85,     2,     9,    20,    40,    84,     2,    10,    21,
-   43,    87,     2,    11,    22,    42,    86,     1,    37,    81,
-    1,    36,    80,     2,     6,    17,    39,    83,     2,     7,
-   18,    38,    82,     1,     8,    19,     1,    55,   144,     1,
-   13,    29,     1,    14,    30,     2,    15,    31,    45,    89,
-    1,    44,    88,     2,    12,    27,    51,   101,     2,    20,
-   36,    50,   100,     1,    21,    37,     3,    22,    38,    52,
-  102,    60,   166,     3,    23,    39,    47,    97,    61,   167,
-    3,    16,    32,    46,    96,    59,   164,     2,    17,    33,
-   49,    99,     3,    18,    34,    48,    98,    58,   162,     1,
-   19,    35,     1,    56,   160,     1,    57,   161,     1,    24,
-   40,     1,    25,    41,     1,    26,    42,     1,    27,    43,
-    1,    62,   168,     1,    53,   113,     1,    54,   114,     1,
-   31,    60,     1,    32,    61,     1,    33,    62,     1,    34,
-   63,     1,    28,    57,
-};
-
-unsigned short Dict409KeyHashTable[] = {
-   64,    63,    63,    63,    63,    67,    63,    70,    73,    63,
-   63,    76,    81,    86,    63,    63,    63,    63,    95,    98,
-   63,   101,    63,   104,   109,   112,   115,   122,   125,    63,
-  128,   131,    63,    63,    63,   138,    63,   143,    63,   152,
-  157,   162,   165,   170,   173,    63,   176,    63,    63,   181,
-  184,   187,   190,    63,   193,   196,    63,   199,   202,   209,
-  218,   223,   226,     0,     1,    37, 38942,     1,    60, 65060,
-    1,    49, 62987,     1,     4, 25136,     2,     0, 55981,    61,
-26320,     2,    13, 62025,    22, 36080,     4,    14,  2125,    16,
-50256,    18, 52727,    23,   755,     1,    54, 15436,     1,    10,
-33637,     1,    20, 63141,     2,    25,  3272,    34, 39152,     1,
-   40, 12066,     1,    17, 33466,     3,     2, 59609,    27,  8981,
-   45, 31336,     1,    39, 21415,     1,    53, 31486,     1,    19,
-26199,     3,    26, 14843,    58, 31501,    62, 53137,     2,    41,
-50795,    52, 26610,     4,     9,  7307,    12,  4422,    33,  2181,
-   57,  7696,     2,    29, 63451,    44, 27520,     2,    31, 61754,
-   48, 18795,     1,     1, 42162,     2,    28, 16532,    59, 39189,
-    1,    11, 55505,     1,    56, 58063,     2,     6, 63209,    24,
- 2865,     1,    38,  5323,     1,     5, 41162,     1,    36, 24647,
-    1,    43, 19671,     1,    30, 39440,     1,    50, 21847,     1,
-   51, 26879,     3,     3, 15820,     8, 11349,    46, 29426,     4,
-    7, 16913,    15, 21639,    21, 38025,    47, 29426,     2,    32,
-17586,    42,  3841,     1,    35, 63010,     1,    55,  1283,
-};
-
-vtkDICOMDictionary::Dict Dict409Data = {
-"GEMS_SENO_02",
-63,
-63,
-Dict409TagHashTable,
-Dict409KeyHashTable,
-Dict409Contents
+vtkDICOMDictionary::Dict Dict422Data = {
+"GEMS_SENO_02",
+64,
+64,
+Dict422TagHashTable,
+Dict422KeyHashTable,
+Dict422Contents
 };
 
 // ----- BioPri3D -----
 
-DictEntry Dict410Contents[] = {
+const DictEntry Dict423Contents[] = {
 { 0x0011, 0x0020, 0, VR::UL, VM::M1, "" },
 { 0x0011, 0x0024, 0, VR::DS, VM::M1TN, "" },
 { 0x0011, 0x0030, 0, VR::LO, VM::M1, "" },
@@ -24741,7 +25724,7 @@ DictEntry Dict410Contents[] = {
 { 0x0063, 0x0035, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict410TagHashTable[] = {
+const unsigned short Dict423TagHashTable[] = {
    18,    18,    19,    18,    22,    18,    25,    28,    33,    36,
    18,    18,    39,    44,    51,    56,    18,    61,     0,     1,
    14,    12,     1,     5,    57,     1,    10,   226,     2,     6,
@@ -24751,7 +25734,7 @@ unsigned short Dict410TagHashTable[] = {
    53,     2,     1,    36,     4,    50,
 };
 
-unsigned short Dict410KeyHashTable[] = {
+const unsigned short Dict423KeyHashTable[] = {
    18,    18,    18,    18,    18,    18,    18,    18,    18,    18,
    18,    18,    18,    18,    18,    18,    18,    19,     0,    18,
     0,   298,     1,   298,     2,   298,     3,   298,     4,   298,
@@ -24760,42 +25743,42 @@ unsigned short Dict410KeyHashTable[] = {
    15,   298,    16,   298,    17,   298,
 };
 
-vtkDICOMDictionary::Dict Dict410Data = {
+vtkDICOMDictionary::Dict Dict423Data = {
 "BioPri3D",
 18,
 18,
-Dict410TagHashTable,
-Dict410KeyHashTable,
-Dict410Contents
+Dict423TagHashTable,
+Dict423KeyHashTable,
+Dict423Contents
 };
 
 // ----- TOSHIBA_SR -----
 
-DictEntry Dict411Contents[] = {
+const DictEntry Dict424Contents[] = {
 { 0x7015, 0x0010, 0, VR::OB, VM::M1, "" },
 { 0x7015, 0x0060, 0, VR::OB, VM::M1, "" },
 };
 
-unsigned short Dict411TagHashTable[] = {
+const unsigned short Dict424TagHashTable[] = {
     3,     6,     0,     1,     1,    96,     1,     0,    16,
 };
 
-unsigned short Dict411KeyHashTable[] = {
+const unsigned short Dict424KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict411Data = {
+vtkDICOMDictionary::Dict Dict424Data = {
 "TOSHIBA_SR",
 2,
 2,
-Dict411TagHashTable,
-Dict411KeyHashTable,
-Dict411Contents
+Dict424TagHashTable,
+Dict424KeyHashTable,
+Dict424Contents
 };
 
 // ----- DIDI TO PCR 1.1 -----
 
-DictEntry Dict412Contents[] = {
+const DictEntry Dict425Contents[] = {
 { 0x0019, 0x0022, 0, VR::LO, VM::M1, "RouteAET" },
 { 0x0019, 0x0023, 0, VR::DS, VM::M1, "PCRPrintScale" },
 { 0x0019, 0x0024, 0, VR::ST, VM::M1, "PCRPrintJobEnd" },
@@ -24840,7 +25823,7 @@ DictEntry Dict412Contents[] = {
 { 0x0089, 0x0010, 0, VR::SQ, VM::M1, "StampImageSequence" },
 };
 
-unsigned short Dict412TagHashTable[] = {
+const unsigned short Dict425TagHashTable[] = {
    43,    46,    49,    52,    42,    55,    58,    61,    64,    67,
    70,    73,    78,    83,    88,    91,    94,    99,   104,   111,
   118,   127,   134,   139,   144,   147,    42,    42,    42,   150,
@@ -24859,7 +25842,7 @@ unsigned short Dict412TagHashTable[] = {
     1,    41,    16,
 };
 
-unsigned short Dict412KeyHashTable[] = {
+const unsigned short Dict425KeyHashTable[] = {
    42,    42,    43,    48,    53,    42,    58,    42,    42,    42,
    42,    61,    64,    42,    69,    72,    42,    42,    75,    78,
    42,    81,    84,    89,    96,    42,    42,    42,    99,    42,
@@ -24878,45 +25861,45 @@ unsigned short Dict412KeyHashTable[] = {
     7,   759,
 };
 
-vtkDICOMDictionary::Dict Dict412Data = {
+vtkDICOMDictionary::Dict Dict425Data = {
 "DIDI TO PCR 1.1",
 42,
 42,
-Dict412TagHashTable,
-Dict412KeyHashTable,
-Dict412Contents
+Dict425TagHashTable,
+Dict425KeyHashTable,
+Dict425Contents
 };
 
 // ----- SIEMENS MEDCOM OOG -----
 
-DictEntry Dict413Contents[] = {
+const DictEntry Dict426Contents[] = {
 { 0x0029, 0x0008, 0, VR::CS, VM::M1, "MedComOOGType" },
 { 0x0029, 0x0009, 0, VR::LO, VM::M1, "MedComOOGVersion" },
 { 0x0029, 0x0010, 0, VR::OB, VM::M1, "MedComOOGInfo" },
 };
 
-unsigned short Dict413TagHashTable[] = {
+const unsigned short Dict426TagHashTable[] = {
     4,     3,     9,     0,     2,     0,     8,     2,    16,     1,
     1,     9,
 };
 
-unsigned short Dict413KeyHashTable[] = {
+const unsigned short Dict426KeyHashTable[] = {
     4,     7,    10,     0,     1,     0, 36427,     1,     2, 31630,
     1,     1, 38561,
 };
 
-vtkDICOMDictionary::Dict Dict413Data = {
+vtkDICOMDictionary::Dict Dict426Data = {
 "SIEMENS MEDCOM OOG",
 3,
 3,
-Dict413TagHashTable,
-Dict413KeyHashTable,
-Dict413Contents
+Dict426TagHashTable,
+Dict426KeyHashTable,
+Dict426Contents
 };
 
 // ----- astm.org/diconde/iod/NdeDxDetector -----
 
-DictEntry Dict414Contents[] = {
+const DictEntry Dict427Contents[] = {
 { 0x0009, 0x0011, 0, VR::DS, VM::M1, "InternalDetectorFrameTime" },
 { 0x0009, 0x0012, 0, VR::DS, VM::M1, "NumberOfFramesIntegrated" },
 { 0x0009, 0x0020, 0, VR::SQ, VM::M1, "DetectorTemperatureSequence" },
@@ -24926,30 +25909,30 @@ DictEntry Dict414Contents[] = {
 { 0x0009, 0x0028, 0, VR::DS, VM::M1, "SensorTemperature" },
 };
 
-unsigned short Dict414TagHashTable[] = {
+const unsigned short Dict427TagHashTable[] = {
     7,     8,     7,    11,     7,    16,    21,     0,     1,     3,
    34,     2,     0,    17,     4,    36,     2,     5,    38,     6,
    40,     2,     1,    18,     2,    32,
 };
 
-unsigned short Dict414KeyHashTable[] = {
+const unsigned short Dict427KeyHashTable[] = {
     8,     7,    13,    16,     7,    19,    24,     0,     2,     0,
 20186,     6, 21387,     1,     3, 20978,     1,     5, 52094,     2,
     1, 53765,     2,  8567,     1,     4,  7561,
 };
 
-vtkDICOMDictionary::Dict Dict414Data = {
+vtkDICOMDictionary::Dict Dict427Data = {
 "astm.org/diconde/iod/NdeDxDetector",
 7,
 7,
-Dict414TagHashTable,
-Dict414KeyHashTable,
-Dict414Contents
+Dict427TagHashTable,
+Dict427KeyHashTable,
+Dict427Contents
 };
 
 // ----- PMTF INFORMATION DATA -----
 
-DictEntry Dict415Contents[] = {
+const DictEntry Dict428Contents[] = {
 { 0x0029, 0x0001, 0, VR::SQ, VM::M1, "" },
 { 0x0029, 0x0031, 0, VR::LO, VM::M1, "PMTFInformation1" },
 { 0x0029, 0x0032, 0, VR::UL, VM::M1, "PMTFInformation2" },
@@ -24960,30 +25943,30 @@ DictEntry Dict415Contents[] = {
 { 0x7015, 0x0073, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict415TagHashTable[] = {
+const unsigned short Dict428TagHashTable[] = {
     9,     8,    14,    19,     8,    24,     8,    27,     0,     2,
     0,     1,     1,    49,     2,     3,    51,     5,   137,     2,
     2,    50,     6,   144,     1,     4,    52,     1,     7,   115,
 };
 
-unsigned short Dict415KeyHashTable[] = {
+const unsigned short Dict428KeyHashTable[] = {
     8,     8,     8,     9,    12,    15,    26,     8,     0,     1,
     1,  6778,     1,     2,  6778,     5,     0,   672,     3,  6778,
     5,   672,     6,   672,     7,   672,     1,     4,  6778,
 };
 
-vtkDICOMDictionary::Dict Dict415Data = {
+vtkDICOMDictionary::Dict Dict428Data = {
 "PMTF INFORMATION DATA",
 8,
 8,
-Dict415TagHashTable,
-Dict415KeyHashTable,
-Dict415Contents
+Dict428TagHashTable,
+Dict428KeyHashTable,
+Dict428Contents
 };
 
 // ----- SIEMENS MED DISPLAY -----
 
-DictEntry Dict416Contents[] = {
+const DictEntry Dict429Contents[] = {
 { 0x0029, 0x0004, 0, VR::CS, VM::M1, "PhotometricInterpretation" },
 { 0x0029, 0x0010, 0, VR::US, VM::M1, "RowsOfSubmatrix" },
 { 0x0029, 0x0011, 0, VR::US, VM::M1, "ColumnsOfSubmatrix" },
@@ -25000,7 +25983,7 @@ DictEntry Dict416Contents[] = {
 { 0x0029, 0x00c1, 0, VR::US, VM::M1, "ContourOfIrregularShutter" },
 };
 
-unsigned short Dict416TagHashTable[] = {
+const unsigned short Dict429TagHashTable[] = {
    15,    18,    14,    23,    14,    14,    14,    14,    28,    33,
    36,    39,    44,    47,     0,     1,     2,    17,     2,     1,
    16,    11,   176,     2,     0,     4,     6,   128,     2,     4,
@@ -25009,7 +25992,7 @@ unsigned short Dict416TagHashTable[] = {
    12,   178,
 };
 
-unsigned short Dict416KeyHashTable[] = {
+const unsigned short Dict429KeyHashTable[] = {
    15,    14,    18,    14,    14,    23,    32,    37,    40,    14,
    45,    14,    14,    48,     0,     1,     1, 50526,     2,     2,
 14292,     9, 23104,     4,     0,  5445,     3,   384,     4,   384,
@@ -25018,41 +26001,41 @@ unsigned short Dict416KeyHashTable[] = {
 20118,
 };
 
-vtkDICOMDictionary::Dict Dict416Data = {
+vtkDICOMDictionary::Dict Dict429Data = {
 "SIEMENS MED DISPLAY",
 14,
 14,
-Dict416TagHashTable,
-Dict416KeyHashTable,
-Dict416Contents
+Dict429TagHashTable,
+Dict429KeyHashTable,
+Dict429Contents
 };
 
 // ----- MITRA LINKED ATTRIBUTES 1.0 -----
 
-DictEntry Dict417Contents[] = {
-{ 0x0031, 0x0020, 0, VR::IS, VM::M1, "" },
+const DictEntry Dict430Contents[] = {
+{ 0x0031, 0x0020, 0, VR::LO, VM::M1, "GlobalPatientID" },
 };
 
-unsigned short Dict417TagHashTable[] = {
+const unsigned short Dict430TagHashTable[] = {
     2,     0,     1,     0,    32,
 };
 
-unsigned short Dict417KeyHashTable[] = {
-    2,     0,     1,     0,  5381,
+const unsigned short Dict430KeyHashTable[] = {
+    2,     0,     1,     0, 55096,
 };
 
-vtkDICOMDictionary::Dict Dict417Data = {
+vtkDICOMDictionary::Dict Dict430Data = {
 "MITRA LINKED ATTRIBUTES 1.0",
 1,
 1,
-Dict417TagHashTable,
-Dict417KeyHashTable,
-Dict417Contents
+Dict430TagHashTable,
+Dict430KeyHashTable,
+Dict430Contents
 };
 
 // ----- BRIT Systems, Inc. -----
 
-DictEntry Dict418Contents[] = {
+const DictEntry Dict431Contents[] = {
 { 0x0021, 0x0000, 0, VR::SQ, VM::M1, "PersonInformationSequence" },
 { 0x0021, 0x0001, 0, VR::LO, VM::M1, "PersonID" },
 { 0x0021, 0x0002, 0, VR::PN, VM::M1, "PersonName" },
@@ -25104,65 +26087,79 @@ DictEntry Dict418Contents[] = {
 { 0x0021, 0x00a6, 0, VR::SH, VM::M1, "LocalIPAddress" },
 { 0x0021, 0x00a7, 0, VR::AE, VM::M1, "RemoteAETitle" },
 { 0x0021, 0x00a8, 0, VR::SH, VM::M1, "RemoteIPAddress" },
-};
-
-unsigned short Dict418TagHashTable[] = {
-   52,    57,    62,    67,    72,    77,    82,    87,    51,    90,
-   93,    96,    51,    51,    51,    51,    99,   102,   105,   108,
-   51,   111,    51,   114,   117,   120,   123,   128,   131,   134,
-  137,   140,   143,   148,   151,   154,   157,   160,   165,   168,
-  171,   174,   177,   180,   183,   186,    51,    51,   189,    51,
-  192,     0,     2,    15,    18,    25,    33,     2,    18,    21,
-   24,    32,     2,    17,    20,    27,    35,     2,    20,    23,
-   26,    34,     2,    19,    22,    29,    37,     2,    22,    25,
-   28,    36,     2,    21,    24,    31,    39,     1,    30,    38,
-    1,    32,    40,     1,    38,    80,     1,    23,    31,     1,
-   34,    49,     1,    33,    48,     1,    36,    51,     1,    35,
-   50,     1,    37,    52,     1,    42,   147,     1,    41,   146,
-    1,    40,   145,     2,    39,   144,    46,   163,     1,    45,
+{ 0x0021, 0x00b0, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b1, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b2, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b3, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b4, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b5, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b6, 0, VR::ST, VM::M1, "" },
+{ 0x0021, 0x00b7, 0, VR::ST, VM::M1, "" },
+};
+
+const unsigned short Dict431TagHashTable[] = {
+   60,    65,    70,    75,    80,    83,    86,    89,    59,    92,
+   95,    98,   101,   104,   107,   110,   113,   118,   121,   124,
+   59,   127,    59,    59,    59,    59,   132,   135,   138,   141,
+  144,   147,   150,   155,   160,   163,   166,   169,   172,   175,
+  178,   181,   184,   187,   190,   193,    59,    59,   196,    59,
+  199,   202,   205,   208,   213,   216,   219,   222,   225,     0,
+    2,    25,    33,    41,   146,     2,    24,    32,    40,   145,
+    2,    27,    35,    39,   144,     2,    23,    31,    26,    34,
+    1,    29,    37,     1,    28,    36,     1,    31,    39,     1,
+   30,    38,     1,    32,    40,     1,    46,   163,     1,    45,
   162,     1,    44,   161,     1,    43,   160,     1,    49,   167,
-    1,    48,   166,     2,     1,     1,    47,   165,     1,     0,
-    0,     1,     3,     3,     1,     2,     2,     1,     5,     5,
-    2,     4,     4,    50,   168,     1,     7,     7,     1,     6,
-    6,     1,     9,     9,     1,     8,     8,     1,    11,    11,
-    1,    10,    10,     1,    13,    13,     1,    12,    12,     1,
-   14,    17,     1,    16,    19,
-};
-
-unsigned short Dict418KeyHashTable[] = {
-   51,    52,    61,    51,    51,    64,    51,    69,    72,    77,
-   51,    80,    51,    85,    90,    93,    96,    51,    51,    99,
-  102,   107,   110,    51,    51,    51,   113,   118,   121,   128,
-  135,   140,   143,   148,   151,   154,   157,   160,    51,   163,
-   51,   166,    51,    51,    51,    51,   171,    51,    51,   178,
-  181,     0,     4,    14, 60697,    25,  4552,    30, 50815,    34,
-34219,     1,    36,   505,     2,    13,  2775,    29, 56087,     1,
-   50, 52531,     2,    38, 52685,    43, 46825,     1,    31, 59379,
-    2,     0, 39376,    24, 28400,     2,     5, 44580,    45, 14249,
-    1,     1, 17497,     1,    21, 16123,     1,    23, 63827,     1,
-   37, 22778,     2,    41,  2102,    47,  8748,     1,    35, 42553,
-    1,    42, 58920,     2,    22, 32886,    44,  7328,     1,    19,
- 4931,     3,    11, 46497,    28, 27925,    33, 11878,     3,    12,
- 7048,    16, 33669,    26, 32713,     2,    27,  2954,    49,  1913,
-    1,    18, 15968,     2,     8, 43799,    32, 29666,     1,     6,
-60759,     1,     4, 59023,     1,     3, 48713,     1,    39, 36005,
-    1,     9, 25605,     1,    48, 34808,     2,     2, 45596,    20,
- 4826,     3,    15, 53940,    40, 25388,    46, 25689,     1,    17,
-18107,     2,     7, 46785,    10, 48368,
+    1,    48,   166,     2,    34,    49,    47,   165,     1,    33,
+   48,     1,    36,    51,     1,    35,    50,     2,    37,    52,
+   50,   168,     1,    54,   179,     1,    53,   178,     1,    52,
+  177,     1,    51,   176,     1,    58,   183,     1,    57,   182,
+    2,     1,     1,    56,   181,     2,     0,     0,    55,   180,
+    1,     3,     3,     1,     2,     2,     1,     5,     5,     1,
+    4,     4,     1,     7,     7,     1,     6,     6,     1,     9,
+    9,     1,     8,     8,     1,    11,    11,     1,    10,    10,
+    1,    13,    13,     1,    12,    12,     1,    14,    17,     1,
+   16,    19,     1,    15,    18,     1,    18,    21,     2,    17,
+   20,    38,    80,     1,    20,    23,     1,    19,    22,     1,
+   22,    25,     1,    21,    24,     1,    42,   147,
+};
+
+const unsigned short Dict431KeyHashTable[] = {
+   59,    60,    65,    59,    59,    68,    59,    73,    78,    81,
+   88,    91,    96,    59,   113,    59,    59,    59,   116,   121,
+  124,   127,   130,    59,   133,   138,    59,   143,    59,   146,
+  149,   152,   155,    59,   158,   161,    59,   164,    59,   169,
+  172,   175,   180,    59,    59,    59,    59,    59,   185,   188,
+  191,   194,    59,   197,   200,   203,   208,   211,    59,     0,
+    2,     4, 53242,    13, 56827,     1,    37, 38573,     2,     0,
+44034,    18, 40462,     2,    10, 28481,    47, 43107,     1,    49,
+11651,     3,    30, 27263,    45, 12317,    50, 40965,     1,    36,
+32649,     2,     3, 23225,     9,  9915,     8,    51,    91,    52,
+   91,    53,    91,    54,    91,    55,    91,    56,    91,    57,
+   91,    58,    91,     1,    21, 38374,     2,    15, 34408,    23,
+47397,     1,    39, 12240,     1,    44, 54098,     1,    22, 48421,
+    1,    42,  9832,     2,    28, 47465,    34, 48462,     2,     7,
+23780,    19, 16481,     1,    41, 16257,     1,    43, 12706,     1,
+    6, 60296,     1,    46, 22206,     1,    40, 10838,     1,    12,
+52745,     1,     1, 46226,     2,    17,  5655,    24, 63426,     1,
+   33,  1381,     1,    25, 65027,     2,     8, 37860,    29, 25155,
+    2,    38, 28879,    48, 31199,     1,    35, 50112,     1,    27,
+53649,     1,    32, 46748,     1,    14, 22475,     1,    20, 16390,
+    1,    16, 55762,     2,     2, 20530,    31, 20225,     1,    11,
+64629,     2,     5,   768,    26, 42717,
 };
 
-vtkDICOMDictionary::Dict Dict418Data = {
+vtkDICOMDictionary::Dict Dict431Data = {
 "BRIT Systems, Inc.",
-51,
-51,
-Dict418TagHashTable,
-Dict418KeyHashTable,
-Dict418Contents
+59,
+59,
+Dict431TagHashTable,
+Dict431KeyHashTable,
+Dict431Contents
 };
 
 // ----- SIEMENS CT VA0  RAW -----
 
-DictEntry Dict419Contents[] = {
+const DictEntry Dict432Contents[] = {
 { 0x0021, 0x0010, 0, VR::UL, VM::M2, "CreationMask" },
 { 0x0021, 0x0020, 0, VR::UL, VM::M2, "EvaluationMask" },
 { 0x0021, 0x0030, 0, VR::US, VM::M7, "ExtendedProcessingMask" },
@@ -25174,59 +26171,59 @@ DictEntry Dict419Contents[] = {
 { 0x0021, 0x0050, 0, VR::CS, VM::M1, "" },
 };
 
-unsigned short Dict419TagHashTable[] = {
+const unsigned short Dict432TagHashTable[] = {
    10,    13,     9,     9,    18,     9,    23,    26,    29,     0,
     1,     6,    67,     2,     1,    32,     7,    68,     2,     0,
    16,     8,    80,     1,     3,    64,     1,     4,    65,     2,
     2,    48,     5,    66,
 };
 
-unsigned short Dict419KeyHashTable[] = {
+const unsigned short Dict432KeyHashTable[] = {
    10,    13,     9,    16,     9,     9,     9,     9,    19,     0,
     1,     1,  2209,     1,     0, 17597,     1,     2, 37852,     6,
     3,   597,     4,   597,     5,   597,     6,   597,     7,   597,
     8,   597,
 };
 
-vtkDICOMDictionary::Dict Dict419Data = {
+vtkDICOMDictionary::Dict Dict432Data = {
 "SIEMENS CT VA0  RAW",
 9,
 9,
-Dict419TagHashTable,
-Dict419KeyHashTable,
-Dict419Contents
+Dict432TagHashTable,
+Dict432KeyHashTable,
+Dict432Contents
 };
 
 // ----- SPI-P Release 2;1 -----
 
-DictEntry Dict420Contents[] = {
+const DictEntry Dict433Contents[] = {
 { 0x0011, 0x0018, 0, VR::LT, VM::M1, "" },
 { 0x0023, 0x000d, 0, VR::UI, VM::M1, "" },
 { 0x0023, 0x000e, 0, VR::UI, VM::M1, "" },
 };
 
-unsigned short Dict420TagHashTable[] = {
+const unsigned short Dict433TagHashTable[] = {
     4,     9,     3,     0,     2,     0,    24,     2,    14,     1,
     1,    13,
 };
 
-unsigned short Dict420KeyHashTable[] = {
+const unsigned short Dict433KeyHashTable[] = {
     3,     3,     4,     0,     3,     0,  1793,     1,  1793,     2,
  1793,
 };
 
-vtkDICOMDictionary::Dict Dict420Data = {
+vtkDICOMDictionary::Dict Dict433Data = {
 "SPI-P Release 2;1",
 3,
 3,
-Dict420TagHashTable,
-Dict420KeyHashTable,
-Dict420Contents
+Dict433TagHashTable,
+Dict433KeyHashTable,
+Dict433Contents
 };
 
 // ----- SPI RELEASE 1 -----
 
-DictEntry Dict421Contents[] = {
+const DictEntry Dict434Contents[] = {
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "Comments" },
 { 0x0009, 0x0015, 0, VR::LO, VM::M1, "UID" },
 { 0x0009, 0x0040, 0, VR::US, VM::M1, "DataObjectType" },
@@ -25237,100 +26234,124 @@ DictEntry Dict421Contents[] = {
 { 0x0029, 0x0060, 0, VR::LO, VM::M1, "CompressionAlgorithm" },
 };
 
-unsigned short Dict421TagHashTable[] = {
+const unsigned short Dict434TagHashTable[] = {
     9,    14,     8,     8,    23,     8,     8,     8,     0,     2,
     2,    64,     7,    96,     4,     0,    16,     3,    65,     4,
    16,     6,    32,     2,     1,    21,     5,    21,
 };
 
-unsigned short Dict421KeyHashTable[] = {
+const unsigned short Dict434KeyHashTable[] = {
     9,     8,    12,    15,    18,     8,    23,    26,     0,     1,
     2, 24415,     1,     3, 55708,     1,     0, 52021,     2,     4,
 39623,     6, 29229,     1,     7, 57071,     2,     1,  1220,     5,
 21898,
 };
 
-vtkDICOMDictionary::Dict Dict421Data = {
+vtkDICOMDictionary::Dict Dict434Data = {
 "SPI RELEASE 1",
 8,
 8,
-Dict421TagHashTable,
-Dict421KeyHashTable,
-Dict421Contents
+Dict434TagHashTable,
+Dict434KeyHashTable,
+Dict434Contents
 };
 
 // ----- SIEMENS MI RWVM SUV -----
 
-DictEntry Dict422Contents[] = {
+const DictEntry Dict435Contents[] = {
 { 0x0041, 0x0001, 0, VR::CS, VM::M1, "SUVDecayCorrectionMethod" },
 };
 
-unsigned short Dict422TagHashTable[] = {
+const unsigned short Dict435TagHashTable[] = {
     2,     0,     1,     0,     1,
 };
 
-unsigned short Dict422KeyHashTable[] = {
+const unsigned short Dict435KeyHashTable[] = {
     2,     0,     1,     0, 19490,
 };
 
-vtkDICOMDictionary::Dict Dict422Data = {
+vtkDICOMDictionary::Dict Dict435Data = {
 "SIEMENS MI RWVM SUV",
 1,
 1,
-Dict422TagHashTable,
-Dict422KeyHashTable,
-Dict422Contents
+Dict435TagHashTable,
+Dict435KeyHashTable,
+Dict435Contents
 };
 
 // ----- MeVis eD: Slice Information -----
 
-DictEntry Dict423Contents[] = {
+const DictEntry Dict436Contents[] = {
 { 0x0021, 0x0010, 0, VR::UI, VM::M1TN, "SliceSOPInstanceUIDs" },
 };
 
-unsigned short Dict423TagHashTable[] = {
+const unsigned short Dict436TagHashTable[] = {
     2,     0,     1,     0,    16,
 };
 
-unsigned short Dict423KeyHashTable[] = {
+const unsigned short Dict436KeyHashTable[] = {
     2,     0,     1,     0, 16081,
 };
 
-vtkDICOMDictionary::Dict Dict423Data = {
+vtkDICOMDictionary::Dict Dict436Data = {
 "MeVis eD: Slice Information",
 1,
 1,
-Dict423TagHashTable,
-Dict423KeyHashTable,
-Dict423Contents
+Dict436TagHashTable,
+Dict436KeyHashTable,
+Dict436Contents
 };
 
-// ----- Silhouette Graphics Export V1.0 -----
+// ----- AGFA PACS Archive Mirroring 1.0 -----
 
-DictEntry Dict424Contents[] = {
-{ 0x0029, 0x0000, 0, VR::UI, VM::M1, "" },
+const DictEntry Dict437Contents[] = {
+{ 0x0031, 0x0000, 0, VR::CS, VM::M1, "StudyStatus" },
+{ 0x0031, 0x0001, 0, VR::UL, VM::M1, "DateTimeVerified" },
 };
 
-unsigned short Dict424TagHashTable[] = {
-    2,     0,     1,     0,     0,
+const unsigned short Dict437TagHashTable[] = {
+    3,     6,     0,     1,     1,     1,     1,     0,     0,
 };
 
-unsigned short Dict424KeyHashTable[] = {
-    2,     0,     1,     0,  5381,
+const unsigned short Dict437KeyHashTable[] = {
+    3,     2,     0,     2,     0,  9201,     1, 56416,
 };
 
-vtkDICOMDictionary::Dict Dict424Data = {
-"Silhouette Graphics Export V1.0",
+vtkDICOMDictionary::Dict Dict437Data = {
+"AGFA PACS Archive Mirroring 1.0",
+2,
+2,
+Dict437TagHashTable,
+Dict437KeyHashTable,
+Dict437Contents
+};
+
+// ----- Brainlab-S23-ProjectiveFusion -----
+
+const DictEntry Dict438Contents[] = {
+{ 0x0073, 0x0010, 0, VR::SQ, VM::M1, "ProjectiveRegistrationSequence" },
+};
+
+const unsigned short Dict438TagHashTable[] = {
+    2,     0,     1,     0,    16,
+};
+
+const unsigned short Dict438KeyHashTable[] = {
+    2,     0,     1,     0, 58996,
+};
+
+vtkDICOMDictionary::Dict Dict438Data = {
+"Brainlab-S23-ProjectiveFusion",
 1,
 1,
-Dict424TagHashTable,
-Dict424KeyHashTable,
-Dict424Contents
+Dict438TagHashTable,
+Dict438KeyHashTable,
+Dict438Contents
 };
 
 // ----- SPI-P Release 1;3 -----
 
-DictEntry Dict425Contents[] = {
+const DictEntry Dict439Contents[] = {
 { 0x0029, 0x0000, 0, VR::LT, VM::M1, "ImageEnhancementID" },
 { 0x0029, 0x0001, 0, VR::LT, VM::M1, "ImageEnhancement" },
 { 0x0029, 0x0002, 0, VR::LT, VM::M1, "ConvolutionID" },
@@ -25343,32 +26364,32 @@ DictEntry Dict425Contents[] = {
 { 0x0029, 0x001f, 0, VR::CS, VM::M1, "ImageEnhancementSelectStatus" },
 };
 
-unsigned short Dict425TagHashTable[] = {
+const unsigned short Dict439TagHashTable[] = {
    11,    14,    17,    20,    23,    28,    10,    33,    10,    10,
     0,     1,     1,     1,     1,     0,     0,     1,     3,     3,
     1,     2,     2,     2,     5,     5,     9,    31,     2,     4,
     4,     8,    30,     2,     6,     6,     7,    12,
 };
 
-unsigned short Dict425KeyHashTable[] = {
+const unsigned short Dict439KeyHashTable[] = {
    11,    16,    19,    10,    10,    10,    10,    10,    10,    28,
     0,     2,     1, 41307,     4, 35963,     1,     8, 23628,     4,
     2, 31800,     6, 16426,     7, 14052,     9, 58824,     3,     0,
 38981,     3,  7555,     5,  1404,
 };
 
-vtkDICOMDictionary::Dict Dict425Data = {
+vtkDICOMDictionary::Dict Dict439Data = {
 "SPI-P Release 1;3",
 10,
 10,
-Dict425TagHashTable,
-Dict425KeyHashTable,
-Dict425Contents
+Dict439TagHashTable,
+Dict439KeyHashTable,
+Dict439Contents
 };
 
 // ----- SPI-P Release 1;2 -----
 
-DictEntry Dict426Contents[] = {
+const DictEntry Dict440Contents[] = {
 { 0x0029, 0x0000, 0, VR::LT, VM::M1, "SubtractionMaskID" },
 { 0x0029, 0x0004, 0, VR::UN, VM::M1, "MaskingFunction" },
 { 0x0029, 0x000c, 0, VR::UN, VM::M1, "ProprietaryMaskingParameters" },
@@ -25376,28 +26397,28 @@ DictEntry Dict426Contents[] = {
 { 0x0029, 0x001f, 0, VR::CS, VM::M1, "SubtractionMaskSelectStatus" },
 };
 
-unsigned short Dict426TagHashTable[] = {
+const unsigned short Dict440TagHashTable[] = {
     6,    11,    14,     5,    17,     0,     2,     1,     4,     3,
    30,     1,     0,     0,     1,     2,    12,     1,     4,    31,
 };
 
-unsigned short Dict426KeyHashTable[] = {
+const unsigned short Dict440KeyHashTable[] = {
     6,     9,    12,     5,    15,     0,     1,     3,  1026,     1,
     4,  5882,     1,     2,  7098,     2,     0, 22248,     1, 24029,
 };
 
-vtkDICOMDictionary::Dict Dict426Data = {
+vtkDICOMDictionary::Dict Dict440Data = {
 "SPI-P Release 1;2",
 5,
 5,
-Dict426TagHashTable,
-Dict426KeyHashTable,
-Dict426Contents
+Dict440TagHashTable,
+Dict440KeyHashTable,
+Dict440Contents
 };
 
 // ----- SPI-P Release 1;1 -----
 
-DictEntry Dict427Contents[] = {
+const DictEntry Dict441Contents[] = {
 { 0x0009, 0x00c0, 0, VR::LT, VM::M1, "" },
 { 0x0009, 0x00c1, 0, VR::LT, VM::M1, "" },
 { 0x0019, 0x0000, 0, VR::UN, VM::M1, "PhysiologicalDataType" },
@@ -25436,7 +26457,7 @@ DictEntry Dict427Contents[] = {
 { 0x0029, 0x004f, 0, VR::CS, VM::M1, "MagnifyingGlassSelectStatus" },
 };
 
-unsigned short Dict427TagHashTable[] = {
+const unsigned short Dict441TagHashTable[] = {
    37,    42,    45,    48,    53,    56,    59,    36,    62,    65,
    70,    73,    76,    79,    82,    85,    88,    91,    36,    94,
    36,    36,    97,   100,   103,   106,   109,   112,   115,   118,
@@ -25453,7 +26474,7 @@ unsigned short Dict427TagHashTable[] = {
    79,     1,    30,    64,     1,    31,    65,     1,    32,    67,
 };
 
-unsigned short Dict427KeyHashTable[] = {
+const unsigned short Dict441KeyHashTable[] = {
    37,    36,    44,    53,    36,    56,    59,    66,    69,    36,
    72,    36,    75,    78,    36,    83,    86,    89,    36,    96,
    36,   103,    36,    36,   106,   109,    36,    36,   112,    36,
@@ -25470,18 +26491,18 @@ unsigned short Dict427KeyHashTable[] = {
    21, 43250,
 };
 
-vtkDICOMDictionary::Dict Dict427Data = {
+vtkDICOMDictionary::Dict Dict441Data = {
 "SPI-P Release 1;1",
 36,
 36,
-Dict427TagHashTable,
-Dict427KeyHashTable,
-Dict427Contents
+Dict441TagHashTable,
+Dict441KeyHashTable,
+Dict441Contents
 };
 
 // ----- SPI-P-PCR Release 2 -----
 
-DictEntry Dict428Contents[] = {
+const DictEntry Dict442Contents[] = {
 { 0x0019, 0x0010, 0, VR::US, VM::M1, "" },
 { 0x0019, 0x0020, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0021, 0, VR::LO, VM::M1, "" },
@@ -25517,7 +26538,7 @@ DictEntry Dict428Contents[] = {
 { 0x0019, 0x00ba, 0, VR::ST, VM::M1, "" },
 };
 
-unsigned short Dict428TagHashTable[] = {
+const unsigned short Dict442TagHashTable[] = {
    33,    33,    33,    34,    37,    40,    43,    46,    51,    56,
    61,    64,    67,    70,    73,    76,    79,    82,    85,    88,
    33,    91,    96,    99,   106,   111,   114,    33,    33,   117,
@@ -25533,7 +26554,7 @@ unsigned short Dict428TagHashTable[] = {
     1,    31,   185,     1,    30,   184,
 };
 
-unsigned short Dict428KeyHashTable[] = {
+const unsigned short Dict442KeyHashTable[] = {
    33,    33,    34,    33,    33,    33,    33,    33,    33,    33,
    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
    33,    33,    33,    33,    33,    33,    33,    33,    33,    33,
@@ -25547,46 +26568,46 @@ unsigned short Dict428KeyHashTable[] = {
   163,
 };
 
-vtkDICOMDictionary::Dict Dict428Data = {
+vtkDICOMDictionary::Dict Dict442Data = {
 "SPI-P-PCR Release 2",
 33,
 33,
-Dict428TagHashTable,
-Dict428KeyHashTable,
-Dict428Contents
+Dict442TagHashTable,
+Dict442KeyHashTable,
+Dict442Contents
 };
 
 // ----- SIEMENS MR PHOENIX ATTRIBUTES -----
 
-DictEntry Dict429Contents[] = {
+const DictEntry Dict443Contents[] = {
 { 0x0021, 0x0001, 0, VR::UL, VM::M1, "MdsModeMask" },
 { 0x0021, 0x0002, 0, VR::US, VM::M1, "Dixon" },
 { 0x0021, 0x0003, 0, VR::LT, VM::M1, "SequenceFileName" },
 { 0x0021, 0x00F1, 0, VR::UL, VM::M1, "CountOfPseudoAttributes" },
 };
 
-unsigned short Dict429TagHashTable[] = {
+const unsigned short Dict443TagHashTable[] = {
     5,     4,     8,    11,     0,     1,     0,     1,     1,     2,
     3,     2,     1,     2,     3,   241,
 };
 
-unsigned short Dict429KeyHashTable[] = {
+const unsigned short Dict443KeyHashTable[] = {
     4,     4,     5,    10,     0,     2,     0,  9150,     3, 33686,
     2,     1, 18649,     2, 43687,
 };
 
-vtkDICOMDictionary::Dict Dict429Data = {
+vtkDICOMDictionary::Dict Dict443Data = {
 "SIEMENS MR PHOENIX ATTRIBUTES",
 4,
 4,
-Dict429TagHashTable,
-Dict429KeyHashTable,
-Dict429Contents
+Dict443TagHashTable,
+Dict443KeyHashTable,
+Dict443Contents
 };
 
 // ----- SIEMENS MR SDI 02 -----
 
-DictEntry Dict430Contents[] = {
+const DictEntry Dict444Contents[] = {
 { 0x0021, 0x0001, 0, VR::US, VM::M1, "NumberOfImagesInMosaic" },
 { 0x0021, 0x0002, 0, VR::FD, VM::M3, "SliceNormalVector" },
 { 0x0021, 0x0003, 0, VR::DS, VM::M1, "SliceMeasurementDuration" },
@@ -25680,7 +26701,7 @@ DictEntry Dict430Contents[] = {
 { 0x0021, 0x00FE, 0, VR::SQ, VM::M1, "SiemensMRSDISequence" },
 };
 
-unsigned short Dict430TagHashTable[] = {
+const unsigned short Dict444TagHashTable[] = {
    92,    95,    98,   101,   104,   107,   112,   117,   122,   127,
   130,   135,   140,   145,   150,   155,   158,   161,   166,   171,
   176,   181,   186,   191,   196,   201,   206,   211,   216,   221,
@@ -25717,7 +26738,7 @@ unsigned short Dict430TagHashTable[] = {
    86,   119,     1,    87,   120,     1,    88,   121,
 };
 
-unsigned short Dict430KeyHashTable[] = {
+const unsigned short Dict444KeyHashTable[] = {
    92,    95,   100,   103,    91,    91,   108,   113,    91,   118,
   121,    91,   126,   131,   134,   137,   144,    91,   147,    91,
   150,    91,    91,    91,   153,   158,   161,    91,   166,    91,
@@ -25754,18 +26775,18 @@ unsigned short Dict430KeyHashTable[] = {
    80, 53629,     1,     8,  6773,
 };
 
-vtkDICOMDictionary::Dict Dict430Data = {
+vtkDICOMDictionary::Dict Dict444Data = {
 "SIEMENS MR SDI 02",
 91,
 91,
-Dict430TagHashTable,
-Dict430KeyHashTable,
-Dict430Contents
+Dict444TagHashTable,
+Dict444KeyHashTable,
+Dict444Contents
 };
 
 // ----- Biospace Med : EOS Tag -----
 
-DictEntry Dict431Contents[] = {
+const DictEntry Dict445Contents[] = {
 { 0x0863, 0x0010, 0, VR::SL, VM::M1, "ImageType" },
 { 0x0863, 0x0023, 0, VR::SL, VM::M1, "CalibrationFlag" },
 { 0x0863, 0x0026, 0, VR::UL, VM::M1, "AttributeVersion" },
@@ -25789,7 +26810,7 @@ DictEntry Dict431Contents[] = {
 { 0x0863, 0x0057, 0, VR::CS, VM::M1, "ImageHorizontalFlip" },
 };
 
-unsigned short Dict431TagHashTable[] = {
+const unsigned short Dict445TagHashTable[] = {
    21,    22,    25,    28,    33,    21,    36,    39,    44,    47,
    50,    53,    56,    61,    64,    21,    67,    70,    73,    78,
    21,     0,     1,     9,    54,     1,    10,    55,     2,     1,
@@ -25801,7 +26822,7 @@ unsigned short Dict431TagHashTable[] = {
    51,
 };
 
-unsigned short Dict431KeyHashTable[] = {
+const unsigned short Dict445KeyHashTable[] = {
    22,    21,    27,    21,    21,    30,    21,    21,    39,    42,
    21,    47,    21,    21,    54,    61,    66,    21,    21,    69,
    72,     0,     2,     3, 55074,     9,  6471,     1,     4, 12148,
@@ -25812,42 +26833,42 @@ unsigned short Dict431KeyHashTable[] = {
     7, 51514,     1,    18, 26685,
 };
 
-vtkDICOMDictionary::Dict Dict431Data = {
+vtkDICOMDictionary::Dict Dict445Data = {
 "Biospace Med : EOS Tag",
 21,
 21,
-Dict431TagHashTable,
-Dict431KeyHashTable,
-Dict431Contents
+Dict445TagHashTable,
+Dict445KeyHashTable,
+Dict445Contents
 };
 
 // ----- AMI ImageContextExt_01 -----
 
-DictEntry Dict432Contents[] = {
+const DictEntry Dict446Contents[] = {
 { 0x3107, 0x00A0, 0, VR::CS, VM::M1, "WindowFunction" },
 { 0x3107, 0x00B0, 0, VR::DS, VM::M1, "WindowSlope" },
 };
 
-unsigned short Dict432TagHashTable[] = {
+const unsigned short Dict446TagHashTable[] = {
     2,     3,     0,     2,     0,   160,     1,   176,
 };
 
-unsigned short Dict432KeyHashTable[] = {
+const unsigned short Dict446KeyHashTable[] = {
     3,     6,     0,     1,     1, 62736,     1,     0, 38065,
 };
 
-vtkDICOMDictionary::Dict Dict432Data = {
+vtkDICOMDictionary::Dict Dict446Data = {
 "AMI ImageContextExt_01",
 2,
 2,
-Dict432TagHashTable,
-Dict432KeyHashTable,
-Dict432Contents
+Dict446TagHashTable,
+Dict446KeyHashTable,
+Dict446Contents
 };
 
 // ----- IMS s.r.l. Biopsy Private Code -----
 
-DictEntry Dict433Contents[] = {
+const DictEntry Dict447Contents[] = {
 { 0x1269, 0x0001, 0, VR::IS, VM::M1, "BiopsyImage" },
 { 0x1269, 0x0010, 0, VR::IS, VM::M1TN, "BiopsyMarkersX" },
 { 0x1269, 0x0011, 0, VR::IS, VM::M1TN, "BiopsyMarkersY" },
@@ -25859,32 +26880,32 @@ DictEntry Dict433Contents[] = {
 { 0x1269, 0x0024, 0, VR::IS, VM::M1, "BiopsyNumber" },
 };
 
-unsigned short Dict433TagHashTable[] = {
+const unsigned short Dict447TagHashTable[] = {
    10,    13,    16,    19,    24,    29,    32,     9,     9,     0,
     1,     4,    32,     1,     5,    33,     1,     6,    34,     2,
     1,    16,     7,    35,     2,     2,    17,     8,    36,     1,
     3,    18,     1,     0,     1,
 };
 
-unsigned short Dict433KeyHashTable[] = {
+const unsigned short Dict447KeyHashTable[] = {
     9,    10,    15,    20,     9,    25,     9,    28,    31,     0,
     2,     0, 51605,     4, 12124,     2,     1,  6166,     3, 48415,
     2,     2,  6166,     7, 42788,     1,     6,  8128,     1,     8,
 21301,     1,     5, 21960,
 };
 
-vtkDICOMDictionary::Dict Dict433Data = {
+vtkDICOMDictionary::Dict Dict447Data = {
 "IMS s.r.l. Biopsy Private Code",
 9,
 9,
-Dict433TagHashTable,
-Dict433KeyHashTable,
-Dict433Contents
+Dict447TagHashTable,
+Dict447KeyHashTable,
+Dict447Contents
 };
 
 // ----- PMI Private Calibration Module Version 2.0 -----
 
-DictEntry Dict434Contents[] = {
+const DictEntry Dict448Contents[] = {
 { 0x2121, 0x0001, 0, VR::ST, VM::M1, "CalibrationMethod" },
 { 0x2121, 0x0002, 0, VR::ST, VM::M1, "CalibrationMethodInfo" },
 { 0x2121, 0x0003, 0, VR::FL, VM::M1, "CalibrationObjectSize" },
@@ -25900,7 +26921,7 @@ DictEntry Dict434Contents[] = {
 { 0x2121, 0x000e, 0, VR::FL, VM::M1, "VerticalPixelSDev" },
 };
 
-unsigned short Dict434TagHashTable[] = {
+const unsigned short Dict448TagHashTable[] = {
    14,    17,    20,    25,    30,    33,    36,    13,    39,    42,
    45,    48,    13,     0,     1,    12,    14,     1,     7,     9,
     2,     4,     5,     6,     8,     2,     3,     4,     9,    11,
@@ -25909,7 +26930,7 @@ unsigned short Dict434TagHashTable[] = {
    12,
 };
 
-unsigned short Dict434KeyHashTable[] = {
+const unsigned short Dict448KeyHashTable[] = {
    14,    17,    13,    20,    23,    28,    13,    13,    31,    34,
    43,    46,    13,     0,     1,     1, 44194,     1,    12, 26778,
     1,     3, 19967,     2,     8, 29024,    10, 24532,     1,    11,
@@ -25917,19 +26938,19 @@ unsigned short Dict434KeyHashTable[] = {
  1048,     9,  9474,     1,     5, 54420,     1,     4, 30559,
 };
 
-vtkDICOMDictionary::Dict Dict434Data = {
+vtkDICOMDictionary::Dict Dict448Data = {
 "PMI Private Calibration Module Version 2.0",
 13,
 13,
-Dict434TagHashTable,
-Dict434KeyHashTable,
-Dict434Contents
+Dict448TagHashTable,
+Dict448KeyHashTable,
+Dict448Contents
 };
 
 // ----- GEMS_ADWSoft_3D1 -----
 
-DictEntry Dict435Contents[] = {
-{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "Reconstruction Parameters Sequence" },
+const DictEntry Dict449Contents[] = {
+{ 0x0047, 0x0001, 0, VR::SQ, VM::M1, "ReconstructionParametersSequence" },
 { 0x0047, 0x0050, 0, VR::UL, VM::M1, "VolumeVoxelCount" },
 { 0x0047, 0x0051, 0, VR::UL, VM::M1, "VolumeSegmentCount" },
 { 0x0047, 0x0053, 0, VR::US, VM::M1, "VolumeSliceSize" },
@@ -25983,7 +27004,7 @@ DictEntry Dict435Contents[] = {
 { 0x0047, 0x00D5, 0, VR::OB, VM::M1, "VolumeOriginalIndexList" },
 };
 
-unsigned short Dict435TagHashTable[] = {
+const unsigned short Dict449TagHashTable[] = {
    53,    56,    61,    66,    52,    69,    72,    75,    78,    52,
    52,    52,    81,    84,    87,    90,    93,    52,    96,    99,
   104,    52,   107,   110,    52,    52,    52,    52,   113,   116,
@@ -26006,65 +27027,93 @@ unsigned short Dict435TagHashTable[] = {
    20,   138,     1,    21,   139,
 };
 
-unsigned short Dict435KeyHashTable[] = {
-   53,    58,    52,    63,    68,    52,    73,    76,    79,    82,
-   87,    92,    95,    98,   101,   106,    52,   109,   114,   117,
-   52,   120,   125,   128,   133,    52,   138,   141,    52,    52,
-  144,   149,   152,    52,    52,    52,   155,   160,   163,    52,
-   52,    52,   166,   169,   172,    52,   179,   184,   187,    52,
-   52,   190,     0,     2,     9,  4240,    15, 30510,     2,    26,
-41838,    32, 13112,     2,    35, 43240,    43, 39675,     2,     0,
-22268,    18,   615,     1,    29, 31433,     1,    31, 39219,     1,
-   36, 58080,     2,    21, 62660,    49, 36836,     2,     7, 49915,
-   19, 64687,     1,    48,  1619,     1,    16, 15156,     1,    12,
-32015,     2,     4, 39802,    14,  7813,     1,    22, 22548,     2,
-    2,  5410,    42, 14339,     1,    51, 32153,     1,    45, 51122,
-    2,    17, 47037,    37, 54208,     1,    39, 40598,     2,    41,
-40805,    46, 51894,     2,    10, 45812,    25, 46127,     1,    13,
- 6923,     1,     8, 24751,     2,    11, 11041,    28, 14543,     1,
-   33, 56869,     1,    34,  6980,     2,    47, 19394,    50, 19909,
-    1,    20, 54841,     1,    38,  6792,     1,    40, 25108,     1,
-   24, 34906,     3,     1, 51250,    23,  3630,    27, 33546,     2,
-    6, 55963,    30, 49438,     1,     5, 33470,     1,     3, 38110,
-    1,    44, 51324,
-};
-
-vtkDICOMDictionary::Dict Dict435Data = {
+const unsigned short Dict449KeyHashTable[] = {
+   53,    58,    52,    63,    68,    52,    71,    74,    77,    80,
+   85,    90,    93,    96,    99,   104,    52,   107,   112,   115,
+   52,   118,   123,   126,   131,    52,   136,   139,    52,    52,
+  142,   147,   150,    52,    52,    52,   153,   158,   161,    52,
+  164,    52,   167,   170,   173,    52,   180,   185,   188,    52,
+   52,   191,     0,     2,     9,  4240,    15, 30510,     2,    26,
+41838,    32, 13112,     2,    35, 43240,    43, 39675,     1,    18,
+  615,     1,    29, 31433,     1,    31, 39219,     1,    36, 58080,
+    2,    21, 62660,    49, 36836,     2,     7, 49915,    19, 64687,
+    1,    48,  1619,     1,    16, 15156,     1,    12, 32015,     2,
+    4, 39802,    14,  7813,     1,    22, 22548,     2,     2,  5410,
+   42, 14339,     1,    51, 32153,     1,    45, 51122,     2,    17,
+47037,    37, 54208,     1,    39, 40598,     2,    41, 40805,    46,
+51894,     2,    10, 45812,    25, 46127,     1,    13,  6923,     1,
+    8, 24751,     2,    11, 11041,    28, 14543,     1,    33, 56869,
+    1,    34,  6980,     2,    47, 19394,    50, 19909,     1,    20,
+54841,     1,    38,  6792,     1,     0, 19823,     1,    40, 25108,
+    1,    24, 34906,     3,     1, 51250,    23,  3630,    27, 33546,
+    2,     6, 55963,    30, 49438,     1,     5, 33470,     1,     3,
+38110,     1,    44, 51324,
+};
+
+vtkDICOMDictionary::Dict Dict449Data = {
 "GEMS_ADWSoft_3D1",
 52,
 52,
-Dict435TagHashTable,
-Dict435KeyHashTable,
-Dict435Contents
+Dict449TagHashTable,
+Dict449KeyHashTable,
+Dict449Contents
 };
 
 // ----- INFINITT_FMX -----
 
-DictEntry Dict436Contents[] = {
+const DictEntry Dict450Contents[] = {
 { 0x0015, 0x0010, 0, VR::LO, VM::M1, "" },
 { 0x0015, 0x0011, 0, VR::LO, VM::M1, "" },
 };
 
-unsigned short Dict436TagHashTable[] = {
+const unsigned short Dict450TagHashTable[] = {
     3,     6,     0,     1,     1,    17,     1,     0,    16,
 };
 
-unsigned short Dict436KeyHashTable[] = {
+const unsigned short Dict450KeyHashTable[] = {
     2,     3,     0,     2,     0,  2690,     1,  2690,
 };
 
-vtkDICOMDictionary::Dict Dict436Data = {
+vtkDICOMDictionary::Dict Dict450Data = {
 "INFINITT_FMX",
 2,
 2,
-Dict436TagHashTable,
-Dict436KeyHashTable,
-Dict436Contents
+Dict450TagHashTable,
+Dict450KeyHashTable,
+Dict450Contents
+};
+
+// ----- Nautilus Medical -----
+
+const DictEntry Dict451Contents[] = {
+{ 0x0857, 0x0000, 0, VR::LO, VM::M1, "" },
+{ 0x0857, 0x0001, 0, VR::LO, VM::M1, "" },
+{ 0x0857, 0x0002, 0, VR::LO, VM::M1, "" },
+{ 0x0857, 0x0003, 0, VR::LO, VM::M1, "" },
+};
+
+const unsigned short Dict451TagHashTable[] = {
+    5,     8,    11,    14,     0,     1,     2,     2,     1,     3,
+    3,     1,     0,     0,     1,     1,     1,
+};
+
+const unsigned short Dict451KeyHashTable[] = {
+    4,     5,     4,     4,     0,     4,     0,  1345,     1,  1345,
+    2,  1345,     3,  1345,
+};
+
+vtkDICOMDictionary::Dict Dict451Data = {
+"Nautilus Medical",
+4,
+4,
+Dict451TagHashTable,
+Dict451KeyHashTable,
+Dict451Contents
 };
 
 // ----- SIEMENS MR SDS 01 -----
 
-DictEntry Dict437Contents[] = {
+const DictEntry Dict452Contents[] = {
 { 0x0021, 0x0001, 0, VR::IS, VM::M1, "" },
 { 0x0021, 0x0002, 0, VR::DS, VM::M1TN, "" },
 { 0x0021, 0x0003, 0, VR::OB, VM::M1, "" },
@@ -26157,7 +27206,7 @@ DictEntry Dict437Contents[] = {
 { 0x0021, 0x00fe, 0, VR::SQ, VM::M1, "" },
 };
 
-unsigned short Dict437TagHashTable[] = {
+const unsigned short Dict452TagHashTable[] = {
    90,    91,    94,    97,   100,   103,   106,   111,   116,   119,
   122,   129,   136,   143,   150,   157,   164,   167,   170,   173,
   176,   179,   182,   185,   190,   195,   200,    90,   205,   208,
@@ -26194,7 +27243,7 @@ unsigned short Dict437TagHashTable[] = {
    33,    30,
 };
 
-unsigned short Dict437KeyHashTable[] = {
+const unsigned short Dict452KeyHashTable[] = {
    90,    90,    90,    90,    91,    90,    90,    90,    90,    90,
    90,    94,    90,    90,    97,    90,    90,    90,    90,    90,
    90,   100,    90,    90,    90,    90,   103,    90,    90,    90,
@@ -26227,18 +27276,18 @@ unsigned short Dict437KeyHashTable[] = {
 54723,    51, 64335,    88, 27848,     1,    43, 19302,
 };
 
-vtkDICOMDictionary::Dict Dict437Data = {
+vtkDICOMDictionary::Dict Dict452Data = {
 "SIEMENS MR SDS 01",
 90,
 90,
-Dict437TagHashTable,
-Dict437KeyHashTable,
-Dict437Contents
+Dict452TagHashTable,
+Dict452KeyHashTable,
+Dict452Contents
 };
 
 // ----- GEMS_RELA_01 -----
 
-DictEntry Dict438Contents[] = {
+const DictEntry Dict453Contents[] = {
 { 0x0021, 0x0003, 0, VR::SS, VM::M1, "SeriesFromWhichPrescribed" },
 { 0x0021, 0x0005, 0, VR::SH, VM::M1, "GenesisVersionNow" },
 { 0x0021, 0x0007, 0, VR::UL, VM::M1, "SeriesRecordChecksum" },
@@ -26282,7 +27331,7 @@ DictEntry Dict438Contents[] = {
 { 0x0021, 0x0094, 0, VR::LO, VM::M1TN, "AnnotationStrings" },
 };
 
-unsigned short Dict438TagHashTable[] = {
+const unsigned short Dict453TagHashTable[] = {
    42,    45,    50,    53,    58,    41,    41,    41,    41,    41,
    41,    61,    64,    67,    70,    75,    80,    41,    41,    83,
    86,    41,    89,    92,    95,    41,    41,    41,    98,   101,
@@ -26301,7 +27350,7 @@ unsigned short Dict438TagHashTable[] = {
    90,    31,   113,
 };
 
-unsigned short Dict438KeyHashTable[] = {
+const unsigned short Dict453KeyHashTable[] = {
    42,    41,    41,    47,    50,    41,    41,    41,    41,    53,
    56,    71,    41,    76,    79,    82,    85,    90,    93,    41,
    96,   101,    41,   106,   111,    41,   114,   119,    41,    41,
@@ -26319,18 +27368,18 @@ unsigned short Dict438KeyHashTable[] = {
 26866,     2,    25, 65225,    26, 65225,     1,    15,  1703,
 };
 
-vtkDICOMDictionary::Dict Dict438Data = {
+vtkDICOMDictionary::Dict Dict453Data = {
 "GEMS_RELA_01",
 41,
 41,
-Dict438TagHashTable,
-Dict438KeyHashTable,
-Dict438Contents
+Dict453TagHashTable,
+Dict453KeyHashTable,
+Dict453Contents
 };
 
 // ----- SIEMENS MR MRS 05 -----
 
-DictEntry Dict439Contents[] = {
+const DictEntry Dict454Contents[] = {
 { 0x0021, 0x0001, 0, VR::FD, VM::M1, "TransmitterReferenceAmplitude" },
 { 0x0021, 0x0002, 0, VR::US, VM::M1, "HammingFilterWidth" },
 { 0x0021, 0x0003, 0, VR::FD, VM::M3, "CSIGridshiftVector" },
@@ -26349,7 +27398,7 @@ DictEntry Dict439Contents[] = {
 { 0x0021, 0x004B, 0, VR::CS, VM::M1, "SpectroResultExtendTypeDetailed" },
 };
 
-unsigned short Dict439TagHashTable[] = {
+const unsigned short Dict454TagHashTable[] = {
    17,    22,    25,    30,    35,    38,    43,    46,    49,    52,
    55,    58,    16,    16,    16,    16,     0,     2,     0,     1,
     4,    64,     1,     5,    65,     2,     2,     3,     6,    66,
@@ -26359,7 +27408,7 @@ unsigned short Dict439TagHashTable[] = {
    75,
 };
 
-unsigned short Dict439KeyHashTable[] = {
+const unsigned short Dict454KeyHashTable[] = {
    17,    20,    16,    16,    16,    16,    25,    30,    16,    35,
    38,    41,    44,    51,    54,    57,     0,     1,     3, 15396,
     2,     7, 18467,    12, 19400,     2,     0, 41119,     5, 12810,
@@ -26368,18 +27417,18 @@ unsigned short Dict439KeyHashTable[] = {
 65199,     1,    14, 57592,     1,     6, 16634,     1,    10, 57721,
 };
 
-vtkDICOMDictionary::Dict Dict439Data = {
+vtkDICOMDictionary::Dict Dict454Data = {
 "SIEMENS MR MRS 05",
 16,
 16,
-Dict439TagHashTable,
-Dict439KeyHashTable,
-Dict439Contents
+Dict454TagHashTable,
+Dict454KeyHashTable,
+Dict454Contents
 };
 
 // ----- TOSHIBA_MEC_CT_1.0 -----
 
-DictEntry Dict440Contents[] = {
+const DictEntry Dict455Contents[] = {
 { 0x0019, 0x0001, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0002, 0, VR::IS, VM::M1, "" },
 { 0x0019, 0x0003, 0, VR::US, VM::M1TN, "" },
@@ -26408,7 +27457,7 @@ DictEntry Dict440Contents[] = {
 { 0x7ff1, 0x000d, 0, VR::US, VM::M1TN, "" },
 };
 
-unsigned short Dict440TagHashTable[] = {
+const unsigned short Dict455TagHashTable[] = {
    27,    32,    37,    42,    47,    50,    26,    26,    26,    26,
    26,    26,    26,    26,    26,    26,    55,    58,    61,    66,
    71,    76,    81,    84,    89,    92,     0,     2,     2,     3,
@@ -26421,7 +27470,7 @@ unsigned short Dict440TagHashTable[] = {
     0,     1,     1,    19,     7,
 };
 
-unsigned short Dict440KeyHashTable[] = {
+const unsigned short Dict455KeyHashTable[] = {
    26,    26,    27,    26,    26,    30,    26,    26,    26,    26,
    26,    35,    38,    26,    26,    26,    26,    26,    26,    26,
    26,    26,    26,    26,    26,    43,     0,     1,    12, 22493,
@@ -26433,18 +27482,18 @@ unsigned short Dict440KeyHashTable[] = {
    24,   206,    25,   206,
 };
 
-vtkDICOMDictionary::Dict Dict440Data = {
+vtkDICOMDictionary::Dict Dict455Data = {
 "TOSHIBA_MEC_CT_1.0",
 26,
 26,
-Dict440TagHashTable,
-Dict440KeyHashTable,
-Dict440Contents
+Dict455TagHashTable,
+Dict455KeyHashTable,
+Dict455Contents
 };
 
 // ----- SPI Release 1 -----
 
-DictEntry Dict441Contents[] = {
+const DictEntry Dict456Contents[] = {
 { 0x0009, 0x0008, 0, VR::CS, VM::M1, "" },
 { 0x0009, 0x0010, 0, VR::LO, VM::M1, "Comments" },
 { 0x0009, 0x0015, 0, VR::LO, VM::M1, "UID" },
@@ -26456,27 +27505,27 @@ DictEntry Dict441Contents[] = {
 { 0x0029, 0x0060, 0, VR::LO, VM::M1, "CompressionAlgorithm" },
 };
 
-unsigned short Dict441TagHashTable[] = {
+const unsigned short Dict456TagHashTable[] = {
    10,    15,     9,     9,    24,     9,     9,    29,     9,     0,
     2,     3,    64,     8,    96,     4,     0,     8,     2,    21,
     4,    65,     5,    16,     2,     6,    21,     7,    32,     1,
     1,    16,
 };
 
-unsigned short Dict441KeyHashTable[] = {
+const unsigned short Dict456KeyHashTable[] = {
     9,    10,    15,     9,    20,     9,     9,    23,    26,     0,
     2,     3, 58111,     5, 27939,     2,     2,  1085,     7, 11418,
     1,     4, 49518,     1,     1, 60804,     3,     0,   597,     6,
 12183,     8, 36166,
 };
 
-vtkDICOMDictionary::Dict Dict441Data = {
+vtkDICOMDictionary::Dict Dict456Data = {
 "SPI Release 1",
 9,
 9,
-Dict441TagHashTable,
-Dict441KeyHashTable,
-Dict441Contents
+Dict456TagHashTable,
+Dict456KeyHashTable,
+Dict456Contents
 };
 
 vtkDICOMDictionary::Dict *PrivateDictData[] = {
@@ -26568,7 +27617,10 @@ vtkDICOMDictionary::Dict *PrivateDictData[] = {
 &Dict426Data, &Dict427Data, &Dict428Data, &Dict429Data, &Dict430Data,
 &Dict431Data, &Dict432Data, &Dict433Data, &Dict434Data, &Dict435Data,
 &Dict436Data, &Dict437Data, &Dict438Data, &Dict439Data, &Dict440Data,
-&Dict441Data, NULL
+&Dict441Data, &Dict442Data, &Dict443Data, &Dict444Data, &Dict445Data,
+&Dict446Data, &Dict447Data, &Dict448Data, &Dict449Data, &Dict450Data,
+&Dict451Data, &Dict452Data, &Dict453Data, &Dict454Data, &Dict455Data,
+&Dict456Data, NULL
 };
 
 } // end anonymous namespace
@@ -26578,21 +27630,21 @@ static unsigned int vtkDICOMDictPrivateInitializerCounter;
 vtkDICOMDictPrivateInitializer::vtkDICOMDictPrivateInitializer()
 {
   if (vtkDICOMDictPrivateInitializerCounter++ == 0)
-    {
+  {
     for (vtkDICOMDictionary::Dict **dp = PrivateDictData; *dp != NULL; dp++)
-      {
+    {
       vtkDICOMDictionary::AddPrivateDictionary(*dp);
-      }
     }
+  }
 }
 
 vtkDICOMDictPrivateInitializer::~vtkDICOMDictPrivateInitializer()
 {
   if (--vtkDICOMDictPrivateInitializerCounter == 0)
-    {
+  {
     for (vtkDICOMDictionary::Dict **dp = PrivateDictData; *dp != NULL; dp++)
-      {
+    {
       vtkDICOMDictionary::RemovePrivateDictionary((*dp)->Name);
-      }
     }
+  }
 }
diff --git a/Source/vtkDICOMDictionary.cxx b/Source/vtkDICOMDictionary.cxx
index d0329c3..614c583 100644
--- a/Source/vtkDICOMDictionary.cxx
+++ b/Source/vtkDICOMDictionary.cxx
@@ -40,24 +40,24 @@ static unsigned int vtkDICOMDictionaryInitializerCounter;
 vtkDICOMDictionaryInitializer::vtkDICOMDictionaryInitializer()
 {
   if (vtkDICOMDictionaryInitializerCounter++ == 0)
-    {
+  {
     for (int i = 0; i < DICT_PRIVATE_TABLE_SIZE; i++)
-      {
+    {
       vtkDICOMDictionary::PrivateDictTable[i] = 0;
-      }
     }
+  }
 }
 
 // Perform cleanup of static variables.
 vtkDICOMDictionaryInitializer::~vtkDICOMDictionaryInitializer()
 {
   if (--vtkDICOMDictionaryInitializerCounter == 0)
-    {
+  {
     for (int i = 0; i < DICT_PRIVATE_TABLE_SIZE; i++)
-      {
+    {
       delete [] vtkDICOMDictionary::PrivateDictTable[i];
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -69,7 +69,7 @@ unsigned int vtkDICOMDictionary::HashLongString(
   // length even, the pad space is ignored.
   unsigned int h = 5381;
   for (int k = 0; k < 64; k += 2)
-    {
+  {
     unsigned char c = input[k];
     output[k] = c;
     if (c == '\0') { break; }
@@ -77,13 +77,13 @@ unsigned int vtkDICOMDictionary::HashLongString(
     c = input[k+1];
     // trim pad space before terminating null
     if (c == ' ' && input[k+2] == '\0')
-      {
+    {
       c = '\0';
-      }
+    }
     output[k+1] = c;
     if (c == '\0') { break; }
     h = (h << 5) + h + c;
-    }
+  }
 
   return h;
 }
@@ -102,16 +102,16 @@ vtkDICOMDictionary::Dict *vtkDICOMDictionary::FindPrivateDict(
   unsigned int i = (h & m);
 
   if (htable && (hptr = htable[i]) != NULL)
-    {
+  {
     while (hptr->Dict != 0)
-      {
+    {
       if (hptr->Hash == h && strncmp(hptr->Dict->Name, stripname, 64) == 0)
-        {
+      {
         return hptr->Dict;
-        }
-      hptr++;
       }
+      hptr++;
     }
+  }
 
   return 0;
 }
@@ -132,29 +132,29 @@ vtkDICOMDictEntry vtkDICOMDictionary::FindDictEntry(
 
   // for odd group number, only search the private dictionary
   if ((group & 1) != 0 && dictname != 0)
-    {
+  {
     dict = vtkDICOMDictionary::FindPrivateDict(dictname);
     if (dict == 0)
-      {
+    {
       // private dictionary not found
       return vtkDICOMDictEntry();
-      }
-    i = (h % dict->HashSize);
     }
+    i = (h % dict->HashSize);
+  }
 
   // search the hash table
-  unsigned short *hptr = &dict->TagHashTable[dict->TagHashTable[i]];
-  vtkDICOMDictEntry::Entry *dptr = dict->Contents;
+  const unsigned short *hptr = &dict->TagHashTable[dict->TagHashTable[i]];
+  const vtkDICOMDictEntry::Entry *dptr = dict->Contents;
   for (unsigned short n = *hptr; n != 0; --n)
-    {
+  {
     ++hptr;
-    vtkDICOMDictEntry::Entry *entry = &dptr[*hptr];
+    const vtkDICOMDictEntry::Entry *entry = &dptr[*hptr];
     ++hptr;
     if (*hptr == element && entry->Group == group)
-      {
+    {
       return vtkDICOMDictEntry(entry);
-      }
     }
+  }
 
   // not found in dictionary
   return vtkDICOMDictEntry();
@@ -165,9 +165,9 @@ vtkDICOMDictEntry vtkDICOMDictionary::FindDictEntry(
   const char *key, const char *dictname)
 {
   if (key == 0 || key[0] == '\0')
-    {
+  {
     return vtkDICOMDictEntry();
-    }
+  }
 
   char stripkey[64];
   unsigned int h = vtkDICOMDictionary::HashLongString(key, stripkey);
@@ -177,46 +177,46 @@ vtkDICOMDictEntry vtkDICOMDictionary::FindDictEntry(
 
   // for odd group number, only search the private dictionary
   if (dictname != 0 && dictname[0] != '\0')
-    {
+  {
     dict = vtkDICOMDictionary::FindPrivateDict(dictname);
     if (dict == 0)
-      {
+    {
       // private dictionary not found
       return vtkDICOMDictEntry();
-      }
     }
+  }
 
   unsigned short i = static_cast<unsigned short>(h % dict->HashSize);
   unsigned short j = static_cast<unsigned short>(h / dict->HashSize);
 
   // search the hash table
-  unsigned short *hptr = &dict->KeyHashTable[dict->KeyHashTable[i]];
-  vtkDICOMDictEntry::Entry *dptr = dict->Contents;
+  const unsigned short *hptr = &dict->KeyHashTable[dict->KeyHashTable[i]];
+  const vtkDICOMDictEntry::Entry *dptr = dict->Contents;
   for (unsigned short n = *hptr; n != 0; --n)
-    {
+  {
     ++hptr;
-    vtkDICOMDictEntry::Entry *entry = &dptr[*hptr];
+    const vtkDICOMDictEntry::Entry *entry = &dptr[*hptr];
     ++hptr;
     if (*hptr == j && strncmp(stripkey, entry->Name, 64) == 0)
-      {
+    {
       return vtkDICOMDictEntry(entry);
-      }
     }
+  }
 
   if (dictname != 0 && dictname[0] != '\0')
-    {
+  {
     // brute force search the entire dictionary, if hash lookup failed
     // (in case people manually changed the key strings in the code,
     // without re-running makedict.py to re-generate the hash table)
     for (unsigned short k = 0; k < dict->DataSize; k++)
-      {
-      vtkDICOMDictEntry::Entry *entry = &dptr[k];
+    {
+      const vtkDICOMDictEntry::Entry *entry = &dptr[k];
       if (strncmp(stripkey, entry->Name, 64) == 0)
-        {
+      {
         return vtkDICOMDictEntry(entry);
-        }
       }
     }
+  }
 
   // not found in dictionary
   return vtkDICOMDictEntry();
@@ -236,34 +236,34 @@ void vtkDICOMDictionary::AddPrivateDictionary(Dict *dict)
 
   // create hash table row if it is empty
   if (hptr == 0)
-    {
+  {
     htable[i] = new DictHashEntry[2];
     hptr = htable[i];
     hptr->Hash = 0;
     hptr->Dict = 0;
-    }
+  }
 
   // go to the end of the row in the hash table
   int n = 0;
   while (hptr->Dict != 0)
-    {
+  {
     n++;
     hptr++;
-    }
+  }
 
   // if n+1 is a power of two, double allocated space
   if (n > 0 && (n & (n+1)) == 0)
-    {
+  {
     DictHashEntry *oldptr = htable[i];
     hptr = new DictHashEntry[2*(n+1)];
     htable[i] = hptr;
     // copy the old list
     for (int j = 0; j < n; j++)
-      {
+    {
       *hptr++ = oldptr[j];
-      }
-    delete [] oldptr;
     }
+    delete [] oldptr;
+  }
 
   hptr->Hash = h;
   hptr->Dict = dict;
@@ -286,21 +286,21 @@ void vtkDICOMDictionary::RemovePrivateDictionary(const char *name)
   unsigned int i = (h & m);
 
   if (htable && (hptr = htable[i]) != NULL)
-    {
+  {
     while (hptr->Dict != 0)
-      {
+    {
       if (hptr->Hash == h && strncmp(hptr->Dict->Name, stripname, 64) == 0)
-        {
+      {
         break;
-        }
-      hptr++;
       }
+      hptr++;
+    }
 
     // erase
     while (hptr->Dict != 0)
-      {
+    {
       *hptr = *(hptr + 1);
       hptr++;
-      }
     }
+  }
 }
diff --git a/Source/vtkDICOMDictionary.h b/Source/vtkDICOMDictionary.h
index 8d431b2..c406f7d 100644
--- a/Source/vtkDICOMDictionary.h
+++ b/Source/vtkDICOMDictionary.h
@@ -26,18 +26,20 @@
 class VTKDICOM_EXPORT vtkDICOMDictionary
 {
 public:
+  //! A struct to store a DICOM dictionary hash table.
   struct Dict
   {
     const char *Name;
     unsigned short HashSize;
     unsigned short DataSize;
-    unsigned short *TagHashTable;
-    unsigned short *KeyHashTable;
-    vtkDICOMDictEntry::Entry *Contents;
+    const unsigned short *TagHashTable;
+    const unsigned short *KeyHashTable;
+    const vtkDICOMDictEntry::Entry *Contents;
   };
 
   struct DictHashEntry;
 
+  //@{
   //! Find the dictionary entry for the given tag.
   static vtkDICOMDictEntry FindDictEntry(const vtkDICOMTag tag) {
     return vtkDICOMDictionary::FindDictEntry(tag, 0); }
@@ -45,7 +47,9 @@ public:
   //! Find the dictionary for the given key.
   static vtkDICOMDictEntry FindDictEntry(const char *key) {
     return vtkDICOMDictionary::FindDictEntry(key, 0); }
+  //@}
 
+  //@{
   //! Include a private dictionary when searching for the tag.
   /*!
    *  This method requires that the creator of the private dictionary
@@ -66,7 +70,9 @@ public:
    */
   static vtkDICOMDictEntry FindDictEntry(
     const char *key, const char *privateDict);
+  //@}
 
+  //@{
   //! Add the hash table for a private dictionary.
   /*!
    *  The name should be the text that appears in the PrivateCreator
@@ -77,6 +83,7 @@ public:
 
   //! Remove a private dictionary.
   static void RemovePrivateDictionary(const char *name);
+  //@}
 
 private:
   friend class vtkDICOMDictionaryInitializer;
@@ -102,6 +109,7 @@ private:
   static DictHashEntry *PrivateDictTable[DICT_PRIVATE_TABLE_SIZE];
 };
 
+//! @cond
 //! Initializer (Schwarz counter).
 /*!
  *  This ensures that the vtkDICOMDictionary module is initialized before
@@ -119,6 +127,7 @@ private:
 };
 
 static vtkDICOMDictionaryInitializer vtkDICOMDictionaryInitializerInstance;
+//! @endcond
 
 #endif /* vtkDICOMDictionary_h */
 // VTK-HeaderTest-Exclude: vtkDICOMDictionary.h
diff --git a/Source/vtkDICOMDirectory.cxx b/Source/vtkDICOMDirectory.cxx
index 7ec5287..a7cabf4 100644
--- a/Source/vtkDICOMDirectory.cxx
+++ b/Source/vtkDICOMDirectory.cxx
@@ -13,6 +13,9 @@
 =========================================================================*/
 #include "vtkDICOMDirectory.h"
 
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
+#include "vtkDICOMFilePath.h"
 #include "vtkDICOMItem.h"
 #include "vtkDICOMMetaData.h"
 #include "vtkDICOMSequence.h"
@@ -38,9 +41,6 @@
 #include <algorithm>
 #include <utility>
 
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Directory.hxx>
-
 #include <ctype.h>
 #include <stdlib.h>
 
@@ -142,6 +142,7 @@ vtkDICOMDirectory::vtkDICOMDirectory()
   this->InternalFileName = 0;
   this->RequirePixelData = 1;
   this->FollowSymlinks = 1;
+  this->ShowHidden = 1;
   this->ScanDepth = 1;
   this->Query = 0;
   this->FindLevel = vtkDICOMDirectory::IMAGE;
@@ -152,9 +153,9 @@ vtkDICOMDirectory::vtkDICOMDirectory()
 vtkDICOMDirectory::~vtkDICOMDirectory()
 {
   if (this->InputFileNames)
-    {
+  {
     this->InputFileNames->Delete();
-    }
+  }
 
   delete [] this->DirectoryName;
   delete [] this->FilePattern;
@@ -206,18 +207,18 @@ void vtkDICOMDirectory::SetDirectoryName(const char *name)
   if (name == this->DirectoryName ||
       (name && this->DirectoryName &&
        strcmp(name, this->DirectoryName) == 0))
-    {
+  {
     return;
-    }
+  }
 
   delete [] this->DirectoryName;
   this->DirectoryName = 0;
   if (name)
-    {
+  {
     char *cp = new char[strlen(name) + 1];
     strcpy(cp, name);
     this->DirectoryName = cp;
-    }
+  }
   this->Modified();
 }
 
@@ -227,18 +228,18 @@ void vtkDICOMDirectory::SetFilePattern(const char *name)
   if (name == this->FilePattern ||
       (name && this->FilePattern &&
        strcmp(name, this->FilePattern) == 0))
-    {
+  {
     return;
-    }
+  }
 
   delete [] this->FilePattern;
   this->FilePattern = 0;
   if (name)
-    {
+  {
     char *cp = new char[strlen(name) + 1];
     strcpy(cp, name);
     this->FilePattern = cp;
-    }
+  }
   this->Modified();
 }
 
@@ -246,51 +247,72 @@ void vtkDICOMDirectory::SetFilePattern(const char *name)
 void vtkDICOMDirectory::SetInputFileNames(vtkStringArray *sa)
 {
   if (sa != this->InputFileNames)
+  {
+    if (!sa)
     {
-    if (this->InputFileNames)
-      {
       this->InputFileNames->Delete();
-      }
-    if (sa)
+    }
+    else
+    {
+      if (!this->InputFileNames)
       {
-      sa->Register(this);
+        this->InputFileNames = vtkStringArray::New();
       }
-    this->InputFileNames = sa;
+      this->InputFileNames->DeepCopy(sa);
+    }
     this->Modified();
+  }
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMDirectory::AddInputFileNames(vtkStringArray *sa)
+{
+  if (sa && sa->GetNumberOfValues() > 0)
+  {
+    if (!this->InputFileNames)
+    {
+      this->InputFileNames = vtkStringArray::New();
+    }
+    vtkIdType n = sa->GetNumberOfValues();
+    for (vtkIdType i = 0; i < n; i++)
+    {
+      this->InputFileNames->InsertNextValue(sa->GetValue(i));
     }
+    this->Modified();
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMDirectory::SetFindQuery(const vtkDICOMItem& item)
 {
   if (this->Query != &item)
-    {
+  {
     delete this->Query;
     this->Query = 0;
     if (!item.IsEmpty())
-      {
+    {
       this->Query = new vtkDICOMItem;
       *(this->Query) = item;
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMDirectory::SetFindLevel(int level)
 {
   if (level < vtkDICOMDirectory::SERIES)
-    {
+  {
     level = vtkDICOMDirectory::SERIES;
-    }
+  }
   if (level > vtkDICOMDirectory::IMAGE)
-    {
+  {
     level = vtkDICOMDirectory::IMAGE;
-    }
+  }
   if (level != this->FindLevel)
-    {
+  {
     this->FindLevel = level;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -377,13 +399,13 @@ std::string OsirixCleanString(const std::string& text)
   std::string s;
   size_t l = text.length();
   if (l > 0)
-    {
+  {
     char space = '\0';
     for (size_t i = 0; i < l; i++)
-      {
+    {
       char c = text[i];
       switch (c)
-        {
+      {
         case ',':
         case '^':
           c = '\0';
@@ -403,18 +425,18 @@ std::string OsirixCleanString(const std::string& text)
           c = '\0';
           space = ' ';
           break;
-        }
+      }
       if (c)
-        {
+      {
         if (space)
-          {
+        {
           s.push_back(space);
           space = '\0';
-          }
-        s.push_back(c);
         }
+        s.push_back(c);
       }
     }
+  }
 
   return s;
 }
@@ -427,7 +449,7 @@ bool MatchesOsirixDatabase(
   unsigned short g = tag.GetGroup();
   if (u.GetNumberOfValues() > 0 && v.GetNumberOfValues() > 0 &&
       (g == 0x0008 || g == 0x0010))
-    {
+  {
     const DC::EnumType tagsToClean[] = {
       DC::StudyDescription,
       DC::SeriesDescription,
@@ -439,14 +461,14 @@ bool MatchesOsirixDatabase(
     };
 
     for (int i = 0; tagsToClean[i] != DC::ItemDelimitationItem; i++)
-      {
+    {
       needsCleanCompare |= (tag == tagsToClean[i]);
-      }
     }
+  }
 
   bool matched = false;
   if (needsCleanCompare)
-    {
+  {
     vtkDICOMValue uclean(
       u.GetVR(), vtkDICOMCharacterSet::ISO_IR_192,
       OsirixCleanString(u.AsUTF8String()));
@@ -454,11 +476,11 @@ bool MatchesOsirixDatabase(
       v.GetVR(), vtkDICOMCharacterSet::ISO_IR_192,
       OsirixCleanString(v.AsUTF8String()));
     matched = uclean.Matches(vclean);
-    }
+  }
   else
-    {
+  {
     matched = u.Matches(v);
-    }
+  }
 
   return matched;
 }
@@ -472,37 +494,37 @@ bool vtkDICOMDirectory::MatchesQuery(
   bool matched = true;
 
   if (this->Query)
-    {
+  {
     vtkDICOMDataElementIterator iter;
     for (iter = record.Begin(); iter != record.End(); ++iter)
-      {
+    {
       vtkDICOMTag tag = iter->GetTag();
       if (tag != DC::SpecificCharacterSet && tag.GetGroup() != 0x0004)
-        {
+      {
         const vtkDICOMValue& v = this->Query->GetAttributeValue(tag);
         if (v.IsValid())
-          {
+        {
           const vtkDICOMValue& u = iter->GetValue();
           if (this->UsingOsirixDatabase)
-            {
+          {
             matched = MatchesOsirixDatabase(tag, u, v);
-            }
+          }
           else
-            {
+          {
             matched = u.Matches(v);
-            }
+          }
           if (matched)
-            {
+          {
             results.SetAttributeValue(tag, u);
-            }
+          }
           else
-            {
+          {
             break;
-            }
           }
         }
       }
     }
+  }
 
   return matched;
 }
@@ -515,51 +537,51 @@ int vtkDICOMDirectory::MatchesImageQuery(
   bool misMatched = false;
 
   if (this->Query)
-    {
+  {
     vtkDICOMDataElementIterator iter;
     for (iter = this->Query->Begin(); iter != this->Query->End(); ++iter)
-      {
+    {
       vtkDICOMTag tag = iter->GetTag();
       const vtkDICOMValue& v = iter->GetValue();
       if (v.GetVR() == vtkDICOMVR::SQ)
-        {
+      {
         if (v.GetNumberOfValues() > 0)
-          {
+        {
           fullyMatched = false;
           break;
-          }
         }
+      }
       else if (tag != DC::SpecificCharacterSet && tag.GetGroup() != 0x0004)
-        {
+      {
         if (v.GetVL() > 0)
-          {
+        {
           if (!results.GetAttributeValue(tag).IsValid())
-            {
+          {
             const vtkDICOMValue& u = record.GetAttributeValue(tag);
             if (!u.IsValid())
-              {
+            {
               fullyMatched = false;
-              }
+            }
             else if (!u.Matches(v))
-              {
+            {
               misMatched = true;
               break;
-              }
             }
           }
         }
       }
     }
+  }
 
   int r = 1;
   if (fullyMatched)
-    {
+  {
     r = 0;
-    }
+  }
   if (misMatched)
-    {
+  {
     r = -1;
-    }
+  }
 
   return r;
 }
@@ -573,12 +595,12 @@ void vtkDICOMDirectory::AddSeriesWithQuery(
   const vtkDICOMItem *imageRecords[])
 {
   if (this->Query == 0)
-    {
+  {
     this->AddSeriesFileNames(
       patient, study, files,
       patientRecord, studyRecord, seriesRecord, imageRecords);
     return;
-    }
+  }
 
   // To store results of querying the patient, study, series records
   vtkDICOMItem results;
@@ -586,41 +608,41 @@ void vtkDICOMDirectory::AddSeriesWithQuery(
   if (this->MatchesQuery(patientRecord, results) &&
       this->MatchesQuery(studyRecord, results) &&
       this->MatchesQuery(seriesRecord, results))
-    {
+  {
     // Have we checked all the attributes in the query?
     bool fullyMatched = true;
     vtkDICOMDataElementIterator iter;
     for (iter = this->Query->Begin(); iter != this->Query->End(); ++iter)
-      {
+    {
       vtkDICOMTag tag = iter->GetTag();
       const vtkDICOMValue& v = iter->GetValue();
       if (v.GetVR() == vtkDICOMVR::SQ)
-        {
+      {
         if (v.GetNumberOfValues() > 0)
-          {
+        {
           fullyMatched = false;
           break;
-          }
         }
+      }
       else if (tag != DC::SpecificCharacterSet && tag.GetGroup() != 0x0004)
-        {
+      {
         if (v.GetVL() > 0 &&
             !results.GetAttributeValue(tag).IsValid())
-          {
+        {
           fullyMatched = false;
           break;
-          }
         }
       }
+    }
 
     if (fullyMatched)
-      {
+    {
       // All query attributes have been matched!
       this->AddSeriesFileNames(
         patient, study, files,
         patientRecord, studyRecord, seriesRecord, imageRecords);
       return;
-      }
+    }
 
     // Need to query against the actual files
     const vtkDICOMItem **usedImageRecords = imageRecords;
@@ -642,64 +664,64 @@ void vtkDICOMDirectory::AddSeriesWithQuery(
     vtkIdType n = files->GetNumberOfValues();
     // Only check the first file unless image-level query
     if (n > 0 && this->FindLevel < vtkDICOMDirectory::IMAGE)
-      {
+    {
       n = 1;
-      }
+    }
 
     for (vtkIdType i = 0; i < n; i++)
-      {
+    {
       const std::string& fileName = files->GetValue(i);
       bool matched = false;
       int r = this->MatchesImageQuery(*imageRecords[i], results);
       if (r == 0)
-        {
+      {
         // All remaining queries were matched by image record
         matched = true;
-        }
+      }
       else if (r > 0)
-        {
+      {
         // Read the file metadata
         meta->Initialize();
         this->SetInternalFileName(fileName.c_str());
         parser->SetFileName(fileName.c_str());
         parser->Update();
         if (!parser->GetPixelDataFound())
-          {
+        {
           if (!this->ErrorCode)
-            {
+          {
             this->ErrorCode = parser->GetErrorCode();
-            }
+          }
           if (this->ErrorCode || this->RequirePixelData)
-            {
+          {
             continue;
-            }
           }
-        matched = parser->GetQueryMatched();
         }
+        matched = parser->GetQueryMatched();
+      }
       if (matched)
-        {
+      {
         if (this->FindLevel < vtkDICOMDirectory::IMAGE)
-          {
+        {
           // Add all the files.
           a = files;
-          }
+        }
         else
-          {
+        {
           // Add the matched file.
           a->InsertNextValue(fileName);
           newImageRecords.push_back(imageRecords[i]);
           usedImageRecords = &newImageRecords[0];
-          }
         }
       }
+    }
 
     if (a->GetNumberOfValues() > 0)
-      {
+    {
       this->AddSeriesFileNames(
         patient, study, a,
         patientRecord, studyRecord, seriesRecord, usedImageRecords);
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -715,72 +737,127 @@ void vtkDICOMDirectory::AddSeriesFileNames(
   int series = static_cast<int>(this->Series->size());
 
   if (study == n)
-    {
+  {
     this->Studies->push_back(StudyItem());
     StudyItem& item = this->Studies->back();
     item.Record = studyRecord;
     item.PatientRecord = patientRecord;
     item.FirstSeries = series;
     item.LastSeries = series;
-    }
-  else if (n >= 0 && study == n-1)
-    {
-    (*this->Studies)[study].LastSeries = series;
-    }
-  else
-    {
+  }
+  else if (n < 0 || study != n-1)
+  {
     vtkErrorMacro("AddSeriesFileNames: non-monotonically increasing study")
     return;
-    }
+  }
 
   if (patient == m)
-    {
+  {
     this->Patients->push_back(PatientItem());
     PatientItem& item = this->Patients->back();
     item.Record = patientRecord;
     item.Studies = vtkSmartPointer<vtkIntArray>::New();
     item.Studies->InsertNextValue(study);
-    }
+  }
   else if (m >= 0 && patient <= m-1)
-    {
+  {
     PatientItem& item = (*this->Patients)[patient];
     vtkIdType nn = item.Studies->GetMaxId() + 1;
     vtkIdType ii = 0;
     for (; ii < nn; ii++)
-      {
+    {
       if (study == item.Studies->GetValue(ii))
-        {
+      {
         break;
-        }
       }
+    }
     if (ii == nn)
-      {
+    {
       item.Studies->InsertNextValue(study);
-      }
     }
+  }
   else
-    {
+  {
     vtkErrorMacro("AddSeriesFileNames: non-monotonically increasing patient")
     return;
-    }
+  }
 
+  // Check for files that are duplicate instances
   int ni = static_cast<int>(files->GetNumberOfValues());
-  vtkSmartPointer<vtkDICOMMetaData> meta =
-    vtkSmartPointer<vtkDICOMMetaData>::New();
-  meta->SetNumberOfInstances(ni);
-  this->CopyRecord(meta, &patientRecord, -1);
-  this->CopyRecord(meta, &studyRecord, -1);
-  this->CopyRecord(meta, &seriesRecord, -1);
+  std::vector<const vtkDICOMValue *> uids(ni);
+  for (int ii = 0; ii < ni; ii++)
+  {
+    uids[ii] = &imageRecords[ii]->GetAttributeValue(DC::SOPInstanceUID);
+  }
+  std::vector<int> duplicate(ni);
+  std::vector<int> seriesLength;
+  seriesLength.push_back(0);
+  int numberOfDuplicates = 0;
   for (int ii = 0; ii < ni; ii++)
+  {
+    int count = 0;
+    const vtkDICOMValue *uid = uids[ii];
+    if (uid->GetVL() > 0)
+    {
+      for (int jj = 0; jj < ii; jj++)
+      {
+        if (*(uids[jj]) == *uid)
+        {
+          count++;
+        }
+      }
+    }
+    duplicate[ii] = count;
+    if (count > numberOfDuplicates)
+    {
+      numberOfDuplicates = count;
+      seriesLength.push_back(0);
+    }
+    seriesLength[count]++;
+  }
+
+  // Add each duplicate as a separate series
+  for (int kk = 0; kk <= numberOfDuplicates; kk++)
+  {
+    vtkSmartPointer<vtkDICOMMetaData> meta =
+      vtkSmartPointer<vtkDICOMMetaData>::New();
+    meta->SetNumberOfInstances(seriesLength[kk]);
+    this->CopyRecord(meta, &patientRecord, -1);
+    this->CopyRecord(meta, &studyRecord, -1);
+    this->CopyRecord(meta, &seriesRecord, -1);
+
+    vtkSmartPointer<vtkStringArray> newfiles;
+    if (numberOfDuplicates > 0)
     {
-    this->CopyRecord(meta, imageRecords[ii], ii);
+      newfiles = vtkSmartPointer<vtkStringArray>::New();
+      newfiles->SetNumberOfValues(seriesLength[kk]);
+    }
+    else
+    {
+      newfiles = files;
+    }
+
+    int jj = 0;
+    for (int ii = 0; ii < ni; ii++)
+    {
+      if (duplicate[ii] == kk)
+      {
+        this->CopyRecord(meta, imageRecords[ii], jj);
+        if (numberOfDuplicates > 0)
+        {
+          newfiles->SetValue(jj, files->GetValue(ii));
+        }
+        jj++;
+      }
     }
 
-  this->Series->push_back(SeriesItem());
-  SeriesItem& item = this->Series->back();
-  item.Record = seriesRecord;
-  item.Files = files;
-  item.Meta = meta;
+    (*this->Studies)[study].LastSeries = series++;
+    this->Series->push_back(SeriesItem());
+    SeriesItem& item = this->Series->back();
+    item.Record = seriesRecord;
+    item.Files = newfiles;
+    item.Meta = meta;
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -790,38 +867,38 @@ void vtkDICOMDirectory::CopyRecord(
   vtkDICOMDataElementIterator iter = item->Begin();
   vtkDICOMDataElementIterator iterEnd = item->End();
   for (; iter != iterEnd; ++iter)
-    {
+  {
     vtkDICOMTag tag = iter->GetTag();
     if (tag.GetGroup() == 0x0004)
-      {
+    {
       // DICOMDIR-specific tags
       if (tag == DC::ReferencedSOPClassUIDInFile)
-        {
+      {
         tag = DC::SOPClassUID;
-        }
+      }
       else if (tag == DC::ReferencedSOPInstanceUIDInFile)
-        {
+      {
         tag = DC::SOPInstanceUID;
-        }
+      }
       else if (tag == DC::ReferencedTransferSyntaxUIDInFile)
-        {
+      {
         tag = DC::TransferSyntaxUID;
-        }
+      }
       else
-        {
+      {
         continue;
-        }
       }
+    }
 
     if (instance >= 0)
-      {
+    {
       meta->SetAttributeValue(instance, tag, iter->GetValue());
-      }
+    }
     else
-      {
+    {
       meta->SetAttributeValue(tag, iter->GetValue());
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -839,10 +916,10 @@ void vtkDICOMDirectory::FillImageRecord(
 
   const DC::EnumType *tag = tags;
   while (*tag != DC::ItemDelimitationItem)
-    {
+  {
     item->SetAttributeValue(*tag, meta->GetAttributeValue(*tag));
     tag++;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -862,10 +939,10 @@ void vtkDICOMDirectory::FillSeriesRecord(
 
   const DC::EnumType *tag = tags;
   while (*tag != DC::ItemDelimitationItem)
-    {
+  {
     item->SetAttributeValue(*tag, meta->GetAttributeValue(*tag));
     tag++;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -887,10 +964,10 @@ void vtkDICOMDirectory::FillStudyRecord(
 
   const DC::EnumType *tag = tags;
   while (*tag != DC::ItemDelimitationItem)
-    {
+  {
     item->SetAttributeValue(*tag, meta->GetAttributeValue(*tag));
     tag++;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -908,10 +985,31 @@ void vtkDICOMDirectory::FillPatientRecord(
 
   const DC::EnumType *tag = tags;
   while (*tag != DC::ItemDelimitationItem)
-    {
+  {
     item->SetAttributeValue(*tag, meta->GetAttributeValue(*tag));
     tag++;
-    }
+  }
+}
+
+//----------------------------------------------------------------------------
+namespace {
+
+unsigned int vtkDICOMDirectoryHashString(const std::string& str)
+{
+  // Compute a string hash based on the function "djb2".
+  unsigned int h = 5381;
+  size_t n = str.size();
+  const char *cp = str.data();
+  for (size_t k = 0; k < n; k++)
+  {
+    unsigned char c = cp[k];
+    if (c == '\0') { break; }
+    h = (h << 5) + h + c;
+  }
+
+  return h;
+}
+
 }
 
 //----------------------------------------------------------------------------
@@ -967,24 +1065,24 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
   for (const DC::EnumType *tagPtr = requiredElements;
        *tagPtr != DC::ItemDelimitationItem;
        ++tagPtr)
-    {
+  {
     vtkDICOMVR vr = query->FindDictVR(0, *tagPtr);
     query->SetAttributeValue(*tagPtr, vtkDICOMValue(vr));
-    }
+  }
 
   if (this->Query)
-    {
+  {
     // add elements that the user requested for the query
     vtkDICOMDataElementIterator iter = this->Query->Begin();
     vtkDICOMDataElementIterator iterEnd = this->Query->End();
     while (iter != iterEnd)
-      {
+    {
       query->SetAttributeValue(iter->GetTag(), iter->GetValue());
       ++iter;
-      }
+    }
     // use a buffer size equal to one disk block
     parser->SetBufferSize(4096);
-    }
+  }
 
   parser->SetQuery(query);
 
@@ -992,19 +1090,66 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
   SeriesInfoList::iterator li;
 
   vtkIdType numberOfStrings = input->GetNumberOfValues();
+
+  // Hash table for efficiently checking for duplicates
+  typedef std::vector<vtkIdType> rowType;
+  typedef std::vector<rowType> tableType;
+  tableType dupcheck(numberOfStrings/4 + 1);
+  std::vector<std::string> realnames;
+  realnames.reserve(numberOfStrings);
+
   for (vtkIdType j = 0; j < numberOfStrings; j++)
-    {
+  {
     const std::string& fileName = input->GetValue(j);
 
+    // Check to see if this file name has already appeared, this is
+    // done with a hash table and is an O(n) check, which is better
+    // than using std::map at O(n log n) or brute-force at O(n^2)
+    realnames.push_back(vtkDICOMFilePath(fileName).GetRealPath());
+    const std::string& realname = realnames.back();
+    unsigned int hash = vtkDICOMDirectoryHashString(realname);
+    hash = hash % dupcheck.size();
+    rowType& row = dupcheck[hash];
+    rowType::iterator iter = row.begin();
+    for (; iter != row.end(); ++iter)
+    {
+      if (realnames[*iter] == realname)
+      {
+        break;
+      }
+    }
+    if (iter != row.end())
+    {
+      continue;
+    }
+    row.push_back(j);
+
     // Skip anything that does not look like a DICOM file.
     if (!vtkDICOMUtilities::IsDICOMFile(fileName.c_str()))
+    {
+      int code = vtkDICOMFile::Access(fileName.c_str(), vtkDICOMFile::In);
+      if (code == vtkDICOMFile::FileNotFound)
       {
-      if (!vtksys::SystemTools::FileExists(fileName.c_str()))
-        {
         vtkWarningMacro("File does not exist: " << fileName.c_str());
-        }
-      continue;
       }
+      else if (code == vtkDICOMFile::AccessDenied)
+      {
+        vtkWarningMacro("File permission denied: " << fileName.c_str());
+      }
+      else if (code == vtkDICOMFile::FileIsDirectory)
+      {
+        vtkWarningMacro("File is a directory: " << fileName.c_str());
+      }
+      else if (code == vtkDICOMFile::ImpossiblePath)
+      {
+        vtkWarningMacro("Bad file path: " << fileName.c_str());
+      }
+      else if (code != 0)
+      {
+        vtkWarningMacro("Unknown file error: " << fileName.c_str());
+      }
+      continue;
+    }
 
     // Read the file metadata
     meta->Initialize();
@@ -1012,38 +1157,38 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
     parser->SetFileName(fileName.c_str());
     parser->Update();
     if (!parser->GetPixelDataFound())
-      {
+    {
       if (!this->ErrorCode)
-        {
+      {
         this->ErrorCode = parser->GetErrorCode();
-        }
+      }
       if (this->ErrorCode || this->RequirePixelData)
-        {
+      {
         continue;
-        }
       }
+    }
 
     // Check for abort and update progress at 1% intervals
     if (!this->AbortExecute)
-      {
+    {
       double progress = (j + 1.0)/numberOfStrings;
       if (progress == 1.0 || progress > this->GetProgress() + 0.01)
-        {
+      {
         progress = static_cast<int>(progress*100.0)/100.0;
         this->UpdateProgress(progress);
-        }
       }
+    }
     if (this->AbortExecute)
-      {
+    {
       return;
-      }
+    }
 
     // Check if the file matches the query
     bool queryMatched = (!this->Query || parser->GetQueryMatched());
     if (!queryMatched && this->FindLevel == vtkDICOMDirectory::IMAGE)
-      {
+    {
       continue;
-      }
+    }
 
     // Insert the file into the sorted list
     FileInfo fileInfo;
@@ -1078,7 +1223,7 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
 
     bool foundSeries = false;
     for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
-      {
+    {
       // Compare patient, then study, then series.
       const char *patientName2 = li->PatientName.GetCharData();
       patientName2 = (patientName2 ? patientName2 : "");
@@ -1086,48 +1231,48 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
       patientID2 = (patientID2 ? patientID2 : "");
       int c = strcmp(patientID2, patientID);
       if (c != 0 || patientID[0] == '\0')
-        {
+      {
         // Use ID to identify patient, but use name to sort.
         int c2 = strcmp(patientName2, patientName);
         c = (c2 == 0 ? c : c2);
-        }
+      }
       if (c == 0)
-        {
+      {
         c = vtkDICOMUtilities::CompareUIDs(
           studyUID, li->StudyUID.GetCharData());
         if (c != 0 || studyUID == 0)
-          {
+        {
           // Use UID to identify study, but use date to sort.
           int c2 = 0;
           const char *studyDate2 = li->StudyDate.GetCharData();
           if (studyDate && studyDate2)
-            {
+          {
             c2 = strcmp(studyDate2, studyDate);
             if (c2 == 0)
-              {
+            {
               const char *studyTime2 = li->StudyTime.GetCharData();
               if (studyTime2 && studyTime)
-                {
+              {
                 c2 = strcmp(studyTime, studyTime2);
-                }
               }
             }
-          c = (c2 == 0 ? c : c2);
           }
+          c = (c2 == 0 ? c : c2);
+        }
         if (c == 0)
-          {
+        {
           c = vtkDICOMUtilities::CompareUIDs(
             seriesUID, li->SeriesUID.GetCharData());
           if (c != 0 || seriesUID == 0)
-            {
+          {
             // Use UID to identify series, but use series number to sort.
             int c2 = li->SeriesNumber - seriesNumber;
             c = (c2 == 0 ? c : c2);
-            }
           }
         }
+      }
       if (c == 0 && seriesUID != 0)
-        {
+      {
         std::vector<FileInfo>::iterator pos =
           li->Files.insert(
             std::upper_bound(li->Files.begin(), li->Files.end(), fileInfo,
@@ -1136,15 +1281,15 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
         li->QueryMatched |= queryMatched;
         foundSeries = true;
         break;
-        }
+      }
       else if (c >= 0)
-        {
+      {
         break;
-        }
       }
+    }
 
     if (!foundSeries)
-      {
+    {
       li = sortedFiles.insert(li, SeriesInfo());
       li->PatientName = patientNameValue;
       li->PatientID = patientIDValue;
@@ -1158,8 +1303,8 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
       this->FillStudyRecord(&li->StudyRecord, meta);
       this->FillSeriesRecord(&li->SeriesRecord, meta);
       this->FillImageRecord(&li->Files.back().ImageRecord, meta);
-      }
     }
+  }
 
   // Visit each series and call AddSeriesFileNames
   int patientCount = this->GetNumberOfPatients();
@@ -1169,23 +1314,23 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
   vtkDICOMValue lastPatientID;
 
   for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
-    {
+  {
     SeriesInfo &v = *li;
     if (!v.QueryMatched) { continue; }
 
     // Is this a new patient or a new study?
     if (!lastPatientID.IsValid() || v.PatientID != lastPatientID)
-      {
+    {
       lastPatientID = v.PatientID;
       patientCount++;
       lastStudyUID = v.StudyUID;
       studyCount++;
-      }
+    }
     else if (!lastStudyUID.IsValid() || v.StudyUID != lastStudyUID)
-      {
+    {
       lastStudyUID = v.StudyUID;
       studyCount++;
-      }
+    }
 
     vtkSmartPointer<vtkStringArray> sa =
       vtkSmartPointer<vtkStringArray>::New();
@@ -1193,14 +1338,14 @@ void vtkDICOMDirectory::SortFiles(vtkStringArray *input)
     sa->SetNumberOfValues(n);
     std::vector<const vtkDICOMItem *> imageRecords(n);
     for (vtkIdType i = 0; i < n; i++)
-      {
+    {
       sa->SetValue(i, v.Files[i].FileName);
       imageRecords[i] = &v.Files[i].ImageRecord;
-      }
+    }
     this->AddSeriesFileNames(
       patientCount-1, studyCount-1, sa,
       v.PatientRecord, v.StudyRecord, v.SeriesRecord, &imageRecords[0]);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1218,7 +1363,7 @@ std::string DecompressUID(const std::string& s)
   size_t n = s.length();
   size_t m = 0;
   for (size_t i = 0; i < n && i < 32; i++)
-    {
+  {
     unsigned char c = s[i];
     c >>= 4;
     if (c == 0) { break; }
@@ -1231,7 +1376,7 @@ std::string DecompressUID(const std::string& s)
     c += ('0' - 1);
     if (c > '9') { c = '.'; }
     uid[m++] = c;
-    }
+  }
   return std::string(uid, m);
 }
 
@@ -1245,29 +1390,28 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
     vtkSmartPointer<vtkSQLiteDatabase>::New();
   dbase->SetDatabaseFileName(fname);
   if (!dbase->Open("", vtkSQLiteDatabase::USE_EXISTING))
-    {
+  {
     vtkErrorMacro("Unable to open database file " << fname);
     return;
-    }
+  }
 
   // Make sure this is an OsiriX database file.
   vtkStringArray *tables = dbase->GetTables();
   int count = 0;
   for (vtkIdType i = 0; i < tables->GetNumberOfValues(); i++)
-    {
+  {
     std::string s = tables->GetValue(i);
     count += (s == "ZSTUDY" || s == "ZSERIES" || s == "ZIMAGE");
-    }
+  }
   if (count != 3)
-    {
+  {
     return;
-    }
+  }
 
   // Create the path to DATABASE.noindex, where .dcm files are stored
-  std::vector<std::string> path;
-  vtksys::SystemTools::SplitPath(fname, path);
-  path.pop_back();
-  path.push_back("DATABASE.noindex");
+  vtkDICOMFilePath path(fname);
+  path.PopBack();
+  path.PushBack("DATABASE.noindex");
 
   vtkSQLQuery *q = dbase->GetQueryInstance();
 
@@ -1305,46 +1449,46 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
                    "ZACCESSIONNUMBER,ZPATIENTSEX,ZPATIENTID from ZSTUDY"
                    " order by ZDATE") ||
       !q->Execute())
-    {
+  {
     vtkErrorMacro("Badly structured ZSTUDY table: " << fname);
     q->CommitTransaction();
     q->Delete();
     return;
-    }
+  }
 
   while (q->NextRow())
-    {
+  {
     studyTable.push_back(StudyRow());
     StudyRow *row = &studyTable.back();
     for (int k = 0; k < ST_NCOLS; k++)
-      {
+    {
       row->col[k] = q->DataValue(k);
-      }
     }
+  }
 
   // Read the series table
   if (!q->SetQuery("select Z_PK,ZID,ZDATE,ZSERIESSOPCLASSUID,"
                    "ZMODALITY,ZNAME,ZSERIESDICOMUID,ZSERIESDESCRIPTION,"
                    "ZSTUDY from ZSERIES order by ZSTUDY,ZID") ||
       !q->Execute())
-    {
+  {
     vtkErrorMacro("Badly structured ZSERIES table: " << fname);
     q->CommitTransaction();
     q->Delete();
     return;
-    }
+  }
 
   std::vector<vtkTypeInt64> zseriesVec;
   while (q->NextRow())
-    {
+  {
     seriesTable.push_back(SeriesRow());
     SeriesRow *row = &seriesTable.back();
     for (int k = 0; k < SE_NCOLS; k++)
-      {
+    {
       row->col[k] = q->DataValue(k);
-      }
-    zseriesVec.push_back(q->DataValue(SE_NCOLS).ToTypeInt64());
     }
+    zseriesVec.push_back(q->DataValue(SE_NCOLS).ToTypeInt64());
+  }
 
   // Read the image table
   if (!q->SetQuery("select ZINSTANCENUMBER,ZFRAMEID,ZPATHNUMBER,"
@@ -1353,24 +1497,24 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
                    " from ZIMAGE order by"
                    " ZSERIES,ZINSTANCENUMBER") ||
       !q->Execute())
-    {
+  {
     vtkErrorMacro("Badly structured IMAGE table: " << fname);
     q->CommitTransaction();
     q->Delete();
     return;
-    }
+  }
 
   std::vector<vtkTypeInt64> zimageVec;
   while (q->NextRow())
-    {
+  {
     imageTable.push_back(ImageRow());
     ImageRow *row = &imageTable.back();
     for (int k = 0; k < IM_NCOLS; k++)
-      {
+    {
       row->col[k] = q->DataValue(k);
-      }
-    zimageVec.push_back(q->DataValue(IM_NCOLS).ToTypeInt64());
     }
+    zimageVec.push_back(q->DataValue(IM_NCOLS).ToTypeInt64());
+  }
 
   // Close the database and delete it by setting the smart pointer to NULL.
   // Calling CommitTransaction doesn't write anything, because only SELECT
@@ -1384,18 +1528,18 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
 
   // Check for abort.
   if (!this->AbortExecute)
-    {
+  {
     this->UpdateProgress(0.0);
-    }
+  }
   if (this->AbortExecute)
-    {
+  {
     return;
-    }
+  }
 
   // Go through all of the studies
   for (std::vector<StudyRow>::iterator st = studyTable.begin();
        st != studyTable.end(); ++st)
-    {
+  {
     vtkDICOMItem patientItem;
     vtkDICOMItem studyItem;
     vtkTypeInt64 zstudy = st->col[ST_PK].ToTypeInt64();
@@ -1439,28 +1583,28 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
     int firstUnusedPatientIdx = this->GetNumberOfPatients();
     // Loop until corrent patientIdx is found
     for (patientIdx = 0; patientIdx < firstUnusedPatientIdx; patientIdx++)
-      {
+    {
       const vtkDICOMItem& pitem = this->GetPatientRecord(patientIdx);
       const vtkDICOMValue& vid = pitem.GetAttributeValue(DC::PatientID);
       if (vid.IsValid() && vid.GetVL() > 0)
-        {
+      {
         if (patientID.length() > 0 && vid.Matches(patientID.c_str()))
-          {
+        {
           break;
-          }
         }
+      }
       else // Use PatientName if PatientID is empty
-        {
+      {
         const vtkDICOMValue& vna = pitem.GetAttributeValue(DC::PatientName);
         if (vna.IsValid() && vna.GetVL() > 0)
-          {
+        {
           if (name.length() > 0 && vna.Matches(name.c_str()))
-            {
+          {
             break;
-            }
           }
         }
       }
+    }
 
     // Search for the first series in the study
     std::vector<vtkTypeInt64>::iterator zseriesVecIter =
@@ -1470,12 +1614,12 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
     // Go through all of the series in the study
     for (std::vector<SeriesRow>::iterator se = seriesTable.begin() + seIdx;
          se != seriesTable.end(); ++se)
-      {
+    {
       // Break when we find a series that isn't part of the study
       if (*zseriesVecIter > zstudy)
-        {
+      {
         break;
-        }
+      }
       ++zseriesVecIter;
 
       vtkDICOMItem seriesItem;
@@ -1490,13 +1634,13 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
       size_t k = 0;
       while (k < seriesUID.length() &&
              (seriesUID[k] <= '0' || seriesUID[k] >= '9'))
-        {
+      {
         k++;
-        }
+      }
       if (k > 0)
-        {
+      {
         seriesUID = seriesUID.substr(k, seriesUID.length()-k);
-        }
+      }
 
       seriesItem.SetAttributeValue(
         DC::SpecificCharacterSet, vtkDICOMCharacterSet::ISO_IR_192);
@@ -1526,42 +1670,42 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
       // Go through all of the images in the series
       for (std::vector<ImageRow>::iterator im = imageTable.begin() + imIdx;
            im != imageTable.end(); ++im)
-        {
+      {
         // Break when we find a series that isn't part of the study
         if (*zimageVecIter > zseries)
-          {
+        {
           break;
-          }
+        }
         ++zimageVecIter;
 
         std::string fpath = im->col[IM_PATHSTRING].ToString();
         if (fpath.length() == 0)
-          {
+        {
           // no PATHSTRING, so use PATHNUMBER instead
           vtkTypeInt64 fnum = im->col[IM_PATHNUMBER].ToTypeInt64();
           vtkTypeInt64 dnum = (fnum/10000 + 1)*10000;
           vtkVariant fv(fnum);
           vtkVariant dv(dnum);
-          path.push_back(dv.ToString());
-          path.push_back(fv.ToString() + ".dcm");
-          fpath = vtksys::SystemTools::JoinPath(path);
-          path.pop_back();
-          path.pop_back();
-          }
+          path.PushBack(dv.ToString());
+          path.PushBack(fv.ToString() + ".dcm");
+          fpath = path.AsString();
+          path.PopBack();
+          path.PopBack();
+        }
         else if (fpath[0] != '/')
-          {
+        {
           // PATHSTRING is a local path, not an absolute path
           vtkTypeInt64 fnum = atol(fpath.c_str());
           vtkTypeInt64 dnum = (fnum/10000 + 1)*10000;
           vtkVariant dv(dnum);
-          path.push_back(dv.ToString());
-          path.push_back(fpath);
-          fpath = vtksys::SystemTools::JoinPath(path);
-          path.pop_back();
-          path.pop_back();
-          }
+          path.PushBack(dv.ToString());
+          path.PushBack(fpath);
+          fpath = path.AsString();
+          path.PopBack();
+          path.PopBack();
+        }
         if (fpath != lastpath)
-          {
+        {
           // Add the path to the list of filenames
           vtkDICOMItem imageRecord;
           imageRecord.SetAttributeValue(DC::SOPClassUID, sopClassUID);
@@ -1577,22 +1721,22 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
           imageRecordSequence.AddItem(imageRecord);
           fileNames->InsertNextValue(fpath);
           lastpath = fpath;
-          }
+        }
 
         // Increment the progress counter.
         imageCounter++;
-        }
+      }
 
       // Add the series if it passes the query
       size_t n = imageRecordSequence.GetNumberOfItems();
       if (n > 0)
-        {
+      {
         const vtkDICOMItem *data = imageRecordSequence.GetSequenceData();
         std::vector<const vtkDICOMItem *> imageRecords(n);
         for (size_t i = 0; i < n; i++)
-          {
+        {
           imageRecords[i] = &data[i];
-          }
+        }
 
         // Set a flag to indicate that loose matching is needed, because
         // the Osirix database "cleans" certain attribute value strings
@@ -1603,24 +1747,24 @@ void vtkDICOMDirectory::ProcessOsirixDatabase(const char *fname)
           patientItem, studyItem, seriesItem, &imageRecords[0]);
 
         this->UsingOsirixDatabase = false;
-        }
+      }
 
       // Check for abort and update progress at 1% intervals
       if (!this->AbortExecute)
-        {
+      {
         double progress = (imageCounter + 1.0)/imageTable.size();
         if (progress == 1.0 || progress > this->GetProgress() + 0.01)
-          {
+        {
           progress = static_cast<int>(progress*100.0)/100.0;
           this->UpdateProgress(progress);
-          }
         }
+      }
       if (this->AbortExecute)
-        {
+      {
         return;
-        }
       }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1629,24 +1773,24 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
 {
   // Get the ID of this file set (informative only).
   if (meta->HasAttribute(DC::FileSetID))
-    {
+  {
     std::string fileSetID = meta->GetAttributeValue(DC::FileSetID).AsString();
     this->FileSetID = new char[fileSetID.length() + 1];
     strcpy(this->FileSetID, fileSetID.c_str());
-    }
+  }
 
   // Get the directory as a sequence.
   const vtkDICOMValue& seq =
     meta->GetAttributeValue(DC::DirectoryRecordSequence);
-  unsigned int n = seq.GetNumberOfValues();
+  unsigned int n = static_cast<unsigned int>(seq.GetNumberOfValues());
   const vtkDICOMItem *items = seq.GetSequenceData();
 
   // The DICOMDIR uses byte offsets to identify items in the sequence.
   std::map<unsigned int, unsigned int> offsetToIndexMap;
   for (unsigned int i = 0; i < n; i++)
-    {
+  {
     offsetToIndexMap[items[i].GetByteOffset()] = i;
-    }
+  }
 
   // Get the first entry.
   unsigned int offset =
@@ -1656,22 +1800,22 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
 
   // This check is just for insurance.
   if (offset == 0 && n > 0)
-    {
+  {
     offset = items[0].GetByteOffset();
-    }
+  }
 
   // To track progress, count number of items processed.
   unsigned int itemCounter = 0;
 
   // Check for abort.
   if (!this->AbortExecute)
-    {
+  {
     this->UpdateProgress(0.0);
-    }
+  }
   if (this->AbortExecute)
-    {
+  {
     return;
-    }
+  }
 
   // A stack to track the directory level.
   std::vector<std::pair<unsigned int, std::string> > offsetStack;
@@ -1686,28 +1830,19 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
     vtkSmartPointer<vtkStringArray>::New();
   std::vector<const vtkDICOMItem *> imageRecords;
 
-  // Path broken into components.
-  std::vector<std::string> path;
-  vtksys::SystemTools::SplitPath(dirname, path);
-  if (path.size() > 0 && path.back() == "")
-    {
-    path.pop_back();
-    }
-  size_t pathDepth = path.size();
-
   // The entry type that is currently being processed.
   std::string entryType;
 
   // Go through the directory, using the "next" and "child" pointers.
   while (offset != 0)
-    {
+  {
     unsigned int offsetOfChild = 0;
     std::map<unsigned int, unsigned int>::iterator iter =
       offsetToIndexMap.find(offset);
     offset = 0;
 
     if (iter != offsetToIndexMap.end() && iter->second != 0xffffffffu)
-      {
+    {
       // Get the item index, mark the item as used.
       unsigned int j = iter->second;
       iter->second = 0xffffffffu;
@@ -1722,68 +1857,88 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
         DC::DirectoryRecordType).AsString();
 
       if (entryType == "PATIENT")
-        {
+      {
         patientItem = j;
-        }
+      }
       else if (entryType == "STUDY")
-        {
+      {
         studyItem = j;
-        }
+      }
       else if (entryType == "SERIES")
-        {
+      {
         seriesItem = j;
-        }
+      }
       else if (entryType == "IMAGE" || !this->RequirePixelData)
-        {
+      {
         const vtkDICOMValue& fileID =
           items[j].GetAttributeValue(DC::ReferencedFileID);
         if (fileID.IsValid())
-          {
-          unsigned int m = fileID.GetNumberOfValues();
+        {
+          size_t m = fileID.GetNumberOfValues();
           if (m > 0)
+          {
+            vtkDICOMFilePath path(dirname);
+            for (size_t k = 0; k < m; k++)
             {
-            for (unsigned int k = 0; k < m; k++)
+              path.PushBack(fileID.GetString(k));
+            }
+            vtkIdType ki = fileNames->InsertNextValue(path.AsString());
+            imageRecords.push_back(&items[j]);
+            // sort the files by instance number, they will almost always
+            // already be in order so we use a simple algorithm
+            int inst = items[j].GetAttributeValue(DC::InstanceNumber).AsInt();
+            while (ki > 0)
+            {
+              const vtkDICOMItem *prev = imageRecords[--ki];
+              int inst2 = prev->GetAttributeValue(DC::InstanceNumber).AsInt();
+              if (inst < inst2)
               {
-              path.push_back(fileID.GetString(k));
+                std::string s = fileNames->GetValue(ki + 1);
+                fileNames->SetValue(ki + 1, fileNames->GetValue(ki));
+                fileNames->SetValue(ki, s);
+                std::swap(imageRecords[ki], imageRecords[ki + 1]);
+              }
+              else
+              {
+                // sorting is finished!
+                break;
               }
-            fileNames->InsertNextValue(vtksys::SystemTools::JoinPath(path));
-            path.resize(pathDepth);
-            imageRecords.push_back(&items[j]);
             }
           }
         }
       }
+    }
 
     if (offsetOfChild != 0)
-      {
+    {
       // Go up one directory level.
       offsetStack.push_back(std::make_pair(offset, entryType));
       offset = offsetOfChild;
-      }
+    }
     else
-      {
+    {
       // Pop the stack until the next offset is not zero.
       while (offset == 0 && offsetStack.size() > 0)
-        {
+      {
         // Go down one directory level.
         offset = offsetStack.back().first;
         entryType = offsetStack.back().second;
         offsetStack.pop_back();
 
         if (entryType == "PATIENT")
-          {
+        {
           // Get current max patient index plus one
           patientIdx = this->GetNumberOfPatients();
-          }
+        }
         else if (entryType == "STUDY")
-          {
+        {
           // Get current max study index plus one
           studyIdx = this->GetNumberOfStudies();
-          }
+        }
         else if (entryType == "SERIES")
-          {
+        {
           if (!imageRecords.empty())
-            {
+          {
             // Add the series if it passes the query
             this->AddSeriesWithQuery(
               patientIdx, studyIdx, fileNames,
@@ -1792,27 +1947,27 @@ void vtkDICOMDirectory::ProcessDirectoryFile(
 
             fileNames = vtkSmartPointer<vtkStringArray>::New();
             imageRecords.clear();
-            }
           }
         }
       }
+    }
 
     // Check for abort and update progress at 1% intervals
     if (!this->AbortExecute)
-      {
+    {
       double progress = (itemCounter + 1.0)/n;
       if (progress == 1.0 || progress > this->GetProgress() + 0.01)
-        {
+      {
         progress = static_cast<int>(progress*100.0)/100.0;
         this->UpdateProgress(progress);
-        }
       }
+    }
     if (this->AbortExecute)
-      {
+    {
       return;
-      }
-    ++itemCounter;
     }
+    ++itemCounter;
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1821,38 +1976,33 @@ void vtkDICOMDirectory::ProcessDirectory(
 {
   // Check if the directory has been visited yet.  This avoids infinite
   // recursion when following circular links.
-  std::string realname = vtksys::SystemTools::GetRealPath(dirname);
+  std::string realname = vtkDICOMFilePath(dirname).GetRealPath();
   std::vector<std::string>::iterator viter =
     std::lower_bound(this->Visited->begin(), this->Visited->end(), realname);
   if (viter == this->Visited->end() || *viter != realname)
-    {
+  {
     // Add this directory to the "visited" list.
     this->Visited->insert(viter, realname);
-    }
+  }
   else
-    {
+  {
     // This directory has already been visited.
     return;
-    }
+  }
 
   // Find the path to the directory.
-  std::vector<std::string> path;
-  vtksys::SystemTools::SplitPath(dirname, path);
-  if (path.size() > 0 && path.back() == "")
-    {
-    path.pop_back();
-    }
+  vtkDICOMFilePath path(dirname);
 
   if (depth == this->ScanDepth)
-    {
+  {
     // Build the path to the DICOMDIR file.
-    path.push_back("DICOMDIR");
-    std::string dicomdir = vtksys::SystemTools::JoinPath(path);
-    path.pop_back();
+    path.PushBack("DICOMDIR");
+    std::string dicomdir = path.AsString();
+    path.PopBack();
 
     // Check to see if the DICOMDIR file exists.
-    if (vtksys::SystemTools::FileExists(dicomdir.c_str(), true))
-      {
+    if (vtkDICOMFile::Access(dicomdir.c_str(), vtkDICOMFile::In) == 0)
+    {
       vtkSmartPointer<vtkDICOMMetaData> meta =
         vtkSmartPointer<vtkDICOMMetaData>::New();
       vtkDICOMParser *parser = vtkDICOMParser::New();
@@ -1866,78 +2016,88 @@ void vtkDICOMDirectory::ProcessDirectory(
       parser->Delete();
 
       if (errorCode && depth == 0)
-        {
+      {
         // Only fail if depth is zero.  Otherwise, we can ignore the
         // DICOMDIR and look for the DICOM files directly.
         this->ErrorCode = errorCode;
         return;
-        }
+      }
       else if (errorCode == 0)
-        {
+      {
         // Process the DICOMDIR file.
         this->ProcessDirectoryFile(dirname, meta);
         return;
-        }
       }
     }
+  }
 
   // If depth is zero, recursion is complete.
   if (depth <= 0)
-    {
+  {
     return;
-    }
+  }
 
   // Check for abort.
   if (!this->AbortExecute)
-    {
+  {
     this->UpdateProgress(0.0);
-    }
+  }
   if (this->AbortExecute)
-    {
+  {
     return;
-    }
+  }
 
-  vtksys::Directory d;
-  if (!d.Load(dirname))
-    {
+  vtkDICOMFileDirectory d(dirname);
+  if (d.GetError() != 0)
+  {
     // Only fail at the initial depth.
     if (depth == this->ScanDepth)
-      {
+    {
       vtkErrorMacro(<< "Could not read directory " << dirname);
       this->ErrorCode = vtkErrorCode::CannotOpenFileError;
       return;
-      }
     }
+  }
 
-  unsigned long n = d.GetNumberOfFiles();
-  for (unsigned long i = 0; i < n; i++)
-    {
+  int n = d.GetNumberOfFiles();
+  for (int i = 0; i < n; i++)
+  {
     const char *fname = d.GetFile(i);
-    if (fname[0] != '.' && strcmp(fname, "DICOMDIR") != 0)
+    if ((fname[0] != '.' || (fname[1] != '\0' &&
+         (fname[1] != '.' || fname[2] != '\0'))) &&
+        strcmp(fname, "DICOMDIR") != 0)
+    {
+      path.PushBack(fname);
+      std::string fileString = path.AsString();
+      path.PopBack();
+      if (!this->FollowSymlinks && d.IsSymlink(i))
       {
-      path.push_back(fname);
-      std::string fileString = vtksys::SystemTools::JoinPath(path);
-      path.pop_back();
-      if (!this->FollowSymlinks &&
-          vtksys::SystemTools::FileIsSymlink(fileString.c_str()))
-        {
         // Do nothing unless FollowSymlinks is On
-        }
-      else if (vtksys::SystemTools::FileIsDirectory(fileString.c_str()))
-        {
+      }
+#ifdef _WIN32
+      else if (!this->ShowHidden && d.IsHidden(i))
+#else
+      else if (!this->ShowHidden && (d.IsHidden(i) || fname[0] == '.'))
+#endif
+      {
+        // Do nothing for hidden files unless ShowHidden is On
+        // (on Linux and OS X, consider "." files to be hidden)
+      }
+      else if (d.IsDirectory(i))
+      {
         if (depth > 1)
-          {
+        {
           this->ProcessDirectory(fileString.c_str(), depth-1, files);
-          }
         }
+      }
       else if (this->FilePattern == 0 || this->FilePattern[0] == '\0' ||
                vtkDICOMUtilities::PatternMatches(
                  this->FilePattern, fileString.c_str()))
-        {
+      {
         files->InsertNextValue(fileString);
-        }
       }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1958,68 +2118,110 @@ void vtkDICOMDirectory::Execute()
     vtkSmartPointer<vtkStringArray>::New();
 
   if (this->InputFileNames)
-    {
+  {
     for (vtkIdType i = 0; i < this->InputFileNames->GetNumberOfValues(); i++)
-      {
+    {
       const std::string& fname = this->InputFileNames->GetValue(i);
-      if (vtksys::SystemTools::FileIsDirectory(fname.c_str()))
-        {
+      int code = vtkDICOMFile::Access(fname.c_str(), vtkDICOMFile::In);
+      if (code == vtkDICOMFile::FileIsDirectory)
+      {
         this->ProcessDirectory(fname.c_str(), this->ScanDepth, files);
-        }
-      else if (!vtksys::SystemTools::FileExists(fname.c_str()))
-        {
+      }
+      else if (code == vtkDICOMFile::FileNotFound)
+      {
+        this->ErrorCode = vtkErrorCode::FileNotFoundError;
         vtkErrorMacro("File or directory not found: " << fname.c_str());
         return;
-        }
+      }
+      else if (code == vtkDICOMFile::AccessDenied)
+      {
+        this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+        vtkErrorMacro("Permission denied: " << fname.c_str());
+        return;
+      }
+      else if (code == vtkDICOMFile::ImpossiblePath)
+      {
+        this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+        vtkErrorMacro("Bad file path: " << fname.c_str());
+        return;
+      }
+      else if (code != 0)
+      {
+        this->ErrorCode = vtkErrorCode::UnknownError;
+        vtkErrorMacro("Unknown file error: " << fname.c_str());
+        return;
+      }
       else if (vtkDICOMUtilities::PatternMatches("*.sql", fname.c_str()))
-        {
+      {
         this->ProcessOsirixDatabase(fname.c_str());
-        }
+      }
       else if (this->FilePattern == 0 || this->FilePattern[0] == '\0' ||
                vtkDICOMUtilities::PatternMatches(
                  this->FilePattern, fname.c_str()))
-        {
+      {
         files->InsertNextValue(fname);
-        }
       }
     }
+  }
   else
-    {
+  {
     if (this->DirectoryName == 0)
-      {
+    {
       // No directory is a valid input.  Return an empty output.
       return;
-      }
-    else if (!vtksys::SystemTools::FileExists(this->DirectoryName))
-      {
+    }
+
+    int code = vtkDICOMFile::Access(this->DirectoryName, vtkDICOMFile::In);
+    if (code == vtkDICOMFile::FileIsDirectory)
+    {
+      this->ProcessDirectory(this->DirectoryName, this->ScanDepth, files);
+    }
+    else if (code == vtkDICOMFile::FileNotFound)
+    {
       this->ErrorCode = vtkErrorCode::FileNotFoundError;
       vtkErrorMacro("Directory not found: " << this->DirectoryName);
       return;
-      }
-    else if (!vtksys::SystemTools::FileIsDirectory(this->DirectoryName))
-      {
+    }
+    else if (code == vtkDICOMFile::AccessDenied)
+    {
+      this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+      vtkErrorMacro("Permission denied: " << this->DirectoryName);
+      return;
+    }
+    else if (code == vtkDICOMFile::ImpossiblePath)
+    {
+      this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+      vtkErrorMacro("Bad file path: " << this->DirectoryName);
+      return;
+    }
+    else if (code != 0)
+    {
+      this->ErrorCode = vtkErrorCode::UnknownError;
+      vtkErrorMacro("Unknown error: " << this->DirectoryName);
+      return;
+    }
+    else
+    {
       this->ErrorCode = vtkErrorCode::CannotOpenFileError;
       vtkErrorMacro("Found a file, not a directory: " << this->DirectoryName);
       return;
-      }
-
-    this->ProcessDirectory(this->DirectoryName, this->ScanDepth, files);
     }
+  }
 
   // Check for abort.
   if (!this->AbortExecute)
-    {
+  {
     this->UpdateProgress(0.0);
-    }
+  }
   if (this->AbortExecute)
-    {
+  {
     return;
-    }
+  }
 
   if (files->GetNumberOfValues() > 0)
-    {
+  {
     this->SortFiles(files);
-    }
+  }
 
   this->InvokeEvent(vtkCommand::EndEvent);
 }
@@ -2030,57 +2232,57 @@ void vtkDICOMDirectory::Update(int)
   this->AbortExecute = 0;
 
   if (this->GetMTime() > this->UpdateTime.GetMTime())
-    {
+  {
     this->Execute();
     this->UpdateTime.Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMDirectory::SetInternalFileName(const char *name)
 {
   if (this->InternalFileName == NULL && name == NULL)
-    {
+  {
     return;
-    }
+  }
   if (this->InternalFileName != 0 && name != 0 &&
       strcmp(this->InternalFileName, name) == 0)
-    {
+  {
     return;
-    }
+  }
   if (this->InternalFileName)
-    {
+  {
     delete [] this->InternalFileName;
-    }
+  }
   if (name)
-    {
+  {
     size_t n = strlen(name) + 1;
     char *cp1 =  new char[n];
     const char *cp2 = (name);
     this->InternalFileName = cp1;
     do { *cp1++ = *cp2++; } while (--n);
-    }
+  }
   else
-    {
+  {
     this->InternalFileName = 0;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMDirectory::RelayError(vtkObject *o, unsigned long e, void *data)
 {
   if (e == vtkCommand::ErrorEvent)
-    {
+  {
     vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o);
     if (parser)
-      {
+    {
       this->SetErrorCode(parser->GetErrorCode());
       this->SetInternalFileName(parser->GetFileName());
-      }
-    vtkErrorMacro(<< static_cast<char *>(data));
     }
+    vtkErrorMacro(<< static_cast<char *>(data));
+  }
   else
-    {
+  {
     this->InvokeEvent(e, data);
-    }
+  }
 }
diff --git a/Source/vtkDICOMDirectory.h b/Source/vtkDICOMDirectory.h
index 0e342aa..e0cb54a 100644
--- a/Source/vtkDICOMDirectory.h
+++ b/Source/vtkDICOMDirectory.h
@@ -41,17 +41,20 @@ public:
     PATIENT, STUDY, SERIES, IMAGE, FRAME
   };
 
+  //@{
   //! Set the input directory.
   /*!
-   *  Set the input directory.  If it has a DICOMDIR file, then that
-   *  file will be scanned to get info about the directory.  Otherwise,
+   *  If the directory has a DICOMDIR file, then that file will be scanned
+   *  to get information about the DICOM files in the directory.  Otherwise,
    *  the directory will be scanned for DICOM files.  The depth of the
    *  scan (how many subdirectories deep) can be controlled with the
    *  SetScanDepth() method.
    */
   void SetDirectoryName(const char *name);
   const char *GetDirectoryName() { return this->DirectoryName; }
+  //@}
 
+  //@{
   //! Set a list of filenames (or files and directories) to read.
   /*!
    *  This can be used as alternative to setting a single input directory.
@@ -59,6 +62,17 @@ public:
   void SetInputFileNames(vtkStringArray *sa);
   vtkStringArray *GetInputFileNames() { return this->InputFileNames; }
 
+  //! Add more filenames to be read.
+  /*!
+   *  This allows the directory to be updated.  The new files can belong to
+   *  an existing series or a new series.  If any of the new files are
+   *  already present in the directory, then nothing will be done for those
+   *  files.
+   */
+  void AddInputFileNames(vtkStringArray *sa);
+  //@}
+
+  //@{
   //! Set a pattern to match for the filenames.
   /*!
    *  For example "*.dcm" will match files ending with ".dcm".  The two
@@ -66,7 +80,9 @@ public:
    */
   void SetFilePattern(const char *pattern);
   const char *GetFilePattern() { return this->FilePattern; }
+  //@}
 
+  //@{
   //! Set the scan depth to use when no DICOMDIR is found.
   /*!
    *  The default scan depth is 1, which scans only the given directory
@@ -75,10 +91,14 @@ public:
    */
   vtkSetMacro(ScanDepth, int);
   int GetScanDepth() { return this->ScanDepth; }
+  //@}
 
+  //@{
   //! Specify a find query.
   void SetFindQuery(const vtkDICOMItem& query);
+  //@}
 
+  //@{
   //! Specify the find level.
   /*!
    *  If this is Series, then the whole series will be found if a single
@@ -90,7 +110,9 @@ public:
   void SetFindLevelToImage() { this->SetFindLevel(IMAGE); }
   void SetFindLevelToSeries() { this->SetFindLevel(SERIES); }
   int GetFindLevel() { return this->FindLevel; }
+  //@}
 
+  //@{
   //! Update the information about the files.
   /*!
    * This method causes the directory to be read.  It must be called before
@@ -98,7 +120,14 @@ public:
    */
   virtual void Update() { this->Update(0); }
   virtual void Update(int);
+#if (VTK_MAJOR_VERSION == 7 && VTK_MINOR_VERSION > 0) || VTK_MAJOR_VERSION > 7
+  virtual int Update(vtkInformation *) { this->Update(); return 1; }
+  virtual int Update(int i, vtkInformationVector *) {
+    this->Update(i); return 1; }
+#endif
+  //@}
 
+  //@{
   //! Get the total number of series that were found.
   int GetNumberOfSeries();
 
@@ -127,7 +156,9 @@ public:
 
   //! Get the studies for this patient.
   vtkIntArray *GetStudiesForPatient(int patient);
+  //@}
 
+  //@{
   //! Get the first series in a particular study.
   int GetFirstSeriesForStudy(int study);
 
@@ -145,13 +176,19 @@ public:
    *  and InstanceNumber for each file.
    */
   vtkDICOMMetaData *GetMetaDataForSeries(int i);
+  //@}
 
+  //@{
   //! Get the file set ID.  This will be NULL unless a DICOMDIR was found.
   const char *GetFileSetID() { return this->FileSetID; }
+  //@}
 
+  //@{
   //! Get the filename associated with the error code.
   const char *GetInternalFileName() { return this->InternalFileName; }
+  //@}
 
+  //@{
   //! If this is On, files with no pixel data will be skipped.
   /*!
    *  This is On by default.  Some files, such as dicom directory files,
@@ -160,11 +197,25 @@ public:
   vtkSetMacro(RequirePixelData, int);
   vtkBooleanMacro(RequirePixelData, int);
   int GetRequirePixelData() { return this->RequirePixelData; }
+  //@}
 
-  //! If On (the default), symbolic links will not be followed.
+  //@{
+  //! If On (the default), symbolic links will be followed.
   vtkSetMacro(FollowSymlinks, int);
   vtkBooleanMacro(FollowSymlinks, int);
   int GetFollowSymlinks() { return this->FollowSymlinks; }
+  //@}
+
+  //@{
+  //! If On (the default), hidden files will be listed.
+  /*!
+   *  A file is hidden if it has a "hidden" attribute set.  On Linux and
+   *  OS X, any file that begins with "." will also be considered "hidden".
+   */
+  vtkSetMacro(ShowHidden, int);
+  vtkBooleanMacro(ShowHidden, int);
+  int GetShowHidden() { return this->ShowHidden; }
+  //@}
 
 protected:
   vtkDICOMDirectory();
@@ -175,6 +226,7 @@ protected:
   const char *FilePattern;
   int RequirePixelData;
   int FollowSymlinks;
+  int ShowHidden;
   int ScanDepth;
 
   vtkTimeStamp UpdateTime;
@@ -269,8 +321,8 @@ protected:
     vtkDICOMMetaData *meta, const vtkDICOMItem *item, int instance);
 
 private:
-  vtkDICOMDirectory(const vtkDICOMDirectory&);  // Not implemented.
-  void operator=(const vtkDICOMDirectory&);  // Not implemented.
+  vtkDICOMDirectory(const vtkDICOMDirectory&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMDirectory&) VTK_DELETE_FUNCTION;
 
   struct SeriesItem;
   struct StudyItem;
diff --git a/Source/vtkDICOMFile.cxx b/Source/vtkDICOMFile.cxx
index 7ac3e71..ecf8116 100644
--- a/Source/vtkDICOMFile.cxx
+++ b/Source/vtkDICOMFile.cxx
@@ -13,6 +13,7 @@
 =========================================================================*/
 
 #include "vtkDICOMFile.h"
+#include "vtkDICOMFilePath.h"
 
 #if defined(VTK_DICOM_POSIX_IO)
 #include <sys/types.h>
@@ -34,6 +35,8 @@
 #include <errno.h>
 #endif
 
+#include <string.h>
+
 //----------------------------------------------------------------------------
 vtkDICOMFile::vtkDICOMFile(const char *filename, Mode mode)
 {
@@ -43,123 +46,117 @@ vtkDICOMFile::vtkDICOMFile(const char *filename, Mode mode)
   this->Eof = false;
 
   if (mode == In)
-    {
+  {
     this->Handle = open(filename, O_RDONLY);
-    }
+  }
   else if (mode == Out)
-    {
+  {
     this->Handle = open(filename, O_WRONLY | O_CREAT | O_TRUNC, 000666);
-    }
+  }
 
   if (this->Handle == -1)
-    {
+  {
     int errorCode = errno;
     if (errorCode == EACCES)
-      {
+    {
       this->Error = AccessDenied;
-      }
+    }
     else if (errorCode == EISDIR)
-      {
-      this->Error = IsDirectory;
-      }
+    {
+      this->Error = FileIsDirectory;
+    }
     else if (errorCode == ENOTDIR)
-      {
-      this->Error = DirectoryNotFound;
-      }
+    {
+      this->Error = (mode == Out ? ImpossiblePath : FileNotFound);
+    }
     else if (errorCode == ENOENT)
-      {
+    {
       this->Error = FileNotFound;
-      }
+    }
     else if (errorCode == ENOSPC)
-      {
+    {
       // some systems also have EDQUOT for "quota exceeded"
       this->Error = OutOfSpace;
-      }
+    }
     else
-      {
-      this->Error = Bad;
-      }
+    {
+      this->Error = UnknownError;
     }
+  }
 #elif defined(VTK_DICOM_WIN32_IO)
   this->Handle = INVALID_HANDLE_VALUE;
   this->Error = 0;
   this->Eof = false;
 
-  WCHAR *wideFilename = 0;
-  int n = MultiByteToWideChar(
-    CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, NULL, 0);
-  if (n > 0)
-    {
-    wideFilename = new WCHAR[n];
-    n = MultiByteToWideChar(
-      CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, wideFilename, n);
-
+  vtkDICOMFilePath fpath(filename);
+  const wchar_t *wideFilename = fpath.Wide();
+  if (wideFilename)
+  {
     if (mode == In)
-      {
+    {
       this->Handle = CreateFileW(wideFilename,
         GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
         NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-      }
+    }
     else if (mode == Out)
-      {
+    {
       this->Handle = CreateFileW(wideFilename,
         GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
         NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
-      }
     }
+  }
 
   if (this->Handle == INVALID_HANDLE_VALUE)
-    {
+  {
     DWORD errorCode = GetLastError();
     if (errorCode == ERROR_ACCESS_DENIED ||
         errorCode == ERROR_SHARING_VIOLATION)
-      {
+    {
       this->Error = AccessDenied;
       if (wideFilename)
-        {
+      {
         DWORD attr = GetFileAttributesW(wideFilename);
         if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0)
-          {
-          this->Error = IsDirectory;
-          }
+        {
+          this->Error = FileIsDirectory;
         }
       }
-    else if (errorCode == ERROR_DIRECTORY)
-      {
-      this->Error = DirectoryNotFound;
-      }
+    }
+    else if (errorCode == ERROR_PATH_NOT_FOUND)
+    {
+      this->Error = (mode == Out ? ImpossiblePath : FileNotFound);
+    }
     else if (errorCode == ERROR_FILE_NOT_FOUND)
-      {
+    {
       this->Error = FileNotFound;
-      }
+    }
     else if (errorCode == ERROR_DISK_FULL)
-      {
+    {
       this->Error = OutOfSpace;
-      }
+    }
     else
-      {
-      this->Error = Bad;
-      }
+    {
+      this->Error = UnknownError;
     }
+  }
 
-  delete [] wideFilename;
 #else
   this->Handle = 0;
   this->Error = 0;
   this->Eof = false;
 
   if (mode == In)
-    {
+  {
     this->Handle = fopen(filename, "rb");
-    }
+  }
   else if (mode == Out)
-    {
+  {
     this->Handle = fopen(filename, "wb");
-    }
+  }
   if (this->Handle == 0)
-    {
-    this->Error = Bad;
-    }
+  {
+    this->Error = UnknownError;
+  }
 #endif
 }
 
@@ -174,25 +171,25 @@ void vtkDICOMFile::Close()
 {
 #if defined(VTK_DICOM_POSIX_IO)
   if (this->Handle)
-    {
+  {
     if (close(this->Handle) == 0)
-      {
+    {
       this->Error = 0;
-      }
+    }
     else if (errno != EINTR)
-      {
-      this->Error = Bad;
-      }
-    this->Handle = 0;
+    {
+      this->Error = UnknownError;
     }
+    this->Handle = 0;
+  }
 #elif defined(VTK_DICOM_WIN32_IO)
   CloseHandle(this->Handle);
   this->Handle = INVALID_HANDLE_VALUE;
 #else
   if (this->Handle)
-    {
+  {
     fclose(static_cast<FILE *>(this->Handle));
-    }
+  }
   this->Handle = 0;
 #endif
 }
@@ -203,51 +200,52 @@ size_t vtkDICOMFile::Read(unsigned char *data, size_t len)
 #if defined(VTK_DICOM_POSIX_IO)
   ssize_t n;
   while ((n = read(this->Handle, data, len)) == -1)
-    {
+  {
     if (errno != EINTR)
-      {
+    {
       break;
-      }
-    errno = 0;
     }
+    errno = 0;
+  }
   if (n == 0)
-    {
+  {
     this->Eof = true;
-    }
+  }
   else if (n == -1)
-    {
-    this->Error = Bad;
+  {
+    this->Error = UnknownError;
     n = 0;
-    }
+  }
   return n;
 #elif defined(VTK_DICOM_WIN32_IO)
   // handle large requests in 1GB chunks
   const size_t chunksize = 1024*1024*1024;
   size_t n = 0;
   while (n < len)
-    {
+  {
     DWORD l = static_cast<DWORD>(len - n < chunksize ? len - n : chunksize);
     DWORD r = 0;
     if (ReadFile(this->Handle, &data[n], l, &r, NULL) == FALSE)
-      {
-      this->Error = Bad;
+    {
+      this->Error = UnknownError;
       break;
-      }
+    }
     else if (r == 0)
-      {
+    {
       this->Eof = true;
       break;
-      }
-    n += r;
     }
+    n += r;
+  }
   return n;
 #else
   size_t n = fread(data, 1, len, static_cast<FILE *>(this->Handle));
   if (n != len || len == 0)
-    {
+  {
     this->Eof = (feof(static_cast<FILE *>(this->Handle)) != 0);
-    this->Error = (ferror(static_cast<FILE *>(this->Handle)) == 0 ? 0 : Bad);
-    }
+    this->Error = (ferror(static_cast<FILE *>(this->Handle)) == 0 ?
+                     0 : UnknownError);
+  }
   return n;
 #endif
 }
@@ -258,49 +256,50 @@ size_t vtkDICOMFile::Write(const unsigned char *data, size_t len)
 #if defined(VTK_DICOM_POSIX_IO)
   ssize_t n;
   while ((n = write(this->Handle, data, len)) == -1)
-    {
+  {
     if (errno != EINTR)
-      {
+    {
       break;
-      }
-    errno = 0;
     }
+    errno = 0;
+  }
   if (n == -1)
-    {
-    this->Error = Bad;
+  {
+    this->Error = UnknownError;
     n = 0;
-    }
+  }
   return n;
 #elif defined(VTK_DICOM_WIN32_IO)
   // handle large requests in 1GB chunks
   const size_t chunksize = 1024*1024*1024;
   size_t n = 0;
   while (n < len)
-    {
+  {
     DWORD l = static_cast<DWORD>(len - n < chunksize ? len - n : chunksize);
     DWORD r = 0;
     if (WriteFile(this->Handle, &data[n], l, &r, NULL) == FALSE)
-      {
+    {
       DWORD errorCode = GetLastError();
       if (errorCode == ERROR_HANDLE_DISK_FULL)
-        {
+      {
         this->Error = OutOfSpace;
-        }
+      }
       else
-        {
-        this->Error = Bad;
-        }
-      break;
+      {
+        this->Error = UnknownError;
       }
-    n += r;
+      break;
     }
+    n += r;
+  }
   return n;
 #else
   size_t n = fwrite(data, 1, len, static_cast<FILE *>(this->Handle));
   if (n != len || len == 0)
-    {
-    this->Error = (ferror(static_cast<FILE *>(this->Handle)) == 0 ? 0 : Bad);
-    }
+  {
+    this->Error = (ferror(static_cast<FILE *>(this->Handle)) == 0 ?
+                     0 : UnknownError);
+  }
   return n;
 #endif
 }
@@ -315,20 +314,20 @@ bool vtkDICOMFile::SetPosition(Size offset)
   off_t pos = lseek(this->Handle, offset, SEEK_SET);
 #endif
   if (pos == -1)
-    {
-    this->Error = Bad;
+  {
+    this->Error = UnknownError;
     return false;
-    }
+  }
   return true;
 #elif defined(VTK_DICOM_WIN32_IO)
   LONG lowerBits = static_cast<LONG>(offset);
   LONG upperBits = static_cast<LONG>(offset >> 32);
   DWORD pos = SetFilePointer(this->Handle, lowerBits, &upperBits, FILE_BEGIN);
   if (pos == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
-    {
-    this->Error = Bad;
+  {
+    this->Error = UnknownError;
     return false;
-    }
+  }
   return true;
 #else
   return (fseek(static_cast<FILE *>(this->Handle), offset, SEEK_SET) == 0);
@@ -341,40 +340,114 @@ vtkDICOMFile::Size vtkDICOMFile::GetSize()
 #if defined(VTK_DICOM_POSIX_IO)
   struct stat fs;
   if (fstat(this->Handle, &fs) != 0)
-    {
-    this->Error = Bad;
+  {
+    this->Error = UnknownError;
     return static_cast<long long>(-1);
-    }
+  }
   return fs.st_size;
 #elif defined(VTK_DICOM_WIN32_IO)
   DWORD upperBits = 0;
   DWORD lowerBits = GetFileSize(this->Handle, &upperBits);
   if (lowerBits == INVALID_FILE_SIZE && GetLastError() != NO_ERROR)
-    {
-    this->Error = Bad;
+  {
+    this->Error = UnknownError;
     return static_cast<long long>(-1);
-    }
+  }
   return lowerBits | (static_cast<Size>(upperBits) << 32);
 #else
   FILE *fp = static_cast<FILE *>(this->Handle);
   long long size = -1;
   fpos_t pos;
   if (fgetpos(fp, &pos) == 0)
-    {
+  {
     if (fseek(fp, 0, SEEK_END) == 0)
-      {
+    {
       size = ftell(fp);
-      }
+    }
     if (fsetpos(fp, &pos) != 0)
+    {
+      this->Error = UnknownError;
+    }
+  }
+  if (size == -1)
+  {
+    this->Error = UnknownError;
+  }
+  return size;
+#endif
+}
+
+//----------------------------------------------------------------------------
+int vtkDICOMFile::Access(const char *filename, Mode mode)
+{
+#ifdef _WIN32
+  int errorCode = UnknownError;
+  vtkDICOMFilePath fpath(filename);
+  const wchar_t *wideFilename = fpath.Wide();
+  if (wideFilename)
+  {
+    errorCode = 0;
+    DWORD code = GetFileAttributesW(wideFilename);
+    if (code == INVALID_FILE_ATTRIBUTES)
+    {
+      DWORD lastError = GetLastError();
+      if (lastError == ERROR_ACCESS_DENIED ||
+          lastError == ERROR_SHARING_VIOLATION)
+      {
+        errorCode = AccessDenied;
+      }
+      else if (lastError == ERROR_FILE_NOT_FOUND)
+      {
+        errorCode = FileNotFound;
+      }
+      else if (lastError == ERROR_PATH_NOT_FOUND)
       {
-      this->Error = Bad;
+        errorCode = (mode == Out ? ImpossiblePath : FileNotFound);
+      }
+      else
+      {
+        errorCode = UnknownError;
       }
     }
-  if (size == -1)
+    else if (mode == Out && (code & FILE_ATTRIBUTE_READONLY) != 0)
+    {
+      errorCode = AccessDenied;
+    }
+    else if ((code & FILE_ATTRIBUTE_DIRECTORY) != 0)
     {
-    this->Error = Bad;
+      errorCode = FileIsDirectory;
     }
-  return size;
+  }
+  return errorCode;
+#else
+  int errorCode = 0;
+  struct stat fs;
+  if (stat(filename, &fs) != 0 ||
+      access(filename, (mode == In ? R_OK : W_OK)) != 0)
+  {
+    int e = errno;
+    if (e == EACCES || e == EPERM)
+    {
+      errorCode = AccessDenied;
+    }
+    else if (e == ENOENT)
+    {
+      errorCode = FileNotFound;
+    }
+    else if (e == ENOTDIR)
+    {
+      errorCode = (mode == Out ? ImpossiblePath : FileNotFound);
+    }
+    else
+    {
+      errorCode = UnknownError;
+    }
+  }
+  else if (S_ISDIR(fs.st_mode))
+  {
+    errorCode = FileIsDirectory;
+  }
+  return errorCode;
 #endif
 }
 
@@ -383,60 +456,99 @@ int vtkDICOMFile::Remove(const char *filename)
 {
 #if defined(VTK_DICOM_WIN32_IO)
   int errorCode = 0;
-  WCHAR *wideFilename = 0;
-  int n = MultiByteToWideChar(
-    CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, NULL, 0);
-  if (n > 0)
-    {
-    wideFilename = new WCHAR[n];
-    n = MultiByteToWideChar(
-      CP_UTF8, MB_ERR_INVALID_CHARS, filename, -1, wideFilename, n);
+  vtkDICOMFilePath fpath(filename);
+  const wchar_t *wideFilename = fpath.Wide();
+  if (wideFilename)
+  {
     if (!DeleteFileW(wideFilename))
-      {
+    {
       DWORD lastError = GetLastError();
       if (lastError == ERROR_ACCESS_DENIED ||
           lastError == ERROR_SHARING_VIOLATION)
-        {
+      {
         errorCode = AccessDenied;
-        }
-      else if (lastError == ERROR_FILE_NOT_FOUND)
-        {
+      }
+      else if (lastError == ERROR_FILE_NOT_FOUND ||
+               lastError == ERROR_PATH_NOT_FOUND)
+      {
         errorCode = FileNotFound;
-        }
-      else if (lastError == ERROR_DIRECTORY)
-        {
-        errorCode = DirectoryNotFound;
-        }
+      }
       else
-        {
-        errorCode = Bad;
-        }
+      {
+        errorCode = UnknownError;
       }
-    delete [] wideFilename;
     }
+  }
   return errorCode;
 #else
   int errorCode = 0;
   if (unlink(filename) != 0)
-    {
+  {
     int e = errno;
     if (e == EACCES || e == EPERM)
-      {
+    {
       errorCode = AccessDenied;
-      }
-    else if (e == ENOENT)
-      {
+    }
+    else if (e == ENOENT || e == ENOTDIR)
+    {
       errorCode = FileNotFound;
-      }
-    else if (e == ENOTDIR)
-      {
-      errorCode = DirectoryNotFound;
-      }
+    }
     else
-      {
-      errorCode = Bad;
-      }
+    {
+      errorCode = UnknownError;
     }
+  }
   return errorCode;
 #endif
 }
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFile::SameFile(const char *file1, const char *file2)
+{
+  // Two files are considered to be the same if:
+  // 1) they are on the same device
+  // 2) their index (inode number) is the same
+
+  bool result = false;
+#ifdef _WIN32
+  vtkDICOMFilePath fpath1(file1);
+  const wchar_t *widepath = fpath1.Wide();
+  HANDLE h1 = CreateFileW(widepath,
+    GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING,
+    FILE_FLAG_BACKUP_SEMANTICS, NULL);
+  vtkDICOMFilePath fpath2(file2);
+  widepath = fpath2.Wide();
+  HANDLE h2 = CreateFileW(widepath,
+    GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING,
+    FILE_FLAG_BACKUP_SEMANTICS, NULL);
+  if (h1 != INVALID_HANDLE_VALUE && h2 != INVALID_HANDLE_VALUE)
+  {
+    BY_HANDLE_FILE_INFORMATION buf;
+    GetFileInformationByHandle(h1, &buf);
+    DWORD sn = buf.dwVolumeSerialNumber;
+    DWORD hi = buf.nFileIndexHigh;
+    DWORD li = buf.nFileIndexLow;
+    GetFileInformationByHandle(h2, &buf);
+    result = (buf.dwVolumeSerialNumber == sn);
+    result &= (buf.nFileIndexHigh == hi);
+    result &= (buf.nFileIndexLow == li);
+  }
+  if (h1 != INVALID_HANDLE_VALUE)
+  {
+    CloseHandle(h1);
+  }
+  if (h2 != INVALID_HANDLE_VALUE)
+  {
+    CloseHandle(h2);
+  }
+#else
+  struct stat st1;
+  struct stat st2;
+  if (stat(file1, &st1) == 0 && stat(file2, &st2) == 0)
+  {
+    result = (memcmp(&st1.st_dev, &st2.st_dev, sizeof(st1.st_dev)) == 0);
+    result &= (memcmp(&st1.st_ino, &st2.st_ino, sizeof(st1.st_ino)) == 0);
+  }
+#endif
+  return result;
+}
diff --git a/Source/vtkDICOMFile.h b/Source/vtkDICOMFile.h
index 82ff1b4..77901bf 100644
--- a/Source/vtkDICOMFile.h
+++ b/Source/vtkDICOMFile.h
@@ -43,10 +43,10 @@ public:
   enum Code
   {
     Good,              // no error
-    Bad,               // unspecified error
+    UnknownError,      // unspecified error
     AccessDenied,      // file permission error
-    IsDirectory,       // can't open file: directory with that name exists
-    DirectoryNotFound, // one of the directories in the path doesn't exist
+    FileIsDirectory,   // can't open file: directory with that name exists
+    ImpossiblePath,    // part of the path doesn't exist or goes through a file
     FileNotFound,      // requested file (or directory) doesn't exist
     OutOfSpace         // disk full or quota exceeded
   };
@@ -54,6 +54,7 @@ public:
   //! Typedef for a file size.
   typedef unsigned long long Size;
 
+  //@{
   //! Construct the file object.
   /*!
    *  The Mode can be "In" or "Out" (read or write).
@@ -62,7 +63,9 @@ public:
 
   //! Destruct the object and close the file.
   ~vtkDICOMFile();
+  //@}
 
+  //@{
   //! Close a file.
   void Close();
 
@@ -94,6 +97,16 @@ public:
 
   //! Return an error indicator (zero if no error).
   int GetError() { return this->Error; }
+  //@}
+
+  //@{
+  //! Test the specified file for accessibility (static method).
+  /*!
+   *  The mode should be "In" or "Out" to indicate how you intend to use
+   *  the file.  The return value will be zero (for an ordinary file) or
+   *  one of the codes returned by GetError.
+   */
+  static int Access(const char *filename, Mode mode);
 
   //! Delete the specified file (static method).
   /*!
@@ -103,7 +116,26 @@ public:
    */
   static int Remove(const char *filename);
 
+  //! Check if two files are the same.
+  /*!
+   *  This does not check that the filenames are the same.  Instead,
+   *  it checks to see if the two filenames point to the same actual
+   *  disk file.  If either file does not exist or is otherwise not
+   *  accessible, then it returns false.
+   */
+  static bool SameFile(const char *file1, const char *file2);
+  //@}
+
+  //! @cond
+  // Copy constructor creates a closed file.  The copy constructor would
+  // normally be deleted, but that would cause the VTK python wrappers to
+  // skip this class.  Once the wrappers are fixed, this can be deleted.
+  vtkDICOMFile(const vtkDICOMFile&) : Handle(0), Error(0), Eof(false) {}
+  //! @endcond
+
 private:
+  vtkDICOMFile& operator=(const vtkDICOMFile&); // = delete;
+
 #ifdef VTK_DICOM_POSIX_IO
   int Handle;
 #else
diff --git a/Source/vtkDICOMFileDirectory.cxx b/Source/vtkDICOMFileDirectory.cxx
new file mode 100644
index 0000000..27c96c4
--- /dev/null
+++ b/Source/vtkDICOMFileDirectory.cxx
@@ -0,0 +1,414 @@
+/*=========================================================================
+
+  Program: DICOM for VTK
+
+  Copyright (c) 2012-2015 David Gobbi
+  All rights reserved.
+  See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "vtkDICOMFileDirectory.h"
+#include "vtkDICOMFilePath.h"
+#include "vtkDICOMFile.h"
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <errno.h>
+#endif
+
+#include <string>
+#include <vector>
+
+// for PGI compiler, use dirent64 if readdir is readdir64
+#if defined(__PGI) && defined(__GLIBC__)
+# define redef_dirent_readdir dirent
+# define redef_dirent_readdir64 dirent64
+# define redef_dirent redef_dirent_lookup(readdir)
+# define redef_dirent_lookup(x) redef_dirent_lookup2(x)
+# define redef_dirent_lookup2(x) redef_dirent_##x
+#else
+# define redef_dirent dirent
+#endif
+
+//----------------------------------------------------------------------------
+struct vtkDICOMFileDirectory::Entry
+{
+  std::string Name;
+  unsigned short Flags;
+  unsigned short Mask;
+};
+
+//----------------------------------------------------------------------------
+vtkDICOMFileDirectory::vtkDICOMFileDirectory(const char *dirname)
+  : Name(dirname), Error(0), NumberOfFiles(0), Entries(0)
+{
+#ifdef _WIN32
+  vtkDICOMFilePath path(dirname);
+  path.PushBack("*");
+  const wchar_t *widename = path.Wide();
+  if (widename == 0)
+  {
+    this->Error = UnknownError;
+  }
+  else
+  {
+    WIN32_FIND_DATAW fileData;
+    HANDLE h = FindFirstFileW(widename, &fileData);
+    DWORD code = 0;
+    if (h == INVALID_HANDLE_VALUE)
+    {
+      code = GetLastError();
+      if (code == ERROR_FILE_NOT_FOUND)
+      {
+        code = ERROR_NO_MORE_FILES;
+      }
+    }
+    else
+    {
+      // each utf-16 wchar converts to three or fewer utf-8 bytes
+      int n = MAX_PATH*3;
+      char name[MAX_PATH*3];
+      do
+      {
+        WideCharToMultiByte(
+          CP_UTF8, 0, fileData.cFileName, -1, name, n, 0, 0);
+        unsigned int flags = 0;
+        if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0 &&
+            fileData.dwReserved0 == IO_REPARSE_TAG_SYMLINK)
+        {
+          flags |= TypeSymlink;
+        }
+        if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) != 0)
+        {
+          flags |= TypeHidden;
+        }
+        if ((fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)
+        {
+          flags |= TypeDirectory;
+        }
+        this->AddEntry(name, flags, (TypeSymlink | TypeDirectory));
+      }
+      while (FindNextFileW(h, &fileData));
+      code = GetLastError();
+    }
+    if (code == ERROR_ACCESS_DENIED)
+    {
+      this->Error = AccessDenied;
+    }
+    else if (code == ERROR_FILE_NOT_FOUND ||
+             code == ERROR_PATH_NOT_FOUND)
+    {
+      this->Error = FileNotFound;
+    }
+    else if (code != ERROR_NO_MORE_FILES)
+    {
+      this->Error = UnknownError;
+    }
+    if (h != INVALID_HANDLE_VALUE)
+    {
+      FindClose(h);
+    }
+  }
+#else
+  errno = 0;
+  DIR* dir = opendir(dirname);
+
+  if (!dir)
+  {
+    int e = errno;
+    if (e == EACCES || e == EPERM)
+    {
+      this->Error = AccessDenied;
+    }
+    else if (e == ENOENT || e == ENOTDIR)
+    {
+      this->Error = FileNotFound;
+    }
+    else
+    {
+      this->Error = UnknownError;
+    }
+  }
+  else
+  {
+    for (redef_dirent *d = readdir(dir); d; d = readdir(dir))
+    {
+      if (strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0)
+      {
+        this->AddEntry(d->d_name, 0, 0);
+      }
+    }
+    closedir(dir);
+  }
+#endif
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFileDirectory::vtkDICOMFileDirectory(const vtkDICOMFileDirectory& o)
+  : Name(o.Name), Error(o.Error), NumberOfFiles(0), Entries(0)
+{
+  if (o.Entries && o.NumberOfFiles)
+  {
+    for (int i = 0; i < o.NumberOfFiles; i++)
+    {
+      const Entry& e = o.Entries[i];
+      this->AddEntry(e.Name.c_str(), e.Flags, e.Mask);
+    }
+  }
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFileDirectory& vtkDICOMFileDirectory::operator=(
+  const vtkDICOMFileDirectory& o)
+{
+  if (this != &o)
+  {
+    delete [] this->Entries;
+
+    this->Name = o.Name;
+    this->Error = o.Error;
+    this->NumberOfFiles = 0;
+    this->Entries = 0;
+
+    if (o.Entries && o.NumberOfFiles)
+    {
+      for (int i = 0; i < o.NumberOfFiles; i++)
+      {
+        const Entry& e = o.Entries[i];
+        this->AddEntry(e.Name.c_str(), e.Flags, e.Mask);
+      }
+    }
+  }
+
+  return *this;
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFileDirectory::~vtkDICOMFileDirectory()
+{
+  delete [] this->Entries;
+}
+
+//----------------------------------------------------------------------------
+const char *vtkDICOMFileDirectory::GetFile(int i)
+{
+  if (i < 0 || i >= this->NumberOfFiles)
+  {
+    return 0;
+  }
+  return this->Entries[i].Name.c_str();
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFileDirectory::IsDirectory(int i)
+{
+  if (i < 0 || i >= this->NumberOfFiles)
+  {
+    return false;
+  }
+#ifndef _WIN32
+  if ((this->Entries[i].Mask & TypeDirectory) == 0)
+  {
+    struct stat fs;
+    vtkDICOMFilePath path(this->Name);
+    path.PushBack(this->Entries[i].Name);
+    if (stat(path.AsString().c_str(), &fs) == 0)
+    {
+      if (S_ISDIR(fs.st_mode))
+      {
+        this->Entries[i].Flags |= TypeDirectory;
+      }
+      this->Entries[i].Mask |= TypeDirectory;
+    }
+  }
+#endif
+  return ((this->Entries[i].Flags & TypeDirectory) != 0);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFileDirectory::IsSymlink(int i)
+{
+  if (i < 0 || i >= this->NumberOfFiles)
+  {
+    return false;
+  }
+  if ((this->Entries[i].Mask & TypeSymlink) == 0)
+  {
+    this->StatEntry(i);
+  }
+
+  return ((this->Entries[i].Flags & TypeSymlink) != 0);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFileDirectory::IsHidden(int i)
+{
+  if (i < 0 || i >= this->NumberOfFiles)
+  {
+    return false;
+  }
+  if ((this->Entries[i].Mask & TypeHidden) == 0)
+  {
+    this->StatEntry(i);
+  }
+
+  return ((this->Entries[i].Flags & TypeHidden) != 0);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFileDirectory::AddEntry(
+  const char *name, unsigned short flags, unsigned short mask)
+{
+  int n = this->NumberOfFiles;
+  if (this->Entries == 0)
+  {
+    this->Entries = new Entry[4];
+  }
+  else if (n >= 4 && ((n-1) & n) == 0)
+  {
+    Entry *entries = new Entry[n*2];
+    for (int i = 0; i < n; i++)
+    {
+      entries[i] = this->Entries[i];
+    }
+    delete [] this->Entries;
+    this->Entries = entries;
+  }
+
+  this->Entries[n].Name = name;
+  this->Entries[n].Flags = flags;
+  this->Entries[n].Mask= mask;
+
+  this->NumberOfFiles++;
+}
+
+//----------------------------------------------------------------------------
+#ifndef _WIN32
+void vtkDICOMFileDirectory::StatEntry(int i)
+{
+  if (i >= 0 && i < this->NumberOfFiles)
+  {
+    struct stat fs;
+    vtkDICOMFilePath path(this->Name);
+    path.PushBack(this->Entries[i].Name);
+    if (lstat(path.AsString().c_str(), &fs) == 0)
+    {
+      if (S_ISLNK(fs.st_mode))
+      {
+        this->Entries[i].Flags |= TypeSymlink;
+      }
+      this->Entries[i].Mask |= TypeSymlink;
+#ifdef __APPLE__
+      if ((fs.st_flags & UF_HIDDEN) != 0)
+      {
+        this->Entries[i].Flags |= TypeHidden;
+      }
+      this->Entries[i].Mask |= TypeHidden;
+#endif
+    }
+  }
+}
+#else /* _WIN32 */
+void vtkDICOMFileDirectory::StatEntry(int)
+{
+  // on Windows, the attributes were collected when the
+  // directory listing was done in the constructor, so
+  // there is no need to run stat on the files
+}
+#endif
+
+//----------------------------------------------------------------------------
+int vtkDICOMFileDirectory::Create(const char *name)
+{
+  int result = 0;
+
+  std::vector<std::string> dirsToCreate;
+  vtkDICOMFilePath path(name);
+
+  while (!path.IsRoot() && !path.IsEmpty() && result == 0)
+  {
+    int code = vtkDICOMFile::Access(path.AsString().c_str(), vtkDICOMFile::In);
+    if (code == 0 || code == vtkDICOMFile::AccessDenied)
+    {
+      // The name exists as a file, or there is no permission to use path
+      result = AccessDenied;
+    }
+    else if (code == vtkDICOMFile::FileIsDirectory)
+    {
+      // Found a directory!
+      break;
+    }
+    dirsToCreate.push_back(path.AsString());
+    path.PopBack();
+  }
+
+  while (dirsToCreate.size() > 0 && result == 0)
+  {
+    const std::string& dirname = dirsToCreate.back();
+#ifdef _WIN32
+    vtkDICOMFilePath dirpath(dirname);
+    const wchar_t *widename = dirpath.Wide();
+    if (widename == 0)
+    {
+      result = UnknownError;
+    }
+    else if (!CreateDirectoryW(widename, NULL))
+    {
+      DWORD e = GetLastError();
+      if (e == ERROR_ACCESS_DENIED ||
+          e == ERROR_ALREADY_EXISTS)
+      {
+        result = AccessDenied;
+      }
+      else if (e == ERROR_PATH_NOT_FOUND)
+      {
+        result = ImpossiblePath;
+      }
+      else if (e == ERROR_DISK_FULL)
+      {
+        result = OutOfSpace;
+      }
+      else
+      {
+        result = UnknownError;
+      }
+    }
+#else
+    if (mkdir(dirname.c_str(), 00777) != 0)
+    {
+      int e = errno;
+      if (e == EACCES || e == EPERM)
+      {
+        result = AccessDenied;
+      }
+      else if (e == ENOENT || e == ENOTDIR)
+      {
+        result = ImpossiblePath;
+      }
+      else if (e == ENOSPC)
+      {
+        // some systems also have EDQUOT for "quota exceeded"
+        result = OutOfSpace;
+      }
+      else
+      {
+        result = UnknownError;
+      }
+    }
+#endif
+    dirsToCreate.pop_back();
+  }
+
+  return result;
+}
diff --git a/Source/vtkDICOMFileDirectory.h b/Source/vtkDICOMFileDirectory.h
new file mode 100644
index 0000000..618c35d
--- /dev/null
+++ b/Source/vtkDICOMFileDirectory.h
@@ -0,0 +1,109 @@
+/*=========================================================================
+
+  Program: DICOM for VTK
+
+  Copyright (c) 2012-2015 David Gobbi
+  All rights reserved.
+  See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef vtkDICOMFileDirectory_h
+#define vtkDICOMFileDirectory_h
+
+#include <vtkSystemIncludes.h>
+#include "vtkDICOMModule.h" // For export macro
+
+#include <string> // Interface type
+
+//! A class that provides directory listings.
+class VTKDICOM_EXPORT vtkDICOMFileDirectory
+{
+public:
+  //! Error codes.
+  enum Code
+  {
+    Good,              // no error
+    UnknownError,      // unspecified error
+    AccessDenied,      // file permission error
+    Reserved,
+    ImpossiblePath,    // part of the path doesn't exist or goes through a file
+    FileNotFound,      // requested file (or directory) doesn't exist
+    OutOfSpace         // disk full or quota exceeded
+  };
+
+  //@{
+  //! Construct the object from a directory name.
+  /*!
+   *  This causes the directory to be read.  Use GetError() to check whether
+   *  the read was successful.
+   */
+  vtkDICOMFileDirectory(const char *dirname);
+
+  //! Copy constructor.
+  vtkDICOMFileDirectory(const vtkDICOMFileDirectory&);
+
+  //! Destruct the object.
+  ~vtkDICOMFileDirectory();
+  //@}
+
+  //@{
+  //! Return an error indicator (zero if no error).
+  int GetError() { return this->Error; }
+  //@}
+
+  //@{
+  //! Get the number of files and subdirectories in the directory.
+  int GetNumberOfFiles() { return this->NumberOfFiles; }
+
+  //! Get the name of the ith file or subdirectory.
+  const char *GetFile(int i);
+
+  //! Check if the list entry is a directory.
+  bool IsDirectory(int i);
+
+  //! Check if the list entry is a symbolic link.
+  bool IsSymlink(int i);
+
+  //! Check if the list entry has an attribute that marks it as hidden.
+  bool IsHidden(int i);
+  //@}
+
+  //@{
+  //! Create a new directory with default permissions.
+  /*!
+   *  This will create any intermediate directories, as well.  The return
+   *  value is zero for success.  Otherwise, one of the error codes is
+   *  returned.
+   */
+  static int Create(const char *dirname);
+  //@}
+
+  //@{
+  //! Assignment operator.
+  vtkDICOMFileDirectory& operator=(const vtkDICOMFileDirectory&);
+  //@}
+
+private:
+  //! Add a directory entry.
+  void AddEntry(const char *name, unsigned short flags, unsigned short mask);
+
+  //! Stat a file to set flags
+  void StatEntry(int i);
+
+  struct Entry;
+  static const unsigned int TypeDirectory = 1;
+  static const unsigned int TypeSymlink = 2;
+  static const unsigned int TypeHidden = 4;
+
+  std::string Name;
+  int Error;
+  int NumberOfFiles;
+  Entry *Entries;
+};
+
+#endif /* vtkDICOMFileDirectory_h */
+// VTK-HeaderTest-Exclude: vtkDICOMFileDirectory.h
diff --git a/Source/vtkDICOMFilePath.cxx b/Source/vtkDICOMFilePath.cxx
new file mode 100644
index 0000000..0dd5c3c
--- /dev/null
+++ b/Source/vtkDICOMFilePath.cxx
@@ -0,0 +1,851 @@
+/*=========================================================================
+
+  Program: DICOM for VTK
+
+  Copyright (c) 2012-2015 David Gobbi
+  All rights reserved.
+  See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+
+#include "vtkDICOMFilePath.h"
+
+#include <stdlib.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#else
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#endif
+
+//----------------------------------------------------------------------------
+vtkDICOMFilePath::vtkDICOMFilePath(const std::string& path)
+  : Path(path), Separator('/')
+{
+#ifdef _WIN32
+  size_t l = path.length();
+  for (size_t i = 0; i < l; i++)
+  {
+    if (IsSeparator(path[i]))
+    {
+      this->Separator = path[i];
+      break;
+    }
+  }
+  this->WidePath = 0;
+  this->LocalPath = 0;
+#endif
+  StripTrailingSlash(&this->Path);
+}
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+vtkDICOMFilePath::vtkDICOMFilePath(const std::wstring& path)
+{
+  char *filename = ConvertToUTF8(path.c_str());
+  this->Path = filename;
+  this->Separator = '/';
+  delete [] filename;
+
+  size_t l = path.length();
+  for (size_t i = 0; i < l; i++)
+  {
+    if (IsSeparator(path[i]))
+    {
+      this->Separator = path[i];
+      break;
+    }
+  }
+  this->WidePath = 0;
+  this->LocalPath = 0;
+  StripTrailingSlash(&this->Path);
+}
+#endif
+
+//----------------------------------------------------------------------------
+vtkDICOMFilePath::vtkDICOMFilePath(const vtkDICOMFilePath& other) :
+  Path(other.Path), Separator(other.Separator)
+{
+#ifdef _WIN32
+  this->WidePath = 0;
+  this->LocalPath = 0;
+#endif
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFilePath::~vtkDICOMFilePath()
+{
+#ifdef _WIN32
+  delete [] this->WidePath;
+  delete [] this->LocalPath;
+#endif
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMFilePath& vtkDICOMFilePath::operator=(const vtkDICOMFilePath& other)
+{
+  if (this != &other)
+  {
+    this->Path = other.Path;
+    this->Separator = other.Separator;
+  }
+  return *this;
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMFilePath::Join(const std::string& second) const
+{
+#ifdef _WIN32
+  std::string path = this->Path;
+  char sep = this->Separator;
+
+  // if extended prefix is present, then all forward slashes must be
+  // converted into back slashes, and "." and ".." must be removed
+  bool extended = false;
+  if (HasExtendedPrefix(path))
+  {
+    sep = '\\';
+    extended = true;
+  }
+
+  // check whether the second part might be an absolute path
+  size_t pos = 0;
+  size_t r = RootLength(second);
+  if (r > 0)
+  {
+    // if second drive letter mismatches the first, paths can't be joined
+    char drive1 = DriveLetter(path);
+    char drive2 = DriveLetter(second);
+    if (HasExtendedPrefix(second))
+    {
+      // if second part uses extended prefix, ignore the first part
+      path.resize(0);
+    }
+    else if (drive2 && drive1 == drive2 && r != 3)
+    {
+      // skip the drive letter in the second path
+      pos = 2;
+    }
+    else if (extended && drive2 && r >= 2)
+    {
+      // move the drive letter from the second path to the first
+      pos = 2;
+      path = "\\\\\?\\";
+      path.append(second, 0, pos);
+      pos += (r >= 3 && IsSeparator(second[pos]));
+    }
+    else if (drive1 && drive2 == 0 && r == 1)
+    {
+      // keep the drive letter, but use absolute path from second part
+      sep = second[0];
+      path.resize(4*extended + 2);
+    }
+    else if (extended && r >= 2 &&
+             IsSeparator(second[0]) && IsSeparator(second[1]))
+    {
+      // create an extended UNC path
+      pos = 2;
+      path = "\\\\\?\\UNC\\";
+    }
+    else
+    {
+      // ignore the first path completely
+      path.resize(0);
+    }
+  }
+
+  // append a separator before appending the second part
+  size_t l = path.length();
+  if (l > 0 && !IsSeparator(path[l-1]) && !(l == 2 && path[1] == ':'))
+  {
+    path.push_back(sep);
+  }
+
+  // append one part at a time
+  while (pos != second.length())
+  {
+    if (IsSeparator(second[pos]))
+    {
+      path.push_back(sep);
+      pos++;
+    }
+    size_t endpos = pos;
+    while (endpos != second.length() && !IsSeparator(second[endpos]))
+    {
+      endpos++;
+    }
+    size_t n = endpos - pos;
+    if (n > 0)
+    {
+      if (extended)
+      {
+        if (n == 1 && second[pos] == '.')
+        {
+          // Ignore the '.' and the following slash
+          if (endpos != second.length() && IsSeparator(second[endpos]))
+          {
+            endpos++;
+          }
+        }
+        else if (n == 2 && second[pos] == '.' && second[pos+1] == '.')
+        {
+          // Ignore the '..' and the following slash
+          if (endpos != second.length() && IsSeparator(second[endpos]))
+          {
+            endpos++;
+          }
+          // Remove the preceeding part of the path
+          l = path.length();
+          size_t m = RootLength(path);
+          if (l > m && path[l-1] == sep)
+          {
+            l--;
+            while (l > m && path[l-1] != sep)
+            {
+              l--;
+            }
+            path.resize(l);
+          }
+        }
+        else if (n > 2 && second[pos + 1] == ':')
+        {
+          path.append(second, pos, 2);
+          path.push_back(sep);
+          path.append(second, pos+2, n-2);
+        }
+        else
+        {
+          path.append(second, pos, n);
+        }
+      }
+      else
+      {
+        path.append(second, pos, n);
+      }
+    }
+    pos = endpos;
+  }
+#else
+  if (this->Path.length() == 0)
+  {
+    // first part is empty, so just return second
+    return second;
+  }
+
+  if (second.length() > 0 && IsSeparator(second[0]))
+  {
+    // second part is an absolute path
+    return second;
+  }
+
+  // append the second part to the first
+  std::string path = this->Path;
+  size_t l = path.length();
+  if (l > 0 && !IsSeparator(path[l-1]))
+  {
+    path.push_back(this->Separator);
+  }
+  path.append(second);
+#endif
+  StripTrailingSlash(&path);
+  return path;
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMFilePath::GetBack() const
+{
+  size_t l = this->Path.length();
+  size_t r = RootLength(this->Path);
+#ifdef _WIN32
+  if (r >= 4 && HasExtendedPrefix(this->Path))
+  {
+    while (l > r && this->Path[l-1] != '\\')
+    {
+      --l;
+    }
+  }
+  else
+#endif
+  {
+    while (l > r && !IsSeparator(this->Path[l-1]))
+    {
+      --l;
+    }
+  }
+  return this->Path.substr(l);
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMFilePath::GetExtension() const
+{
+  size_t i = ExtensionPosition(this->Path);
+  return this->Path.substr(i);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::PopExtension()
+{
+  size_t i = ExtensionPosition(this->Path);
+  this->Path.resize(i);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::PushExtension(const std::string& ext)
+{
+  size_t l = ext.length();
+  if (l == 0 || (l == 1 && ext[0] == '.'))
+  {
+    return;
+  }
+  for (size_t i = 0; i < l; i++)
+  {
+    if (IsSeparator(ext[i]))
+    {
+      return;
+    }
+  }
+
+  if (l > 0 && ext[0] != '.')
+  {
+    this->Path.push_back('.');
+  }
+
+  this->Path.append(ext);
+}
+
+//----------------------------------------------------------------------------
+size_t vtkDICOMFilePath::ExtensionPosition(const std::string& path)
+{
+  size_t l = path.length();
+  size_t r = RootLength(path);
+  size_t i = l;
+
+#ifdef _WIN32
+  if (r >= 4 && HasExtendedPrefix(path))
+  {
+    while (l > r && path[l-1] != '\\')
+    {
+      if (path[--l] == '.')
+      {
+        i = l;
+        break;
+      }
+    }
+  }
+  else
+#endif
+  {
+    while (l > r && !IsSeparator(path[l-1]))
+    {
+      if (path[--l] == '.')
+      {
+        i = l;
+        break;
+      }
+    }
+  }
+
+  return i;
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFilePath::IsRoot() const
+{
+  size_t l = this->Path.length();
+  return (l > 0 && l == RootLength(this->Path));
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFilePath::IsDirectory() const
+{
+  bool result = false;
+#ifdef _WIN32
+  wchar_t *widepath = ConvertToWideChar(this->Path.c_str());
+  if (widepath)
+  {
+    DWORD a = GetFileAttributesW(widepath);
+    delete [] widepath;
+    result = ((a & FILE_ATTRIBUTE_DIRECTORY) != 0);
+  }
+#else
+  struct stat fs;
+  if (stat(this->Path.c_str(), &fs) == 0 && S_ISDIR(fs.st_mode))
+  {
+    result = true;
+  }
+#endif
+  return result;
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMFilePath::IsSymlink() const
+{
+  bool result = false;
+#ifdef _WIN32
+  wchar_t *widepath = ConvertToWideChar(this->Path.c_str());
+  if (widepath && GetFileAttributesW(widepath) != INVALID_FILE_ATTRIBUTES)
+  {
+    WIN32_FIND_DATAW buf;
+    HANDLE h = FindFirstFileW(widepath, &buf);
+    if (h != INVALID_HANDLE_VALUE)
+    {
+      CloseHandle(h);
+      if ((buf.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) != 0 &&
+          buf.dwReserved0 == 0xA000000C)
+      {
+        result = true;
+      }
+    }
+  }
+  delete [] widepath;
+#else
+  struct stat fs;
+  if (lstat(this->Path.c_str(), &fs) == 0 && S_ISLNK(fs.st_mode))
+  {
+    result = true;
+  }
+#endif
+  return result;
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMFilePath::GetRealPath() const
+{
+#ifdef _WIN32
+
+  std::string result;
+  wchar_t *widepath = ConvertToWideChar(this->Path.c_str());
+
+#ifndef DICOM_DEPRECATE_WINXP
+  wchar_t buffer[512];
+  DWORD m = 512;
+  wchar_t *tmp = buffer;
+  DWORD n = GetFullPathNameW(widepath, m, tmp, NULL);
+  if (n >= m-1)
+  {
+    tmp = new wchar_t[n+3];
+    n = GetFullPathNameW(widepath, n+3, tmp, NULL);
+  }
+  delete [] widepath;
+  widepath = tmp;
+#else
+  HANDLE h = CreateFileW(widepath,
+    GENERIC_READ, FILE_SHARE_READ , NULL, OPEN_EXISTING,
+    FILE_FLAG_BACKUP_SEMANTICS, NULL);
+  delete [] widepath;
+
+  if (h == INVALID_HANDLE_VALUE)
+  {
+    return result;
+  }
+
+  wchar_t buffer[512];
+  widepath = buffer;
+  DWORD m = 512;
+  // GetFinalPathNameByHandle() is not supported on Windows XP
+  DWORD n = GetFinalPathNameByHandleW(h, widepath, m, 0);
+  if (n >= m)
+  {
+    widepath = new wchar_t[n+1];
+    n = GetFinalPathNameByHandleW(h, widepath, n+1, 0);
+  }
+  CloseHandle(h);
+#endif
+
+  if (n != 0)
+  {
+    char *path = ConvertToUTF8(widepath);
+    if (widepath != buffer)
+    {
+      delete [] widepath;
+    }
+
+    if (path == 0)
+    {
+      return result;
+    }
+
+#ifndef DICOM_DEPRECATE_WINXP
+    // Add extended prefix if not present
+    if (path[0] == '\0' ||
+        strncmp("\\\\?\\", path, 4) == 0 ||
+        strncmp("\\\\.\\", path, 4) == 0)
+    {
+      result = path;
+    }
+    else
+    {
+      size_t l = strlen(path);
+      if (l >= 2 && path[0] == '\\' && path[1] == '\\')
+      {
+        result = "\\\\?\\UNC\\";
+        result.append(&path[2]);
+      }
+      else
+      {
+        result = "\\\\?\\";
+        result.append(path);
+      }
+    }
+#else
+    result = path;
+#endif
+
+    delete [] path;
+  }
+
+  return result;
+
+#else
+
+#if _POSIX_VERSION >= 200809L
+  char *storage = 0;
+#else
+  char *storage = static_cast<char *>(malloc(PATH_MAX));
+#endif
+
+  std::string result;
+  char *path = realpath(this->Path.c_str(), storage);
+  if (path != 0)
+  {
+    result = path;
+    storage = path;
+  }
+  free(storage);
+  return result;
+
+#endif
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::PushBack(const std::string& second)
+{
+  if (this->Path.length() == 0 || RootLength(second) == 0)
+  {
+    this->Path = this->Join(second);
+  }
+#ifdef _WIN32
+  else if (this->Path.length() == 4 && HasExtendedPrefix(this->Path))
+  {
+    this->Path = this->Join(second);
+  }
+  else if (RootLength(this->Path) == 2 && DriveLetter(this->Path) &&
+           (DriveLetter(this->Path) == DriveLetter(second) ||
+            RootLength(second) == 1))
+  {
+    this->Path = this->Join(second);
+  }
+  // Check if the separator changed, make it sticky.
+  size_t l = this->Path.length();
+  for (size_t i = 0; i < l; i++)
+  {
+    if (IsSeparator(this->Path[i]))
+    {
+      this->Separator = this->Path[i];
+      break;
+    }
+  }
+#endif
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::PopBack()
+{
+  const std::string& path = this->Path;
+  size_t root = RootLength(path);
+  size_t l = path.length();
+
+#ifdef _WIN32
+  if (l >= 4 && HasExtendedPrefix(path))
+  {
+    // only allow backslash as a separator with the "\\?\" prefix
+    while (l > root && path[l-1] != '\\')
+    {
+      --l;
+    }
+    // strip all trailing slashes that aren't part of the root
+    while (l > root && path[l-1] == '\\')
+    {
+      --l;
+    }
+  }
+  else
+#endif
+  {
+    // back up to the last separator
+    while (l > root && !IsSeparator(path[l-1]))
+    {
+      --l;
+    }
+    // strip all trailing slashes that aren't part of the root
+    while (l > root && IsSeparator(path[l-1]))
+    {
+      --l;
+    }
+  }
+
+  this->Path.resize(l);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMFilePath::StripTrailingSlash(std::string *path)
+{
+  size_t l = path->length();
+  size_t r = RootLength(*path);
+#ifdef _WIN32
+  if (r >= 4 && HasExtendedPrefix(*path))
+  {
+    // remove the trailing slash, if present and not the root
+    while (l > r && (*path)[l-1] == '\\')
+    {
+      path->resize(--l);
+    }
+  }
+  else
+#endif
+  {
+    // remove the trailing slash, if present and not the root
+    while (l > r && IsSeparator((*path)[l-1]))
+    {
+      path->resize(--l);
+    }
+  }
+}
+
+//----------------------------------------------------------------------------
+size_t vtkDICOMFilePath::RootLength(const std::string& path)
+{
+  size_t root = 0;
+  size_t l = path.length();
+
+#ifdef _WIN32
+  // Several possible base prefixes exist on Windows:
+  //  \ (the root of the current device)
+  //  A: (indicates a relative path on a device)
+  //  A:\ (the root of a device)
+  //  \\server\share\ (a UNC path prefix)
+  // There's also the special "\\?\" prefix, which allows paths to go beyond
+  // the usual 260 char limits, but is only allowed for absolute paths and
+  // does not allows substitutions such as "/" for "\" or "." and "..".
+  //  \\?\A:\ (the root of a device)
+  //  \\?\UNC\server\share\ (a UNC path prefix)
+  // Finally, the special "\\?\" prefix is used to name system devices:
+  //  \\.\DEVICE (name of a special devices)
+  if (l >= 4 && HasExtendedPrefix(path))
+  {
+    root = 4;
+    if (path[2] == '\?')
+    {
+      if (l >= 7 && path[4] == 'U' && path[5] == 'N' && path[6] == 'C')
+      {
+        if (l == 7)
+        {
+          root = 7;
+        }
+        else if (l > 7 && path[7] == '\\')
+        {
+          root = 8;
+          while (root != l && path[root] != '\\')
+          {
+            root++;
+          }
+          if (root != l && path[root] == '\\')
+          {
+            root++;
+          }
+          while (root != l && path[root] != '\\')
+          {
+            root++;
+          }
+        }
+      }
+      else if (l > 5 && path[5] == ':' &&
+               ((path[4] >= 'A' && path[4] <= 'Z') ||
+                (path[4] >= 'a' && path[4] <= 'z')))
+      {
+        root = 6;
+        if (l > 6 && path[6] == '\\')
+        {
+          root = 7;
+        }
+      }
+    }
+  }
+  else
+  {
+    if (l > 0 && IsSeparator(path[0]))
+    {
+      root = 1;
+      if (l > 1 && IsSeparator(path[1]))
+      {
+        // UNC path
+        root = 2;
+        while (root != l && !IsSeparator(path[root]))
+        {
+          root++;
+        }
+        if (root != l && IsSeparator(path[root]))
+        {
+          root++;
+        }
+        while (root != l && !IsSeparator(path[root]))
+        {
+          root++;
+        }
+      }
+    }
+    else if (l >= 2 && path[1] == ':' &&
+             ((path[0] >= 'A' && path[0] <= 'Z') ||
+              (path[0] >= 'a' && path[0] <= 'z')))
+    {
+      root = 2;
+      if (l > 2 && IsSeparator(path[2]))
+      {
+        root = 3;
+      }
+    }
+  }
+#else
+  // For UNIX, the only possible root is "/"
+  if (l > 0 && IsSeparator(path[0]))
+  {
+    root = 1;
+  }
+#endif
+
+  return root;
+}
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+const wchar_t *vtkDICOMFilePath::Wide()
+{
+  delete [] this->WidePath;
+  this->WidePath = ConvertToWideChar(this->Path.c_str());
+  return this->WidePath;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+const char *vtkDICOMFilePath::Local()
+{
+  delete [] this->LocalPath;
+  this->LocalPath = 0;
+  if (this->Wide())
+  {
+    this->LocalPath = ConvertToLocal(this->WidePath);
+  }
+  return this->LocalPath;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+bool vtkDICOMFilePath::HasExtendedPrefix(const std::string& path)
+{
+  // extended prefixes are '\\?\' and '\\.\'
+  return (path.length() >= 4 &&
+          path[0] == '\\' && path[1] == '\\' && path[3] == '\\' &&
+          (path[2] == '\?' || path[2] == '.'));
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+char vtkDICOMFilePath::DriveLetter(const std::string& path)
+{
+  char d = '\0';
+  size_t l = path.length();
+  size_t pos = 0;
+  if (l >= 4 && HasExtendedPrefix(path))
+  {
+    pos = 4;
+  }
+  if (l >= pos+2 && path[pos+1] == ':')
+  {
+    char e = path[pos];
+    if (e >= 'A' && e <= 'Z')
+    {
+      d = e;
+    }
+    else if (e >= 'a' && e <= 'z')
+    {
+      d = e - ('a' - 'A');
+    }
+  }
+  return d;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+wchar_t *vtkDICOMFilePath::ConvertToWideChar(const char *filename)
+{
+  wchar_t *wideFilename = 0;
+  int n = MultiByteToWideChar(
+    CP_UTF8, 0, filename, -1, NULL, 0);
+  if (n > 0)
+  {
+    wideFilename = new wchar_t[n];
+    n = MultiByteToWideChar(
+      CP_UTF8, 0, filename, -1, wideFilename, n);
+    if (n == 0)
+    {
+      delete [] wideFilename;
+      wideFilename = 0;
+    }
+  }
+  return wideFilename;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+char *vtkDICOMFilePath::ConvertToUTF8(const wchar_t *wideFilename)
+{
+  char *filename = 0;
+  int n = WideCharToMultiByte(
+    CP_UTF8, 0, wideFilename, -1, NULL, 0, 0, 0);
+  if (n > 0)
+  {
+    filename = new char[n];
+    n = WideCharToMultiByte(
+      CP_UTF8, 0, wideFilename, -1, filename, n, 0, 0);
+    if (n == 0)
+    {
+      delete [] filename;
+      filename = 0;
+    }
+  }
+  return filename;
+}
+#endif
+
+//----------------------------------------------------------------------------
+#ifdef _WIN32
+char *vtkDICOMFilePath::ConvertToLocal(const wchar_t *wideFilename)
+{
+  char *filename = 0;
+  int n = WideCharToMultiByte(
+    CP_ACP, 0, wideFilename, -1, NULL, 0, 0, 0);
+  if (n > 0)
+  {
+    filename = new char[n];
+    n = WideCharToMultiByte(
+      CP_ACP, 0, wideFilename, -1, filename, n, 0, 0);
+    if (n == 0)
+    {
+      delete [] filename;
+      filename = 0;
+    }
+  }
+  return filename;
+}
+#endif
diff --git a/Source/vtkDICOMFilePath.h b/Source/vtkDICOMFilePath.h
new file mode 100644
index 0000000..e1d6687
--- /dev/null
+++ b/Source/vtkDICOMFilePath.h
@@ -0,0 +1,184 @@
+/*=========================================================================
+
+  Program: DICOM for VTK
+
+  Copyright (c) 2012-2015 David Gobbi
+  All rights reserved.
+  See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef vtkDICOMFilePath_h
+#define vtkDICOMFilePath_h
+
+#include <vtkSystemIncludes.h>
+#include "vtkDICOMModule.h" // For export macro
+
+#include <string> // Interface type
+
+//! A class that provides path manipulation.
+class VTKDICOM_EXPORT vtkDICOMFilePath
+{
+public:
+  //@{
+  //! Create a new path from the given string.
+  /*!
+   *  Trailing slashes will be removed (unless the trailing slash is
+   *  the root of the filesystem).
+   */
+  vtkDICOMFilePath(const std::string& path);
+
+#ifdef _WIN32
+  //! Create a new path from a wide string.
+  /*!
+   *  This is to support unicode paths on Windows.
+   */
+  vtkDICOMFilePath(const std::wstring& path);
+#endif
+
+  //! Copy constructor.
+  vtkDICOMFilePath(const vtkDICOMFilePath&);
+
+  //! Destructor.
+  ~vtkDICOMFilePath();
+  //@}
+
+  //@{
+  //! Get the path as a string.
+  const std::string& AsString() const { return this->Path; }
+  //@}
+
+  //@{
+  //! Check if the path is empty.
+  bool IsEmpty() const { return (this->Path.length() == 0); }
+
+  //! Check if the path is a root path.
+  bool IsRoot() const;
+
+  //! Check whether the path is an existing directory.
+  bool IsDirectory() const;
+
+  //! Check whether the path is a symbolic link.
+  bool IsSymlink() const;
+  //@}
+
+  //@{
+  //! Return the path joined with the given extra component.
+  std::string Join(const std::string& second) const;
+  //@}
+
+  //@{
+  //! Get the final component of the path.
+  std::string GetBack() const;
+
+  //! Remove a component from the path.
+  void PopBack();
+
+  //! Add a new component (or components) to the path.
+  void PushBack(const std::string& path);
+  //@}
+
+  //@{
+  //! Get the file extension (the final dot and everything after).
+  std::string GetExtension() const;
+
+  //! Remove the current file extension, including the dot.
+  void PopExtension();
+
+  //! Add a new file extension to the current file path.
+  void PushExtension(const std::string& path);
+  //@}
+
+  //@{
+  //! Get the full absolute path (or empty string if file doesn't exist).
+  /*!
+   *  This will go to the file system to find the true path to a file,
+   *  including exactly the same case as used by the file system.  On
+   *  Windows, all forward slashes will be converted to back slashes,
+   *  and the returned file name will have a \\?\ prefix to indicate
+   *  that extended path processing should be used.
+   */
+  std::string GetRealPath() const;
+  //@}
+
+#ifdef _WIN32
+  //@{
+  //! Convert the path to a wchar_t pointer for Windows methods.
+  /*!
+   *  Call this method if the path is going to be passed to a Windows
+   *  method that expects a unicode string.
+   */
+  const wchar_t *Wide();
+
+  //! Convert the path to a local 8-bit string for Windows methods.
+  /*!
+   *  Call this method if the path is going to be passed to a Windows
+   *  method that expects an 8-bit string with the local encoding.
+   */
+  const char *Local();
+  //@}
+
+#endif
+
+  //@{
+  //! Assignment operator.
+  vtkDICOMFilePath& operator=(const vtkDICOMFilePath&);
+  //@}
+
+private:
+
+  //! Check if the given character is a separator.
+  static bool IsSeparator(char c) {
+#ifndef __WRAP__
+#ifdef _WIN32
+    return (c == '/' || c == '\\');
+#else
+    return (c == '/');
+#endif
+#endif
+  }
+
+  //! Strip the trailing slash, if present.
+  static void StripTrailingSlash(std::string *path);
+
+  //! Find the position of the extension (including the dot).
+  static size_t ExtensionPosition(const std::string& path);
+
+  //! Get the length of the "root device" part of the path.
+  /*!
+   *  On UNIX, the root is '/' for absolute paths, and is empty for relative
+   *  paths.  On Windows, the root includes the device letter plus any slash
+   *  that immediately follows it, or the network share path for UNC paths.
+   */
+  static size_t RootLength(const std::string& path);
+
+#ifdef _WIN32
+  //! Check if an extended path prefix is present.
+  static bool HasExtendedPrefix(const std::string& path);
+
+  //! Get the drive letter (or zero if none).
+  static char DriveLetter(const std::string& path);
+
+  //! Convert to WideChar. Returns NULL or new string (free with delete []).
+  static wchar_t *ConvertToWideChar(const char *filename);
+
+  //! Convert to utf8. Returns NULL or new string (free with delete []).
+  static char *ConvertToUTF8(const wchar_t *filename);
+
+  //! Convert to local 8-bit. Returns NULL or new string (free with delete []).
+  static char *ConvertToLocal(const wchar_t *filename);
+#endif
+
+  std::string Path;
+  char Separator;
+#ifdef _WIN32
+  wchar_t *WidePath;
+  char *LocalPath;
+#endif
+};
+
+#endif /* vtkDICOMFilePath_h */
+// VTK-HeaderTest-Exclude: vtkDICOMFilePath.h
diff --git a/Source/vtkDICOMFileSorter.cxx b/Source/vtkDICOMFileSorter.cxx
index 12a5e94..dd1dfb3 100644
--- a/Source/vtkDICOMFileSorter.cxx
+++ b/Source/vtkDICOMFileSorter.cxx
@@ -12,9 +12,13 @@
 
 =========================================================================*/
 #include "vtkDICOMFileSorter.h"
+#include "vtkDICOMFile.h"
+#include "vtkDICOMFileDirectory.h"
+#include "vtkDICOMFilePath.h"
 #include "vtkDICOMMetaData.h"
 #include "vtkDICOMParser.h"
 #include "vtkDICOMUtilities.h"
+#include "vtkDICOMCharacterSet.h"
 
 #include <vtkObjectFactory.h>
 #include <vtkSmartPointer.h>
@@ -28,11 +32,16 @@
 #include <vector>
 #include <list>
 #include <algorithm>
-#include <vtksys/SystemTools.hxx>
-#include <vtksys/Glob.hxx>
 
 #include <ctype.h>
 
+// For compatibility with new VTK generic data arrays
+#ifdef vtkGenericDataArray_h
+#define SetTupleValue SetTypedTuple
+#define GetTupleValue GetTypedTuple
+#define InsertNextTupleValue InsertNextTypedTuple
+#endif
+
 vtkStandardNewMacro(vtkDICOMFileSorter);
 
 //----------------------------------------------------------------------------
@@ -51,7 +60,8 @@ struct vtkDICOMFileSorter::FileInfo
   std::string FileName;
   vtkDICOMValue StudyUID;
   vtkDICOMValue SeriesUID;
-  int InstanceNumber;
+  vtkDICOMValue InstanceUID;
+  unsigned int InstanceNumber;
 };
 
 bool vtkDICOMFileSorter::CompareInstance(
@@ -86,17 +96,17 @@ vtkDICOMFileSorter::vtkDICOMFileSorter()
 vtkDICOMFileSorter::~vtkDICOMFileSorter()
 {
   if (this->InputFileName)
-    {
+  {
     delete [] this->InputFileName;
-    }
+  }
   if (this->InputFileNames)
-    {
+  {
     this->InputFileNames->Delete();
-    }
+  }
   if (this->InternalFileName)
-    {
+  {
     delete [] this->InternalFileName;
-    }
+  }
 
   this->OutputFileNames->Delete();
   delete this->Series;
@@ -130,18 +140,18 @@ void vtkDICOMFileSorter::SetInputFileName(const char *name)
   if (name == this->InputFileName ||
       (name && this->InputFileName &&
        strcmp(name, this->InputFileName) == 0))
-    {
+  {
     return;
-    }
+  }
 
   delete [] this->InputFileName;
   this->InputFileName = 0;
   if (name)
-    {
+  {
     char *cp = new char[strlen(name) + 1];
     strcpy(cp, name);
     this->InputFileName = cp;
-    }
+  }
   this->Modified();
 }
 
@@ -194,21 +204,21 @@ void vtkDICOMFileSorter::AddSeriesFileNames(int study, vtkStringArray *files)
   vtkIdType n = this->Studies->GetNumberOfTuples();
   int st[2];
   if (study == n)
-    {
+  {
     st[0] = static_cast<int>(this->Series->size());
     st[1] = st[0];
     this->Studies->InsertNextTupleValue(st);
-    }
+  }
   else if (n >= 0 && study == n-1)
-    {
+  {
     this->Studies->GetTupleValue(study, st);
     st[1]++;
     this->Studies->SetTupleValue(study, st);
-    }
+  }
   else
-    {
+  {
     vtkErrorMacro("AddSeriesFileNames: non-monotonically increasing study")
-    }
+  }
 
   this->Series->push_back(files);
 }
@@ -226,6 +236,7 @@ void vtkDICOMFileSorter::SortFiles(vtkStringArray *input)
   parser->AddObserver(
     vtkCommand::ErrorEvent, this, &vtkDICOMFileSorter::RelayError);
 
+  groups->InsertNextValue(0x0008);
   groups->InsertNextValue(0x0020);
   parser->SetMetaData(meta);
   parser->SetGroups(groups);
@@ -235,15 +246,35 @@ void vtkDICOMFileSorter::SortFiles(vtkStringArray *input)
 
   vtkIdType numberOfStrings = input->GetNumberOfValues();
   for (vtkIdType j = 0; j < numberOfStrings; j++)
-    {
+  {
     const std::string& fileName = input->GetValue(j);
     this->SetInternalFileName(fileName.c_str());
 
-    // Skip anything that is a directory
-    if (vtksys::SystemTools::FileIsDirectory(fileName.c_str()))
-      {
+    int code = vtkDICOMFile::Access(fileName.c_str(), vtkDICOMFile::In);
+    if (code == vtkDICOMFile::FileIsDirectory)
+    {
+      // Skip anything that is a directory
       continue;
+    }
+    else if (code != 0)
+    {
+      const char *errText = "Can't open the file ";
+      this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
+      if (code == vtkDICOMFile::AccessDenied)
+      {
+        errText = "No permission to read the file ";
+      }
+      else if (code == vtkDICOMFile::FileNotFound)
+      {
+        errText = "File not found ";
+      }
+      else if (code == vtkDICOMFile::ImpossiblePath)
+      {
+        errText = "Bad file path ";
       }
+      vtkErrorMacro("SortFiles: " << errText << this->InternalFileName);
+      continue;
+    }
 
     // Read the file metadata
     meta->Initialize();
@@ -251,22 +282,23 @@ void vtkDICOMFileSorter::SortFiles(vtkStringArray *input)
     parser->SetFileName(fileName.c_str());
     parser->Update();
     if (!parser->GetPixelDataFound())
-      {
+    {
       if (!this->ErrorCode)
-        {
+      {
         this->ErrorCode = parser->GetErrorCode();
-        }
+      }
       if (this->ErrorCode || this->RequirePixelData)
-        {
+      {
         continue;
-        }
       }
+    }
 
     // Insert the file into the sorted list
     FileInfo fileInfo;
     fileInfo.FileName = fileName;
     fileInfo.StudyUID = meta->GetAttributeValue(DC::StudyInstanceUID);
     fileInfo.SeriesUID = meta->GetAttributeValue(DC::SeriesInstanceUID);
+    fileInfo.InstanceUID = meta->GetAttributeValue(DC::SOPInstanceUID);
     fileInfo.InstanceNumber =
       meta->GetAttributeValue(DC::InstanceNumber).AsUnsignedInt();
 
@@ -275,62 +307,97 @@ void vtkDICOMFileSorter::SortFiles(vtkStringArray *input)
 
     bool foundSeries = false;
     for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
-      {
+    {
       // compare studyId first, then seriesId
       int c1 = vtkDICOMUtilities::CompareUIDs(
         studyUID, (*li)[0].StudyUID.GetCharData());
       int c2 = 0;
       if (c1 == 0)
-        {
+      {
         c2 = vtkDICOMUtilities::CompareUIDs(
           seriesUID, (*li)[0].SeriesUID.GetCharData());
-        }
+      }
       if (c1 == 0 && c2 == 0 && seriesUID != 0)
-        {
+      {
         (*li).push_back(fileInfo);
         foundSeries = true;
         break;
-        }
+      }
       else if (c1 >= 0 || (c1 == 0 && c2 >= 0))
-        {
+      {
         break;
-        }
       }
+    }
 
     if (!foundSeries)
-      {
+    {
       std::vector<FileInfo> newSeries;
       newSeries.push_back(fileInfo);
       sortedFiles.insert(li, newSeries);
-      }
     }
+  }
 
   // Sort each series by InstanceNumber
   int studyCount = 0;
 
   vtkDICOMValue lastStudyUID;
   for (li = sortedFiles.begin(); li != sortedFiles.end(); ++li)
-    {
+  {
     std::vector<FileInfo> &v = *li;
     std::stable_sort(v.begin(), v.end(), CompareInstance);
 
     // Is this a new study?
     if (studyCount == 0 || v[0].StudyUID != lastStudyUID)
-      {
+    {
       lastStudyUID = v[0].StudyUID;
       studyCount++;
-      }
+    }
 
-    vtkSmartPointer<vtkStringArray> sa =
-      vtkSmartPointer<vtkStringArray>::New();
+    // Check for duplicate instances, put them into a new series
     vtkIdType n = static_cast<vtkIdType>(v.size());
-    sa->SetNumberOfValues(n);
+    std::vector<vtkIdType> duplicate(n);
+    std::vector<vtkIdType> seriesLength;
+    seriesLength.push_back(0);
+    vtkIdType numberOfDuplicates = 0;
     for (vtkIdType i = 0; i < n; i++)
+    {
+      const vtkDICOMValue& uid = v[i].InstanceUID;
+      vtkIdType count = 0;
+      if (uid.GetVL() > 0)
       {
-      sa->SetValue(i, v[i].FileName);
+        for (vtkIdType j = 0; j < i; j++)
+        {
+          if (v[j].InstanceUID == uid)
+          {
+            count++;
+          }
+        }
+      }
+      duplicate[i] = count;
+      if (count > numberOfDuplicates)
+      {
+        numberOfDuplicates = count;
+        seriesLength.push_back(0);
+      }
+      seriesLength[count]++;
+    }
+
+    for (vtkIdType k = 0; k <= numberOfDuplicates; k++)
+    {
+      vtkSmartPointer<vtkStringArray> sa =
+        vtkSmartPointer<vtkStringArray>::New();
+      sa->SetNumberOfValues(seriesLength[k]);
+      vtkIdType j = 0;
+      for (vtkIdType i = 0; i < n; i++)
+      {
+        if (duplicate[i] == k)
+        {
+          sa->SetValue(j++, v[i].FileName);
+        }
       }
-    this->AddSeriesFileNames(studyCount - 1, sa);
+      this->AddSeriesFileNames(studyCount - 1, sa);
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -340,23 +407,42 @@ void vtkDICOMFileSorter::Execute()
   this->OutputFileNames->Reset();
   this->Series->clear();
   this->Studies->Reset();
-  this->SetInputFileName(0);
+  this->SetInternalFileName(0);
   this->ErrorCode = 0;
 
   if (this->InputFileName) // The input was a single file
+  {
+    int code = vtkDICOMFile::Access(this->InputFileName, vtkDICOMFile::In);
+    if (code == vtkDICOMFile::FileNotFound)
     {
-    if (!vtksys::SystemTools::FileExists(this->InputFileName))
-      {
       this->ErrorCode = vtkErrorCode::FileNotFoundError;
-      vtkErrorMacro("File not found: " << this->InputFileName);
+      vtkErrorMacro("File or directory not found: " << this->InputFileName);
       return;
-      }
-    else if (vtksys::SystemTools::FileIsDirectory(this->InputFileName))
-      {
+    }
+    else if (code == vtkDICOMFile::FileIsDirectory)
+    {
       this->ErrorCode = vtkErrorCode::CannotOpenFileError;
       vtkErrorMacro("Named file is a directory: " << this->InputFileName);
       return;
-      }
+    }
+    else if (code == vtkDICOMFile::AccessDenied)
+    {
+      this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+      vtkErrorMacro("Permission denied: " << this->InputFileName);
+      return;
+    }
+    else if (code == vtkDICOMFile::ImpossiblePath)
+    {
+      this->ErrorCode = vtkErrorCode::CannotOpenFileError;
+      vtkErrorMacro("Bad file path: " << this->InputFileName);
+      return;
+    }
+    else if (code != 0)
+    {
+      this->ErrorCode = vtkErrorCode::UnknownError;
+      vtkErrorMacro("Unknown file error: " << this->InputFileName);
+      return;
+    }
 
     vtkDICOMParser *parser = vtkDICOMParser::New();
     parser->AddObserver(
@@ -369,86 +455,108 @@ void vtkDICOMFileSorter::Execute()
     parser->Delete();
 
     if (!pixelDataFound)
-      {
+    {
       if (!errorCode)
-        {
+      {
         this->ErrorCode = vtkErrorCode::FileFormatError;
         vtkErrorMacro("Not a DICOM image: " << this->InputFileName);
-        }
+      }
       else if (!this->ErrorCode)
-        {
+      {
         this->ErrorCode = errorCode;
-        }
-      return;
       }
+      return;
+    }
 
     // Find the path to the file
-    std::vector<std::string> path;
-    vtksys::SystemTools::SplitPath(this->InputFileName, path);
+    vtkDICOMFilePath path(this->InputFileName);
 
-    // Replace file with a glob pattern
-    std::string ext =
-      vtksys::SystemTools::GetFilenameLastExtension(path.back());
-    path.back() = "*";
+    // Create a glob pattern
+    std::string base = path.GetBack();
+    std::string ext = path.GetExtension();
+    std::string pattern = "*";
     if (ext == ".dc" || ext == ".dcm" || ext == ".DC" || ext == ".DCM")
-      {
-      path.back() += ext;
-      }
-    std::string pattern = vtksys::SystemTools::JoinPath(path);
+    {
+      pattern += ext;
+    }
+    path.PopBack();
+    std::string dirname = path.AsString();
 
     // Find all the files that match the pattern
-    vtksys::Glob glob;
-    glob.RecurseOff();
-    glob.FindFiles(pattern);
-    std::vector<std::string> files = glob.GetFiles();
+    vtkDICOMFileDirectory d(dirname.c_str());
 
     // Create a vtkStringArray from the matching files
     vtkSmartPointer<vtkStringArray> array =
       vtkSmartPointer<vtkStringArray>::New();
-    for (size_t i = 0; i < files.size(); i++)
+    if (d.GetError() == 0)
+    {
+      int n = d.GetNumberOfFiles();
+      for (int i = 0; i < n; i++)
       {
-      array->InsertNextValue(files[i]);
+        const char *filename = d.GetFile(i);
+        if (vtkDICOMUtilities::PatternMatches(pattern.c_str(), filename) &&
+            !d.IsDirectory(i))
+        {
+          path.PushBack(filename);
+          array->InsertNextValue(path.AsString());
+          path.PopBack();
+        }
       }
+    }
 
     // Sort the files
     this->SortFiles(array);
 
-    // Set FileNames to contain the matched series
+    // Find the series that the original file belonged to.  Do the search
+    // twice, once with case-sensitivity and once without
     bool done = false;
-    for (size_t j = 0; j < this->Series->size() && !done; j++)
+    for (int caseless = 0; !done && caseless < 2; caseless++)
+    {
+      if (caseless)
       {
-      vtkStringArray *sa = (*this->Series)[j];
-      for (vtkIdType k = 0; k < sa->GetNumberOfValues(); k++)
+        vtkDICOMCharacterSet cs(vtkDICOMCharacterSet::ISO_IR_192);
+        base = cs.CaseFoldedUTF8(base.data(), base.length());
+      }
+      for (size_t j = 0; j < this->Series->size() && !done; j++)
+      {
+        vtkStringArray *sa = (*this->Series)[j];
+        for (vtkIdType k = 0; k < sa->GetNumberOfValues(); k++)
         {
-        if (vtksys::SystemTools::ComparePath(
-              sa->GetValue(k).c_str(), this->InputFileName))
+          std::string tmp = vtkDICOMFilePath(sa->GetValue(k)).GetBack();
+          if (caseless)
           {
-          this->OutputFileNames->DeepCopy(sa);
-          done = true;
-          break;
+            vtkDICOMCharacterSet cs(vtkDICOMCharacterSet::ISO_IR_192);
+            tmp = cs.CaseFoldedUTF8(tmp.data(), tmp.length());
+          }
+          if (tmp == base)
+          {
+            this->OutputFileNames->DeepCopy(sa);
+            done = true;
+            break;
           }
         }
       }
+    }
 
     // This should never happen
     if (!done)
-      {
+    {
       vtkErrorMacro("Pattern didn't match original file.");
-      }
     }
+  }
   else if (this->InputFileNames) // The input was a list of files
-    {
+  {
     this->SortFiles(this->InputFileNames);
 
     for (size_t j = 0; j < this->Series->size(); j++)
-      {
+    {
       vtkStringArray *sa = (*this->Series)[j];
       for (vtkIdType k = 0; k < sa->GetNumberOfValues(); k++)
-        {
+      {
         this->OutputFileNames->InsertNextValue(sa->GetValue(k));
-        }
       }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -457,57 +565,57 @@ void vtkDICOMFileSorter::Update()
   if (this->GetMTime() > this->UpdateTime.GetMTime() ||
       (this->InputFileNames &&
        this->InputFileNames->GetMTime() > this->UpdateTime.GetMTime()))
-    {
+  {
     this->Execute();
     this->UpdateTime.Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMFileSorter::SetInternalFileName(const char *name)
 {
   if (this->InternalFileName == NULL && name == NULL)
-    {
+  {
     return;
-    }
+  }
   if (this->InternalFileName != 0 && name != 0 &&
       strcmp(this->InternalFileName, name) == 0)
-    {
+  {
     return;
-    }
+  }
   if (this->InternalFileName)
-    {
+  {
     delete [] this->InternalFileName;
-    }
+  }
   if (name)
-    {
+  {
     size_t n = strlen(name) + 1;
     char *cp1 =  new char[n];
     const char *cp2 = (name);
     this->InternalFileName = cp1;
     do { *cp1++ = *cp2++; } while (--n);
-    }
+  }
   else
-    {
+  {
     this->InternalFileName = 0;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMFileSorter::RelayError(vtkObject *o, unsigned long e, void *data)
 {
   if (e == vtkCommand::ErrorEvent)
-    {
+  {
     vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o);
     if (parser)
-      {
+    {
       this->SetErrorCode(parser->GetErrorCode());
       this->SetInternalFileName(parser->GetFileName());
-      }
-    vtkErrorMacro(<< static_cast<char *>(data));
     }
+    vtkErrorMacro(<< static_cast<char *>(data));
+  }
   else
-    {
+  {
     this->InvokeEvent(e, data);
-    }
+  }
 }
diff --git a/Source/vtkDICOMFileSorter.h b/Source/vtkDICOMFileSorter.h
index b781003..278ec98 100644
--- a/Source/vtkDICOMFileSorter.h
+++ b/Source/vtkDICOMFileSorter.h
@@ -36,6 +36,7 @@ public:
   void PrintSelf(ostream& os, vtkIndent indent);
   static vtkDICOMFileSorter *New();
 
+  //@{
   //! Set one file from the desired series.
   /*!
    *  When Update() is called, all files that belong to the
@@ -44,7 +45,9 @@ public:
    */
   void SetInputFileName(const char *name);
   const char *GetInputFileName() { return this->InputFileName; }
+  //@}
 
+  //@{
   //! Set a list of file names to group and sort.
   /*!
    *  This method is mutually exclusive with SetInputFileName().
@@ -53,13 +56,17 @@ public:
    */
   void SetInputFileNames(vtkStringArray *input);
   vtkStringArray *GetInputFileNames() { return this->InputFileNames; }
+  //@}
 
+  //@{
   //! Update the information about the files.
   /*!
    * This method must be called before any of the Get methods.
    */
   virtual void Update();
+  //@}
 
+  //@{
   //! Get the total number of series that were found.
   int GetNumberOfSeries();
 
@@ -71,19 +78,25 @@ public:
 
   //! Get the last series (inclusive) for a particular study.
   int GetLastSeriesForStudy(int study);
+  //@}
 
+  //@{
   //! Get the full list of sorted filenames.
   vtkStringArray *GetOutputFileNames() { return this->OutputFileNames; }
 
   //! Get the file names for a specific series.
   vtkStringArray *GetFileNamesForSeries(int i);
+  //@}
 
+  //@{
   //! Get the error code.
   unsigned long GetErrorCode() { return this->ErrorCode; }
 
   //! Get the filename associated with the error code.
   const char *GetInternalFileName() { return this->InternalFileName; }
+  //@}
 
+  //@{
   //! If this is On, files with no pixel data will be skipped.
   /*!
    *  This is On by default.  Some files, such as dicom directory files,
@@ -92,6 +105,7 @@ public:
   vtkSetMacro(RequirePixelData, int);
   vtkBooleanMacro(RequirePixelData, int);
   int GetRequirePixelData() { return this->RequirePixelData; }
+  //@}
 
 protected:
   vtkDICOMFileSorter();
@@ -133,8 +147,8 @@ protected:
   void SetErrorCode(unsigned long e) { this->ErrorCode = e; }
 
 private:
-  vtkDICOMFileSorter(const vtkDICOMFileSorter&);  // Not implemented.
-  void operator=(const vtkDICOMFileSorter&);  // Not implemented.
+  vtkDICOMFileSorter(const vtkDICOMFileSorter&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMFileSorter&) VTK_DELETE_FUNCTION;
 
   class StringArrayVector;
   struct FileInfo;
diff --git a/Source/vtkDICOMGenerator.cxx b/Source/vtkDICOMGenerator.cxx
index e7e3860..481f291 100644
--- a/Source/vtkDICOMGenerator.cxx
+++ b/Source/vtkDICOMGenerator.cxx
@@ -17,6 +17,7 @@
 #include "vtkDICOMItem.h"
 #include "vtkDICOMTagPath.h"
 #include "vtkDICOMMetaDataAdapter.h"
+#include "vtkDICOMUIDGenerator.h"
 #include "vtkDICOMUtilities.h"
 
 #include "vtkObjectFactory.h"
@@ -33,14 +34,21 @@
 #include <math.h>
 #include <stdlib.h>
 
+// For compatibility with new VTK generic data arrays
+#ifdef vtkGenericDataArray_h
+#define SetTupleValue SetTypedTuple
+#endif
+
 vtkCxxSetObjectMacro(vtkDICOMGenerator,PatientMatrix,vtkMatrix4x4);
 vtkCxxSetObjectMacro(vtkDICOMGenerator,SourceMetaData,vtkDICOMMetaData);
+vtkCxxSetObjectMacro(vtkDICOMGenerator,UIDGenerator,vtkDICOMUIDGenerator);
 
 //----------------------------------------------------------------------------
 vtkDICOMGenerator::vtkDICOMGenerator()
 {
   this->MetaData = 0;
   this->SourceMetaData = 0;
+  this->UIDGenerator = 0;
   this->MultiFrame = 0;
   this->OriginAtBottom = 1;
   this->ReverseSliceOrder = 0;
@@ -63,44 +71,48 @@ vtkDICOMGenerator::vtkDICOMGenerator()
   this->PixelValueRange[1] = -1;
 
   for (int i = 0; i < 5; i++)
-    {
+  {
     this->Dimensions[i] = 0;
     this->Spacing[i] = 0;
     this->Origin[i] = 0;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 vtkDICOMGenerator::~vtkDICOMGenerator()
 {
   if (this->RangeArray)
-    {
+  {
     this->RangeArray->Delete();
-    }
+  }
   if (this->SourceInstanceArray)
-    {
+  {
     this->SourceInstanceArray->Delete();
-    }
+  }
   if (this->SliceIndexArray)
-    {
+  {
     this->SliceIndexArray->Delete();
-    }
+  }
   if (this->ComponentIndexArray)
-    {
+  {
     this->ComponentIndexArray->Delete();
-    }
+  }
   if (this->PatientMatrix)
-    {
+  {
     this->PatientMatrix->Delete();
-    }
+  }
+  if (this->UIDGenerator)
+  {
+    this->UIDGenerator->Delete();
+  }
   if (this->SourceMetaData)
-    {
+  {
     this->SourceMetaData->Delete();
-    }
+  }
   if (this->MetaData)
-    {
+  {
     this->MetaData->Delete();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -122,40 +134,49 @@ void vtkDICOMGenerator::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "MetaData: ";
   if (this->MetaData)
-    {
+  {
     os << this->MetaData << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
   os << indent << "SourceMetaData: ";
   if (this->SourceMetaData)
-    {
+  {
     os << this->SourceMetaData << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
+  os << indent << "UIDGenerator: ";
+  if (this->UIDGenerator)
+  {
+    os << this->UIDGenerator << "\n";
+  }
+  else
+  {
+    os << "(none)\n";
+  }
   os << indent << "SliceIndexArray: ";
   if (this->SliceIndexArray)
-    {
+  {
     os << this->SliceIndexArray << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
   os << indent << "ComponentIndexArray: ";
   if (this->ComponentIndexArray)
-    {
+  {
     os << this->ComponentIndexArray << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
   os << indent << "MultiFrame: "
      << (this->MultiFrame ? "On\n" : "Off\n");
   os << indent << "OriginAtBottom: "
@@ -171,19 +192,42 @@ void vtkDICOMGenerator::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "PatientMatrix:";
   if (this->PatientMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMUIDGenerator *vtkDICOMGenerator::GetUIDGenerator()
+{
+  vtkDICOMUIDGenerator *uidgen = this->UIDGenerator;
+  if (uidgen == 0)
+  {
+    uidgen = vtkDICOMUIDGenerator::GetDefault();
+  }
+  return uidgen;
+}
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMGenerator::GenerateUID(vtkDICOMTag tag)
+{
+  return this->GetUIDGenerator()->GenerateUID(tag);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMGenerator::GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids)
+{
+  return this->GetUIDGenerator()->GenerateUIDs(tag, uids);
 }
 
 //----------------------------------------------------------------------------
@@ -217,28 +261,28 @@ void vtkDICOMGenerator::ComputeAspectRatio(
 
   double minrem = fabs(a - 1.0);
   for (int j = 0; primes[j] != 0; j++)
-    {
+  {
     int x = primes[j];
     double b = a*x;
     int y = static_cast<int>(b + 0.5);
     double r = fabs(b - y);
     if (r < minrem)
-      {
+    {
       minrem = r;
       yaspect = y;
       xaspect = x;
-      }
+    }
     y = x;
     b = y/a;
     x = static_cast<int>(b + 0.5);
     r = fabs(b - x);
     if (r < minrem)
-      {
+    {
       minrem = r;
       yaspect = y;
       xaspect = x;
-      }
     }
+  }
 
   aspect[0] = yaspect;
   aspect[1] = xaspect;
@@ -249,13 +293,13 @@ void vtkDICOMGenerator::ComputeAdjustedMatrix(
   double matrix[16], double origin[3], double spacing[3])
 {
   if (this->PatientMatrix)
-    {
+  {
     vtkMatrix4x4::DeepCopy(matrix, this->PatientMatrix);
-    }
+  }
   else
-    {
+  {
     vtkMatrix4x4::Identity(matrix);
-    }
+  }
 
   spacing[0] = this->Spacing[0];
   spacing[1] = this->Spacing[1];
@@ -266,7 +310,7 @@ void vtkDICOMGenerator::ComputeAdjustedMatrix(
   origin[2] = this->Origin[2];
 
   if (this->OriginAtBottom)
-    {
+  {
     // move origin to the correct corner
     origin[1] -= spacing[1]*(this->Dimensions[1] - 1);
     matrix[1] = -matrix[1];
@@ -277,7 +321,7 @@ void vtkDICOMGenerator::ComputeAdjustedMatrix(
     matrix[2] = -matrix[2];
     matrix[6] = -matrix[6];
     matrix[10] = -matrix[10];
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -328,40 +372,40 @@ void vtkDICOMGenerator::ComputeDimensions(
   // time is either in the slices or in the components
   int numTimeSlots = this->TimeDimension;
   if (numTimeSlots)
-    {
+  {
     if (this->TimeAsVector)
-      {
+    {
       if (numComponents % numTimeSlots == 0)
-        {
+      {
         numComponents /= numTimeSlots;
-        }
+      }
       else
-        {
+      {
         numTimeSlots = 0;
-        }
       }
+    }
     else
-      {
+    {
       if (numSlices % numTimeSlots == 0)
-        {
+      {
         numSlices /= numTimeSlots;
-        }
+      }
       else
-        {
+      {
         numTimeSlots = 0;
-        }
       }
     }
+  }
 
   // if unsigned char, assume scalars are colors, not vector components
   if (scalarType == VTK_UNSIGNED_CHAR)
-    {
+  {
     numComponents /= this->NumberOfColorComponents;
     if (numComponents < 2)
-      {
+    {
       numComponents = 0;
-      }
     }
+  }
 
   dims[0] = extent[1] - extent[0] + 1;
   dims[1] = extent[3] - extent[2] + 1;
@@ -381,11 +425,11 @@ void vtkDICOMGenerator::ComputeDimensions(
 
   // get the dimension spacing
   if (!this->TimeAsVector && numTimeSlots > 1 && numSlices > 1)
-    {
+  {
     // adjust spacing for multiple temporal positions per spatial position
     spacing[2] *= (numTimeSlots*numSlices - 1);
     spacing[2] /= (numSlices - 1);
-    }
+  }
   spacing[3] = this->TimeSpacing;
   spacing[4] = 0.0;
 
@@ -399,16 +443,16 @@ void vtkDICOMGenerator::ComputeDimensions(
 void vtkDICOMGenerator::MatchInstances(vtkDICOMMetaData *sourcemeta)
 {
   if (this->SourceInstanceArray)
-    {
+  {
     this->SourceInstanceArray->Delete();
     this->SourceInstanceArray = 0;
-    }
+  }
 
   // make sure there is sourcemeta data to compare with
   if (!sourcemeta)
-    {
+  {
     return;
-    }
+  }
 
   // create an adapter to handle enhanced multi-frame source
   vtkDICOMMetaDataAdapter source(sourcemeta);
@@ -421,32 +465,32 @@ void vtkDICOMGenerator::MatchInstances(vtkDICOMMetaData *sourcemeta)
   bool mismatch = false;
   int m = source->GetNumberOfInstances();
   for (int j = 0; j < m && !mismatch; j++)
-    {
+  {
     const vtkDICOMValue &o =
       source->GetAttributeValue(j, DC::ImageOrientationPatient);
     if (o.GetNumberOfValues() != 6)
-      {
+    {
       mismatch = true;
       break;
-      }
+    }
 
     double orientation[6];
     o.GetValues(orientation, 6);
     for (int i = 0; i < 3; i++)
-      {
+    {
       if (fabs(matrix[4*i] - orientation[i]) > 1e-4 ||
           fabs(matrix[4*i + 1] - orientation[i + 3]) > 1e-4)
-        {
+      {
         mismatch = true;
         break;
-        }
       }
     }
+  }
 
   if (mismatch)
-    {
+  {
     return;
-    }
+  }
 
   this->SourceInstanceArray = vtkIntArray::New();
   this->SourceInstanceArray->SetNumberOfComponents(1);
@@ -455,21 +499,21 @@ void vtkDICOMGenerator::MatchInstances(vtkDICOMMetaData *sourcemeta)
 
   int timeSlices = 1;
   if (!this->TimeAsVector && this->Dimensions[3] > 0)
-    {
+  {
     timeSlices = this->Dimensions[3];
-    }
+  }
 
   // for keeping track of which source instances have been matched
   bool *usedInstances = new bool[m];
   for (int j = 0; j < m; j++)
-    {
+  {
     usedInstances[j] = false;
-    }
+  }
 
   int n = this->MetaData->GetNumberOfInstances();
   double zorigin = origin[2];
   for (int i = 0; i < n && !mismatch; i++)
-    {
+  {
     int sliceIdx = this->SliceIndexArray->GetComponent(i, 0);
     // remove the time from the slice index
     sliceIdx /= timeSlices;
@@ -484,44 +528,44 @@ void vtkDICOMGenerator::MatchInstances(vtkDICOMMetaData *sourcemeta)
     // the 4th and 5th dimensions correctly
     bool foundOne = false;
     for (int j = 0; j < m; j++)
-      {
+    {
       if (usedInstances[j])
-        {
+      {
         continue;
-        }
+      }
 
       const vtkDICOMValue &p =
         source->GetAttributeValue(j, DC::ImagePositionPatient);
       if (p.GetNumberOfValues() == 3)
-        {
+      {
         double r[3];
         p.GetValues(r, 3);
         double dd = 0;
         for (int k = 0; k < 3; k++)
-          {
+        {
           double d = r[k] - position[k];
           dd += d*d;
-          }
+        }
         if (dd/(spacing[2]*spacing[2]) < 1e-8)
-          {
+        {
           this->SourceInstanceArray->SetComponent(i, 0, j);
           usedInstances[j] = true;
           foundOne = true;
           break;
-          }
         }
       }
+    }
 
     mismatch = !foundOne;
-    }
+  }
 
   delete [] usedInstances;
 
   if (mismatch)
-    {
+  {
     this->SourceInstanceArray->Delete();
     this->SourceInstanceArray = 0;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -533,33 +577,33 @@ void vtkDICOMGeneratorComputeHistogram(
   vtkIdType *histogram)
 {
   if (n > 0)
-    {
+  {
     if (nComponents == totalComponents)
-      {
+    {
       do { histogram[*ptr++]++; } while (--n > 0);
-      }
+    }
     else if (nComponents == 1)
-      {
+    {
       do
-        {
+      {
         histogram[*ptr]++;
         ptr += totalComponents;
         n -= totalComponents;
-        }
-      while (n > 0);
       }
+      while (n > 0);
+    }
     else
-      {
+    {
       do
-        {
+      {
         int m = nComponents;
         do { histogram[*ptr++]++; } while (--m > 0);
         ptr += (totalComponents - nComponents);
         n -= totalComponents;
-        }
-      while (n > 0);
       }
+      while (n > 0);
     }
+  }
 }
 
 } // end anonymous namespace
@@ -579,14 +623,14 @@ void vtkDICOMGenerator::ComputePixelValueRange(
   data->GetExtent(extent);
   info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), wholeExtent);
   for (int i = 0; i < 6; i++)
-    {
+  {
     if (extent[i] != wholeExtent[i])
-      {
+    {
       seriesRange[0] = 0;
       seriesRange[1] = -1;
       return;
-      }
     }
+  }
 
   vtkDataArray *a = data->GetPointData()->GetScalars();
   vtkIdType nt = a->GetNumberOfTuples();
@@ -601,15 +645,15 @@ void vtkDICOMGenerator::ComputePixelValueRange(
   seriesRange[1] = static_cast<int>(range[1]);
 
   if (this->RangeArray)
-    {
+  {
     this->RangeArray->Delete();
     this->RangeArray = 0;
-    }
+  }
 
   if (this->ScalarType == VTK_UNSIGNED_SHORT ||
       this->ScalarType == VTK_SHORT || this->ScalarType == VTK_SIGNED_CHAR ||
       this->ScalarType == VTK_UNSIGNED_CHAR)
-    {
+  {
     vtkIdType *h = new vtkIdType[seriesRange[1] - seriesRange[0] + 1];
     vtkIdType *histogram = h - seriesRange[0];
 
@@ -619,9 +663,9 @@ void vtkDICOMGenerator::ComputePixelValueRange(
     int nvector = (this->Dimensions[4] > 0 ? this->Dimensions[4] : 1);
     int sliceSize = npixels/(npositions*ntimes);
     if (this->TimeAsVector)
-      {
+    {
       sliceSize = npixels/npositions;
-      }
+    }
 
     int nframes = this->SliceIndexArray->GetNumberOfComponents();
     int ninstances = this->SliceIndexArray->GetNumberOfTuples();
@@ -632,9 +676,9 @@ void vtkDICOMGenerator::ComputePixelValueRange(
     this->RangeArray->SetNumberOfTuples(ntotal);
 
     for (int i = 0; i < ninstances; i++)
-      {
+    {
       for (int j = 0; j < nframes; j++)
-        {
+      {
         int k = i*nframes + j;
         int idx = 0;
         int s = this->SliceIndexArray->GetComponent(i, j);
@@ -642,22 +686,22 @@ void vtkDICOMGenerator::ComputePixelValueRange(
         int n = nc/nvector; // ntimes*samplesPerPixel
         idx += s*sliceSize;
         if (this->TimeAsVector)
-          {
+        {
           n /= ntimes; // samplesPerPixel
           int t = v/nvector;
           v = v % nvector;
           idx += t*nvector*n;
-          }
+        }
         idx += v*n;
 
         void *ptr = a->GetVoidPointer(idx);
         for (int hi = seriesRange[0]; hi <= seriesRange[1]; hi++)
-          {
+        {
           histogram[hi] = 0;
-          }
+        }
 
         switch (this->ScalarType)
-          {
+        {
           case VTK_UNSIGNED_SHORT:
             vtkDICOMGeneratorComputeHistogram(
               static_cast<unsigned short *>(ptr), sliceSize, n, nc, histogram);
@@ -674,7 +718,7 @@ void vtkDICOMGenerator::ComputePixelValueRange(
             vtkDICOMGeneratorComputeHistogram(
               static_cast<signed char *>(ptr), sliceSize, n, nc, histogram);
             break;
-          }
+        }
 
         // compute the min/max from the histogram,
         // also try to compute window/level as 99th percentile
@@ -687,18 +731,18 @@ void vtkDICOMGenerator::ComputePixelValueRange(
         int minVal = seriesRange[0] - 1;
         int maxVal = seriesRange[0];
         for (int hi = seriesRange[0]; hi <= seriesRange[1]; hi++)
-          {
+        {
           vtkIdType b = histogram[hi];
           sum += b;
           lowVal = (sum > lowSum ? lowVal : hi);
           highVal = (sum > highSum ? highVal : hi);
           minVal = (sum > 0 ? minVal : hi);
           maxVal = (b == 0 ? maxVal : hi);
-          }
+        }
         if (minVal < maxVal)
-          {
+        {
           minVal++;
-          }
+        }
         // expand the window slightly, but keep within total range
         int lowExpansion = static_cast<int>((highVal - lowVal)*0.1);
         int highExpansion = static_cast<int>((highVal - lowVal)*0.1);
@@ -713,20 +757,20 @@ void vtkDICOMGenerator::ComputePixelValueRange(
         tp[2] = lowVal;
         tp[3] = highVal;
         this->RangeArray->SetTupleValue(k, tp);
-        }
       }
+    }
 
     delete [] h;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMGenerator::InitializeMetaData(vtkInformation *info)
 {
   if (this->MetaData)
-    {
+  {
     this->MetaData->Delete();
-    }
+  }
   this->MetaData = vtkDICOMMetaData::New();
   vtkDICOMMetaData *meta = this->MetaData;
 
@@ -746,23 +790,23 @@ void vtkDICOMGenerator::InitializeMetaData(vtkInformation *info)
   // compute the SliceIndexArray, either use one multi-frame file to save
   // the data or use a series of non-multi-frame files
   if (this->MultiFrame)
-    {
+  {
     this->NumberOfFrames = nframes;
     this->SliceIndexArray->SetNumberOfComponents(nframes);
     this->SliceIndexArray->SetNumberOfTuples(1);
     this->ComponentIndexArray->SetNumberOfComponents(nframes);
     this->ComponentIndexArray->SetNumberOfTuples(1);
     meta->SetNumberOfInstances(1);
-    }
+  }
   else
-    {
+  {
     this->NumberOfFrames = 0;
     this->SliceIndexArray->SetNumberOfComponents(1);
     this->SliceIndexArray->SetNumberOfTuples(nframes);
     this->ComponentIndexArray->SetNumberOfComponents(1);
     this->ComponentIndexArray->SetNumberOfTuples(nframes);
     meta->SetNumberOfInstances(nframes);
-    }
+  }
 
   // Reversing slice ordering isn't necessary if the ImagePlane module
   // is present, because then every file has an ImagePositionPatient,
@@ -772,53 +816,53 @@ void vtkDICOMGenerator::InitializeMetaData(vtkInformation *info)
   // dimension) comes before the slice dimension in the files.
   bool switchDimensions = false;
   for (int k = 0; k < 4; k++)
-    {
+  {
     int m = nframes/numSlices;
     int n = m/numTimeSlots;
     for (int i = 0; i < nframes; i++)
-      {
+    {
       int componentIdx = (switchDimensions ? i / numSlices : i % m);
       int sliceIdx = (switchDimensions ? i % numSlices : i / m);
       sliceIdx = (reverseSlices ? (numSlices - sliceIdx - 1) : sliceIdx);
       if (!this->TimeAsVector)
-        {
+      {
         int timeIdx = componentIdx / n;
         componentIdx = componentIdx % n;
         sliceIdx = sliceIdx*numTimeSlots + timeIdx;
-        }
+      }
       this->SliceIndexArray->SetValue(i, sliceIdx);
       this->ComponentIndexArray->SetValue(i, componentIdx);
-      }
+    }
 
     // Try to match each generated slice to an input slice
     this->MatchInstances(this->SourceMetaData);
 
     if (this->SourceInstanceArray)
-      {
+    {
       // If MatchInstances generated a reversed array, try again with
       // the slices in the opposite order.
       if (this->SourceInstanceArray->GetComponent(0, 0) >
           this->SourceInstanceArray->GetComponent(nframes-1, 0))
-        {
+      {
         reverseSlices = !reverseSlices;
         continue;
-        }
+      }
 
       // If MatchInstances generated a shuffled array, try again with
       // a different dimension ordering.
       for (int j = 1; j < nframes; j++)
-        {
+      {
         if (this->SourceInstanceArray->GetComponent(j-1, 0) >
             this->SourceInstanceArray->GetComponent(j, 0))
-          {
+        {
           switchDimensions = !switchDimensions;
           continue;
-          }
         }
       }
+    }
 
     break;
-    }
+  }
 
   this->ComputePixelValueRange(info, this->PixelValueRange);
 }
@@ -831,79 +875,79 @@ bool vtkDICOMGenerator::CopyRequiredAttributes(
 
   if (source && source == this->SourceMetaData && this->SourceInstanceArray &&
       source->HasAttribute(DC::PerFrameFunctionalGroupsSequence))
-    {
+  {
     while (*tags != DC::ItemDelimitationItem)
-      {
+    {
       vtkDICOMTag tag = *tags++;
       vtkDICOMMetaDataAdapter sourceAdapter(source);
       bool nonevalid = true;
       int n = meta->GetNumberOfInstances();
       for (int i = 0; i < n; i++)
-        {
+      {
         int j = this->SourceInstanceArray->GetComponent(i, 0);
         const vtkDICOMValue& v = sourceAdapter->GetAttributeValue(j, tag);
         if (v.IsValid())
-          {
+        {
           nonevalid = false;
           meta->SetAttributeValue(i, tag, v);
-          }
         }
+      }
       if (nonevalid)
-        {
+      {
         // set the attribute to zero-length value.
         vtkDICOMVR vr = meta->FindDictVR(0, tag);
         if (vr != vtkDICOMVR::UN)
-          {
+        {
           meta->SetAttributeValue(tag, vtkDICOMValue(vr));
-          }
         }
       }
     }
+  }
   else if (source)
-    {
+  {
     while (*tags != DC::ItemDelimitationItem)
-      {
+    {
       vtkDICOMTag tag = *tags++;
       vtkDICOMDataElementIterator iter = source->Find(tag);
       if (iter != source->End())
-        {
+      {
         if (!iter->IsPerInstance())
-          {
+        {
           meta->SetAttributeValue(tag, iter->GetValue());
-          }
+        }
         else if (this->SourceInstanceArray && source == this->SourceMetaData)
-          {
+        {
           int n = meta->GetNumberOfInstances();
           for (int i = 0; i < n; i++)
-            {
+          {
             int j = this->SourceInstanceArray->GetComponent(i, 0);
             meta->SetAttributeValue(i, tag, iter->GetValue(j));
-            }
           }
         }
+      }
       else
-        {
+      {
         // set the attribute to zero-length value.
         vtkDICOMVR vr = meta->FindDictVR(0, tag);
         if (vr != vtkDICOMVR::UN)
-          {
+        {
           meta->SetAttributeValue(tag, vtkDICOMValue(vr));
-          }
         }
       }
     }
+  }
   else
-    {
+  {
     while (*tags != DC::ItemDelimitationItem)
-      {
+    {
       vtkDICOMTag tag = *tags++;
       vtkDICOMVR vr = meta->FindDictVR(0, tag);
       if (vr != vtkDICOMVR::UN)
-        {
+      {
         meta->SetAttributeValue(tag, vtkDICOMValue(vr));
-        }
       }
     }
+  }
 
   return true;
 }
@@ -916,47 +960,47 @@ bool vtkDICOMGenerator::CopyOptionalAttributes(
 
   if (source && source == this->SourceMetaData && this->SourceInstanceArray &&
       source->HasAttribute(DC::PerFrameFunctionalGroupsSequence))
-    {
+  {
     while (*tags != DC::ItemDelimitationItem)
-      {
+    {
       vtkDICOMTag tag = *tags++;
       vtkDICOMMetaDataAdapter sourceAdapter(source);
       int n = meta->GetNumberOfInstances();
       for (int i = 0; i < n; i++)
-        {
+      {
         int j = this->SourceInstanceArray->GetComponent(i, 0);
         const vtkDICOMValue& v = sourceAdapter->GetAttributeValue(j, tag);
         if (v.IsValid())
-          {
+        {
           meta->SetAttributeValue(i, tag, v);
-          }
         }
       }
     }
+  }
   else if (source)
-    {
+  {
     while (*tags != DC::ItemDelimitationItem)
-      {
+    {
       vtkDICOMTag tag = *tags++;
       vtkDICOMDataElementIterator iter = source->Find(tag);
       if (iter != source->End())
-        {
+      {
         if (!iter->IsPerInstance())
-          {
+        {
           meta->SetAttributeValue(tag, iter->GetValue());
-          }
+        }
         else if (this->SourceInstanceArray && source == this->SourceMetaData)
-          {
+        {
           int n = meta->GetNumberOfInstances();
           for (int i = 0; i < n; i++)
-            {
+          {
             int j = this->SourceInstanceArray->GetComponent(i, 0);
             meta->SetAttributeValue(i, tag, iter->GetValue(j));
-            }
           }
         }
       }
     }
+  }
 
   return true;
 }
@@ -982,19 +1026,19 @@ bool vtkDICOMGenerator::GenerateSOPCommonModule(
   vtkSmartPointer<vtkStringArray> uids =
     vtkSmartPointer<vtkStringArray>::New();
   uids->SetNumberOfValues(n);
-  vtkDICOMUtilities::GenerateUIDs(DC::SOPInstanceUID, uids);
+  this->GenerateUIDs(DC::SOPInstanceUID, uids);
   for (int i = 0; i < n; i++)
-    {
+  {
     meta->SetAttributeValue(i, DC::SOPInstanceUID, uids->GetValue(i));
-    }
+  }
 
   // set the InstanceCreationDate and Time
   const char *tz = 0;
   if (source)
-    {
+  {
     tz = source->GetAttributeValue(
       DC::TimezoneOffsetFromUTC).GetCharData();
-    }
+  }
   std::string dt = vtkDICOMUtilities::GenerateDateTime(tz);
   meta->SetAttributeValue(DC::InstanceCreationDate, dt.substr(0, 8));
   meta->SetAttributeValue(DC::InstanceCreationTime, dt.substr(8, 13));
@@ -1090,14 +1134,14 @@ bool vtkDICOMGenerator::GenerateGeneralStudyModule(vtkDICOMMetaData *source)
   // The StudyInstanceUID is mandatory.
   std::string studyUID;
   if (source)
-    {
+  {
     studyUID = source->GetAttributeValue(
       DC::StudyInstanceUID).AsString();
-    }
+  }
   if (studyUID == "")
-    {
-    studyUID = vtkDICOMUtilities::GenerateUID(DC::StudyInstanceUID);
-    }
+  {
+    studyUID = this->GenerateUID(DC::StudyInstanceUID);
+  }
   vtkDICOMMetaData *meta = this->MetaData;
   meta->SetAttributeValue(DC::StudyInstanceUID, studyUID);
 
@@ -1179,53 +1223,53 @@ bool vtkDICOMGenerator::GenerateGeneralSeriesModule(vtkDICOMMetaData *source)
   vtkDICOMMetaData *meta = this->MetaData;
   meta->SetAttributeValue(
     DC::SeriesInstanceUID,
-    vtkDICOMUtilities::GenerateUID(DC::SeriesInstanceUID));
+    this->GenerateUID(DC::SeriesInstanceUID));
 
   // The modality is mandatory, it cannot be left blank,
   // and it must agree with the SOP Class IOD.
   std::string m;
   if (source)
-    {
+  {
     m = source->GetAttributeValue(DC::Modality).AsString();
-    }
+  }
   if (m == "")
-    {
+  {
     m = "OT"; // Other, i.e. unknown
-    }
+  }
   meta->SetAttributeValue(DC::Modality, m);
 
   // Set pixel min/max information
   if (this->ScalarType != VTK_INT && this->ScalarType != VTK_UNSIGNED_INT)
-    {
+  {
     // Get the pixel VR
     vtkDICOMVR pixelVR = vtkDICOMVR::US;
     if (this->ScalarType == VTK_SIGNED_CHAR ||
         this->ScalarType == VTK_SHORT)
-      {
+    {
       pixelVR = vtkDICOMVR::SS;
-      }
+    }
 
     // Force it to conform the VRs allowed by the SOP Class
     if ((this->AllowedPixelRepresentation & RepresentationSigned) == 0)
-      {
+    {
       pixelVR = vtkDICOMVR::US;
-      }
+    }
     else if ((this->AllowedPixelRepresentation & RepresentationUnsigned) == 0)
-      {
+    {
       pixelVR = vtkDICOMVR::SS;
-      }
+    }
 
     // These are optional, but very nice to have
     if (this->PixelValueRange[0] <= this->PixelValueRange[1])
-      {
+    {
       meta->SetAttributeValue(
         DC::SmallestPixelValueInSeries,
         vtkDICOMValue(pixelVR, this->PixelValueRange[0]));
       meta->SetAttributeValue(
         DC::LargestPixelValueInSeries,
         vtkDICOMValue(pixelVR, this->PixelValueRange[1]));
-      }
     }
+  }
 
   // required items: use simple read/write validation
   DC::EnumType required[] = {
@@ -1294,16 +1338,16 @@ bool vtkDICOMGenerator::GenerateFrameOfReferenceModule(
   // Note that, depending on how the image has been manipulated,
   // the frame of reference might have changed.
   if (source)
-    {
+  {
     uid = source->GetAttributeValue(
       DC::FrameOfReferenceUID).AsString();
     fid = source->GetAttributeValue(
       DC::PositionReferenceIndicator).AsString();
-    }
+  }
   if (uid == "")
-    {
-    uid = vtkDICOMUtilities::GenerateUID(DC::FrameOfReferenceUID);
-    }
+  {
+    uid = this->GenerateUID(DC::FrameOfReferenceUID);
+  }
 
   vtkDICOMMetaData *meta = this->MetaData;
   meta->SetAttributeValue(DC::FrameOfReferenceUID, uid);
@@ -1351,10 +1395,10 @@ bool vtkDICOMGenerator::GenerateGeneralImageModule(
   vtkDICOMMetaData *meta = this->MetaData;
   int n = meta->GetNumberOfInstances();
   for (int i = 0; i < n; i++)
-    {
+  {
     unsigned int instance = i + 1;
     meta->SetAttributeValue(i, DC::InstanceNumber, instance);
-    }
+  }
 
   // PatientInformation is required if no ImagePlane module is present,
   // it will be overwritten if a real value is found
@@ -1402,9 +1446,9 @@ bool vtkDICOMGenerator::GenerateImagePlaneModule(vtkDICOMMetaData *source)
 
   int timeSlices = 1;
   if (!this->TimeAsVector && this->Dimensions[3] > 0)
-    {
+  {
     timeSlices = this->Dimensions[3];
-    }
+  }
 
   // remove attributes that conflict with this module
   vtkDICOMMetaData *meta = this->MetaData;
@@ -1419,7 +1463,7 @@ bool vtkDICOMGenerator::GenerateImagePlaneModule(vtkDICOMMetaData *source)
   int n = meta->GetNumberOfInstances();
   double zorigin = origin[2];
   for (int i = 0; i < n; i++)
-    {
+  {
     int sliceIdx = this->SliceIndexArray->GetComponent(i, 0);
     // remove the time from the slice index
     sliceIdx /= timeSlices;
@@ -1449,32 +1493,32 @@ bool vtkDICOMGenerator::GenerateImagePlaneModule(vtkDICOMMetaData *source)
 
     // use the original value if possible, to avoid surprises
     if (this->SourceInstanceArray && source == this->SourceMetaData && source)
-      {
+    {
       vtkDICOMMetaDataAdapter sourceAdapter(source);
       if (sourceAdapter->HasAttribute(DC::SliceLocation))
-        {
+      {
         int j = this->SourceInstanceArray->GetComponent(i, 0);
         location = sourceAdapter->GetAttributeValue(
           j, DC::SliceLocation).AsDouble();
-        }
       }
+    }
 
     meta->SetAttributeValue(i, DC::SliceLocation, location);
-    }
+  }
 
   // the original SliceThickness should be used if it is still valid,
   // i.e. if the slices are original slices rather than reformatted.
   double thickness = 0;
   if (this->SourceInstanceArray && source == this->SourceMetaData && source)
-    {
+  {
     vtkDICOMMetaDataAdapter sourceAdapter(source);
     thickness = sourceAdapter->GetAttributeValue(
       0, DC::SliceThickness).AsDouble();
-    }
+  }
   if (thickness <= 0)
-    {
+  {
     thickness = fabs(spacing[2]);
-    }
+  }
   meta->SetAttributeValue(DC::SliceThickness, thickness);
 
   return true;
@@ -1491,7 +1535,7 @@ bool vtkDICOMGenerator::GenerateImagePixelModule(vtkDICOMMetaData *source)
   short pixelrep = 0;
 
   switch (this->ScalarType)
-    {
+  {
     case VTK_SIGNED_CHAR:
       pixelrep = 1;
       pixelbits = 8;
@@ -1516,89 +1560,90 @@ bool vtkDICOMGenerator::GenerateImagePixelModule(vtkDICOMMetaData *source)
       break;
     default:
       break;
-    }
+  }
 
   if (pixelbits == 0)
-    {
+  {
     vtkErrorMacro("Illegal scalar type: " <<
       vtkImageScalarTypeNameMacro(this->ScalarType));
     return false;
-    }
+  }
 
   // modify the type based on what SOP allows
   int storedbits = pixelbits;
   if ((this->AllowedPixelRepresentation & (1 << pixelrep)) == 0)
-    {
+  {
     // if data is signed but no negative values are present,
     // then write as unsigned if SOP Class doesn't allow signed
     if (pixelrep == 1 && this->PixelValueRange[0] >= 0)
-      {
+    {
       pixelrep = 0;
-      }
+    }
     else
-      {
+    {
       vtkErrorMacro("This SOP class requires unsigned values.");
       return false;
-      }
     }
+  }
   if ((this->AllowedBitsStored & (1 << (pixelbits-1))) == 0)
-    {
+  {
     vtkErrorMacro("Illegal scalar type: " <<
       vtkImageScalarTypeNameMacro(this->ScalarType));
-    }
+  }
   // reduce BitsStored if the SOP class allows
   unsigned int minv = static_cast<unsigned int>(-this->PixelValueRange[0]);
   unsigned int maxv = static_cast<unsigned int>(this->PixelValueRange[1]);
   for (int bi = pixelbits/2 + 1; bi < pixelbits; bi++)
-    {
+  {
     if ((this->AllowedBitsStored & (1u << bi)) != 0 &&
         ((pixelrep == 0 && maxv < (1u << (bi + 1))) ||
          (pixelrep == 1 && maxv < (1u << bi) && minv <= (1u << bi))))
-      {
+    {
       storedbits = bi + 1;
       break;
-      }
     }
+  }
 
   if (rows > 65535 || cols > 65535)
-    {
+  {
     vtkErrorMacro("Image dimensions " << rows << "x"
       << cols << " are too large for DICOM");
     return false;
-    }
+  }
 
   vtkDICOMMetaData *meta = this->MetaData;
   bool paletteColor = false;
   if (this->NumberOfColorComponents >= 3)
-    {
+  {
     meta->SetAttributeValue(DC::SamplesPerPixel, 3);
     meta->SetAttributeValue(DC::PlanarConfiguration, 0);
     meta->SetAttributeValue(DC::PhotometricInterpretation, "RGB");
-    }
+  }
   else
-    {
+  {
     meta->SetAttributeValue(DC::SamplesPerPixel, 1);
 
     std::string pm;
     if (source)
-      {
+    {
       pm = source->GetAttributeValue(
         DC::PhotometricInterpretation).AsString();
-      }
-    if (pm == "PALETTE COLOR" && source &&
-        source->HasAttribute(DC::RedPaletteColorLookupTableData))
-      {
+    }
+    if ((pm == "PALETTE COLOR" || pm == "PALETTE_COLOR") &&
+        source && source->HasAttribute(DC::RedPaletteColorLookupTableData))
+    {
+      pm = "PALETTE COLOR";
       paletteColor = true;
-      }
+    }
     else if (pm != "MONOCHROME1")
-      {
+    {
       pm = "MONOCHROME2";
-      }
-    meta->SetAttributeValue(DC::PhotometricInterpretation, pm);
     }
+    meta->SetAttributeValue(DC::PhotometricInterpretation, pm);
+  }
 
   if (paletteColor && source)
-    {
+  {
     static const DC::EnumType palette[] = {
       DC::RedPaletteColorLookupTableDescriptor,
       DC::GreenPaletteColorLookupTableDescriptor,
@@ -1609,11 +1654,11 @@ bool vtkDICOMGenerator::GenerateImagePixelModule(vtkDICOMMetaData *source)
       DC::ItemDelimitationItem
     };
     for (int i = 0; palette[i] != DC::ItemDelimitationItem; i++)
-      {
+    {
       meta->SetAttributeValue(palette[i],
         source->GetAttributeValue(palette[i]));
-      }
     }
+  }
 
   meta->SetAttributeValue(DC::Rows, rows);
   meta->SetAttributeValue(DC::Columns, cols);
@@ -1624,55 +1669,55 @@ bool vtkDICOMGenerator::GenerateImagePixelModule(vtkDICOMMetaData *source)
 
   // This cannot be set if PixelSpacing is set
   if (!meta->HasAttribute(DC::PixelSpacing))
-    {
+  {
     int aspect[2];
     vtkDICOMGenerator::ComputeAspectRatio(this->Spacing, aspect);
     meta->SetAttributeValue(
       DC::PixelAspectRatio,
       vtkDICOMValue(vtkDICOMVR::IS, aspect, 2));
-    }
+  }
 
   // The Smallest/LargestPixelValue are optional, but nice to have
   if (this->RangeArray)
-    {
+  {
     // Get the pixel VR
     vtkDICOMVR pixelVR = vtkDICOMVR::US;
     if (this->ScalarType == VTK_SIGNED_CHAR ||
         this->ScalarType == VTK_SHORT)
-      {
+    {
       pixelVR = vtkDICOMVR::SS;
-      }
+    }
 
     // Force it to conform the VRs allowed by the SOP Class
     if ((this->AllowedPixelRepresentation & RepresentationSigned) == 0)
-      {
+    {
       pixelVR = vtkDICOMVR::US;
-      }
+    }
     else if ((this->AllowedPixelRepresentation & RepresentationUnsigned) == 0)
-      {
+    {
       pixelVR = vtkDICOMVR::SS;
-      }
+    }
 
     int n = meta->GetNumberOfInstances();
     for (int i = 0; i < n; i++)
-      {
+    {
       int nframes = (this->NumberOfFrames > 0 ? this->NumberOfFrames : 1);
       int minVal = VTK_INT_MAX;
       int maxVal = VTK_INT_MIN;
       for (int j = 0; j < nframes; j++)
-        {
+      {
         int v = this->RangeArray->GetComponent(i*nframes + j, 0);
         minVal = (minVal <= v ? minVal : v);
         v = this->RangeArray->GetComponent(i*nframes + j, 1);
         maxVal = (maxVal >= v ? maxVal : v);
-        }
+      }
 
       meta->SetAttributeValue(
         i, DC::SmallestImagePixelValue, vtkDICOMValue(pixelVR, minVal));
       meta->SetAttributeValue(
         i, DC::LargestImagePixelValue, vtkDICOMValue(pixelVR, maxVal));
-      }
     }
+  }
 
   return true;
 }
@@ -1768,21 +1813,21 @@ bool vtkDICOMGenerator::GenerateOverlayPlaneModule(vtkDICOMMetaData *source)
   // overlay is a repeating group, it repeats 16 times
   DC::EnumType tags[16];
   for (int i = 0; i < 16; i++)
-    {
+  {
     if (source && source->HasAttribute(vtkDICOMTag(0x6000 + i*2, 0x0010)))
-      {
+    {
       for (int j = 0; j < 12; j++)
-        {
+      {
         tags[j] = static_cast<DC::EnumType>(basetags[j] + i*0x20000);
-        }
+      }
       tags[13] = DC::ItemDelimitationItem;
 
       if (!this->CopyOptionalAttributes(tags, source))
-        {
+      {
         return false;
-        }
       }
     }
+  }
 
   return true;
 }
@@ -1797,36 +1842,36 @@ bool vtkDICOMGenerator::GenerateVOILUTModule(vtkDICOMMetaData *source)
       this->RangeArray &&
       (this->ScalarType == VTK_SHORT ||
        this->ScalarType == VTK_UNSIGNED_SHORT))
-    {
+  {
     int n = meta->GetNumberOfInstances();
     int m = static_cast<int>(this->RangeArray->GetNumberOfTuples()/n);
     for (int i = 0; i < n; i++)
-      {
+    {
       int lowVal = this->RangeArray->GetComponent(i*m, 2);
       int highVal = this->RangeArray->GetComponent(i*m, 3);
       // set a limit on how tight the window can be
       if (highVal - lowVal < 20)
-        {
+      {
         highVal = lowVal + 20;
-        }
+      }
       // make sure that WindowCenter will be an integer
       if ((highVal - lowVal) % 2 != 0)
-        {
+      {
         if (lowVal > 0)
-          {
+        {
           lowVal--;
-          }
+        }
         else
-          {
+        {
           highVal--;
-          }
         }
+      }
       meta->SetAttributeValue(i, DC::WindowCenter, 0.5*(highVal + lowVal));
       meta->SetAttributeValue(i, DC::WindowWidth, 1.0*(highVal - lowVal));
-      }
+    }
 
     return true;
-    }
+  }
 
   // if data is real-valued like CT, then use original window/level
   static const DC::EnumType tags[] = {
diff --git a/Source/vtkDICOMGenerator.h b/Source/vtkDICOMGenerator.h
index 1b491a5..7340d01 100644
--- a/Source/vtkDICOMGenerator.h
+++ b/Source/vtkDICOMGenerator.h
@@ -15,14 +15,17 @@
 #define vtkDICOMGenerator_h
 
 #include <vtkObject.h>
+#include <vtkStdString.h> // For std::string
 #include "vtkDICOMModule.h" // For export macro
 #include "vtkDICOMTag.h" // For method parameter
 
 class vtkIntArray;
 class vtkMatrix4x4;
 class vtkInformation;
+class vtkStringArray;
 class vtkDICOMMetaData;
 class vtkDICOMItem;
+class vtkDICOMUIDGenerator;
 
 //! Generate DICOM data series for specific IOD classes.
 /*!
@@ -47,6 +50,7 @@ public:
   //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
+  //@{
   //! Generate an instance of one of the supported classes.
   /*!
    *  This is the primary interface method of this class.  Given the
@@ -54,14 +58,18 @@ public:
    *  attributes of the supplied vtkDICOMMetaData object.
    */
   virtual bool GenerateInstance(vtkInformation *) = 0;
+  //@}
 
+  //@{
   //! Get the generated meta data.
   /*!
    *  Every time GenerateInstance() is called, it will generate a
    *  new meta data object that can be retrieved with this method.
    */
   vtkDICOMMetaData *GetMetaData();
+  //@}
 
+  //@{
   //! Create a multi-frame object (default: Off).
   /*!
    *  If this is on, the one multi-frame data set will be created.  If
@@ -71,7 +79,9 @@ public:
   vtkSetMacro(MultiFrame, int);
   vtkBooleanMacro(MultiFrame, int);
   vtkGetMacro(MultiFrame, int);
+  //@}
 
+  //@{
   //! Write scalar components as the time dimension (default: Off).
   /*!
    *  If this is on, then each time slot is stored in a different scalar
@@ -81,7 +91,9 @@ public:
   vtkSetMacro(TimeAsVector, int);
   vtkBooleanMacro(TimeAsVector, int);
   vtkGetMacro(TimeAsVector, int);
+  //@}
 
+  //@{
   //! Set the time dimension to use in the DICOM file (or zero if none).
   /*!
    *  The number of components of the input data must be divisible by the
@@ -94,7 +106,9 @@ public:
   vtkGetMacro(TimeDimension, int);
   vtkSetMacro(TimeSpacing, double);
   vtkGetMacro(TimeSpacing, double);
+  //@}
 
+  //@{
   //! Set the rescaling parameters, for example for CT.
   /*!
    *  CT, PET, and some other modalities require rescaling parameters
@@ -105,7 +119,9 @@ public:
   vtkGetMacro(RescaleIntercept, double);
   vtkSetMacro(RescaleSlope, double);
   vtkGetMacro(RescaleSlope, double);
+  //@}
 
+  //@{
   //! Set the matrix that places the image in DICOM patient coords.
   /*!
    *  The 3x3 portion of the matrix must be orthonormal, and the
@@ -113,7 +129,9 @@ public:
    */
   void SetPatientMatrix(vtkMatrix4x4 *);
   vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; }
+  //@}
 
+  //@{
   //! Let the generator know how the image is arranged in memory.
   /*!
    *  The generator needs to know how to interpret the geometry of
@@ -125,7 +143,9 @@ public:
    */
   vtkSetMacro(OriginAtBottom, int);
   vtkGetMacro(OriginAtBottom, int);
+  //@}
 
+  //@{
   //! Let the generator know how to order the slices.
   /*!
    *  By default, the generator will try to keep the same slice order
@@ -135,7 +155,9 @@ public:
    */
   vtkSetMacro(ReverseSliceOrder, int);
   vtkGetMacro(ReverseSliceOrder, int);
+  //@}
 
+  //@{
   //! Set some meta data for the constructor to use as a source.
   /*!
    *  The supplied meta data can provide some general properties
@@ -145,7 +167,19 @@ public:
    */
   void SetSourceMetaData(vtkDICOMMetaData *);
   vtkDICOMMetaData *GetSourceMetaData();
+  //@}
 
+  //@{
+  //! Set the UID generator, for generating unique IDs.
+  /*!
+   *  If no UID generator is supplied, then the default UID generator
+   *  will be used.
+   */
+  void SetUIDGenerator(vtkDICOMUIDGenerator *);
+  vtkDICOMUIDGenerator *GetUIDGenerator();
+  //@}
+
+  //@{
   //! Get an array that maps file and frame to slice.
   /*!
    *  Once the generator has created the metadata, this array lets the
@@ -163,11 +197,9 @@ public:
    *  frame as the second index.
    */
   vtkIntArray *GetComponentIndexArray() { return this->ComponentIndexArray; }
+  //@}
 
 protected:
-  vtkDICOMGenerator();
-  ~vtkDICOMGenerator();
-
   //! Enumerated values for restricting pixel values.
   enum {
     RepresentationUnsigned = 1u,
@@ -181,11 +213,40 @@ protected:
     BitsStored32 = (1u << 31)
   };
 
+  //@{
+  //! Protected constructor method.
+  vtkDICOMGenerator();
+  ~vtkDICOMGenerator();
+  //@}
+
+  //@{
+  //! Generate a UID for the provided tag.
+  /*
+   *  The generator uses the tag as a hint when generating the UIDs,
+   *  for example the SOPInstanceUID might have a different format from
+   *  the FrameOfReferenceUID.
+   */
+  std::string GenerateUID(vtkDICOMTag tag);
+
+  //! Generate a series of UIDs, sorted from low to high.
+  /*!
+   *  Before passing the string array, call SetNumberOfValues() on
+   *  the array to specify the number of UIDs that you want to be
+   *  stored in it.  The stored UIDs will be sorted, low to high.
+   *  Generating a batch of UIDs is more efficient than calling
+   *  GenerateUID() repeatedly.
+   */
+  void GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids);
+  //@}
+
+  //@{
   //! Used by subclasses to place restrictions on the pixel type.
   void SetPixelRestrictions(
     unsigned int pixelRepresentation, unsigned int bitsStored,
     int colorComponents);
+  //@}
 
+  //@{
   //! Generate the DICOM SOP Common Module.
   virtual bool GenerateSOPCommonModule(
     vtkDICOMMetaData *meta, const char *SOPClass);
@@ -243,7 +304,9 @@ protected:
 
   //! Generate the DICOM VOI LUT Module.
   virtual bool GenerateVOILUTModule(vtkDICOMMetaData *source);
+  //@}
 
+  //@{
   //! Copy required attributes into the meta data.
   /*!
    *  Required attributes must be set, so if no value is available,
@@ -259,13 +322,16 @@ protected:
    */
   virtual bool CopyOptionalAttributes(
     const DC::EnumType *tags, vtkDICOMMetaData *source);
+  //@}
 
   //! Compute aspect ratio from spacing.
   static void ComputeAspectRatio(const double spacing[2], int aspect[2]);
 
+  //@{
   //! Compute the matrix, needed for Position and Orientation.
   void ComputeAdjustedMatrix(
     double matrix[16], double origin[3], double spacing[3]);
+  //@}
 
   //! Compute the position and orientation for a slice.
   /*!
@@ -277,6 +343,7 @@ protected:
     const double origin[3], const double matrix[16],
     double position[3], double orientation[6]);
 
+  //@{
   //! Compute the dimensions.
   /*!
    *  This will compute the dimensions of the data, given the information
@@ -293,9 +360,14 @@ protected:
    */
   virtual void ComputePixelValueRange(
     vtkInformation *info, int seriesRange[2]);
+  //@}
 
+  //@{
+  //! Attempt to match each slice to a source meta data slice.
   virtual void MatchInstances(vtkDICOMMetaData *source);
+  //@}
 
+  //@{
   //! Initialize the meta data and compute the slice index array.
   /*!
    *  This must be done before any of the meta data has been generated.
@@ -303,6 +375,7 @@ protected:
    *  and the slices that make up the image data.
    */
   virtual void InitializeMetaData(vtkInformation *info);
+  //@}
 
   //! The generated meta data
   vtkDICOMMetaData *MetaData;
@@ -310,6 +383,9 @@ protected:
   //! The source meta data.
   vtkDICOMMetaData *SourceMetaData;
 
+  //! The UID generator.
+  vtkDICOMUIDGenerator *UIDGenerator;
+
   //! Whether to prefer multi-frame files over single-frame.
   int MultiFrame;
 
@@ -390,8 +466,8 @@ protected:
   vtkIntArray *RangeArray;
 
 private:
-  vtkDICOMGenerator(const vtkDICOMGenerator&);  // Not implemented.
-  void operator=(const vtkDICOMGenerator&);  // Not implemented.
+  vtkDICOMGenerator(const vtkDICOMGenerator&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMGenerator&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMGenerator_h
diff --git a/Source/vtkDICOMImageCodec.cxx b/Source/vtkDICOMImageCodec.cxx
index 4f665c9..92561ce 100644
--- a/Source/vtkDICOMImageCodec.cxx
+++ b/Source/vtkDICOMImageCodec.cxx
@@ -62,13 +62,13 @@ vtkDICOMImageCodec::vtkDICOMImageCodec(const std::string& tsyntax)
   const char *ts = tsyntax.c_str();
 
   for (int i = 0; i < NumberOfCodecs; i++)
-    {
+  {
     if (strcmp(ts, vtkDICOMImageCodec::UIDs[i]) == 0)
-      {
+    {
       key = i;
       break;
-      }
     }
+  }
 
   this->Key = static_cast<unsigned char>(key);
 }
@@ -79,9 +79,9 @@ std::string vtkDICOMImageCodec::GetTransferSyntaxUID() const
   const char *result = "";
 
   if (this->Key < NumberOfCodecs)
-    {
+  {
     result = vtkDICOMImageCodec::UIDs[this->Key];
-    }
+  }
 
   return result;
 }
@@ -119,7 +119,7 @@ int vtkDICOMImageCodec::DecodeRLE(
 
   // loop over all RLE segments
   for (unsigned int i = 0; i < n; i++)
-    {
+  {
     // sample position in pixel
     unsigned int s = i / bps;
     // byte position in sample
@@ -127,84 +127,84 @@ int vtkDICOMImageCodec::DecodeRLE(
     // compute the offset into the output buffer for this segment
     size_t outOffset = s*segInc + b; // big-endian
     if (endiancheck.s == 1) // little-endian
-      {
+    {
       outOffset = s*segInc + (bps - b - 1);
-      }
+    }
     // get the offset into the input buffer for this segment
     unsigned int offset =
       vtkDICOMUtilities::UnpackUnsignedInt(inPtr + (i+1)*4);
     if (offset >= sourceSize)
-      {
+    {
       break;
-      }
+    }
     // loop over the segment and decompress it
     const signed char *cp =
       reinterpret_cast<const signed char *>(inPtr + offset);
     signed char *dp = reinterpret_cast<signed char *>(outPtr + outOffset);
     size_t remaining = segmentSize;
     while (remaining > 0 && offset < sourceSize)
-      {
+    {
       if (++offset == sourceSize)
-        {
+      {
         break;
-        }
+      }
       // check the indicator byte (use short to avoid overflow)
       short c = *cp++;
       if (c >= 0)
-        {
+      {
         // do a literal run
         c = c + 1;
         if (sourceSize - offset < static_cast<size_t>(c))
-          {
+        {
           // safety check: limit to the number available input bytes
           c = static_cast<short>(sourceSize - offset);
-          }
+        }
         offset += c;
         if (static_cast<size_t>(c) > remaining)
-          {
+        {
           // safety check: limit to the size of the output dest
-          c = remaining;
-          }
+          c = static_cast<short>(remaining);
+        }
         remaining -= c;
         do
-          {
+        {
           *dp = *cp++;
           dp += outInc;
-          }
-        while (--c);
         }
+        while (--c);
+      }
       else if (c > -128)
-        {
+      {
         // do a replication run
         c = 1 - c;
         offset += 1;
         if (static_cast<size_t>(c) > remaining)
-          {
+        {
           // safety check: limit to the size of the output dest
-          c = remaining;
-          }
+          c = static_cast<short>(remaining);
+        }
         remaining -= c;
         do
-          {
+        {
           *dp = *cp;
           dp += outInc;
-          }
+        }
         while (--c);
         cp++;
-        }
       }
+    }
     if (remaining > 0)
-      {
+    {
       // short read, clear remainder of dest
       errorCode = MissingData;
       do
-        {
+      {
         *dp = 0;
         dp += outInc;
-        }
-      while (--remaining);
       }
+      while (--remaining);
     }
+  }
 
   return errorCode;
 }
@@ -226,18 +226,18 @@ int vtkDICOMImageCodec::EncodeRLE(
   // the number of segments
   unsigned int n = spp*bps;
   if (n == 0 || n > 15)
-    {
+  {
     *destP = 0;
     *destSizeP = 0;
     return BadPixelFormat;
-    }
+  }
 
   // number of bytes per segment
   size_t segmentSize = sourceSize/n;
 
   // the amount to advance after each input byte
   unsigned int inInc = (image.PlanarConfiguration ? bps : n);
-  // the amount to advance advance after each sample
+  // the amount to advance after each sample
   size_t segInc = (image.PlanarConfiguration ? segmentSize : 1);
   segInc *= bps;
 
@@ -248,9 +248,9 @@ int vtkDICOMImageCodec::EncodeRLE(
   // write the table
   vtkDICOMUtilities::PackUnsignedInt(n, dest);
   for (unsigned int i = 0; i < 15; i++)
-    {
+  {
     vtkDICOMUtilities::PackUnsignedInt(0, dest + 4*(i + 1));
-    }
+  }
 
   // the offset to the first segment
   unsigned int offset = 64;
@@ -265,7 +265,7 @@ int vtkDICOMImageCodec::EncodeRLE(
   // loop over all RLE segments
   // write the segments
   for (unsigned int i = 0; i < n; i++)
-    {
+  {
     // write the offset into the table
     vtkDICOMUtilities::PackUnsignedInt(offset, dest + 4*(i + 1));
     // sample position in pixel
@@ -275,18 +275,18 @@ int vtkDICOMImageCodec::EncodeRLE(
     // compute the offset into the input buffer for this segment
     size_t inOffset = s*segInc + b; // big-endian
     if (endiancheck.s == 1) // little-endian
-      {
+    {
       inOffset = s*segInc + (bps - b - 1);
-      }
+    }
     const signed char *cp =
       reinterpret_cast<const signed char *>(source + inOffset);
     signed char *dp = reinterpret_cast<signed char *>(dest + offset);
 
     for (size_t j = 0; j < numrows; j++)
-      {
+    {
       const signed char *ep = cp + rowlen*inInc;
       while (cp != ep)
-        {
+      {
         short maxcount = 128;
         ptrdiff_t remainder = (ep - cp)/inInc;
         maxcount = (remainder < maxcount ? remainder : maxcount);
@@ -296,26 +296,26 @@ int vtkDICOMImageCodec::EncodeRLE(
         // count repeated characters
         signed char prev = *cp;
         do
-          {
+        {
           cp += inInc;
-          }
+        }
         while (--counter != 0 && *cp == prev);
 
         if (maxcount - counter > 1)
-          {
+        {
           // negative count for repeating
           counter = -(maxcount - counter - 1);
-          }
+        }
         else if (counter > 0)
-          {
+        {
           // count non-repeated bytes until a triplicate found
           signed char pprev;
           do
-            {
+          {
             pprev = prev;
             prev = *cp;
             cp += inInc;
-            }
+          }
           while (--counter != 0 && (*cp != prev || prev != pprev));
 
           // positive count for literal
@@ -323,23 +323,23 @@ int vtkDICOMImageCodec::EncodeRLE(
 
           // remove repeats at the end that can join with next run
           if (remainder > counter + 1 && *cp == prev)
-            {
+          {
             short reps = 1 + (prev == pprev);
             reps = (reps < counter ? reps : counter);
             counter -= reps;
             cp -= reps*inInc;
-            }
+          }
 
           // increment for the next offset into the destination
           offset += counter;
-          }
+        }
 
         // at least two bytes are always written to destination
         offset += 2;
 
         // check whether destination buffer is large enough
         if (offset > destReserve)
-          {
+        {
           destReserve *= 2;
           unsigned char *newdest = new unsigned char[destReserve];
           size_t size = dp-reinterpret_cast<signed char *>(dest);
@@ -347,26 +347,26 @@ int vtkDICOMImageCodec::EncodeRLE(
           delete [] dest;
           dest = newdest;
           dp = reinterpret_cast<signed char *>(dest + size);
-          }
+        }
 
         // write the results
         *dp++ = counter;
         do
-          {
+        {
           *dp++ = *sp;
           sp += inInc;
-          }
-        while (--counter >= 0);
         }
+        while (--counter >= 0);
       }
+    }
 
     // add a pad byte to the segment if needed
     if ((offset & 1) != 0)
-      {
+    {
       offset++;
       *dp = 0;
-      }
     }
+  }
 
   *destP = dest;
   *destSizeP = offset;
@@ -377,9 +377,9 @@ int vtkDICOMImageCodec::EncodeRLE(
   DecodeRLE(image, dest, offset, check, sourceSize);
 
   for (size_t k = 0; k < sourceSize; k++)
-    {
+  {
     assert(source[k] == check[k]);
-    }
+  }
   delete [] check;
 #endif
 
@@ -394,9 +394,9 @@ int vtkDICOMImageCodec::Decode(
 {
   int code = MissingCodec;
   if (this->Key == RLE)
-    {
+  {
     code = DecodeRLE(image, source, sourceSize, dest, destSize);
-    }
+  }
 
   return code;
 }
@@ -409,9 +409,9 @@ int vtkDICOMImageCodec::Encode(
 {
   int code = MissingCodec;
   if (this->Key == RLE)
-    {
+  {
     code = EncodeRLE(image, source, sourceSize, dest, destSize);
-    }
+  }
 
   return code;
 }
@@ -421,8 +421,8 @@ ostream& operator<<(ostream& o, const vtkDICOMImageCodec& a)
 {
   std::string c = a.GetTransferSyntaxUID();
   if (c == "")
-    {
+  {
     c = "Unknown";
-    }
+  }
   return o << c;
 }
diff --git a/Source/vtkDICOMImageCodec.h b/Source/vtkDICOMImageCodec.h
index 2feda78..ed433e4 100644
--- a/Source/vtkDICOMImageCodec.h
+++ b/Source/vtkDICOMImageCodec.h
@@ -76,6 +76,7 @@ public:
     ImageFormat(vtkDICOMMetaData *meta);
   };
 
+  //@{
   //! Construct an object for the default codec (little endian uncompressed).
   vtkDICOMImageCodec() : Key(0) {}
 
@@ -91,7 +92,9 @@ public:
    *  compression method, given the transfer syntax.
    */
   explicit vtkDICOMImageCodec(const std::string& syntax);
+  //@}
 
+  //@{
   //! Get the transfer syntax for this codec.
   /*!
    *  If the object is invalid, then an empty string is returned.
@@ -100,7 +103,9 @@ public:
 
   //! Get the numerical identifier for this codec.
   unsigned char GetKey() const { return this->Key; }
+  //@}
 
+  //@{
   //! Decode a compressed image into the given destination buffer.
   /*!
    *  The length of the source buffer must be provided.  The destination
@@ -113,19 +118,22 @@ public:
 
   //! Encode a compressed image, and return an allocated destination buffer.
   /*!
-   *  The caller has the responsibility of calling "free" on the returned
+   *  The caller has the responsibility of calling "delete []" on the returned
    *  destination buffer.
    */
   int Encode(const ImageFormat& image,
              const unsigned char *source, size_t sourceSize,
              unsigned char **dest, size_t *destSize) const;
+  //@}
 
+  //@{
   bool operator==(vtkDICOMImageCodec b) const { return (this->Key == b.Key); }
   bool operator!=(vtkDICOMImageCodec b) const { return (this->Key != b.Key); }
   bool operator<=(vtkDICOMImageCodec a) const { return (this->Key <= a.Key); }
   bool operator>=(vtkDICOMImageCodec a) const { return (this->Key >= a.Key); }
   bool operator<(vtkDICOMImageCodec a) const { return (this->Key < a.Key); }
   bool operator>(vtkDICOMImageCodec a) const { return (this->Key > a.Key); }
+  //@}
 
 private:
   unsigned char Key;
diff --git a/Source/vtkDICOMItem.cxx b/Source/vtkDICOMItem.cxx
index fdf45f8..a7d132d 100644
--- a/Source/vtkDICOMItem.cxx
+++ b/Source/vtkDICOMItem.cxx
@@ -29,21 +29,21 @@ vtkDICOMItem::vtkDICOMItem(vtkDICOMMetaData *meta)
   this->L->Head.Next = &this->L->Tail;
   this->L->Tail.Prev = &this->L->Head;
   if (meta)
-    {
+  {
     const vtkDICOMValue& vcs =
       meta->GetAttributeValue(DC::SpecificCharacterSet);
     if (vcs.IsValid())
-      {
+    {
       this->L->CharacterSet =
         vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
-      }
+    }
     const vtkDICOMValue &v = meta->GetAttributeValue(DC::PixelRepresentation);
     if (v.IsValid())
-      {
+    {
       this->L->VRForXS = (v.AsUnsignedShort() == 0 ?
                           vtkDICOMVR::US : vtkDICOMVR::SS);
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -67,17 +67,17 @@ vtkDICOMDataElement *vtkDICOMItem::NewDataElement(vtkDICOMDataElement **iter)
 
   // if no data elements yet, then allocate four
   if (this->L->DataElements == 0)
-    {
+  {
     this->L->DataElements = new vtkDICOMDataElement[4];
-    }
+  }
   // if n is a power of two, double allocated space
   else if (n >= 4 && (n & (n-1)) == 0)
-    {
+  {
     // but first check if a free element exists
     do { --n; } while (n > 0 && this->L->DataElements[n].Next != 0);
 
     if (this->L->DataElements[n].Next != 0)
-      {
+    {
       // make a new, larger list
       n = this->L->NumberOfDataElements;
       vtkDICOMDataElement *oldptr = this->L->DataElements;
@@ -85,17 +85,17 @@ vtkDICOMDataElement *vtkDICOMItem::NewDataElement(vtkDICOMDataElement **iter)
       vtkDICOMItem::CopyDataElements(
         this->L->Head.Next, &this->L->Tail, this->L);
       if (iter)
-        {
+      {
         // fix the address of the provided node, since it was re-alloced
         vtkDICOMDataElement *tptr = *iter;
         vtkDICOMDataElement *nptr = &this->L->Tail;
         do { tptr = tptr->Next; nptr = nptr->Prev; }
         while (tptr != &this->L->Tail);
         *iter = nptr;
-        }
-      delete [] oldptr;
       }
+      delete [] oldptr;
     }
+  }
 
   return &this->L->DataElements[n];
 }
@@ -116,7 +116,7 @@ void vtkDICOMItem::CopyList(const List *o, List *t)
 
   int n = o->NumberOfDataElements;
   if (n > 0)
-    {
+  {
     // round up to power of two
     int m = n - 1;
     m |= m >> 1;
@@ -130,7 +130,7 @@ void vtkDICOMItem::CopyList(const List *o, List *t)
     if (m < 4) { m = 4; }
     t->DataElements = new vtkDICOMDataElement[m];
     vtkDICOMItem::CopyDataElements(o->Head.Next, &o->Tail, t);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -142,14 +142,14 @@ void vtkDICOMItem::CopyDataElements(
 
   const vtkDICOMDataElement *ptr = begin;
   while (ptr != end)
-    {
+  {
     e->Tag = ptr->Tag;
     e->Value = ptr->Value;
     e->Next = e + 1;
     e->Prev = e - 1;
     ptr = ptr->Next;
     e++;
-    }
+  }
 
   t->Tail.Prev = e - 1;
   t->Head.Next->Prev = &t->Head;
@@ -161,30 +161,30 @@ vtkDICOMDataElement *vtkDICOMItem::FindDataElementOrInsert(vtkDICOMTag tag)
 {
   // make a container if we don't have one yet
   if (this->L == 0)
-    {
+  {
     this->L = new List;
     this->L->Head.Next = &this->L->Tail;
     this->L->Tail.Prev = &this->L->Head;
-    }
+  }
   // if we aren't the sole owner, copy before modifying
   else if (this->L->ReferenceCount != 1)
-    {
+  {
     List *t = new List;
     vtkDICOMItem::CopyList(this->L, t);
     this->Clear();
     this->L = t;
-    }
+  }
 
   // find the insert location in the linked list
   vtkDICOMDataElement *tptr = &this->L->Tail;
   do
-    {
+  {
     tptr = tptr->Prev;
-    }
+  }
   while (tag < tptr->GetTag());
 
   if (tag != tptr->GetTag())
-    {
+  {
     // create a new data element
     vtkDICOMDataElement *e = this->NewDataElement(&tptr);
     e->Tag = tag;
@@ -195,7 +195,7 @@ vtkDICOMDataElement *vtkDICOMItem::FindDataElementOrInsert(vtkDICOMTag tag)
 
     tptr = e;
     this->L->NumberOfDataElements++;
-    }
+  }
 
   return tptr;
 }
@@ -207,80 +207,80 @@ vtkDICOMItem *vtkDICOMItem::FindItemOrInsert(
   vtkDICOMItem *item = 0;
 
   if (tagpath.HasTail())
-    {
+  {
     vtkDICOMTag tag = tagpath.GetHead();
     vtkDICOMDataElement *tptr = this->FindDataElementOrInsert(tag);
     vtkDICOMVR vr = tptr->Value.GetVR();
     if (!vr.IsValid())
-      {
+    {
       vr = this->FindDictVR(tag);
       if (vr == vtkDICOMVR::UN)
-        {
+      {
         // let it through if it isn't in the dictionary
         vr = vtkDICOMVR::SQ;
-        }
       }
-    // add the item to the sequences, or create a sequence
+    }
+    // add the item to the sequence, or create a sequence
     if (vr == vtkDICOMVR::SQ)
-      {
-      unsigned int i = tagpath.GetIndex();
-      unsigned int n = i+1;
-      unsigned int m = 0;
+    {
+      size_t i = tagpath.GetIndex();
+      size_t n = i+1;
+      size_t m = 0;
       const vtkDICOMItem *oldItems = tptr->Value.GetSequenceData();
       if (oldItems != 0)
-        {
+      {
         m = tptr->Value.GetNumberOfValues();
         n = (n > m ? n : m);
-        }
+      }
       vtkDICOMValue seq;
       vtkDICOMItem *items = seq.AllocateSequenceData(vtkDICOMVR::SQ, n);
       // copy the old sequence into the new one (shallow copy)
-      for (unsigned int j = 0; j < m; j++)
-        {
+      for (size_t j = 0; j < m; j++)
+      {
         items[j] = oldItems[j];
-        }
+      }
       // Get the character set and default VR for XS
       vtkDICOMCharacterSet cs = this->L->CharacterSet;
       vtkDICOMVR vrForXS = this->L->VRForXS;
       if (n > m)
-        {
+      {
         const vtkDICOMValue& vcs =
           this->GetAttributeValue(DC::SpecificCharacterSet);
         if (vcs.IsValid())
-          {
+        {
           cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
-          }
+        }
         const vtkDICOMValue &v = this->GetAttributeValue(
           DC::PixelRepresentation);
         if (v.IsValid())
-          {
+        {
           vrForXS = (v.AsUnsignedShort() == 0 ?
                      vtkDICOMVR::US : vtkDICOMVR::SS);
-          }
         }
-      for (unsigned int j = m; j < n; j++)
-        {
+      }
+      for (size_t j = m; j < n; j++)
+      {
         // Inherit properties that originally came from parent data set
         items[j] = vtkDICOMItem(cs, vrForXS);
-        }
+      }
       tptr->Value = seq;
       item = items[i].FindItemOrInsert(tagpath.GetTail(), tagptr);
-      }
+    }
     else if (!tptr->Value.IsValid())
-      {
+    {
       // we just inserted a non-SQ value, remove it
       tptr->Prev->Next = tptr->Next;
       tptr->Next->Prev = tptr->Prev;
       tptr->Next = 0;
       tptr->Prev = 0;
       this->L->NumberOfDataElements--;
-      }
     }
+  }
   else
-    {
+  {
     item = this;
     *tagptr = tagpath.GetHead();
-    }
+  }
 
   return item;
 }
@@ -294,14 +294,14 @@ void vtkDICOMItem::SetAttributeValue(
   tptr->Value = v;
 
   if (!v.IsValid())
-    {
+  {
     // setting a value to the invalid value causes deletion
     tptr->Prev->Next = tptr->Next;
     tptr->Next->Prev = tptr->Prev;
     tptr->Next = 0;
     tptr->Prev = 0;
     this->L->NumberOfDataElements--;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -312,9 +312,9 @@ void vtkDICOMItem::SetAttributeValue(
   vtkDICOMItem *item = this->FindItemOrInsert(tagpath, &tag);
   // if item is NULL, the path was invalid
   if (item)
-    {
+  {
     item->SetAttributeValue(tag, v);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -325,14 +325,14 @@ void vtkDICOMItem::SetAttributeValue(
   vtkDICOMItem *item = this->FindItemOrInsert(tagpath, &tag);
   // if item is NULL, the path was invalid
   if (item)
-    {
+  {
     vtkDICOMVR vr = item->FindDictVR(tag);
     assert(vr != vtkDICOMVR::UN);
     if (vr != vtkDICOMVR::UN)
-      {
+    {
       item->SetAttributeValue(tag, vtkDICOMValue(vr, v));
-      }
     }
+  }
 }
 
 void vtkDICOMItem::SetAttributeValue(
@@ -342,26 +342,26 @@ void vtkDICOMItem::SetAttributeValue(
   vtkDICOMItem *item = this->FindItemOrInsert(tagpath, &tag);
   // if item is NULL, the path was invalid
   if (item)
-    {
+  {
     vtkDICOMVR vr = item->FindDictVR(tag);
     assert(vr != vtkDICOMVR::UN);
     // note that there is similar code in vtkDICOMMetaData
     if (vr.HasSpecificCharacterSet() && item->L != 0)
-      {
+    {
       vtkDICOMCharacterSet cs = item->L->CharacterSet;
       const vtkDICOMValue& vcs =
         item->GetAttributeValue(DC::SpecificCharacterSet);
       if (vcs.IsValid())
-        {
+      {
         cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
-        }
-      item->SetAttributeValue(tag, vtkDICOMValue(vr, cs, v));
       }
+      item->SetAttributeValue(tag, vtkDICOMValue(vr, cs, v));
+    }
     else if (vr != vtkDICOMVR::UN)
-      {
+    {
       item->SetAttributeValue(tag, vtkDICOMValue(vr, v));
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -380,18 +380,18 @@ const vtkDICOMValue &vtkDICOMItem::GetAttributeValue(
   vtkDICOMTag tag) const
 {
   if (this->L)
-    {
+  {
     vtkDICOMDataElement *e = this->L->Head.Next;
     vtkDICOMDataElement *tail = &this->L->Tail;
     while (e != tail)
-      {
+    {
       if (e->Tag == tag)
-        {
+      {
         return e->Value;
-        }
-      e = e->Next;
       }
+      e = e->Next;
     }
+  }
   return vtkDICOMItem::InvalidValue;
 }
 
@@ -401,19 +401,19 @@ const vtkDICOMValue &vtkDICOMItem::GetAttributeValue(
 {
   const vtkDICOMValue &v = this->GetAttributeValue(tagpath.GetHead());
   if (!tagpath.HasTail())
-    {
+  {
     return v;
-    }
+  }
   if (v.IsValid())
-    {
-    unsigned int i = tagpath.GetIndex();
-    unsigned int n = v.GetNumberOfValues();
+  {
+    size_t i = tagpath.GetIndex();
+    size_t n = v.GetNumberOfValues();
     const vtkDICOMItem *items = v.GetSequenceData();
     if (items != 0 && i < n)
-      {
+    {
       return items[i].GetAttributeValue(tagpath.GetTail());
-      }
     }
+  }
   return vtkDICOMItem::InvalidValue;
 }
 
@@ -424,36 +424,40 @@ vtkDICOMVR vtkDICOMItem::FindDictVR(vtkDICOMTag tag) const
   vtkDICOMDictEntry e = this->FindDictEntry(tag);
 
   if (e.IsValid())
-    {
+  {
     vr = e.GetVR();
     // use the dictionary VR
     if (vr == vtkDICOMVR::XS)
-      {
+    {
       const vtkDICOMValue &v =
         this->GetAttributeValue(DC::PixelRepresentation);
       if (v.IsValid())
-        {
+      {
         unsigned short r = v.AsUnsignedShort();
         vr = (r == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS);
-        }
+      }
+      else if (this->L)
+      {
+        vr = this->L->VRForXS;
+      }
       else
-        {
-        vr = (this->L ? this->L->VRForXS : vtkDICOMVR::US);
-        }
+      {
+        vr = vtkDICOMVR::US;
       }
+    }
     else if (vr == vtkDICOMVR::OX)
-      {
+    {
       vr = vtkDICOMVR::OW;
       vtkDICOMTag reftag = (tag.GetGroup() == 0x5400 ?
                             DC::WaveformBitsAllocated :
                             DC::BitsAllocated);
       const vtkDICOMValue& v = this->GetAttributeValue(reftag);
       if (v.IsValid() && v.AsUnsignedShort() <= 8)
-        {
+      {
         vr = vtkDICOMVR::OB;
-        }
       }
     }
+  }
 
   return vr;
 }
@@ -464,9 +468,9 @@ vtkDICOMTag vtkDICOMItem::ResolvePrivateTag(
 {
   unsigned short g = ptag.GetGroup();
   if ((g & 0x0001) == 0)
-    {
+  {
     return ptag;
-    }
+  }
 
   // if not resolved, the result will be (ffff,ffff)
   vtkDICOMTag otag(0xFFFF, 0xFFFF);
@@ -478,21 +482,21 @@ vtkDICOMTag vtkDICOMItem::ResolvePrivateTag(
 
   // search for the correct group
   while (iter != iterEnd && iter->GetTag() < ctag)
-    {
+  {
     ++iter;
-    }
+  }
   // look for private creator elements within the group
   while (iter != iterEnd && iter->GetTag() <= etag)
-    {
+  {
     ctag = iter->GetTag();
     if (iter->GetValue().AsString() == creator)
-      {
+    {
       otag = vtkDICOMTag(
         g, (ctag.GetElement() << 8) | (ptag.GetElement() & 0x00FF));
       break;
-      }
-    ++iter;
     }
+    ++iter;
+  }
 
   return otag;
 }
@@ -503,30 +507,30 @@ vtkDICOMTag vtkDICOMItem::ResolvePrivateTagForWriting(
 {
   vtkDICOMTag otag = this->ResolvePrivateTag(ptag, creator);
   if (otag == vtkDICOMTag(0xFFFF, 0xFFFF))
-    {
+  {
     unsigned short g = ptag.GetGroup();
     for (unsigned short e = 0x0010; e <= 0x00FF; e++)
-      {
+    {
       vtkDICOMTag ctag(g, e);
       vtkDICOMDataElement *d = this->FindDataElementOrInsert(ctag);
       if (!d->Value.IsValid())
-        {
+      {
         // creator elements are LO, which uses SpecificCharacterSet
         vtkDICOMCharacterSet cs = this->L->CharacterSet;
         const vtkDICOMValue& vcs =
           this->GetAttributeValue(DC::SpecificCharacterSet);
         if (vcs.IsValid())
-          {
+        {
           cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
-          }
+        }
         // if an empty slot was found, use it for this creator
         d->Tag = ctag;
         d->Value = vtkDICOMValue(vtkDICOMVR::LO, cs, creator);
         otag = vtkDICOMTag(g, (e << 8) | (ptag.GetElement() & 0x00FF));
         break;
-        }
       }
     }
+  }
 
   return otag;
 }
@@ -540,13 +544,13 @@ vtkDICOMDictEntry vtkDICOMItem::FindDictEntry(vtkDICOMTag tag) const
   // note that there is similar code in vtkDICOMMetaData
   const char *dict = 0;
   if ((group & 1) != 0 && element > 0x00ffu)
-    {
+  {
     unsigned short creatorElement = (element >> 8);
     element &= 0x00ffu;
     tag = vtkDICOMTag(group, element);
     vtkDICOMTag creatorTag(group, creatorElement);
     dict = this->GetAttributeValue(creatorTag).GetCharData();
-    }
+  }
 
   return vtkDICOMDictionary::FindDictEntry(tag, dict);
 }
@@ -559,26 +563,26 @@ bool vtkDICOMItem::operator==(const vtkDICOMItem& ob) const
 
   bool r = true;
   if (t != o)
-    {
+  {
     r = false;
     if (t != 0 && o != 0 &&
         t->NumberOfDataElements == o->NumberOfDataElements)
-      {
+    {
       r = true;
       int n = t->NumberOfDataElements;
       if (n > 0)
-        {
+      {
         vtkDICOMDataElement *a = t->Head.Next;
         vtkDICOMDataElement *b = o->Head.Next;
         do
-          {
+        {
           r &= (*a == *b);
           a = a->Next;
           b = b->Next;
-          }
-        while (r && --n);
         }
+        while (r && --n);
       }
     }
+  }
   return r;
 }
diff --git a/Source/vtkDICOMItem.h b/Source/vtkDICOMItem.h
index d9d9d30..1d5bfed 100644
--- a/Source/vtkDICOMItem.h
+++ b/Source/vtkDICOMItem.h
@@ -56,6 +56,7 @@ private:
 
 public:
 
+  //@{
   //! Default constructor creates an empty item.
   vtkDICOMItem() : L(0) {}
 
@@ -85,7 +86,9 @@ public:
 
   //! Destructor does reference counting.
   ~vtkDICOMItem() { this->Clear(); }
+  //@}
 
+  //@{
   //! Clear the data.
   void Clear() {
     if (this->L && --(this->L->ReferenceCount) == 0) { this->FreeList(); }
@@ -97,7 +100,9 @@ public:
   //! Check if this was read as a delimited item.
   bool IsDelimited() const {
     return (this->L == 0 || this->L->Delimited != 0); }
+  //@}
 
+  //@{
   //! Add a data element to this item.
   /*!
    *  If you specify a string, it must either be an ASCII string, or it must
@@ -106,7 +111,9 @@ public:
   void SetAttributeValue(vtkDICOMTag tag, const vtkDICOMValue& v);
   void SetAttributeValue(vtkDICOMTag tag, double v);
   void SetAttributeValue(vtkDICOMTag tag, const std::string& v);
+  //@}
 
+  //@{
   //! Add a data element at the specified path.
   /*!
    *  The data element is inserted at the tail of the given path.  If the
@@ -117,11 +124,15 @@ public:
   void SetAttributeValue(const vtkDICOMTagPath& tag, const vtkDICOMValue& v);
   void SetAttributeValue(const vtkDICOMTagPath& tag, double v);
   void SetAttributeValue(const vtkDICOMTagPath& tag, const std::string& v);
+  //@}
 
+  //@{
   //! Get a data element from this item.
   const vtkDICOMValue &GetAttributeValue(vtkDICOMTag tag) const;
   const vtkDICOMValue &GetAttributeValue(const vtkDICOMTagPath &tag) const;
+  //@}
 
+  //@{
   //! Get the offset of this item from the beginning of the file.
   /*!
    *  Some DICOM files, such as DICOMDIR files, index into sequences via
@@ -130,7 +141,9 @@ public:
    */
   unsigned int GetByteOffset() const {
     return (this->L == 0 ? 0 : this->L->ByteOffset); }
+  //@}
 
+  //@{
   //! Get the number of data elements.
   int GetNumberOfDataElements() const {
     return (this->L ? this->L->NumberOfDataElements : 0); }
@@ -142,7 +155,9 @@ public:
   //! Get an end iterator for the list of data elements.
   vtkDICOMDataElementIterator End() const {
     return (this->L ? &this->L->Tail : 0); }
+  //@}
 
+  //@{
   //! Resolve a private tag, or return (ffff,ffff) if not resolved.
   /*!
    *  Private data elements are mobile, which means that different data
@@ -166,7 +181,9 @@ public:
    */
   vtkDICOMTag ResolvePrivateTagForWriting(
     vtkDICOMTag ptag, const std::string& creator);
+  //@}
 
+  //@{
   //! Look up a tag in the DICOM dictionary.
   /*!
    *  Unlike the method in vtkDICOMDictionary, this method can identify
@@ -177,11 +194,15 @@ public:
 
   //! Use the dictionary to get the VR, returns UN on failure.
   vtkDICOMVR FindDictVR(vtkDICOMTag tag) const;
+  //@}
 
+  //@{
   bool operator==(const vtkDICOMItem& o) const;
   bool operator!=(const vtkDICOMItem& o) const {
     return !(*this == o); }
+  //@}
 
+  //@{
   //! Assignment operator does reference counting.
   vtkDICOMItem &operator=(const vtkDICOMItem &o) {
     if (this->L != o.L) {
@@ -189,6 +210,7 @@ public:
       if (this->L && --(this->L->ReferenceCount) == 0) { this->FreeList(); }
       this->L = o.L; }
     return *this; }
+  //@}
 
 private:
   void FreeList();
diff --git a/Source/vtkDICOMLookupTable.cxx b/Source/vtkDICOMLookupTable.cxx
index 7343a95..5b791e1 100644
--- a/Source/vtkDICOMLookupTable.cxx
+++ b/Source/vtkDICOMLookupTable.cxx
@@ -40,185 +40,185 @@ void vtkDICOMLookupTable::PrintSelf(ostream& os, vtkIndent indent)
 void vtkDICOMLookupTable::BuildStandardPalette(const char *cs)
 {
   if (cs == 0)
-    {
+  {
     vtkErrorMacro("Null string passed to BuildStandardPalette()!");
-    }
+  }
   else if (strcmp(cs, "HOT_IRON") == 0)
-    {
+  {
     // use small adjustments to exactly match the DICOM hot iron table,
     // while still maintaining the ability to create a table of any size
     int n = this->GetNumberOfColors();
     unsigned char *cptr = this->WritePointer(0, n);
     double rgba[4] = { 0.0, 0.0, 0.0, 1.0 };
     for (int i = 0; i < n; i++)
-      {
+    {
       double x = static_cast<double>(i)/(n - 1);
       if (x < 0.5)
-        {
+      {
         rgba[0] = 2.0*x;
-        }
+      }
       else if (x < 0.5 + 0.5/255.0)
-        {
+      {
         rgba[0] = 1.0;
-        }
+      }
       else if (x < 0.75 - 0.25/255.0)
-        {
+      {
         rgba[0] = 1.0;
         rgba[1] = 2.0*x - (1.0 + 1.0/255.0);
-        }
+      }
       else if (x < 1.0 - 0.25/255.0)
-        {
+      {
         rgba[0] = 1.0;
         rgba[1] = 2.0*x - (1.0 + 1.0/255.0);
         rgba[2] = 4.0*x - (3.0 - 1.0/255.0);
-        }
+      }
       else if (x < 1.0)
-        {
+      {
         rgba[0] = 1.0;
         rgba[1] = 2.0*x - (1.0 + 1.0/255.0);
         rgba[2] = 1.0;
-        }
+      }
       else
-        {
+      {
         rgba[0] = 1.0;
         rgba[1] = 1.0;
         rgba[2] = 1.0;
-        }
+      }
       cptr[0] = static_cast<unsigned char>(rgba[0]*255.0 + 0.5);
       cptr[1] = static_cast<unsigned char>(rgba[1]*255.0 + 0.5);
       cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
       cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
       cptr += 4;
-      }
-    this->Modified();
     }
+    this->Modified();
+  }
   else if (strcmp(cs, "PET") == 0)
-    {
+  {
     // algorithmically create the table, this uses linear segments that
     // have been fit to the numerical data in the standard table
     int n = this->GetNumberOfColors();
     unsigned char *cptr = this->WritePointer(0, n);
     double rgba[4] = { 0.0, 0.0, 0.0, 1.0 };
     for (int i = 0; i < n; i++)
-      {
+    {
       double x = static_cast<double>(i)/(n - 1);
       if (x < 0.2475252060520769 - 0.5/(n - 1))
-        {
+      {
         rgba[1] = 2.024199843871975*x - 0.001028608164577255;
         rgba[2] = 2.0*x - 0.00392156862745098;
-        }
+      }
       else if (x < 0.2475252060520769 + 0.5/(n - 1))
-        {
+      {
         rgba[1] = 0.5;
         rgba[2] = 2.0*x - 0.00392156862745098;
-        }
+      }
       else if (x < 0.5019607843137255)
-        {
+      {
         rgba[0] = 1.9792076771653557*x -0.49153398564149964;
         rgba[1] = -1.9765567765567764*x + 0.9892594986712628;
         rgba[2] = 2.0*x - 0.00392156862745098;
-        }
+      }
       else if (x < 0.5029411764705882)
-        {
+      {
         rgba[0] = 1.9792076771653557*x -0.49153398564149964;
         rgba[1] = -1.9765567765567764*x + 0.9892594986712628;
         rgba[2] = 1.0;
-        }
+      }
       else if (x < 0.7531036189872085)
-        {
+      {
         rgba[0] = 1.9792076771653557*x -0.49153398564149964;
         rgba[1] = 2.0*x - 1.00392156862745;
         rgba[2] = -4.0*x + 3.011764705882353;
-        }
+      }
       else if (x < 1.0)
-        {
+      {
         rgba[0] = 1.0;
         rgba[1] = 2.0*x - 1.00392156862745;
         rgba[2] = 4.0428344791115824*x - 3.045323047251687;
-        }
+      }
       else
-        {
+      {
         rgba[0] = 1.0;
         rgba[1] = 1.0;
         rgba[2] = 1.0;
-        }
+      }
       cptr[0] = static_cast<unsigned char>(rgba[0]*255.0 + 0.5);
       cptr[1] = static_cast<unsigned char>(rgba[1]*255.0 + 0.5);
       cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
       cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
       cptr += 4;
-      }
-    this->Modified();
     }
+    this->Modified();
+  }
   else if (strcmp(cs, "HOT_METAL_BLUE") == 0)
-    {
+  {
     // algorithmically create the "hot metal blue" table
     int n = this->GetNumberOfColors();
     unsigned char *cptr = this->WritePointer(0, n);
     double rgba[4] = { 0.0, 0.0, 0.0, 1.0 };
     for (int i = 0; i < n; i++)
-      {
+    {
       double x = static_cast<double>(i)/(n - 1);
       if (x < 0.3333333333333333)
-        {
+      {
         rgba[2] = 1.96*x;
-        }
+      }
       else if (x < 0.4)
-        {
+      {
         rgba[0] = 3.0*x - 1.0;
         rgba[2] = 1.96*x;
-        }
+      }
       else if (x < 0.4666666666666666)
-        {
+      {
         rgba[0] = 2.25*x - 0.7;
         rgba[2] = 1.96 - 2.94*x;
-        }
+      }
       else if (x < 0.5333333333333333)
-        {
+      {
         rgba[0] = 3.0*x - 1.05;
         rgba[1] = 1.875*x - 0.875;
         rgba[2] = 3.332 - 5.88*x;
-        }
+      }
       else if (x < 0.6)
-        {
+      {
         rgba[0] = 3.0*x - 1.05;
         rgba[1] = 1.875*x - 0.875;
         rgba[2] = 1.764 - 2.94*x;
-        }
+      }
       else if (x < 0.6666666666666666)
-        {
+      {
         rgba[0] = 3.75*x - 1.5;
         rgba[1] = 1.875*x - 0.875;
         rgba[2] = 0.0;
-        }
+      }
       else if (x < 0.9333333333333333)
-        {
+      {
         rgba[0] = 1.0;
         rgba[1] = 1.875*x - 0.875;
         rgba[2] = 2.95*x - 1.9666666666666666;
-        }
+      }
       else if (x < 1.0)
-        {
+      {
         rgba[0] = 1.0;
         rgba[1] = 1.875*x - 0.875;
         rgba[2] = 3.2*x - 2.2;
-        }
+      }
       else
-        {
+      {
         rgba[0] = 1.0;
         rgba[1] = 1.0;
         rgba[2] = 1.0;
-        }
+      }
       cptr[0] = static_cast<unsigned char>(rgba[0]*255.0 + 0.5);
       cptr[1] = static_cast<unsigned char>(rgba[1]*255.0 + 0.5);
       cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
       cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
       cptr += 4;
-      }
-    this->Modified();
     }
+    this->Modified();
+  }
   else if (strcmp(cs, "PET_20_STEP") == 0)
-    {
+  {
     // segment the table into 20 steps
     double values[20][4] = {
       { 0.0, 0.0, 0.0, 1.0 },
@@ -245,7 +245,7 @@ void vtkDICOMLookupTable::BuildStandardPalette(const char *cs)
     int n = this->GetNumberOfColors();
     unsigned char *cptr = this->WritePointer(0, n);
     for (int i = 0; i < n; i++)
-      {
+    {
       double x = static_cast<double>(i)/(n - 1);
       double *rgba;
       if (x < 0.05) { rgba = values[0]; }
@@ -274,9 +274,9 @@ void vtkDICOMLookupTable::BuildStandardPalette(const char *cs)
       cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
       cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
       cptr += 4;
-      }
-    this->Modified();
     }
+    this->Modified();
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -306,12 +306,12 @@ void vtkDICOMLookupTable::BuildImagePalette(
   const unsigned short *spp[4] = { 0, 0, 0, 0 };
   const unsigned char *cpp[4] = { 0, 0, 0, 0 };
   for (int j = 0; j < 4; j++)
-    {
+  {
     const vtkDICOMValue& v = meta->GetAttributeValue(
       fileIndex, descTag[j]);
     // Descriptor must have three values
     if (v.GetNumberOfValues() == 3)
-      {
+    {
       // First value is number of entries in the this
       int n = v.GetUnsignedShort(0);
       n = (n == 0 ? 65536 : n);
@@ -333,50 +333,50 @@ void vtkDICOMLookupTable::BuildImagePalette(
       const vtkDICOMValue& d = meta->GetAttributeValue(
         fileIndex, dataTag[j]);
       if (d.GetVL() >= static_cast<unsigned int>(2*n))
-        {
+      {
         spp[j] = d.GetUnsignedShortData();
-        }
+      }
       else if (d.GetVL() >= static_cast<unsigned int>(n))
-        {
+      {
         cpp[j] = d.GetUnsignedCharData();
         if (cpp[j] == 0)
-          {
+        {
           cpp[j] = reinterpret_cast<const unsigned char *>(
             d.GetUnsignedShortData());
-          }
         }
       }
     }
+  }
 
   if (maxValue > minValue)
-    {
+  {
     // Generate the lookup table
     this->SetRange(minValue, maxValue);
     this->SetNumberOfColors(maxValue - minValue + 1);
     unsigned char *cptr = this->WritePointer(0, maxValue - minValue + 1);
     for (int i = minValue; i <= maxValue; i++)
-      {
+    {
       double rgba[4] = { 0.0, 0.0, 0.0, 1.0 };
       for (int j = 0; j < 4; j++)
-        {
+      {
         int k = i - firstValue[j];
         k = (i >= firstValue[j] ? k : 0);
         k = (i <= lastValue[j] ? k : lastValue[j] - firstValue[j]);
         if (spp[j])
-          {
+        {
           rgba[j] = spp[j][k] / divisor[j];
-          }
+        }
         else if (cpp[j])
-          {
+        {
           rgba[j] = cpp[j][k] / divisor[j];
-          }
         }
+      }
       cptr[0] = static_cast<unsigned char>(rgba[0]*255.0 + 0.5);
       cptr[1] = static_cast<unsigned char>(rgba[1]*255.0 + 0.5);
       cptr[2] = static_cast<unsigned char>(rgba[2]*255.0 + 0.5);
       cptr[3] = static_cast<unsigned char>(rgba[3]*255.0 + 0.5);
       cptr += 4;
-      }
     }
+  }
   this->Modified();
 }
diff --git a/Source/vtkDICOMLookupTable.h b/Source/vtkDICOMLookupTable.h
index 455c4bb..1d2c33b 100644
--- a/Source/vtkDICOMLookupTable.h
+++ b/Source/vtkDICOMLookupTable.h
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -11,11 +11,13 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkDICOMLookupTable - Lookup tables from DICOM data.
-// .SECTION Description
-// This class can create VTK lookup tables from the information in a
-// DICOM data set.  Lookup tables can be created from a palette LUT,
-// or from standard DICOM LUTs such as HOT_IRON.
+/*! \class vtkDICOMLookupTable
+ *  \brief Lookup tables from DICOM data.
+ *
+ *  This class can create VTK lookup tables from the information in a
+ *  DICOM data set.  Lookup tables can be created from a palette LUT,
+ *  or from standard DICOM LUTs such as HOT_IRON.
+ */
 
 #ifndef vtkDICOMLookupTable_h
 #define vtkDICOMLookupTable_h
@@ -29,26 +31,26 @@ class vtkDICOMMetaData;
 class VTKDICOM_EXPORT vtkDICOMLookupTable : public vtkLookupTable
 {
 public:
-  // Description:
-  // Static method for construction.
+  //! Static method for construction.
   static vtkDICOMLookupTable *New();
   vtkTypeMacro(vtkDICOMLookupTable, vtkLookupTable);
 
-  // Description:
-  // Print information about this object.
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Build the a standard lookup table, given a code string.
-  // The supported code strings are HOT_IRON, HOT_METAL_BLUE, PET,
-  // and PET_20_STEP.  This does not set the range of the table.
+  //! Build the a standard lookup table, given a code string.
+  /*!
+   *  The supported code strings are HOT_IRON, HOT_METAL_BLUE, PET,
+   *  and PET_20_STEP.  This does not set the range of the table.
+   */
   void BuildStandardPalette(const char *name);
 
-  // Description:
-  // Build the lookup table from the supplied meta data.
-  // An index may be given to specify which data set instance in the
-  // meta data will be used.  The range of the table will be set to
-  // the smallest and largest pixel values to be mapped.
+  //! Build the lookup table from the supplied meta data.
+  /*!
+   *  An index may be given to specify which data set instance in the
+   *  meta data will be used.  The range of the table will be set to
+   *  the smallest and largest pixel values to be mapped.
+   */
   void BuildImagePalette(vtkDICOMMetaData *meta, int idx=0);
 
 protected:
@@ -56,8 +58,8 @@ protected:
   ~vtkDICOMLookupTable();
 
 private:
-  vtkDICOMLookupTable(const vtkDICOMLookupTable&);  // Not implemented.
-  void operator=(const vtkDICOMLookupTable&);  // Not implemented.
+  vtkDICOMLookupTable(const vtkDICOMLookupTable&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMLookupTable&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMLookupTable_h
diff --git a/Source/vtkDICOMMRGenerator.cxx b/Source/vtkDICOMMRGenerator.cxx
index ccb2e54..e9de061 100644
--- a/Source/vtkDICOMMRGenerator.cxx
+++ b/Source/vtkDICOMMRGenerator.cxx
@@ -65,13 +65,13 @@ bool vtkDICOMMRGenerator::GenerateMRImageModule(vtkDICOMMetaData *source)
   // DENSITY MAP, IMAGE ADDITION, OTHER
   const char *it = 0;
   if (source)
-    {
+  {
     it = source->GetAttributeValue(DC::ImageType).GetCharData();
-    }
+  }
   if (it == 0 || it[0] == '\0')
-    {
+  {
     it = "DERIVED\\SECONDARY\\OTHER";
-    }
+  }
   vtkDICOMMetaData *meta = this->MetaData;
   meta->SetAttributeValue(DC::ImageType, it);
 
@@ -84,18 +84,18 @@ bool vtkDICOMMRGenerator::GenerateMRImageModule(vtkDICOMMetaData *source)
   const char *ss = 0;
   const char *sv = 0;
   if (source)
-    {
+  {
     ss = source->GetAttributeValue(DC::ScanningSequence).GetCharData();
     sv = source->GetAttributeValue(DC::SequenceVariant).GetCharData();
-    }
+  }
   if (ss == 0 || ss[0] == '\0')
-    { // default to "research mode"
+  { // default to "research mode"
     ss = "RM";
-    }
+  }
   if (sv == 0 || sv[0] == '\0')
-    {
+  {
     sv = "NONE";
-    }
+  }
   meta->SetAttributeValue(DC::ScanningSequence, ss);
   meta->SetAttributeValue(DC::SequenceVariant, sv);
 
@@ -103,41 +103,41 @@ bool vtkDICOMMRGenerator::GenerateMRImageModule(vtkDICOMMetaData *source)
   meta->SetAttributeValue(DC::SpacingBetweenSlices, this->Spacing[2]);
 
   if (source)
-    {
+  {
     // set this to the time dimension
     if (source->HasAttribute(DC::CardiacNumberOfImages))
-      {
+    {
       meta->SetAttributeValue(DC::CardiacNumberOfImages, this->Dimensions[3]);
-      }
+    }
     // keep this if data was not reformatted
     if (this->SourceInstanceArray != 0 && source == this->SourceMetaData)
-      {
+    {
       vtkDICOMMetaDataAdapter sourceAdapter(source);
       const char *ped = sourceAdapter->GetAttributeValue(
         DC::InPlanePhaseEncodingDirection).GetCharData();
       if (ped != 0 && ped[0] != '\0')
-        {
+      {
         meta->SetAttributeValue(DC::InPlanePhaseEncodingDirection, ped);
-        }
       }
     }
+  }
 
   // temporal information
   if (this->Dimensions[3] > 1)
-    {
+  {
     int n = meta->GetNumberOfInstances();
     int nslices = (this->Dimensions[2] > 0 ? this->Dimensions[2] : 1);
 
     for (int i = 0; i < n; i++)
-      {
+    {
       int t = (i % (n / nslices)) / (n / (nslices*this->Dimensions[3]));
       meta->SetAttributeValue(i, DC::TemporalPositionIdentifier, t + 1);
-      }
+    }
     meta->SetAttributeValue(
       DC::NumberOfTemporalPositions, this->Dimensions[3]);
     meta->SetAttributeValue(
       DC::TemporalResolution, this->Spacing[3]);
-    }
+  }
 
   // required items: use simple read/write validation
   DC::EnumType required[] = {
@@ -229,9 +229,9 @@ bool vtkDICOMMRGenerator::GenerateMRInstance(vtkInformation *info)
       !this->GenerateMRImageModule(source) ||
       !this->GenerateOverlayPlaneModule(source) ||
       !this->GenerateVOILUTModule(source))
-    {
+  {
     return false;
-    }
+  }
 
   return true;
 }
@@ -240,10 +240,10 @@ bool vtkDICOMMRGenerator::GenerateMRInstance(vtkInformation *info)
 bool vtkDICOMMRGenerator::GenerateInstance(vtkInformation *info)
 {
   if (this->MultiFrame)
-    {
+  {
     vtkErrorMacro("Enhanced Multi-Frame MR is not yet supported.");
     return false;
-    }
+  }
 
   return this->GenerateMRInstance(info);
 }
diff --git a/Source/vtkDICOMMRGenerator.h b/Source/vtkDICOMMRGenerator.h
index ccbb898..506237f 100644
--- a/Source/vtkDICOMMRGenerator.h
+++ b/Source/vtkDICOMMRGenerator.h
@@ -57,8 +57,8 @@ protected:
   virtual bool GenerateMRInstance(vtkInformation *info);
 
 private:
-  vtkDICOMMRGenerator(const vtkDICOMMRGenerator&);  // Not implemented.
-  void operator=(const vtkDICOMMRGenerator&);  // Not implemented.
+  vtkDICOMMRGenerator(const vtkDICOMMRGenerator&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMMRGenerator&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMMRGenerator_h
diff --git a/Source/vtkDICOMMetaData.cxx b/Source/vtkDICOMMetaData.cxx
index dca91c1..9158988 100644
--- a/Source/vtkDICOMMetaData.cxx
+++ b/Source/vtkDICOMMetaData.cxx
@@ -50,13 +50,13 @@ vtkDICOMMetaData::~vtkDICOMMetaData()
 {
   this->Clear();
   if (this->FileIndexArray)
-    {
+  {
     this->FileIndexArray->Delete();
-    }
+  }
   if (this->FrameIndexArray)
-    {
+  {
     this->FrameIndexArray->Delete();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -65,13 +65,13 @@ void vtkDICOMMetaData::Clear()
   vtkDICOMDataElement **htable = this->Table;
 
   if (htable)
-    {
+  {
     for (unsigned int i = 0; i < METADATA_HASH_SIZE; i++)
-      {
+    {
       delete [] htable[i];
-      }
-    delete [] htable;
     }
+    delete [] htable;
+  }
 
   this->NumberOfDataElements = 0;
   this->Table = NULL;
@@ -85,65 +85,65 @@ void vtkDICOMMetaData::Initialize()
   this->Clear();
   this->NumberOfInstances = 1;
   if (this->FileIndexArray)
-    {
+  {
     this->FileIndexArray->Delete();
     this->FileIndexArray = 0;
-    }
+  }
   if (this->FrameIndexArray)
-    {
+  {
     this->FrameIndexArray->Delete();
     this->FrameIndexArray = 0;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMMetaData::SetNumberOfInstances(int n)
 {
   if (this->Table != NULL)
-    {
+  {
     vtkErrorMacro("SetNumberOfInstances: Cannot set NumberOfInstances after "
                   "attributes have been added");
-    }
+  }
   else
-    {
+  {
     this->NumberOfInstances = n;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMMetaData::SetFileIndexArray(vtkIntArray *a)
 {
   if (this->FileIndexArray != a)
-    {
+  {
     if (this->FileIndexArray)
-      {
+    {
       this->FileIndexArray->Delete();
-      }
+    }
     this->FileIndexArray = a;
     if (this->FileIndexArray)
-      {
+    {
       this->FileIndexArray->Register(this);
-      }
-    this->Modified();
     }
+    this->Modified();
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMMetaData::SetFrameIndexArray(vtkIntArray *a)
 {
   if (this->FrameIndexArray != a)
-    {
+  {
     if (this->FrameIndexArray)
-      {
+    {
       this->FrameIndexArray->Delete();
-      }
+    }
     this->FrameIndexArray = a;
     if (this->FrameIndexArray)
-      {
+    {
       this->FrameIndexArray->Register(this);
-      }
-    this->Modified();
     }
+    this->Modified();
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -156,30 +156,30 @@ void vtkDICOMMetaData::RemoveAttribute(vtkDICOMTag tag)
   vtkDICOMDataElement *hptr;
 
   if (htable && (hptr = htable[i]) != NULL)
-    {
+  {
     while (hptr->Next != 0)
-      {
+    {
       if (hptr->Tag == tag)
-        {
+      {
         // remove from the linked list
         hptr->Next->Prev = hptr->Prev;
         hptr->Prev->Next = hptr->Next;
         // remove from the hash table
         hptr[0] = hptr[1];
         while (hptr->Next != 0)
-          {
+        {
           // adjust links as necessary
           hptr->Prev->Next = hptr;
           hptr->Next->Prev = hptr;
           hptr++;
           hptr[0] = hptr[1];
-          }
+        }
         this->NumberOfDataElements--;
         break;
-        }
-      hptr++;
       }
+      hptr++;
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -193,16 +193,16 @@ vtkDICOMDataElement *vtkDICOMMetaData::FindDataElement(
   vtkDICOMDataElement *hptr;
 
   if (htable && (hptr = htable[i]) != NULL)
-    {
+  {
     while (hptr->Next != 0)
-      {
+    {
       if (hptr->Tag == tag)
-        {
+      {
         return hptr;
-        }
-      hptr++;
       }
+      hptr++;
     }
+  }
 
   return NULL;
 }
@@ -221,23 +221,23 @@ const vtkDICOMValue *vtkDICOMMetaData::FindAttributeValue(
   const vtkDICOMValue *vptr = 0;
 
   if (a != 0)
-    {
+  {
     vptr = &a->Value;
     // is this a sequence of values?
     const vtkDICOMValue *sptr = vptr->GetMultiplexData();
     if (sptr)
-      {
+    {
       size_t n = vptr->GetNumberOfValues();
       vptr = 0;
       if (idx >= 0 && static_cast<size_t>(idx) < n)
-        {
+      {
         if (sptr[idx].IsValid())
-          {
+        {
           vptr = &sptr[idx];
-          }
         }
       }
     }
+  }
 
   return vptr;
 }
@@ -248,20 +248,20 @@ const vtkDICOMValue *vtkDICOMMetaData::FindAttributeValue(
 {
   const vtkDICOMValue *vptr = this->FindAttributeValue(idx, tagpath.GetHead());
   if (vptr != 0 && tagpath.HasTail())
-    {
-    unsigned int i = tagpath.GetIndex();
-    unsigned int n = vptr->GetNumberOfValues();
+  {
+    size_t i = tagpath.GetIndex();
+    size_t n = vptr->GetNumberOfValues();
     const vtkDICOMItem *items = vptr->GetSequenceData();
     vptr = 0;
     if (items != 0 && i < n)
-      {
+    {
       vptr = &items[i].GetAttributeValue(tagpath.GetTail());
       if (!vptr->IsValid())
-        {
+      {
         vptr = 0;
-        }
       }
     }
+  }
   return vptr;
 }
 
@@ -314,51 +314,51 @@ const vtkDICOMValue &vtkDICOMMetaData::GetAttributeValue(
   // (if frame is "-1", then only search SharedFunctionalGroups)
   int istart = (frame < 0 ? 1 : 0);
   for (int i = istart; i < 2; i++)
-    {
+  {
     // we only need the frame number for the PerFrame sequence
     size_t f = (i == 0 ? frame : 0);
     const vtkDICOMValue *seq = this->FindAttributeValue(idx, fgs[i]);
     if (seq && f < seq->GetNumberOfValues())
-      {
+    {
       // search for the item that matches the frame
       const vtkDICOMItem *items = seq->GetSequenceData();
       const vtkDICOMValue &v = items[f].GetAttributeValue(tagpath);
       if (v.IsValid())
-        {
+      {
         return v;
-        }
+      }
       // search within all the sequences in the item
       vtkDICOMDataElementIterator iter = items[f].Begin();
       vtkDICOMDataElementIterator iterEnd = items[f].End();
       while (iter != iterEnd)
-        {
+      {
         const vtkDICOMValue &u = iter->GetValue();
         if (u.GetNumberOfValues() == 1)
-          {
+        {
           const vtkDICOMItem *item = u.GetSequenceData();
           if (item)
-            {
+          {
             const vtkDICOMValue &w = item->GetAttributeValue(tagpath);
             if (w.IsValid())
-              {
+            {
               if ((iter->GetTag().GetGroup() & 1) == 0)
-                {
+              {
                 return w;
-                }
+              }
               else if (privateValue == 0)
-                {
+              {
                 // if we found the attribute in a private sequence,
                 // then save but and keep searching to see if it will
                 // eventually be found somewhere public
                 privateValue = &w;
-                }
               }
             }
           }
-        ++iter;
         }
+        ++iter;
       }
     }
+  }
 
   // search root last of all
   const vtkDICOMValue *vptr = this->FindAttributeValue(idx, tagpath);
@@ -381,9 +381,9 @@ int vtkDICOMMetaData::GetFileIndex(int sliceIdx)
 {
   if (this->FileIndexArray == 0 || sliceIdx < 0 ||
       sliceIdx >= this->FileIndexArray->GetNumberOfTuples())
-    {
+  {
     return -1;
-    }
+  }
 
   int n = this->FileIndexArray->GetNumberOfComponents();
   return this->FileIndexArray->GetValue(sliceIdx*n);
@@ -395,9 +395,9 @@ int vtkDICOMMetaData::GetFileIndex(int sliceIdx, int compIdx, int numComp)
   if (this->FileIndexArray == 0 || sliceIdx < 0 ||
       sliceIdx >= this->FileIndexArray->GetNumberOfTuples() ||
       compIdx < 0 || compIdx >= numComp)
-    {
+  {
     return -1;
-    }
+  }
 
   int n = this->FileIndexArray->GetNumberOfComponents();
   return this->FileIndexArray->GetValue(sliceIdx*n + compIdx*n/numComp);
@@ -408,9 +408,9 @@ int vtkDICOMMetaData::GetFrameIndex(int sliceIdx)
 {
   if (this->FrameIndexArray == 0 || sliceIdx < 0 ||
       sliceIdx >= this->FrameIndexArray->GetNumberOfTuples())
-    {
+  {
     return -1;
-    }
+  }
 
   int n = this->FrameIndexArray->GetNumberOfComponents();
   return this->FrameIndexArray->GetValue(sliceIdx*n);
@@ -422,9 +422,9 @@ int vtkDICOMMetaData::GetFrameIndex(int sliceIdx, int compIdx, int numComp)
   if (this->FrameIndexArray == 0 || sliceIdx < 0 ||
       sliceIdx >= this->FrameIndexArray->GetNumberOfTuples() ||
       compIdx < 0 || compIdx >= numComp)
-    {
+  {
     return -1;
-    }
+  }
 
   int n = this->FrameIndexArray->GetNumberOfComponents();
   return this->FrameIndexArray->GetValue(sliceIdx*n + compIdx*n/numComp);
@@ -442,62 +442,62 @@ vtkDICOMDataElement *vtkDICOMMetaData::FindDataElementOrInsert(
   vtkDICOMDataElement *hptr;
 
   if (htable == NULL)
-    {
+  {
     // allocate the hash table
     m = METADATA_HASH_SIZE;
     htable = new vtkDICOMDataElement *[METADATA_HASH_SIZE];
     this->Table = htable;
     do { *htable++ = NULL; } while (--m);
     htable = this->Table;
-    }
+  }
 
   hptr = htable[i];
 
   if (hptr == NULL)
-    {
+  {
     hptr = new vtkDICOMDataElement[4];
     htable[i] = hptr;
-    }
+  }
   else if (hptr->Next != 0)
-    {
+  {
     // see if item is already there
     unsigned int n = 0;
     do
-      {
+    {
       if (hptr->Tag == tag)
-        {
+      {
         return hptr;
-        }
+      }
       n++;
       hptr++;
-      }
+    }
     while (hptr->Next != 0);
 
     // if n+1 is a power of two, double allocated space
     if (n > 2 && (n & (n+1)) == 0)
-      {
+    {
       vtkDICOMDataElement *oldptr = htable[i];
       hptr = new vtkDICOMDataElement[2*(n+1)];
       htable[i] = hptr;
       // copy the old list
       for (unsigned int j = 0; j < n; j++)
-        {
+      {
         *hptr = oldptr[j];
         // link the new element into the list
         hptr->Next->Prev = hptr;
         hptr->Prev->Next = hptr;
         hptr++;
-        }
-      delete [] oldptr;
       }
+      delete [] oldptr;
     }
+  }
 
   // insert into the linked list
   vtkDICOMDataElement *tptr = &this->Tail;
   do
-    {
+  {
     tptr = tptr->Prev;
-    }
+  }
   while (tag < tptr->GetTag());
 
   hptr->Prev = tptr;
@@ -518,109 +518,109 @@ int vtkDICOMMetaData::FindItemsOrInsert(
 
   vtkDICOMDataElement *loc = this->FindDataElementOrInsert(tag);
   if (loc == 0)
-    {
+  {
     vtkErrorMacro("SetAttributeValue: tag group number must not be zero.");
     return 0;
-    }
+  }
 
   loc->Tag = tag;
   vtkDICOMValue *vptr = &loc->Value;
   if (!vptr->IsValid())
-    {
+  {
     vtkDICOMVR vr = this->FindDictVR(idx, tag);
     if (vr != vtkDICOMVR::SQ && vr != vtkDICOMVR::UN)
-      {
+    {
       // we just inserted a non-SQ value, remove it
       this->RemoveAttribute(tag);
       return 0;
-      }
     }
+  }
   else if (vptr->GetVR() != vtkDICOMVR::SQ)
-    {
+  {
     return 0;
-    }
+  }
 
   // is this a series of values?
   int count = 1;
   vtkDICOMValue *sptr = vtkDICOMValueFriendMetaData::GetMultiplex(vptr);
   if (sptr != 0)
-    {
+  {
     if (useidx)
-      {
+    {
       assert(idx >= 0 && idx < this->NumberOfInstances);
       sptr = &sptr[idx];
-      }
+    }
     else
-      {
+    {
       count = this->NumberOfInstances;
-      }
     }
+  }
   else if (useidx && this->NumberOfInstances > 1)
-    {
+  {
     // create a multiplex
     assert(idx >= 0 && idx < this->NumberOfInstances);
     int n = this->NumberOfInstances;
     vtkDICOMValue l;
     sptr = l.AllocateMultiplexData(vtkDICOMVR::SQ, n);
     for (int i = 0; i < n; i++)
-      {
+    {
       if (i != idx)
-        {
+      {
         sptr[i] = *vptr;
-        }
       }
+    }
     *vptr = l;
     sptr = &sptr[idx];
-    }
+  }
   else
-    {
+  {
     sptr = vptr;
-    }
+  }
 
-  unsigned int i = tagpath.GetIndex();
+  size_t i = tagpath.GetIndex();
   for (int k = 0; k < count; k++)
-    {
-    unsigned int n = i+1;
-    unsigned int m = 0;
+  {
+    size_t n = i+1;
+    size_t m = 0;
     const vtkDICOMItem *oldItems = sptr[k].GetSequenceData();
     if (oldItems != 0)
-      {
+    {
       m = sptr[k].GetNumberOfValues();
       n = (n > m ? n : m);
-      }
+    }
     vtkDICOMValue seq;
     vtkDICOMItem *items = seq.AllocateSequenceData(vtkDICOMVR::SQ, n);
     // copy the old sequence into the new one (shallow copy)
-    for (unsigned int j = 0; j < m; j++)
-      {
+    for (size_t j = 0; j < m; j++)
+    {
       items[j] = oldItems[j];
-      }
+    }
     // Get the character set and default VR for XS
     vtkDICOMCharacterSet cs = vtkDICOMCharacterSet::ISO_IR_6;
     vtkDICOMVR vrForXS = vtkDICOMVR::US;
     if (n > m)
-      {
+    {
       const vtkDICOMValue& vcs =
         this->GetAttributeValue(DC::SpecificCharacterSet);
       if (vcs.IsValid())
-        {
+      {
         cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
-        }
+      }
       const vtkDICOMValue &v = this->GetAttributeValue(
         DC::PixelRepresentation);
       if (v.IsValid())
-        {
+      {
         vrForXS = (v.AsUnsignedShort() == 0 ?
                    vtkDICOMVR::US : vtkDICOMVR::SS);
-        }
       }
-    for (unsigned int j = m; j < n; j++)
-      {
+    }
+    for (size_t j = m; j < n; j++)
+    {
       items[j] = vtkDICOMItem(cs, vrForXS);
-      }
+    }
     sptr[k] = seq;
     itemarray[k] = &items[i];
-    }
+  }
 
   return count;
 }
@@ -639,53 +639,53 @@ void vtkDICOMMetaData::SetAttributeValue(
   vtkDICOMTag tag, const vtkDICOMValue& v)
 {
   if (v.IsValid())
-    {
+  {
     vtkDICOMDataElement *loc = this->FindDataElementOrInsert(tag);
     if (loc == 0)
-      {
+    {
       vtkErrorMacro("SetAttributeValue: tag group number must not be zero.");
       return;
-      }
+    }
     loc->Tag = tag;
     loc->Value = v;
-    }
+  }
   else
-    {
+  {
     this->RemoveAttribute(tag);
-    }
+  }
 }
 
 void vtkDICOMMetaData::SetAttributeValue(vtkDICOMTag tag, double v)
 {
   vtkDICOMVR vr = this->FindDictVR(0, tag);
   if (vr != vtkDICOMVR::UN)
-    {
+  {
     this->SetAttributeValue(tag, vtkDICOMValue(vr, v));
-    }
+  }
   else
-    {
+  {
     vtkErrorMacro("SetAttributeValue: could not find tag (" <<
                   tag << ") in the dictionary");
-    }
+  }
 }
 
 void vtkDICOMMetaData::SetAttributeValue(vtkDICOMTag tag, const std::string& v)
 {
   vtkDICOMVR vr = this->FindDictVR(0, tag);
   if (vr.HasSpecificCharacterSet() && tag > DC::SpecificCharacterSet)
-    {
+  {
     this->SetAttributeValue(tag,
       this->MakeValueWithSpecificCharacterSet(vr, v));
-    }
+  }
   else if (vr != vtkDICOMVR::UN)
-    {
+  {
     this->SetAttributeValue(tag, vtkDICOMValue(vr, v));
-    }
+  }
   else
-    {
+  {
     vtkErrorMacro("SetAttributeValue: could not find tag (" <<
                   tag << ") in the dictionary");
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -695,10 +695,10 @@ void vtkDICOMMetaData::SetAttributeValue(
 {
   vtkDICOMDataElement *loc = this->FindDataElementOrInsert(tag);
   if (loc == 0)
-    {
+  {
     vtkErrorMacro("SetAttributeValue: tag group number must not be zero.");
     return;
-    }
+  }
 
   loc->Tag = tag;
   vtkDICOMValue *vptr = &loc->Value;
@@ -708,46 +708,46 @@ void vtkDICOMMetaData::SetAttributeValue(
   // is this a sequence of values?
   vtkDICOMValue *sptr = vtkDICOMValueFriendMetaData::GetMultiplex(vptr);
   if (sptr)
-    {
+  {
     sptr[idx] = v;
     // if invalid value was added, make sure valid values remain
     if (!v.IsValid())
-      {
+    {
       bool valid = false;
       for (int i = 0; i < this->NumberOfInstances; i++)
-        {
+      {
         valid |= sptr[i].IsValid();
-        }
+      }
       if (!valid)
-        {
+      {
         this->RemoveAttribute(tag);
-        }
       }
     }
+  }
   else if (v != *vptr)
-    {
+  {
     // differs from other instances, must turn value into a list,
     // so create a value that is actually a list of values
     int n = this->NumberOfInstances;
     vtkDICOMValue l;
     sptr = l.AllocateMultiplexData(vptr->GetVR(), n);
     for (int i = 0; i < n; i++)
-      {
+    {
       if (i == idx)
-        {
+      {
         sptr[i] = v;
-        }
+      }
       else
-        {
+      {
         sptr[i] = *vptr;
-        }
       }
-    *vptr = l;
     }
+    *vptr = l;
+  }
   else if (!vptr->IsValid())
-    {
+  {
     this->RemoveAttribute(tag);
-    }
+  }
 }
 
 void vtkDICOMMetaData::SetAttributeValue(
@@ -755,14 +755,14 @@ void vtkDICOMMetaData::SetAttributeValue(
 {
   vtkDICOMVR vr = this->FindDictVR(idx, tag);
   if (vr != vtkDICOMVR::UN)
-    {
+  {
     this->SetAttributeValue(idx, tag, vtkDICOMValue(vr, v));
-    }
+  }
   else
-    {
+  {
     vtkErrorMacro("SetAttributeValue: could not find tag (" <<
                   tag << ") in the dictionary");
-    }
+  }
 }
 
 void vtkDICOMMetaData::SetAttributeValue(
@@ -770,19 +770,19 @@ void vtkDICOMMetaData::SetAttributeValue(
 {
   vtkDICOMVR vr = this->FindDictVR(idx, tag);
   if (vr.HasSpecificCharacterSet() && tag > DC::SpecificCharacterSet)
-    {
+  {
     this->SetAttributeValue(idx, tag,
       this->MakeValueWithSpecificCharacterSet(vr, v));
-    }
+  }
   else if (vr != vtkDICOMVR::UN)
-    {
+  {
     this->SetAttributeValue(idx, tag, vtkDICOMValue(vr, v));
-    }
+  }
   else
-    {
+  {
     vtkErrorMacro("SetAttributeValue: could not find tag (" <<
                   tag << ") in the dictionary");
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -791,57 +791,57 @@ void vtkDICOMMetaData::SetAttributeValue(
   const vtkDICOMTagPath& tagpath, const vtkDICOMValue& v)
 {
   if (tagpath.HasTail())
-    {
+  {
     vtkDICOMItem **items = new vtkDICOMItem *[this->NumberOfInstances];
     int n = this->FindItemsOrInsert(0, false, tagpath, items);
     for (int i = 0; i < n; i++)
-      {
+    {
       items[i]->SetAttributeValue(tagpath.GetTail(), v);
-      }
-    delete [] items;
     }
+    delete [] items;
+  }
   else
-    {
+  {
     this->SetAttributeValue(tagpath.GetHead(), v);
-    }
+  }
 }
 
 void vtkDICOMMetaData::SetAttributeValue(
   const vtkDICOMTagPath& tagpath, double v)
 {
   if (tagpath.HasTail())
-    {
+  {
     vtkDICOMItem **items = new vtkDICOMItem *[this->NumberOfInstances];
     int n = this->FindItemsOrInsert(0, false, tagpath, items);
     for (int i = 0; i < n; i++)
-      {
+    {
       items[i]->SetAttributeValue(tagpath.GetTail(), v);
-      }
-    delete [] items;
     }
+    delete [] items;
+  }
   else
-    {
+  {
     this->SetAttributeValue(tagpath.GetHead(), v);
-    }
+  }
 }
 
 void vtkDICOMMetaData::SetAttributeValue(
   const vtkDICOMTagPath& tagpath, const std::string& v)
 {
   if (tagpath.HasTail())
-    {
+  {
     vtkDICOMItem **items = new vtkDICOMItem *[this->NumberOfInstances];
     int n = this->FindItemsOrInsert(0, false, tagpath, items);
     for (int i = 0; i < n; i++)
-      {
+    {
       items[i]->SetAttributeValue(tagpath.GetTail(), v);
-      }
-    delete [] items;
     }
+    delete [] items;
+  }
   else
-    {
+  {
     this->SetAttributeValue(tagpath.GetHead(), v);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -850,51 +850,51 @@ void vtkDICOMMetaData::SetAttributeValue(
   int idx, const vtkDICOMTagPath& tagpath, const vtkDICOMValue& v)
 {
   if (tagpath.HasTail())
-    {
+  {
     vtkDICOMItem *item = this->FindItemOrInsert(idx, tagpath);
     if (item)
-      {
+    {
       item->SetAttributeValue(tagpath.GetTail(), v);
-      }
     }
+  }
   else
-    {
+  {
     this->SetAttributeValue(idx, tagpath.GetHead(), v);
-    }
+  }
 }
 
 void vtkDICOMMetaData::SetAttributeValue(
   int idx, const vtkDICOMTagPath& tagpath, double v)
 {
   if (tagpath.HasTail())
-    {
+  {
     vtkDICOMItem *item = this->FindItemOrInsert(idx, tagpath);
     if (item)
-      {
+    {
       item->SetAttributeValue(tagpath.GetTail(), v);
-      }
     }
+  }
   else
-    {
+  {
     this->SetAttributeValue(idx, tagpath.GetHead(), v);
-    }
+  }
 }
 
 void vtkDICOMMetaData::SetAttributeValue(
   int idx, const vtkDICOMTagPath& tagpath, const std::string& v)
 {
   if (tagpath.HasTail())
-    {
+  {
     vtkDICOMItem *item = this->FindItemOrInsert(idx, tagpath);
     if (item)
-      {
+    {
       item->SetAttributeValue(tagpath.GetTail(), v);
-      }
     }
+  }
   else
-    {
+  {
     this->SetAttributeValue(idx, tagpath.GetHead(), v);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -906,9 +906,9 @@ vtkDICOMValue vtkDICOMMetaData::MakeValueWithSpecificCharacterSet(
   const vtkDICOMValue& vcs =
     this->GetAttributeValue(DC::SpecificCharacterSet);
   if (vcs.IsValid())
-    {
+  {
     cs = vtkDICOMCharacterSet(vcs.GetCharData(), vcs.GetVL());
-    }
+  }
   return vtkDICOMValue(vr, cs, v);
 }
 
@@ -920,37 +920,37 @@ void vtkDICOMMetaData::CopyAttributes(vtkDICOMMetaData *o)
   // can safely have private tags when this method is called.
 
   if (o != 0 && o != this)
-    {
+  {
     vtkDICOMDataElement **otable = o->Table;
     if (otable != 0)
-      {
+    {
       const vtkDICOMDataElement *iter = o->Head.Next;
       const vtkDICOMDataElement *iterEnd = &o->Tail;
       while (iter != iterEnd)
-        {
+      {
         // if this is a per-instance element, then make a copy of it
         const vtkDICOMValue *vptr = iter->Value.GetMultiplexData();
         if (vptr == 0)
-          {
+        {
           vtkDICOMDataElement *e = this->FindDataElementOrInsert(iter->Tag);
           e->Tag = iter->Tag;
           e->Value = iter->Value;
-          }
+        }
         else if (this->NumberOfInstances == o->NumberOfInstances)
-          {
+        {
           vtkDICOMDataElement *e = this->FindDataElementOrInsert(iter->Tag);
           e->Tag = iter->Tag;
           vtkDICOMValue *nvptr = e->Value.AllocateMultiplexData(
             iter->Value.GetVR(), this->NumberOfInstances);
           for (int i = 0; i < this->NumberOfInstances; i++)
-            {
+          {
             nvptr[i] = vptr[i];
-            }
           }
-        iter = iter->Next;
         }
+        iter = iter->Next;
       }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -958,17 +958,17 @@ void vtkDICOMMetaData::ShallowCopy(vtkDataObject *source)
 {
   vtkDICOMMetaData *o = vtkDICOMMetaData::SafeDownCast(source);
   if (o != this)
-    {
+  {
     this->Initialize();
     if (o != 0)
-      {
+    {
       this->NumberOfInstances = o->NumberOfInstances;
       this->CopyAttributes(o);
       this->SetFileIndexArray(o->FileIndexArray);
       this->SetFrameIndexArray(o->FrameIndexArray);
-      }
-    this->vtkDataObject::ShallowCopy(source);
     }
+    this->vtkDataObject::ShallowCopy(source);
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -976,25 +976,25 @@ void vtkDICOMMetaData::DeepCopy(vtkDataObject *source)
 {
   vtkDICOMMetaData *o = vtkDICOMMetaData::SafeDownCast(source);
   if (o != this)
-    {
+  {
     this->Initialize();
     if (o != 0)
-      {
+    {
       this->NumberOfInstances = o->NumberOfInstances;
       this->CopyAttributes(o);
       if (o->FileIndexArray)
-        {
+      {
         this->FileIndexArray = vtkIntArray::New();
         this->FileIndexArray->DeepCopy(o->FileIndexArray);
-        }
+      }
       if (o->FrameIndexArray)
-        {
+      {
         this->FrameIndexArray = vtkIntArray::New();
         this->FrameIndexArray->DeepCopy(o->FrameIndexArray);
-        }
       }
-    this->vtkDataObject::DeepCopy(source);
     }
+    this->vtkDataObject::DeepCopy(source);
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1005,60 +1005,60 @@ vtkDICOMVR vtkDICOMMetaData::FindDictVR(int idx, vtkDICOMTag tag)
   vtkDICOMDictEntry e = this->FindDictEntry(tag);
 
   if (e.IsValid())
-    {
+  {
     vr = e.GetVR();
     // use the dictionary VR
     if (vr == vtkDICOMVR::XS)
-      {
+    {
       vr = vtkDICOMVR::US;
       const vtkDICOMValue &v =
         this->GetAttributeValue(idx, DC::PixelRepresentation);
       if (v.IsValid())
-        {
+      {
         unsigned short r = v.AsUnsignedShort();
         vr = (r == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS);
-        }
+      }
       else if (tag > DC::PixelRepresentation)
-        {
+      {
         vtkErrorMacro("SetAttributeValue: could not look up vr for (" <<
                       tag << ") because PixelRepresentation is not set.");
-        }
       }
+    }
     else if (vr == vtkDICOMVR::OX)
-      {
+    {
       vr = vtkDICOMVR::OW;
       if (tag.GetGroup() == 0x5400)
-        {
+      {
         const vtkDICOMValue &v =
           this->GetAttributeValue(idx, DC::WaveformBitsAllocated);
         if (v.IsValid())
-          {
+        {
           unsigned short s = v.AsUnsignedShort();
           vr = (s > 8 ? vtkDICOMVR::OW : vtkDICOMVR::OB);
-          }
+        }
         else
-          {
+        {
           vtkErrorMacro("SetAttributeValue: could not look up vr for (" <<
                         tag << ") because WaveformBitsAllocated is not set.");
-          }
         }
+      }
       else
-        {
+      {
         const vtkDICOMValue &v =
           this->GetAttributeValue(idx, DC::BitsAllocated);
         if (v.IsValid())
-          {
+        {
           unsigned short s = v.AsUnsignedShort();
           vr = (s > 8 ? vtkDICOMVR::OW : vtkDICOMVR::OB);
-          }
+        }
         else
-          {
+        {
           vtkErrorMacro("SetAttributeValue: could not look up vr for (" <<
                         tag << ") because BitsAllocated is not set.");
-          }
         }
       }
     }
+  }
 
   return vr;
 }
@@ -1069,9 +1069,9 @@ vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTag(
 {
   unsigned short g = ptag.GetGroup();
   if ((g & 0x0001) == 0)
-    {
+  {
     return ptag;
-    }
+  }
 
   // if not resolved, the result will be (ffff,ffff)
   vtkDICOMTag otag(0xFFFF, 0xFFFF);
@@ -1083,31 +1083,31 @@ vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTag(
 
   vtkDICOMDataElement *e = this->FindDataElement(ctag);
   if (e != 0)
-    {
+  {
     // found (gggg,0010) in the hash table
     iter = vtkDICOMDataElementIterator(e);
-    }
+  }
   else
-    {
+  {
     // skip through list of elements until group is found
     while (iter != iterEnd && iter->GetTag() < ctag)
-      {
+    {
       ++iter;
-      }
     }
+  }
 
   // look for private creator elements within the group
   while (iter != iterEnd && iter->GetTag() <= etag)
-    {
+  {
     ctag = iter->GetTag();
     if (iter->GetValue().AsString() == creator)
-      {
+    {
       otag = vtkDICOMTag(
         g, (ctag.GetElement() << 8) | (ptag.GetElement() & 0x00FF));
       break;
-      }
-    ++iter;
     }
+    ++iter;
+  }
 
   return otag;
 }
@@ -1118,23 +1118,23 @@ vtkDICOMTag vtkDICOMMetaData::ResolvePrivateTagForWriting(
 {
   vtkDICOMTag otag = this->ResolvePrivateTag(ptag, creator);
   if (otag == vtkDICOMTag(0xFFFF, 0xFFFF))
-    {
+  {
     unsigned short g = ptag.GetGroup();
     for (unsigned short e = 0x0010; e <= 0x00FF; e++)
-      {
+    {
       vtkDICOMTag ctag(g, e);
       vtkDICOMDataElement *d = this->FindDataElementOrInsert(ctag);
       if (!d->Value.IsValid())
-        {
+      {
         // if an empty slot was found, use it for this creator
         d->Tag = ctag;
         d->Value = this->MakeValueWithSpecificCharacterSet(
           vtkDICOMVR::LO, creator);
         otag = vtkDICOMTag(g, (e << 8) | (ptag.GetElement() & 0x00FF));
         break;
-        }
       }
     }
+  }
 
   return otag;
 }
@@ -1148,13 +1148,13 @@ vtkDICOMDictEntry vtkDICOMMetaData::FindDictEntry(vtkDICOMTag tag)
   // note that there is similar code in vtkDICOMItem
   const char *dict = 0;
   if ((group & 1) != 0 && element > 0x00ffu)
-    {
+  {
     unsigned short creatorElement = (element >> 8);
     element &= 0x00ffu;
     tag = vtkDICOMTag(group, element);
     vtkDICOMTag creatorTag(group, creatorElement);
     dict = this->GetAttributeValue(creatorTag).GetCharData();
-    }
+  }
 
   return vtkDICOMDictionary::FindDictEntry(tag, dict);
 }
diff --git a/Source/vtkDICOMMetaData.h b/Source/vtkDICOMMetaData.h
index f41611c..7e57311 100644
--- a/Source/vtkDICOMMetaData.h
+++ b/Source/vtkDICOMMetaData.h
@@ -41,6 +41,7 @@ public:
   //! Print a summary of the contents of this object.
   void PrintSelf(ostream& os, vtkIndent indent);
 
+  //@{
   //! Get the number of instances (i.e. files).
   /*!
    *  We want to track the metadata from all of the files that
@@ -51,13 +52,17 @@ public:
    */
   int GetNumberOfInstances() { return this->NumberOfInstances; }
   void SetNumberOfInstances(int n);
+  //@}
 
+  //@{
   //! Remove all data elements.
   void Clear();
 
   //! Remove all data elements and initialize all members.
   void Initialize();
+  //@}
 
+  //@{
   //! Get the number of data elements that are present.
   int GetNumberOfDataElements() {
     return this->NumberOfDataElements; }
@@ -69,7 +74,9 @@ public:
   //! Get an end iterator for the list of data elements.
   vtkDICOMDataElementIterator End() {
     return &this->Tail; }
+  //@}
 
+  //@{
   //! Get the iterator for a specific data element.
   /*!
    *  If the element was not found, then End() will be returned.
@@ -77,13 +84,17 @@ public:
   vtkDICOMDataElementIterator Find(vtkDICOMTag tag) {
     vtkDICOMDataElement *e = this->FindDataElement(tag);
     return (e != 0 ? e : &this->Tail); }
+  //@}
 
+  //@{
   //! Check whether an attribute is present in the metadata.
   bool HasAttribute(vtkDICOMTag tag);
 
   //! Erase an attribute.
   void RemoveAttribute(vtkDICOMTag tag);
+  //@}
 
+  //@{
   //! Get an attribute value.
   /*!
    *  The tag will usually be specified in one of these two ways:
@@ -94,7 +105,9 @@ public:
    */
   const vtkDICOMValue &GetAttributeValue(vtkDICOMTag tag);
   const vtkDICOMValue &GetAttributeValue(const vtkDICOMTagPath &p);
+  //@}
 
+  //@{
   //! Get an attribute value for the specified file index.
   /*!
    *  If this meta data object is used to hold the meta data for
@@ -105,7 +118,9 @@ public:
    */
   const vtkDICOMValue &GetAttributeValue(int idx, vtkDICOMTag tag);
   const vtkDICOMValue &GetAttributeValue(int idx, const vtkDICOMTagPath &p);
+  //@}
 
+  //@{
   //! Get an attribute value for the specified file and frame index.
   /*!
    *  In order to get the file and frame index for a particular slice
@@ -120,7 +135,9 @@ public:
   const vtkDICOMValue &GetAttributeValue(int idx, int frame, vtkDICOMTag tag);
   const vtkDICOMValue &GetAttributeValue(
     int idx, int frame, const vtkDICOMTagPath &p);
+  //@}
 
+  //@{
   //! Get the file index for the given image slice and component.
   /*!
    *  This takes into account the way the files were sorted to create
@@ -131,7 +148,9 @@ public:
    */
   int GetFileIndex(int sliceIdx, int compIdx, int numComps);
   int GetFileIndex(int sliceIdx);
+  //@}
 
+  //@{
   //! Get the frame index for the given image slice and component.
   /*!
    *  This takes into account the way the frames were sorted to create
@@ -142,7 +161,9 @@ public:
    */
   int GetFrameIndex(int sliceIdx, int compIdx, int numComps);
   int GetFrameIndex(int sliceIdx);
+  //@}
 
+  //@{
   //! Set an attribute value for the image at file index "idx".
   /*!
    *  Except for the method that takes a vtkDICOMValue, these methods
@@ -157,12 +178,16 @@ public:
   void SetAttributeValue(int idx, vtkDICOMTag tag, const vtkDICOMValue& v);
   void SetAttributeValue(int idx, vtkDICOMTag tag, double v);
   void SetAttributeValue(int idx, vtkDICOMTag tag, const std::string& v);
+  //@}
 
+  //@{
   //! Set the same attribute value for all images.
   void SetAttributeValue(vtkDICOMTag tag, const vtkDICOMValue& v);
   void SetAttributeValue(vtkDICOMTag tag, double v);
   void SetAttributeValue(vtkDICOMTag tag, const std::string& v);
+  //@}
 
+  //@{
   //! Set the attribute at the specified path.
   /*!
    *  The data element is inserted at the tail of the given path.  If the
@@ -176,12 +201,16 @@ public:
     int idx, const vtkDICOMTagPath& tag, double v);
   void SetAttributeValue(
     int idx, const vtkDICOMTagPath& tag, const std::string& v);
+  //@}
 
+  //@{
   //! Set the attribute value along this path for all images.
   void SetAttributeValue(const vtkDICOMTagPath& tag, const vtkDICOMValue& v);
   void SetAttributeValue(const vtkDICOMTagPath& tag, double v);
   void SetAttributeValue(const vtkDICOMTagPath& tag, const std::string& v);
+  //@}
 
+  //@{
   //! Resolve a private tag, or return (ffff,ffff) if not resolved.
   /*!
    *  Private data elements are mobile, which means that different data
@@ -204,7 +233,9 @@ public:
    */
   vtkDICOMTag ResolvePrivateTagForWriting(
     vtkDICOMTag ptag, const std::string& creator);
+  //@}
 
+  //@{
   //! Look up a tag in the DICOM dictionary.
   /*!
    *  Unlike the method in vtkDICOMDictionary, this method can identify
@@ -215,19 +246,27 @@ public:
 
   //! Use the dictionary to get the VR, return UN if not found.
   vtkDICOMVR FindDictVR(int idx, vtkDICOMTag tag);
+  //@}
 
+  //@{
   //! Create a value from text in a specific character set.
   vtkDICOMValue MakeValueWithSpecificCharacterSet(
     vtkDICOMVR vr, const std::string& v);
+  //@}
 
+  //@{
   //! Set the array to convert slice, component indices to file index.
   void SetFileIndexArray(vtkIntArray *fileArray);
   vtkIntArray *GetFileIndexArray() { return this->FileIndexArray; }
+  //@}
 
+  //@{
   //! Set the array to convert slice, component indices to frame index.
   void SetFrameIndexArray(vtkIntArray *frameArray);
   vtkIntArray *GetFrameIndexArray() { return this->FrameIndexArray; }
+  //@}
 
+  //@{
   //! Copy all the attributes from another MetaData object.
   /*!
    *  Copy attributes from the source meta data object into this one.
@@ -237,10 +276,13 @@ public:
    *  value for all instances.
    */
   void CopyAttributes(vtkDICOMMetaData *source);
+  //@}
 
+  //@{
   //! DataObject interface function.
   void ShallowCopy(vtkDataObject *source);
   void DeepCopy(vtkDataObject *source);
+  //@}
 
 protected:
   vtkDICOMMetaData();
@@ -289,8 +331,8 @@ private:
   //! An array to map slices and components to frames.
   vtkIntArray *FrameIndexArray;
 
-  vtkDICOMMetaData(const vtkDICOMMetaData&);  // Not implemented.
-  void operator=(const vtkDICOMMetaData&);  // Not implemented.
+  vtkDICOMMetaData(const vtkDICOMMetaData&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMMetaData&) VTK_DELETE_FUNCTION;
 };
 
 #endif /* vtkDICOMMetaData_h */
diff --git a/Source/vtkDICOMMetaDataAdapter.cxx b/Source/vtkDICOMMetaDataAdapter.cxx
index ee41a61..54572ff 100644
--- a/Source/vtkDICOMMetaDataAdapter.cxx
+++ b/Source/vtkDICOMMetaDataAdapter.cxx
@@ -20,136 +20,211 @@
 //----------------------------------------------------------------------------
 vtkDICOMMetaDataAdapter::vtkDICOMMetaDataAdapter(vtkDICOMMetaData *meta)
 {
+  this->ConstructionHelper(meta, -1);
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMMetaDataAdapter::vtkDICOMMetaDataAdapter(
+  vtkDICOMMetaData *meta, int i)
+{
+  this->ConstructionHelper(meta, i);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMMetaDataAdapter::ConstructionHelper(
+  vtkDICOMMetaData *meta, int i)
+{
   this->Meta = meta;
   this->PerFrame = 0;
   this->Shared = 0;
-  this->NumberOfInstances = 0;
   this->NullValue = 0;
+  this->NumberOfInstances = 0;
+  this->MetaInstance = (i >= 0 ? i : 0);
 
   if (meta)
-    {
+  {
     meta->Register(0);
     vtkDICOMDataElementIterator iter;
     iter = meta->Find(DC::PerFrameFunctionalGroupsSequence);
     if (iter != meta->End())
+    {
+      if (iter->IsPerInstance())
       {
-      this->PerFrame = &iter->GetValue();
+        this->PerFrame = &iter->GetValue(this->MetaInstance);
       }
+      else
+      {
+        this->PerFrame = &iter->GetValue();
+      }
+    }
     iter = meta->Find(DC::SharedFunctionalGroupsSequence);
     if (iter != meta->End())
+    {
+      if (iter->IsPerInstance())
+      {
+        this->Shared = &iter->GetValue(this->MetaInstance);
+      }
+      else
       {
-      this->Shared = &iter->GetValue();
+        this->Shared = &iter->GetValue();
       }
     }
+  }
 
-  if (this->Shared && this->PerFrame)
-    {
-    this->NumberOfInstances =
-      meta->GetAttributeValue(DC::NumberOfFrames).AsInt();
+  if (this->Shared && this->Shared->IsValid() &&
+      this->PerFrame && this->PerFrame->IsValid())
+  {
+    this->NumberOfInstances = meta->GetAttributeValue(
+      this->MetaInstance, DC::NumberOfFrames).AsInt();
     // an invalid value to return when asked for NumberOfFrames
     this->NullValue = new vtkDICOMValue();
-    }
+  }
   else if (meta)
-    {
-    this->NumberOfInstances = meta->GetNumberOfInstances();
+  {
+    this->NumberOfInstances = (i < 0 ? meta->GetNumberOfInstances() : 1);
     this->Shared = 0;
     this->PerFrame = 0;
-    }
+  }
 }
 
+//----------------------------------------------------------------------------
+// Copy constructor
+vtkDICOMMetaDataAdapter::vtkDICOMMetaDataAdapter(
+  const vtkDICOMMetaDataAdapter& other)
+  : Meta(other.Meta), PerFrame(other.PerFrame), Shared(other.Shared),
+    NullValue(other.NullValue), NumberOfInstances(other.NumberOfInstances),
+    MetaInstance(other.MetaInstance)
+{
+  if (other.Meta)
+  {
+    this->Meta->Register(0);
+  }
+  if (this->NullValue)
+  {
+    this->NullValue = new vtkDICOMValue();
+  }
+}
+
+//----------------------------------------------------------------------------
 // Destructor
 vtkDICOMMetaDataAdapter::~vtkDICOMMetaDataAdapter()
 {
   if (this->Meta)
-    {
+  {
     this->Meta->Delete();
-    }
+  }
   delete this->NullValue;
 }
 
 //----------------------------------------------------------------------------
+// Assignment
+vtkDICOMMetaDataAdapter& vtkDICOMMetaDataAdapter::operator=(
+  const vtkDICOMMetaDataAdapter& other)
+{
+  if (this != &other)
+  {
+    this->Meta = other.Meta;
+    this->PerFrame = other.PerFrame;
+    this->Shared = other.Shared;
+    this->NullValue = other.NullValue;
+    this->NumberOfInstances = other.NumberOfInstances;
+    this->MetaInstance = other.MetaInstance;
+
+    if (other.Meta)
+    {
+      this->Meta->Register(0);
+    }
+    if (this->NullValue)
+    {
+      this->NullValue = new vtkDICOMValue();
+    }
+  }
+  return *this;
+}
+
+//----------------------------------------------------------------------------
 const vtkDICOMValue &vtkDICOMMetaDataAdapter::GetAttributeValue(
   int idx, vtkDICOMTag tag) const
 {
   vtkDICOMMetaData *meta = this->Meta;
 
   if (this->PerFrame)
-    {
+  {
     // if asked for NumberOfFrames, pretend that it isn't set
     if (tag == DC::NumberOfFrames)
-      {
+    {
       return *this->NullValue;
-      }
+    }
 
     // search PerFrameFunctionalGroupsSequence first,
     // then search SharedFunctionalGroupsSequence
     const vtkDICOMValue *privateValue = 0;
     for (int i = 0; i < 2; i++)
-      {
+    {
       const vtkDICOMValue *seq = this->PerFrame;
       unsigned int f = idx;
 
       if (i == 1)
-        {
+      {
         seq = this->Shared;
         f = 0;
-        }
+      }
 
       if (seq && f < seq->GetNumberOfValues())
-        {
+      {
         // search for the item that matches the frame
         const vtkDICOMItem *items = seq->GetSequenceData();
         const vtkDICOMValue &v = items[f].GetAttributeValue(tag);
         if (v.IsValid())
-          {
+        {
           return v;
-          }
+        }
         // search within all the sequences in the item
         vtkDICOMDataElementIterator iter = items[f].Begin();
         vtkDICOMDataElementIterator iterEnd = items[f].End();
         while (iter != iterEnd)
-          {
+        {
           const vtkDICOMValue &u = iter->GetValue();
           if (u.GetNumberOfValues() == 1)
-            {
+          {
             const vtkDICOMItem *item = u.GetSequenceData();
             if (item)
-              {
+            {
               const vtkDICOMValue &w = item->GetAttributeValue(tag);
               if (w.IsValid())
-                {
+              {
                 if ((iter->GetTag().GetGroup() & 1) == 0)
-                  {
+                {
                   return w;
-                  }
+                }
                 else if (privateValue == 0)
-                  {
+                {
                   // if we found the attribute in a private sequence,
                   // then save but and keep searching to see if it will
                   // eventually be found somewhere public
                   privateValue = &w;
-                  }
                 }
               }
             }
-          ++iter;
           }
+          ++iter;
         }
       }
+    }
 
     // if it wasn't in a PerFrame or Shared functional group
-    const vtkDICOMValue& v = meta->GetAttributeValue(0, tag);
+    const vtkDICOMValue& v = meta->GetAttributeValue(this->MetaInstance, tag);
     if (privateValue && !v.IsValid())
-      {
+    {
       // attributes found in private parts of the PerFrame or Shared are
       // only returned if the attribute could not be found elsewhere
       return *privateValue;
-      }
-    return v;
     }
+    return v;
+  }
 
   // if no per-frame data, use file instance
-  return meta->GetAttributeValue(idx, tag);
+  return meta->GetAttributeValue(idx + this->MetaInstance, tag);
 }
 
 //----------------------------------------------------------------------------
@@ -174,82 +249,81 @@ vtkDICOMTag vtkDICOMMetaDataAdapter::ResolvePrivateTag(
   vtkDICOMMetaData *meta = this->Meta;
 
   if (this->PerFrame)
-    {
+  {
     // search PerFrameFunctionalGroupsSequence first,
     // then search SharedFunctionalGroupsSequence
     vtkDICOMTag tagFromPrivSeq(0xFFFF,0xFFFF);
     for (int i = 0; i < 2; i++)
-      {
+    {
       const vtkDICOMValue *seq = this->PerFrame;
       unsigned int f = 0;
 
       if (i == 1)
-        {
+      {
         seq = this->Shared;
         f = 0;
-        }
+      }
 
       if (seq && f < seq->GetNumberOfValues())
-        {
+      {
         // search for the item that matches the frame
         const vtkDICOMItem *items = seq->GetSequenceData();
         vtkDICOMTag tag = items[f].ResolvePrivateTag(ptag, creator);
         if (tag != vtkDICOMTag(0xFFFF, 0xFFFF))
-          {
+        {
           const vtkDICOMValue &v = items[f].GetAttributeValue(tag);
           if (v.IsValid())
-            {
+          {
             return tag;
-            }
           }
+        }
         // search within all the sequences in the item
         vtkDICOMDataElementIterator iter = items[f].Begin();
         vtkDICOMDataElementIterator iterEnd = items[f].End();
         while (iter != iterEnd)
-          {
+        {
           const vtkDICOMValue &u = iter->GetValue();
           if (u.GetNumberOfValues() == 1)
-            {
+          {
             const vtkDICOMItem *item = u.GetSequenceData();
             if (item)
-              {
+            {
               tag = item->ResolvePrivateTag(ptag, creator);
               if (tag != vtkDICOMTag(0xFFFF, 0xFFFF))
-                {
+              {
                 const vtkDICOMValue &v = item->GetAttributeValue(tag);
                 if (v.IsValid())
-                  {
+                {
                   if ((iter->GetTag().GetGroup() & 1) == 0)
-                    {
+                  {
                     return tag;
-                    }
+                  }
                   else if (tagFromPrivSeq == vtkDICOMTag(0xFFFF, 0xFFFF))
-                    {
+                  {
                     // if desired attribute was found within a private
                     // sequence, we want to keep searching in case it
                     // later appears within a public sequence (this matches
                     // the behavior of GetAttributeValue)
                     tagFromPrivSeq = tag;
-                    }
                   }
                 }
               }
             }
-          ++iter;
           }
+          ++iter;
         }
       }
+    }
 
     // if it wasn't in a PerFrame or Shared functional group
     vtkDICOMTag tag = meta->ResolvePrivateTag(ptag, creator);
     if (tag == vtkDICOMTag(0xFFFF, 0xFFFF))
-      {
+    {
       tag = tagFromPrivSeq;
-      }
-    return tag;
     }
+    return tag;
+  }
 
   // if no per-frame data, use file instance
   return meta->ResolvePrivateTag(ptag, creator);
 }
-
diff --git a/Source/vtkDICOMMetaDataAdapter.h b/Source/vtkDICOMMetaDataAdapter.h
index 1e2d424..109b0d1 100644
--- a/Source/vtkDICOMMetaDataAdapter.h
+++ b/Source/vtkDICOMMetaDataAdapter.h
@@ -32,12 +32,31 @@ class vtkDICOMValue;
 class VTKDICOM_EXPORT vtkDICOMMetaDataAdapter
 {
 public:
+  //@{
   //! Construct an adapter for the given meta data object.
+  /*!
+   *  If the provided meta-data is from an enhanced multi-frame data set,
+   *  then the adapter will make it look like a series of data sets.  If
+   *  the provided meta-data is from a series of non-enhanced data sets,
+   *  the adapter will act as a simple pass-through.
+   */
   vtkDICOMMetaDataAdapter(vtkDICOMMetaData *meta);
 
+  //! Construct an adapter for one DICOM object instance.
+  /*!
+   *  If instance i of the provided meta-data is an enhanced multi-frame
+   *  data set, make it look like a series.
+   */
+  vtkDICOMMetaDataAdapter(vtkDICOMMetaData *meta, int i);
+
+  //! Copy constructor.
+  vtkDICOMMetaDataAdapter(const vtkDICOMMetaDataAdapter&);
+
   //! Destructor release the reference to the meta data.
   ~vtkDICOMMetaDataAdapter();
+  //@}
 
+  //@{
   //! Get the number of instances (i.e. files).
   /*!
    *  For an enhanced multi-frame data set, this will return the
@@ -45,7 +64,9 @@ public:
    *  the number of instances in the series.
    */
   int GetNumberOfInstances() const { return this->NumberOfInstances; }
+  //@}
 
+  //@{
   //! Check whether an attribute is present in the metadata.
   /*!
    *  For an enhanced multi-frame data set, this will search the Shared
@@ -76,10 +97,20 @@ public:
    *  data set attributes.
    */
   vtkDICOMTag ResolvePrivateTag(vtkDICOMTag ptag, const std::string& creator);
+  //@}
 
+  //@{
   //! Make the adapter look like a pointer (for convenience).
   const vtkDICOMMetaDataAdapter* operator->() const { return this; }
   vtkDICOMMetaDataAdapter* operator->() { return this; }
+  //@}
+
+  //! Copy constructor.
+  vtkDICOMMetaDataAdapter& operator=(const vtkDICOMMetaDataAdapter&);
+
+protected:
+  //! Helper function for the constructors.  Set all members.
+  void ConstructionHelper(vtkDICOMMetaData *meta, int i);
 
 private:
 
@@ -88,6 +119,7 @@ private:
   const vtkDICOMValue *Shared;
   vtkDICOMValue *NullValue;
   int NumberOfInstances;
+  int MetaInstance;
 };
 
 #endif /* vtkDICOMMetaDataAdapter_h */
diff --git a/Source/vtkDICOMParser.cxx b/Source/vtkDICOMParser.cxx
index f82dc6f..dd4cde4 100644
--- a/Source/vtkDICOMParser.cxx
+++ b/Source/vtkDICOMParser.cxx
@@ -153,14 +153,14 @@ private:
 const vtkDICOMValue& DecoderContext::GetAttributeValue(vtkDICOMTag tag)
 {
   if (this->Item)
-    {
+  {
     return this->Item->GetAttributeValue(tag);
-    }
+  }
   else
-    {
+  {
     int idx = (this->Index == -1 ? 0 : this->Index);
     return this->MetaData->GetAttributeValue(idx, tag);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -168,26 +168,26 @@ vtkDICOMCharacterSet DecoderContext::GetCharacterSet()
 {
   vtkDICOMCharacterSet cs = this->CharacterSet;
   if (cs == vtkDICOMCharacterSet::Unknown)
-    {
+  {
     const vtkDICOMValue& v =
       this->GetAttributeValue(DC::SpecificCharacterSet);
     if (v.IsValid())
-      {
+    {
       cs = vtkDICOMCharacterSet(v.GetCharData(), v.GetVL());
-      }
+    }
     else if (this->Prev)
-      {
+    {
       cs = this->Prev->GetCharacterSet();
-      }
+    }
     else
-      {
+    {
       cs = vtkDICOMCharacterSet::ISO_IR_6;
-      }
+    }
     if (this->CurrentTag > DC::SpecificCharacterSet)
-      {
+    {
       this->CharacterSet = cs;
-      }
     }
+  }
 
   return cs;
 }
@@ -197,26 +197,26 @@ vtkDICOMVR DecoderContext::GetVRForXS()
 {
   vtkDICOMVR vr = this->VRForXS;
   if (vr == vtkDICOMVR::XX)
-    {
+  {
     const vtkDICOMValue& v =
       this->GetAttributeValue(DC::PixelRepresentation);
     if (v.IsValid())
-      {
+    {
       vr = (v.AsUnsignedShort() == 0 ? vtkDICOMVR::US : vtkDICOMVR::SS);
-      }
+    }
     else if (this->Prev)
-      {
+    {
       vr = this->Prev->GetVRForXS();
-      }
+    }
     else
-      {
+    {
       vr = vtkDICOMVR::US;
-      }
+    }
     if (this->CurrentTag > DC::PixelRepresentation)
-      {
+    {
       this->VRForXS = vr;
-      }
     }
+  }
   return vr;
 }
 
@@ -226,42 +226,42 @@ vtkDICOMVR DecoderContext::FindDictVR(vtkDICOMTag tag)
   vtkDICOMVR vr = vtkDICOMVR::UN;
 
   if (tag.GetElement() == 0x0000)
-    {
+  {
     // this is a group length element, which has VR of "UL"
     vr = vtkDICOMVR::UL;
-    }
+  }
   else if ((tag.GetGroup() & 0x1) != 0 &&
            tag.GetElement() >= 0x0010 && tag.GetElement() < 0x0100)
-    {
+  {
     // this is a private creator tag
     vr = vtkDICOMVR::LO;
-    }
+  }
   else
-    {
+  {
     vtkDICOMDictEntry de;
     if ((tag.GetGroup() & 0x1) == 0)
-      {
+    {
       de = vtkDICOMDictionary::FindDictEntry(tag);
-      }
+    }
     else if (this->Item)
-      {
+    {
       de = this->Item->FindDictEntry(tag);
-      }
+    }
     else if (this->MetaData)
-      {
+    {
       de = this->MetaData->FindDictEntry(tag);
-      }
+    }
     if (de.IsValid())
-      {
+    {
       vr = de.GetVR();
       if (vr == vtkDICOMVR::XS)
-        {
+      {
         // disambiguate tags that may be either "US" or "SS"
         this->CurrentTag = tag;
         vr = this->GetVRForXS();
-        }
+      }
       else if (vr == vtkDICOMVR::OX)
-        {
+      {
         // disambiguate tags that may be either "OB" or "OW"
         vr = vtkDICOMVR::OW;
         vtkDICOMTag reftag = (tag.GetGroup() == 0x5400 ?
@@ -269,12 +269,12 @@ vtkDICOMVR DecoderContext::FindDictVR(vtkDICOMTag tag)
                               DC::BitsAllocated);
         const vtkDICOMValue& v = this->GetAttributeValue(reftag);
         if (v.IsValid() && v.AsUnsignedShort() <= 8)
-          {
+        {
           vr = vtkDICOMVR::OB;
-          }
         }
       }
     }
+  }
 
   return vr;
 }
@@ -348,7 +348,7 @@ public:
   // Get the last tag that was read.
   vtkDICOMTag GetLastTag() { return this->LastTag; }
 
-  // Get the VR of the last data element.
+  // Get the VR of the last data element (invalid if implicit)
   vtkDICOMVR GetLastVR() { return this->LastVR; }
 
   // Get the VL of the last data element.
@@ -506,10 +506,10 @@ public:
     unsigned short g = 0;
     unsigned short e = 0;
     if (this->CheckBuffer(cp, ep, 4))
-      {
+    {
       g = Decoder<E>::GetInt16(cp);
       e = Decoder<E>::GetInt16(cp + 2);
-      }
+    }
     return vtkDICOMTag(g, e);
   }
 
@@ -593,18 +593,18 @@ void DecoderBase::SetQuery(
   const vtkDICOMDataElementIterator& iterEnd)
 {
   if (iter != iterEnd)
-    {
+  {
     this->HasQuery = true;
     this->QueryMatched = true;
     this->Query = iter;
     this->QueryEnd = iterEnd;
     this->QuerySave = iter;
-    }
+  }
   else
-    {
+  {
     this->HasQuery = false;
     this->QueryMatched = false;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -613,12 +613,12 @@ inline void DecoderBase::CopyBuffer(
 {
   // append bytes from sp to cp into the supplied value "v"
   if (v && cp != sp)
-    {
+  {
     size_t m = cp - sp;
     size_t n = v->GetNumberOfValues();
     unsigned char *ptr = v->ReallocateUnsignedCharData(n + m) + n;
     do { *ptr++ = *sp++; } while (--m);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -627,11 +627,11 @@ inline bool DecoderBase::CheckBuffer(
 {
   bool r = true;
   if (n > static_cast<size_t>(ep - cp))
-    {
+  {
     r = vtkDICOMParserInternalFriendship::FillBuffer(
           this->Parser, cp, ep);
     r &= (n <= static_cast<size_t>(ep - cp));
-    }
+  }
   return r;
 }
 
@@ -641,13 +641,13 @@ inline bool DecoderBase::CheckBuffer(
 {
   bool r = true;
   if (n > static_cast<size_t>(ep - cp))
-    {
+  {
     this->CopyBuffer(v, sp, cp);
     r = vtkDICOMParserInternalFriendship::FillBuffer(
           this->Parser, cp, ep);
     r &= (n <= static_cast<size_t>(ep - cp));
     sp = cp;
-    }
+  }
   return r;
 }
 
@@ -668,28 +668,28 @@ void DecoderBase::HandleMissingAttributes(vtkDICOMTag tag)
   --iter;
   if (iter->GetTag() != this->LastWrittenTag &&
       iter->GetTag().GetGroup() != 0x0002)
-    {
+  {
     int count = 0;
     do
-      {
+    {
       count++;
       --iter;
-      }
+    }
     while (iter->GetTag() != this->LastWrittenTag &&
            iter->GetTag().GetGroup() != 0x0002);
 
     vtkDICOMTag *missing = new vtkDICOMTag[count];
     for (int i = 0; i < count; i++)
-      {
+    {
       missing[i] = (++iter)->GetTag();
-      }
+    }
     for (int i = 0; i < count; i++)
-      {
+    {
       this->MetaData->SetAttributeValue(
         this->Index, missing[i], vtkDICOMValue());
-      }
-    delete [] missing;
     }
+    delete [] missing;
+  }
   this->LastWrittenTag = tag;
 }
 
@@ -698,7 +698,7 @@ void DecoderBase::AdvanceQueryIterator(vtkDICOMTag tag)
 {
   // advance the query iterator to the given tag
   while (this->Query != this->QueryEnd && this->Query->GetTag() < tag)
-    {
+  {
     // for query keys that weren't in the data set, only match if:
     // 1) the key is SpecificCharacterSet (not used for matching), or
     // 2) the key is a group length element (gggg,0000)
@@ -707,60 +707,60 @@ void DecoderBase::AdvanceQueryIterator(vtkDICOMTag tag)
     vtkDICOMTag qtag = this->Query->GetTag();
     if (qtag != DC::SpecificCharacterSet && qtag.GetElement() != 0 &&
         ((qtag.GetGroup() & 1) == 0 || qtag.GetElement() > 0x00ff))
-      {
+    {
       vtkDICOMValue nullValue;
       bool matched = nullValue.Matches(this->Query->GetValue());
 
       // if query tag is private, need additional checks
       if (!matched && (qtag.GetGroup() & 1) != 0)
-        {
+      {
         // compute creator tag, and search for it
         vtkDICOMTag ctag =
           vtkDICOMTag(qtag.GetGroup(), qtag.GetElement() >> 8);
         vtkDICOMDataElementIterator iter = this->QuerySave;
         while (iter != this->QueryEnd && iter->GetTag() < ctag)
-          {
+        {
           ++iter;
-          }
+        }
         if (iter != this->QueryEnd && iter->GetTag() == ctag)
-          {
+        {
           // if we already read the element, we already checked whether it
           // but if we didn't read it, then it doesn't exist, so don't match
           if (this->Item)
-            {
+          {
             vtkDICOMTag ptag = this->Item->ResolvePrivateTag(
               qtag, iter->GetValue().AsString());
             matched = (ptag != vtkDICOMTag(0xffff,0xffff) &&
                        this->Item->GetAttributeValue(ptag).IsValid());
-            }
+          }
           else
-            {
+          {
             vtkDICOMTag ptag = this->MetaData->ResolvePrivateTag(
               qtag, iter->GetValue().AsString());
             matched = (ptag != vtkDICOMTag(0xffff,0xffff) &&
                        this->MetaData->HasAttribute(ptag));
-            }
           }
+        }
         else
-          {
+        {
           // query has a private tag with no creator!
           if (this->Item)
-            {
+          {
             matched = this->Item->GetAttributeValue(qtag).Matches(
               this->Query->GetValue());
-            }
+          }
           else
-            {
+          {
             matched = this->MetaData->GetAttributeValue(qtag).Matches(
               this->Query->GetValue());
-            }
           }
         }
+      }
 
       this->QueryMatched &= matched;
-      }
-    ++this->Query;
     }
+    ++this->Query;
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -768,13 +768,13 @@ bool DecoderBase::QueryContains(vtkDICOMTag tag)
 {
   // if the tag isn't private
   if ((tag.GetGroup() & 1) == 0)
-    {
+  {
     // advance the query iterator until the tag is found in the query
     this->AdvanceQueryIterator(tag);
 
     // return true if the tag exists in the query
     return (this->Query != this->QueryEnd && this->Query->GetTag() == tag);
-    }
+  }
 
   // the remainder of this function handles private tags
   unsigned short g = tag.GetGroup();
@@ -787,57 +787,57 @@ bool DecoderBase::QueryContains(vtkDICOMTag tag)
 
   // save the query iterator
   if (this->QuerySave->GetTag() < gtag)
-    {
+  {
     this->QuerySave = this->Query;
-    }
+  }
 
   // if query doesn't contain any more keys in this group, return
   vtkDICOMDataElementIterator iter = this->Query;
   if (iter == this->QueryEnd || iter->GetTag().GetGroup() != g)
-    {
+  {
     return false;
-    }
+  }
 
   // if this is a creator element (e is 0x00XX), return true
   if (e >= 0x0010 && e <= 0x00FF)
-    {
+  {
     return true;
-    }
+  }
 
   // search for the creator element within the query
   vtkDICOMTag ctag = vtkDICOMTag(g, e >> 8);
   vtkDICOMValue creator = this->Context->GetAttributeValue(ctag);
   if (creator.IsValid())
-    {
+  {
     // maximum possible creator element is (gggg,00FF)
     gtag = vtkDICOMTag(g, 0x00FF);
     while (iter != this->QueryEnd && iter->GetTag() <= gtag)
-      {
+    {
       if (iter->GetValue().Matches(creator))
-        {
+      {
         tag = vtkDICOMTag(
           g, (iter->GetTag().GetElement() << 8) | (e & 0x00FF));
         break;
-        }
-      ++iter;
       }
+      ++iter;
+    }
     // if creator not found in query, tag obviously won't be found
     if (iter == this->QueryEnd || iter->GetTag() > gtag)
-      {
+    {
       return false;
-      }
     }
+  }
 
   // finally, look for the private tag at its resolved location
   while (iter != this->QueryEnd && iter->GetTag() < tag)
-    {
+  {
     ++iter;
-    }
+  }
   if (iter != this->QueryEnd && iter->GetTag() == tag)
-    {
+  {
     this->Query = iter;
     return true;
-    }
+  }
 
   return false;
 }
@@ -849,34 +849,34 @@ bool DecoderBase::QueryMatches(const vtkDICOMValue& v)
   vtkDICOMTag tag = this->Query->GetTag();
 
   if (v.GetVR() != vtkDICOMVR::SQ)
-    {
+  {
     // a query match is always true for SpecificCharacterSet, because this
     // element exists to describe the character encoding of the query, not
     // because it is to be matched.
     if (tag != DC::SpecificCharacterSet && tag.GetElement() != 0 &&
         ((tag.GetGroup() & 1) == 0 || tag.GetElement() > 0x00ff))
-      {
+    {
       // if above conditions don't apply, check if the query key matches
       matched = v.Matches(this->Query->GetValue());
-      }
     }
+  }
   else
-    {
+  {
     // if VR is SQ, then the matching was done when the sequence items were
     // parsed, and we just have to return the current value of QueryMatched
     matched = this->QueryMatched;
-    }
+  }
 
   if ((tag.GetGroup() & 1) == 0)
-    {
+  {
     // advance the query iterator
     ++this->Query;
-    }
+  }
   else
-    {
+  {
     // if private, restore to the start of the private group
     this->Query = this->QuerySave;
-    }
+  }
 
   return matched;
 }
@@ -885,9 +885,9 @@ bool DecoderBase::QueryMatches(const vtkDICOMValue& v)
 bool DecoderBase::FinishQuery()
 {
   if (this->HasQuery && this->QueryMatched)
-    {
+  {
     this->AdvanceQueryIterator(vtkDICOMTag(0xffff,0xffff));
-    }
+  }
   return this->QueryMatched;
 }
 
@@ -984,11 +984,11 @@ void Decoder<E>::GetValues(
   union { float f; unsigned int i; } u;
 
   do
-    {
+  {
     u.i = Decoder<E>::GetInt32(ip);
     *op++ = u.f;
     ip += 4;
-    }
+  }
   while (--n);
 }
 
@@ -999,11 +999,11 @@ void Decoder<E>::GetValues(
   union { double d; unsigned long long l; } u;
 
   do
-    {
+  {
     u.l = Decoder<E>::GetInt64(ip);
     *op++ = u.d;
     ip += 8;
-    }
+  }
   while (--n);
 }
 
@@ -1012,12 +1012,12 @@ void Decoder<E>::GetValues(
   const unsigned char *ip, vtkDICOMTag *op, size_t n)
 {
   do
-    {
+  {
     unsigned short g = Decoder<E>::GetInt16(ip);
     unsigned short e = Decoder<E>::GetInt16(ip + 2);
     *op++ = vtkDICOMTag(g, e);
     ip += 4;
-    }
+  }
   while (--n);
 }
 
@@ -1030,14 +1030,14 @@ size_t Decoder<E>::ReadData(
 {
   size_t l = n*sizeof(T);
   while (n != 0 && this->CheckBuffer(cp, ep, sizeof(T)))
-    {
+  {
     size_t m = (ep - cp)/sizeof(T);
     if (m > n) { m = n; }
     Decoder<E>::GetValues(cp, ptr, m);
     cp += m*sizeof(T);
     ptr += m;
     n -= m;
-    }
+  }
 
   return l - n*sizeof(T);
 }
@@ -1051,12 +1051,12 @@ size_t Decoder<E>::SkipData(
   size_t n = l;
 
   while (n != 0 && this->CheckBuffer(cp, ep, 2))
-    {
+  {
     size_t m = ep - cp;
     if (m > n) { m = n; }
     cp += m;
     n -= m;
-    }
+  }
 
   return l - n;
 }
@@ -1070,51 +1070,52 @@ size_t Decoder<E>::ReadElementHead(
   // basic size is 4 bytes
   size_t l = 4;
 
-  if (this->ImplicitVR)
-    {
+  // sequence and item delimiters are always decoded as implicit
+  if (this->ImplicitVR || tag.GetGroup() == HxFFFE)
+  {
     // implicit VR
-    vr = this->Context->FindDictVR(tag);
     vl = Decoder<E>::GetInt32(cp);
     // ignore vl in group length tags, it is corrupt in some files
     // and we know that it should always have a value of "4".
     if (tag.GetElement() == 0x0000) { vl = 4; }
     cp += 4;
-    }
+  }
   else
-    {
+  {
     // explicit VR
     bool implicit = false;
     vr = vtkDICOMVR(cp);
     vl = Decoder<E>::GetInt16(cp + 2);
     cp += 4;
     if (!vr.IsValid())
-      {
+    {
       // invalid vr, try to get VR from dictionary instead
       vr = this->Context->FindDictVR(tag);
-      if (cp[-4] <= 0x20 || cp[-4] >= 0x7f ||
-          cp[-3] <= 0x20 || cp[-3] >= 0x7f)
-        {
-        // if VR is not a graphical character within the default character
+      // check that vr was composed of reasonable chars
+      if (cp[-4] < 0x20 || cp[-4] >= 0x7f ||
+          cp[-3] < 0x20 || cp[-3] >= 0x7f)
+      {
+        // if VR is not a printable character within the default character
         // set, assume implicit encoding for this particular element
         implicit = true;
         vl = Decoder<E>::GetInt32(cp - 4);
-        }
       }
+    }
     if (!implicit && vr.HasLongVL())
-      {
+    {
       // for OB, OD, OF, OL, OW, SQ, UC, UN, UR, UT, and unrecognized
       // check that buffer has 4 bytes for 32-bit VL
       if (!this->CheckBuffer(cp, ep, 4))
-        {
+      {
         vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
           "Unexpected end of file.");
         return 0;
-        }
+      }
       vl = Decoder<E>::GetInt32(cp);
       cp += 4;
       l += 4;
-      }
     }
+  }
 
   return l;
 }
@@ -1129,144 +1130,144 @@ size_t Decoder<E>::ReadElementValue(
 
   // handle elements of unknown length
   if (vl == HxFFFFFFFF)
-    {
+  {
     if (vr == vtkDICOMVR::UN)
-      {
+    {
       // if VR is UN then it is a sequence encoded as implicit LE
       // (see DICOM Part 5, Section 6.2.2, Unknown (UN) Value Representation
       v.AllocateUnsignedCharData(vr, 0);
       this->ImplicitLE->SkipElements(
         cp, ep, vl, vtkDICOMTag(HxFFFE,HxE0DD), &v);
       return v.GetNumberOfValues();
-      }
+    }
     else if (vr == vtkDICOMVR::OB)
-      {
+    {
       // make sure unknown length data is properly encapsulated
       if (!this->CheckBuffer(cp, ep, 8))
-        {
+      {
         vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
           "Unexpected end of file.");
         return 0;
-        }
+      }
       unsigned short g1 = Decoder<E>::GetInt16(cp);
       unsigned short e1 = Decoder<E>::GetInt16(cp + 2);
       if (g1 != HxFFFE || (e1 != HxE000 && e1 != HxE0DD))
-        {
+      {
         vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
           "Encapsulated object is missing (FFFE,E000) tag.");
         return 0;
-        }
+      }
 
       v.AllocateUnsignedCharData(vr, 0);
       this->SkipElements(
         cp, ep, vl, vtkDICOMTag(HxFFFE,HxE0DD), &v);
       return v.GetNumberOfValues();
-      }
+    }
     else if (vr != vtkDICOMVR::SQ)
-      {
+    {
       // only UN, OB, and SQ can have unknown length
       vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
         "Illegal item length FFFFFFFF encountered.");
       return 0;
-      }
     }
+  }
   else if (static_cast<size_t>(ep - cp) < static_cast<size_t>(vl))
-    {
+  {
     // value is larger than what remains in buffer,
     // make sure there are enough bytes left in file
     vtkTypeInt64 bytesRemaining =
       vtkDICOMParserInternalFriendship::GetBytesRemaining(
           this->Parser, cp, ep);
     if (static_cast<vtkTypeInt64>(vl) > bytesRemaining)
-      {
+    {
       vtkDICOMParserInternalFriendship::ParseError(this->Parser, cp, ep,
         "Item length exceeds the bytes remaining in file.");
       return 0;
-      }
     }
+  }
 
   switch (vr.GetType())
-    {
+  {
     case VTK_CHAR:
-      {
+    {
       char *ptr;
       if (vr.HasSpecificCharacterSet() &&
           this->LastTag > DC::SpecificCharacterSet)
-        {
+      {
         ptr = v.AllocateCharData(vr, this->Context->GetCharacterSet(), vl);
-        }
+      }
       else
-        {
+      {
         ptr = v.AllocateCharData(vr, vl);
-        }
+      }
       l = this->ReadData(cp, ep, ptr, vl);
       // AllocateCharData makes room for terminal null
       if (l == 0 || ptr[l-1] != '\0') { ptr[l] = '\0'; }
       v.ComputeNumberOfValuesForCharData();
-      }
       break;
+    }
     case VTK_UNSIGNED_CHAR:
-      {
+    {
       unsigned char *ptr = v.AllocateUnsignedCharData(vr, vl);
       l = this->ReadData(cp, ep, ptr, vl);
-      }
       break;
+    }
     case VTK_SHORT:
-      {
+    {
       unsigned int n = vl/sizeof(short);
       short *ptr = v.AllocateShortData(vr, n);
       l = this->ReadData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_UNSIGNED_SHORT:
-      {
+    {
       unsigned int n = vl/sizeof(unsigned short);
       unsigned short *ptr = v.AllocateUnsignedShortData(vr, n);
       l = this->ReadData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_INT:
-      {
+    {
       unsigned int n = vl/sizeof(int);
       int *ptr = v.AllocateIntData(vr, n);
       l = this->ReadData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_UNSIGNED_INT:
-      {
+    {
       unsigned int n = vl/sizeof(unsigned int);
       unsigned int *ptr = v.AllocateUnsignedIntData(vr, n);
       l = this->ReadData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_FLOAT:
-      {
+    {
       unsigned int n = vl/sizeof(float);
       float *ptr = v.AllocateFloatData(vr, n);
       l = this->ReadData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_DOUBLE:
-      {
+    {
       unsigned int n = vl/sizeof(double);
       double *ptr = v.AllocateDoubleData(vr, n);
       l = this->ReadData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_DICOM_TAG:
-      {
+    {
       unsigned int n = vl/sizeof(vtkDICOMTag);
       vtkDICOMTag *ptr = v.AllocateTagData(vr, n);
       l = this->ReadData(cp, ep, ptr, n);
-      }
       break;
+    }
     case VTK_DICOM_ITEM:
-      {
+    {
       vtkDICOMTag tag = this->LastTag;
       vtkDICOMSequence seq;
       l = 0;
       while (l < static_cast<size_t>(vl) || vl == HxFFFFFFFF)
-        {
+      {
         if (!this->CheckBuffer(cp, ep, 8)) { return l; }
         unsigned short g = Decoder<E>::GetInt16(cp);
         unsigned short e = Decoder<E>::GetInt16(cp + 2);
@@ -1275,19 +1276,19 @@ size_t Decoder<E>::ReadElementValue(
         l += 8;
 
         if (g == HxFFFE && e == HxE000)
-          {
+        {
           // read one item
-          unsigned int offset = this->GetByteOffset(cp, ep) - 8;
+          size_t offset = this->GetByteOffset(cp, ep) - 8;
           bool delimited = (il == HxFFFFFFFF);
           vtkDICOMTag endtag(HxFFFE, HxE00D);
           vtkDICOMItem item(this->Context->GetCharacterSet(),
                             this->Context->GetVRForXS(),
-                            delimited, offset);
+                            delimited, static_cast<unsigned int>(offset));
           DecoderContext context(&item);
           this->PushContext(&context, tag);
 
           if (this->HasQuery)
-            {
+          {
             assert(this->Query != this->QueryEnd);
 
             // save the current query state before going one level deeper
@@ -1302,12 +1303,12 @@ size_t Decoder<E>::ReadElementValue(
 
             if ((query->GetTag().GetGroup() & 1) == 0 &&
                 query->GetValue().GetNumberOfValues() > 0)
-              {
+            {
               // if query sequence isn't empty, set HasQuery to 'true' and
               // use the sequence item as the new data set query
               const vtkDICOMItem *qitems = query->GetValue().GetSequenceData();
               if (qitems != 0 && qitems[0].GetNumberOfDataElements() != 0)
-                {
+              {
                 this->HasQuery = true;
                 this->QueryMatched = true;
                 this->Query = qitems[0].Begin();
@@ -1316,16 +1317,16 @@ size_t Decoder<E>::ReadElementValue(
 
                 // initialize queryMatched to false at the start of seq
                 queryMatched &= (seq.GetNumberOfItems() > 0);
-                }
               }
+            }
 
             this->ReadElements(cp, ep, il, endtag, l);
 
             // check query keys up to the end of the item
             if (this->HasQuery)
-              {
+            {
               this->AdvanceQueryIterator(vtkDICOMTag(0xffff,0xffff));
-              }
+            }
 
             // restore the query state
             this->HasQuery = hasQuery;
@@ -1333,52 +1334,52 @@ size_t Decoder<E>::ReadElementValue(
             this->Query = query;
             this->QueryEnd = queryEnd;
             this->QuerySave = querySave;
-            }
+          }
           else
-            {
+          {
             // if HasQuery is false, simply read the item
             this->ReadElements(cp, ep, il, endtag, l);
-            }
+          }
           seq.AddItem(item);
           this->PopContext();
-          }
+        }
         else if (g == HxFFFE && e == HxE0DD)
-          {
+        {
           // sequence delimiter found
           break;
-          }
+        }
         else
-          {
+        {
           // non-item tag found, skip to end if vl is known
           if (vl != HxFFFFFFFF)
-            {
+          {
             l += this->SkipData(cp, ep, static_cast<size_t>(vl) - l);
-            }
-          break;
           }
+          break;
         }
+      }
       if (vl != HxFFFFFFFF)
-        {
+      {
         // if vl != 0xffffffff, then the sequence was fixed-size rather
         // than delimited, so let's make our own fixed-size sequence and
         // copy all of the items into it
-        size_t n = seq.GetNumberOfItems();
+        unsigned int n = static_cast<unsigned int>(seq.GetNumberOfItems());
         vtkDICOMSequence seq2(n);
-        for (size_t i = 0; i < n; i++)
-          {
+        for (unsigned int i = 0; i < n; i++)
+        {
           seq2.SetItem(i, seq.GetItem(i));
-          }
-        seq = seq2;
         }
+        seq = seq2;
+      }
       v = seq;
 
       // reset the tag and VR as we step out of the sequence
       this->LastTag = tag;
       this->LastVR = vr;
       this->LastVL = vl;
-      }
       break;
     }
+  }
 
   return l;
 }
@@ -1396,7 +1397,7 @@ bool Decoder<E>::ReadElements(
   bool readGroup = (delimiter.GetElement() == 0x0000);
 
   while (tl < static_cast<size_t>(l) || l == HxFFFFFFFF)
-    {
+  {
     // read the tag
     if (!this->CheckBuffer(cp, ep, 8)) { break; }
     unsigned short g = Decoder<E>::GetInt16(cp);
@@ -1416,6 +1417,9 @@ bool Decoder<E>::ReadElements(
     // return false if could not read element
     if (hl == 0) { return false; }
 
+    // if VR wasn't in the element head (e.g. implicit), use dictionary
+    if (!vr.IsValid()) { vr = this->Context->FindDictVR(tag); }
+
     // save this as the most recent tag
     this->LastTag = tag;
     this->LastVR = vr;
@@ -1426,88 +1430,89 @@ bool Decoder<E>::ReadElements(
 
     // skip the value if this tag is not in the query
     if (this->HasQuery && !this->QueryContains(tag))
-      {
+    {
       if (vl != HxFFFFFFFF)
-        {
+      {
         // constant length item
         tl = this->SkipData(cp, ep, vl);
         if (tl != static_cast<size_t>(vl)) { return false; }
-        }
+      }
       else
-        {
+      {
         // if vl == 0xffffffff, the value is delimited
         vtkDICOMTag newdelim(HxFFFE, HxE0DD);
         if (tag == vtkDICOMTag(HxFFFE, HxE000))
-          { // if tag is item tag, use item delimiter
+        { // if tag is item tag, use item delimiter
           newdelim = vtkDICOMTag(HxFFFE, HxE00D);
-          }
+        }
         if (vr != vtkDICOMVR::UN)
-          {
+        {
           // Value is either a sequence or is encapsulated data
           if (!this->SkipElements(cp, ep, vl, newdelim, NULL))
-            {
+          {
             return false;
-            }
           }
+        }
         else
-          {
+        {
           // VR of UN indicates the value is an implicit LE sequence
           if (!this->ImplicitLE->SkipElements(cp, ep, vl, newdelim, NULL))
-            {
+          {
             return false;
-            }
           }
         }
-      continue;
       }
+      continue;
+    }
 
     // read the value
     vtkDICOMValue v;
     size_t rl = 0;
     if (vr == vtkDICOMVR::UN && !this->ImplicitVR)
-      {
+    {
       // if it was explicitly labeled 'UN' then check dictionary
       vr = this->Context->FindDictVR(tag);
+      this->LastVR = vr; // save true VR, rather than recorded VR
       rl = this->ImplicitLE->ReadElementValue(cp, ep, vr, vl, v);
-      }
+    }
     else
-      {
+    {
       rl = this->ReadElementValue(cp, ep, vr, vl, v);
-      }
+    }
 
     // was it a short read?
     if (rl < static_cast<size_t>(vl) && vl != HxFFFFFFFF)
-      {
+    {
       size_t dl = static_cast<size_t>(vl) - rl;
       // is the difference small, and not due to buffer underrun?
       if (dl <= 8 && this->CheckBuffer(cp, ep, dl))
-        {
+      {
         // treat the difference as if it is padding
         cp += dl;
         rl = vl;
-        }
+      }
       else
-        {
+      {
         return false;
-        }
       }
+    }
 
     tl += rl;
 
     // store the value
     if (this->Item)
-      {
+    {
       this->Item->SetAttributeValue(tag, v);
-      }
+    }
     else if (this->Index < 0)
-      {
+    {
       this->MetaData->SetAttributeValue(tag, v);
-      }
+    }
     else
-      {
+    {
       this->MetaData->SetAttributeValue(this->Index, tag, v);
       this->HandleMissingAttributes(tag);
-      }
+    }
 
     /*
     cout << tag << " " << vr << " " << vl << " " << v;
@@ -1521,16 +1526,16 @@ bool Decoder<E>::ReadElements(
 
     // check if the value matches the query
     if (this->HasQuery && !this->QueryMatches(v))
-      {
+    {
       this->QueryMatched = false;
-      }
     }
+  }
 
   // if reading by group, advance the query to the next group
   if (readGroup && this->HasQuery && this->QueryMatched)
-    {
+  {
     this->AdvanceQueryIterator(vtkDICOMTag(group+1, 0x0000));
-    }
+  }
 
   bytesRead += tl;
 
@@ -1544,7 +1549,7 @@ bool Decoder<E>::SkipElements(
   unsigned int l, vtkDICOMTag delimiter, vtkDICOMValue *v)
 {
   if (l == HxFFFFFFFF)
-    {
+  {
     // save the current buffer position
     const unsigned char *sp = cp;
 
@@ -1554,7 +1559,7 @@ bool Decoder<E>::SkipElements(
 
     // skip until delimiter found
     for (;;)
-      {
+    {
       if (!this->CheckBuffer(cp, ep, 8, v, sp)) { return false; }
       unsigned short g = Decoder<E>::GetInt16(cp);
       unsigned short e = Decoder<E>::GetInt16(cp + 2);
@@ -1563,50 +1568,14 @@ bool Decoder<E>::SkipElements(
       if (readGroup && group != g) { break; }
 
       cp += 4;
-      size_t tl = 8;
+      vtkDICOMTag tag(g, e);
       unsigned int vl = 0;
       vtkDICOMVR vr;
 
-      // sequence and item delimiters are always decoded as implicit
-      if (g == HxFFFE || this->ImplicitVR)
-        {
-        vl = Decoder<E>::GetInt32(cp);
-        // ignore vl in group length tags, it is corrupt in some files
-        // and we know that it should always have a value of "4".
-        if (e == 0x0000) { vl = 4; }
-        cp += 4;
-        }
-      else
-        {
-        // explicit VR
-        bool implicit = false;
-        vr = vtkDICOMVR(cp);
-        vl = Decoder<E>::GetInt16(cp + 2);
-        cp += 4;
-        if (!vr.IsValid())
-          {
-          // invalid vr, try to get VR from dictionary instead
-          vr = this->Context->FindDictVR(vtkDICOMTag(g,e));
-          // check that vr was composed of reasonable chars
-          if (cp[-4] <= 0x20 || cp[-4] >= 0x7f ||
-              cp[-3] <= 0x20 || cp[-3] >= 0x7f)
-            {
-            // assume an implicitly coded element slipped into the data
-            implicit = true;
-            vl = Decoder<E>::GetInt32(cp - 4);
-            }
-          }
-        if (!implicit && vr.HasLongVL())
-          {
-          if (!this->CheckBuffer(cp, ep, 4, v, sp)) { return false; }
-          vl = Decoder<E>::GetInt32(cp);
-          cp += 4;
-          tl += 4;
-          }
-        }
+      if (this->ReadElementHead(cp, ep, tag, vr, vl) == 0) { return false; }
 
       // save this as the most recent tag
-      this->LastTag = vtkDICOMTag(g, e);
+      this->LastTag = tag;
       this->LastVR = vr;
       this->LastVL = vl;
 
@@ -1614,7 +1583,7 @@ bool Decoder<E>::SkipElements(
       if (!readGroup && this->LastTag == delimiter) { break; }
 
       if (vl == HxFFFFFFFF)
-        {
+      {
         // copy data up to current buffer position
         this->CopyBuffer(v, sp, cp);
         sp = cp;
@@ -1622,32 +1591,32 @@ bool Decoder<E>::SkipElements(
         // use sequence delimiter
         vtkDICOMTag newdelim(HxFFFE, HxE0DD);
         if (g == HxFFFE && e == HxE000)
-          {
+        {
           // use item delimiter
           newdelim = vtkDICOMTag(HxFFFE, HxE00D);
-          }
+        }
         // skip internal segment until new delimiter found
         if (vr != vtkDICOMVR::UN)
-          {
+        {
           if (!this->SkipElements(cp, ep, vl, newdelim, v))
-            {
+          {
             return false;
-            }
           }
+        }
         // if VR is explicit UN, sequence is implicit LE
         // (see DICOM Part 5, Section 6.2.2)
         else if (!this->ImplicitLE->SkipElements(
                    cp, ep, vl, newdelim, v))
-          {
+        {
           return false;
-          }
-        sp = cp;
         }
+        sp = cp;
+      }
       else
-        {
+      {
         // fixed length element (vl != 0xffffffff)
         if (v != 0 && static_cast<size_t>(vl) > static_cast<size_t>(ep - cp))
-          {
+        {
           // if vl is larger than number of bytes left in buffer,
           // then copy data from save point "sp" up to "cp" into v,
           // and read the value into "v".
@@ -1655,41 +1624,41 @@ bool Decoder<E>::SkipElements(
           size_t n = v->GetNumberOfValues();
           unsigned char *ptr = v->ReallocateUnsignedCharData(n + vl + m) + n;
           if (m) { do { *ptr++ = *sp++; } while (--m); }
-          tl = this->ReadData(cp, ep, ptr, vl);
+          size_t tl = this->ReadData(cp, ep, ptr, vl);
           sp = cp;
           if (tl != static_cast<size_t>(vl)) { return false; }
-          }
+        }
         else
-          {
-          tl = this->SkipData(cp, ep, vl);
+        {
+          size_t tl = this->SkipData(cp, ep, vl);
           if (tl != static_cast<size_t>(vl)) { return false; }
-          }
         }
       }
+    }
 
     // the for(;;) loop is done, copy data from the save point sp
     // up to current position cp into the value v
     this->CopyBuffer(v, sp, cp);
-    }
+  }
   else if (l != 0) // l != 0xffffffff
-    {
+  {
     // skipped a fixed number of bytes
     size_t tl;
     if (v != 0)
-      {
+    {
       // read bytes into the value "v"
       size_t n = v->GetNumberOfValues();
       unsigned char *ptr = v->ReallocateUnsignedCharData(n + l) + n;
       tl = this->ReadData(cp, ep, ptr, l);
       if (tl != static_cast<size_t>(l)) { return false; }
-      }
+    }
     else
-      {
+    {
       // simply skip "l" bytes
       tl = this->SkipData(cp, ep, l);
       if (tl != static_cast<size_t>(l)) { return false; }
-      }
     }
+  }
 
   return true;
 }
@@ -1727,45 +1696,45 @@ vtkDICOMParser::~vtkDICOMParser()
   delete this->QueryItem;
 
   if (this->MetaData)
-    {
+  {
     this->MetaData->Delete();
-    }
+  }
   if (this->Query)
-    {
+  {
     this->Query->Delete();
-    }
+  }
   if (this->Groups)
-    {
+  {
     this->Groups->Delete();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMParser::SetQueryItem(const vtkDICOMItem& query)
 {
   if (this->Query)
-    {
+  {
     this->Query->Delete();
     this->Query = 0;
-    }
+  }
   delete this->QueryItem;
   this->QueryItem = 0;
   if (query.GetNumberOfDataElements() > 0)
-    {
+  {
     this->QueryItem = new vtkDICOMItem(query);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMParser::SetBufferSize(int size)
 {
   if (this->BufferSize != size)
-    {
+  {
     if (size < 256) { size = 256; }
     if (size > (2147483647 - 8)) { size = (2147483647 - 8); }
     this->BufferSize = size;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1778,15 +1747,15 @@ void vtkDICOMParser::Update()
   if (this->MetaData &&
       this->MetaData->GetNumberOfDataElements() > 0 &&
       this->MetaData->GetNumberOfInstances() > 1)
-    {
+  {
     idx = this->Index;
-    }
+  }
 
   this->ReadFile(this->MetaData, idx);
   if (this->MetaData)
-    {
+  {
     this->MetaData->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1800,29 +1769,29 @@ bool vtkDICOMParser::ReadFile(vtkDICOMMetaData *data, int idx)
 
   // Check that the file name has been set.
   if (!this->FileName)
-    {
+  {
     this->SetErrorCode(vtkErrorCode::NoFileNameError);
     vtkErrorMacro("ReadFile: No file name has been set");
     return false;
-    }
+  }
 
   // Make sure that the file is readable.
   vtkDICOMFile infile(this->FileName, vtkDICOMFile::In);
   if (infile.GetError())
-    {
+  {
     this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
     const char *errText = "Can't open the file ";
     if (infile.GetError() == vtkDICOMFile::AccessDenied)
-      {
+    {
       errText = "No permission to read the file ";
-      }
-    else if (infile.GetError() == vtkDICOMFile::IsDirectory)
-      {
+    }
+    else if (infile.GetError() == vtkDICOMFile::FileIsDirectory)
+    {
       errText = "The selected file is a directory ";
-      }
+    }
     vtkErrorMacro("ReadFile: " << errText << this->FileName);
     return false;
-    }
+  }
 
   this->InputFile = &infile;
   this->FileSize = infile.GetSize();
@@ -1837,16 +1806,16 @@ bool vtkDICOMParser::ReadFile(vtkDICOMMetaData *data, int idx)
 
   if (ep - cp >= 132 &&
       cp[128] == 'D' && cp[129] == 'I' && cp[130] == 'C' && cp[131] == 'M')
-    {
+  {
     // DICM magic number at offset 128, where it belongs in DICOM
     cp += 132;
-    }
+  }
   else if (ep - cp >= 4 &&
            cp[0] == 'D' && cp[1] == 'I' && cp[2] == 'C' && cp[3] == 'M')
-    {
+  {
     // DICM magic number at beginning of file, where it doesn't belong
     cp += 4;
-    }
+  }
 
   this->ReadMetaHeader(cp, ep, data, idx);
   this->ReadMetaData(cp, ep, data, idx);
@@ -1865,10 +1834,10 @@ bool vtkDICOMParser::ReadMetaHeader(
 {
   bool tempMeta = false;
   if (meta == 0)
-    {
+  {
     meta = vtkDICOMMetaData::New();
     tempMeta = true;
-    }
+  }
 
   LittleEndianDecoder decoder(this, meta, idx);
 
@@ -1880,34 +1849,34 @@ bool vtkDICOMParser::ReadMetaHeader(
 
   // verify that this is the right tag
   if (g == 0x0002)
-    {
+  {
     // check for strange files with implicit VR meta header
     decoder.SetImplicitVR(!vr.IsValid());
 
     unsigned int l = HxFFFFFFFF;
     if (e == 0x0000 && vl == 4)
-      {
+    {
       // get length from tag 0x0002,0x0000
       l = Decoder<LE>::GetInt32(cp + 8) + 12;
-      }
+    }
 
     decoder.ReadElements(cp, ep, l, vtkDICOMTag(g,0));
 
     int i = (idx == -1 ? 0 : idx);
     this->TransferSyntax =
       meta->GetAttributeValue(i, DC::TransferSyntaxUID).AsString();
-    }
+  }
   else
-    {
+  {
     this->TransferSyntax = "";
-    }
+  }
 
   this->FileOffset = this->GetBytesProcessed(cp, ep);
 
   if (tempMeta)
-    {
+  {
     meta->Delete();
-    }
+  }
 
   return true;
 }
@@ -1924,131 +1893,131 @@ bool vtkDICOMParser::ReadMetaData(
 
   // make sure there is at least one data element
   if (ep - cp < 8)
-    {
+  {
     this->FillBuffer(cp, ep);
     if (ep - cp < 8)
-      {
+    {
       return false;
-      }
     }
+  }
 
   std::string &tsyntax = this->TransferSyntax;
   if (tsyntax == "") // try to guess the syntax
-    {
+  {
     if (!decoder->CheckBuffer(cp, ep, 8)) { return false; }
     if (cp[0] == 0x00 && cp[1] == 0x08)
-      {
+    {
       tsyntax = "1.2.840.10008.1.2.2";
       decoder = &decoderBE;
-      }
-    decoder->SetImplicitVR(!vtkDICOMVR(cp + 4).IsValid());
     }
+    decoder->SetImplicitVR(!vtkDICOMVR(cp + 4).IsValid());
+  }
   else if (tsyntax == "1.2.840.10008.1.2" ||  // Implicit LE
            tsyntax == "1.2.840.10008.1.20" || // Papyrus Implicit LE
            tsyntax == "1.2.840.113619.5.2")   // GE Implicit LE
-    {
+  {
     decoder->SetImplicitVR(true);
-    }
+  }
   else if (tsyntax == "1.2.840.10008.1.2.2") // Explicit BE
-    {
+  {
     decoder = &decoderBE;
-    }
+  }
 
   // get the Query
   vtkDICOMDataElementIterator iter;
   vtkDICOMDataElementIterator iterEnd;
   bool hasQuery = false;
   if (this->Query)
-    {
+  {
     hasQuery = true;
     iter = this->Query->Begin();
     iterEnd = this->Query->End();
-    }
+  }
   else if (this->QueryItem)
-    {
+  {
     hasQuery = true;
     iter = this->QueryItem->Begin();
     iterEnd = this->QueryItem->End();
-    }
+  }
 
   if (hasQuery)
-    {
+  {
     // skip any elements in groups less than 0002
     while (iter != iterEnd && iter->GetTag().GetGroup() < 0x0002)
-      {
+    {
       ++iter;
-      }
+    }
 
     if (iter->GetTag() == vtkDICOMTag(0x0002,0x0000))
-      {
+    {
       // if FileMetaInformationGroupLength is set, assume that the
       // query was read from a file and that we don't actually want
       // to query the meta header
       while (iter != iterEnd && iter->GetTag().GetGroup() <= 0x0002)
-        {
+      {
         ++iter;
-        }
       }
+    }
     else
-      {
+    {
       // check the query against the meta header, which was already read
       bool matched = true;
       vtkDICOMDataElementIterator metaIter = meta->Begin();
       vtkDICOMDataElementIterator metaEnd = meta->End();
       while (metaIter != metaEnd && iter != iterEnd &&
              iter->GetTag().GetGroup() <= 0x0002)
-        {
+      {
         if (metaIter->GetTag() == iter->GetTag())
-          {
+        {
           matched &= metaIter->GetValue(this->Index).Matches(iter->GetValue());
           ++iter;
           ++metaIter;
-          }
+        }
         else if (metaIter->GetTag() < iter->GetTag())
-          {
+        {
           ++metaIter;
-          }
+        }
         else
-          {
+        {
           // this is a mismatch unless the query key is for universal matching
           vtkDICOMValue nullValue;
           matched &= nullValue.Matches(iter->GetValue());
           ++iter;
-          }
         }
-      this->QueryMatched &= matched;
       }
+      this->QueryMatched &= matched;
+    }
 
     // set the query for the decoder so it can scan the rest of the file
     decoder->SetQuery(iter, iterEnd);
-    }
+  }
 
   // make a list of the groups of interest
   std::vector<unsigned short> groups;
   if (hasQuery)
-    {
+  {
     unsigned short lastg = 0;
     while (iter != iterEnd)
-      {
+    {
       unsigned short g = iter->GetTag().GetGroup();
       if (g > lastg)
-        {
+      {
         lastg = g;
         groups.push_back(g);
-        }
-      ++iter;
       }
+      ++iter;
     }
+  }
   else if (this->Groups)
-    {
+  {
     vtkIdType n = this->Groups->GetNumberOfTuples();
     for (vtkIdType i = 0; i < n; i++)
-      {
+    {
       groups.push_back(this->Groups->GetValue(i));
-      }
+    }
     std::sort(groups.begin(),groups.end());
     groups.erase(std::unique(groups.begin(),groups.end()), groups.end());
-    }
+  }
 
   // iterator for going through the groups to read
   std::vector<unsigned short>::iterator giter = groups.begin();
@@ -2060,7 +2029,7 @@ bool vtkDICOMParser::ReadMetaData(
   bool bailOnQueryFailure = (meta && meta->GetNumberOfInstances() == 1);
   while (!foundPixelData && !readFailure &&
          (!queryFailure || !bailOnQueryFailure))
-    {
+  {
     vtkDICOMTag tag = decoder->Peek(cp, ep);
 
     // if there is no data left to decode, then break
@@ -2069,13 +2038,13 @@ bool vtkDICOMParser::ReadMetaData(
     // do we want to read or skip this group?
     bool found = true;
     if (!groups.empty())
-      {
+    {
       while (giter != groups.end() && *giter < tag.GetGroup())
-        {
+      {
         ++giter;
-        }
-      found = (giter != groups.end() && *giter == tag.GetGroup());
       }
+      found = (giter != groups.end() && *giter == tag.GetGroup());
+    }
 
     // create a delimiter to read/skip only this group
     vtkDICOMTag delimiter(tag.GetGroup(), 0);
@@ -2083,30 +2052,30 @@ bool vtkDICOMParser::ReadMetaData(
     // check for PixelData group 0x7fe0, or obsolete 0x7fxx
     unsigned int l = HxFFFFFFFF;
     if ((tag.GetGroup() & 0xff01) == 0x7f00)
-      {
+    {
       if (tag.GetElement() == 0x0000)
-        {
+      {
         // have to read "group length" before pixel data
         l = 12;
-        }
+      }
       else
-        {
+      {
         // set delimiter to pixel data tag
         delimiter = tag;
         foundPixelData = true;
-        }
       }
+    }
 
     if (found && meta)
-      {
+    {
       readFailure = !decoder->ReadElements(cp, ep, l, delimiter);
       queryFailure = (hasQuery && !decoder->GetQueryMatched());
-      }
+    }
     else
-      {
+    {
       readFailure = !decoder->SkipElements(cp, ep, l, delimiter);
-      }
     }
+  }
 
   vtkDICOMTag lastTag = decoder->GetLastTag();
   this->FileOffset = this->GetBytesProcessed(cp, ep);
@@ -2116,24 +2085,35 @@ bool vtkDICOMParser::ReadMetaData(
   this->PixelDataVL = 0;
 
   if (meta && this->PixelDataFound)
-    {
+  {
     // the last tag read will be PixelData (or an equivalent), and we
     // want to add it as an empty attribute because we did not read its
     // value (the FileOffset was saved so it can be read later)
     unsigned short x = 0;
-    vtkDICOMValue v(decoder->GetLastVR(), &x, x);
+    vtkDICOMVR lastVR = decoder->GetLastVR();
+    if (!lastVR.IsValid())
+    {
+      lastVR = vtkDICOMVR::OW;
+      const vtkDICOMValue& ba =
+        meta->GetAttributeValue(idx, DC::BitsAllocated);
+      if (ba.IsValid() && ba.AsUnsignedInt() <= 8)
+      {
+        lastVR = vtkDICOMVR::OB;
+      }
+    }
+    vtkDICOMValue v(lastVR, &x, x);
     this->PixelDataVL = decoder->GetLastVL();
 
     if (idx >= 0)
-      {
+    {
       meta->SetAttributeValue(idx, lastTag, v);
       decoder->HandleMissingAttributes(lastTag);
-      }
+    }
     else
-      {
+    {
       meta->SetAttributeValue(lastTag, v);
-      }
     }
+  }
 
   return true;
 }
@@ -2149,26 +2129,26 @@ bool vtkDICOMParser::FillBuffer(
   // number of bytes to read
   size_t nbytes = this->ChunkSize;
   if (n != 0)
-    {
+  {
     // make sure read will not overflow the buffer
     if (n > 8)
-      {
+    {
       nbytes -= (n - 8);
-      }
+    }
     // recycle unused buffer chars to head of buffer
     do { *dp++ = *cp++; } while (--n);
-    }
+  }
   else if (this->InputFile->GetError())
-    {
+  {
     this->SetErrorCode(vtkErrorCode::UnknownError);
     vtkErrorMacro("FillBuffer: error reading from file " << this->FileName);
     return false;
-    }
+  }
   else if (this->InputFile->EndOfFile())
-    {
+  {
     // if buffer is drained, and eof, then done
     return false;
-    }
+  }
 
   // read at most n bytes
   n = this->InputFile->Read(dp, nbytes);
diff --git a/Source/vtkDICOMParser.h b/Source/vtkDICOMParser.h
index 137beaf..74217f9 100644
--- a/Source/vtkDICOMParser.h
+++ b/Source/vtkDICOMParser.h
@@ -44,18 +44,25 @@ public:
   //! Print a summary of the contents of this object.
   void PrintSelf(ostream& os, vtkIndent indent);
 
+  //@{
   //! Set the file name.
   vtkSetStringMacro(FileName);
   vtkGetStringMacro(FileName);
+  //@}
 
+  //@{
   //! Set the metadata object for storing the data elements.
   void SetMetaData(vtkDICOMMetaData *);
   vtkDICOMMetaData *GetMetaData() { return this->MetaData; }
+  //@}
 
+  //@{
   //! Set the instance index to use when storing metadata.
   vtkSetMacro(Index, int);
   int GetIndex() { return this->Index; }
+  //@}
 
+  //@{
   //! Set a query. Only matching data will be retrieved.
   /*!
    *  This can be used to scan a file for data that matches a given
@@ -64,7 +71,9 @@ public:
    */
   void SetQuery(vtkDICOMMetaData *query);
   vtkDICOMMetaData *GetQuery() { return this->Query; }
+  //@}
 
+  //@{
   //! Set a query, using an item instead of vtkDICOMMetaData.
   /*!
    *  This can be used to scan a file for data that matches a given
@@ -73,14 +82,18 @@ public:
    *  empty item.
    */
   void SetQueryItem(const vtkDICOMItem& query);
+  //@}
 
+  //@{
   //! Set specific metadata groups to read (obsolete).
   /*!
    *  This method is obsolete, the SetQuery() method should be used instead.
    */
   void SetGroups(vtkUnsignedShortArray *groups);
   vtkUnsignedShortArray *GetGroups() { return this->Groups; }
+  //@}
 
+  //@{
   //! This is true only if the file matched the query.
   bool GetQueryMatched() { return this->QueryMatched; }
 
@@ -89,7 +102,9 @@ public:
 
   //! Get the VL for the PixelData, will be 0xffffffff if compressed.
   unsigned int GetPixelDataVL() { return this->PixelDataVL; }
+  //@}
 
+  //@{
   //! Get the byte offset to the end of the metadata.
   /*!
    *  After the metadata has been read, the file offset
@@ -100,6 +115,7 @@ public:
   //! Get the total file length (only valid after Update).
   vtkTypeInt64 GetFileSize() { return this->FileSize; }
 
+  //@{
   //! Set the buffer size, the default is 8192 (8k).
   /*!
    *  A larger buffer size results in fewer IO calls.  The
@@ -107,12 +123,15 @@ public:
    */
   void SetBufferSize(int size);
   int GetBufferSize() { return this->BufferSize; }
+  //@}
 
+  //@{
   //! Read the metadata from the file.
   virtual void Update();
 
   //! Get the error code.
   unsigned long GetErrorCode() { return this->ErrorCode; }
+  //@}
 
 protected:
   vtkDICOMParser();
@@ -183,8 +202,8 @@ protected:
   friend class vtkDICOMParserInternalFriendship;
 
 private:
-  vtkDICOMParser(const vtkDICOMParser&);  // Not implemented.
-  void operator=(const vtkDICOMParser&);  // Not implemented.
+  vtkDICOMParser(const vtkDICOMParser&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMParser&) VTK_DELETE_FUNCTION;
 };
 
 #endif /* vtkDICOMParser_h */
diff --git a/Source/vtkDICOMReader.cxx b/Source/vtkDICOMReader.cxx
index 9a6f965..6124cd6 100644
--- a/Source/vtkDICOMReader.cxx
+++ b/Source/vtkDICOMReader.cxx
@@ -62,19 +62,25 @@
 #include "gdcmImageReader.h"
 #endif
 
-#include "vtksys/SystemTools.hxx"
-
 #include <algorithm>
 #include <stdio.h>
 #include <math.h>
 #include <stdlib.h>
 
+// For compatibility with new VTK generic data arrays
+#ifdef vtkGenericDataArray_h
+#define SetTupleValue SetTypedTuple
+#define GetTupleValue GetTypedTuple
+#endif
+
 vtkStandardNewMacro(vtkDICOMReader);
 vtkCxxSetObjectMacro(vtkDICOMReader,Sorter,vtkDICOMSliceSorter);
 
 //----------------------------------------------------------------------------
 vtkDICOMReader::vtkDICOMReader()
 {
+  this->AutoYBRToRGB = 1;
+  this->NeedsYBRToRGB = 0;
   this->AutoRescale = 1;
   this->NeedsRescale = 0;
   this->RescaleSlope = 1.0;
@@ -126,41 +132,41 @@ vtkDICOMReader::~vtkDICOMReader()
 #endif
 
   if (this->Parser)
-    {
+  {
     this->Parser->Delete();
-    }
+  }
   if (this->Sorter)
-    {
+  {
     this->Sorter->Delete();
-    }
+  }
   if (this->FileOffsetArray)
-    {
+  {
     this->FileOffsetArray->Delete();
-    }
+  }
   if (this->FileIndexArray)
-    {
+  {
     this->FileIndexArray->Delete();
-    }
+  }
   if (this->FrameIndexArray)
-    {
+  {
     this->FrameIndexArray->Delete();
-    }
+  }
   if (this->StackIDs)
-    {
+  {
     this->StackIDs->Delete();
-    }
+  }
   if (this->MetaData)
-    {
+  {
     this->MetaData->Delete();
-    }
+  }
   if (this->PatientMatrix)
-    {
+  {
     this->PatientMatrix->Delete();
-    }
+  }
   if (this->MedicalImageProperties)
-    {
+  {
     this->MedicalImageProperties->Delete();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -170,33 +176,33 @@ void vtkDICOMReader::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "MetaData: ";
   if (this->MetaData)
-    {
+  {
     os << this->MetaData << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
 
   os << indent << "MedicalImageProperties: ";
   if (this->MedicalImageProperties)
-    {
+  {
     os << this->MedicalImageProperties << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
 
   os << indent << "Sorter: ";
   if (this->Sorter)
-    {
+  {
     os << this->Sorter << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
 
   os << indent << "DesiredStackID: "
      << (*this->DesiredStackID ? "(empty)" : this->DesiredStackID) << "\n";
@@ -219,19 +225,19 @@ void vtkDICOMReader::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "PatientMatrix:";
   if (this->PatientMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "MemoryRowOrder: "
      << this->GetMemoryRowOrderAsString() << "\n";
@@ -241,17 +247,17 @@ void vtkDICOMReader::PrintSelf(ostream& os, vtkIndent indent)
 void vtkDICOMReader::SetDesiredStackID(const char *stackId)
 {
   if (stackId == 0)
-    {
+  {
     stackId = "";
-    }
+  }
 
   // the maximum length of a stackId is 16
   if (strncmp(this->DesiredStackID, stackId, 16) != 0)
-    {
+  {
     strncpy(this->DesiredStackID, stackId, 16);
     this->DesiredStackID[17] = '\0';
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -281,13 +287,13 @@ void vtkDICOMErrorSilencer::Execute(vtkObject *, unsigned long, void *)
 void vtkDICOMReader::SetMemoryRowOrder(int order)
 {
   if (order >= 0 && order <= vtkDICOMReader::BottomUp)
-    {
+  {
     if (order != this->MemoryRowOrder)
-      {
+    {
       this->MemoryRowOrder = order;
       this->Modified();
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -295,7 +301,7 @@ const char *vtkDICOMReader::GetMemoryRowOrderAsString()
 {
   const char *text = "";
   switch (this->MemoryRowOrder)
-    {
+  {
     case vtkDICOMReader::FileNative:
       text = "FileNative";
       break;
@@ -305,7 +311,7 @@ const char *vtkDICOMReader::GetMemoryRowOrderAsString()
     case vtkDICOMReader::BottomUp:
       text = "BottomUp";
       break;
-    }
+  }
 
   return text;
 }
@@ -391,16 +397,16 @@ void vtkDICOMReader::NoSortFiles(vtkIntArray *files, vtkIntArray *frames)
   frames->SetNumberOfComponents(1);
 
   for (int i = 0; i < numFiles; i++)
-    {
+  {
     int numFrames = meta->GetAttributeValue(i, DC::NumberOfFrames).AsInt();
     numFrames = (numFrames > 0 ? numFrames : 1);
 
     for (int j = 0; j < numFrames; j++)
-      {
+    {
       files->InsertNextValue(i);
       frames->InsertNextValue(j);
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -417,25 +423,25 @@ bool vtkDICOMReader::ValidateStructure(
   vtkIdType numSlices = fileArray->GetNumberOfTuples();
   if (numSlices != frameArray->GetNumberOfTuples() ||
       numComponents != fileArray->GetNumberOfComponents())
-    {
+  {
     this->SetErrorCode(vtkErrorCode::FileFormatError);
     vtkErrorMacro("Critical failure in file sorting!");
     return false;
-    }
+  }
 
   for (vtkIdType i = 0; i < numSlices; i++)
-    {
+  {
     for (int j = 0; j < numComponents; j++)
-      {
+    {
       int fileIndex = fileArray->GetComponent(i, j);
       int frameIndex = frameArray->GetComponent(i, j);
 
       if (fileIndex < 0 || fileIndex >= numFiles)
-        {
+      {
         this->SetErrorCode(vtkErrorCode::FileFormatError);
         vtkErrorMacro("File index " << fileIndex << " is out of range!");
         return false;
-        }
+      }
 
       usedFiles[fileIndex]++;
 
@@ -444,13 +450,13 @@ bool vtkDICOMReader::ValidateStructure(
       numFrames = (numFrames == 0 ? 1 : numFrames);
 
       if (frameIndex < 0 || frameIndex >= numFrames)
-        {
+      {
         this->SetErrorCode(vtkErrorCode::FileFormatError);
         vtkErrorMacro("Frame index " << frameIndex << " is out of range!");
         return false;
-        }
       }
     }
+  }
 
   // The reader requires the following mandatory attributes
   static const DC::EnumType imagePixelAttribs[] = {
@@ -464,65 +470,65 @@ bool vtkDICOMReader::ValidateStructure(
   for (const DC::EnumType *tags = imagePixelAttribs;
        *tags != DC::ItemDelimitationItem;
        tags++)
-    {
+  {
     int firstValue = 0;
 
     for (int fileIndex = 0; fileIndex < numFiles; fileIndex++)
-      {
+    {
       if (usedFiles[fileIndex] == 0) { continue; }
 
       const char *errorText = 0;
       vtkDICOMValue v = meta->GetAttributeValue(fileIndex, *tags);
       int i = 1;
       if (v.IsValid())
-        {
+      {
         i = v.AsInt();
-        }
+      }
       else if (*tags != DC::SamplesPerPixel)
-        {
+      {
         // Some ACR-NEMA files do not contain SamplesPerPixel, all
         // other tags must be present
         errorText = "Missing pixel info ";
-        }
+      }
 
       if (firstValue == 0)
-        {
+      {
         firstValue = i;
-        }
+      }
       else if (firstValue != i)
-        {
+      {
         errorText = "Inconsistent pixel info ";
-        }
+      }
 
       if (i <= 0 ||
           (*tags == DC::BitsAllocated &&
            i != 1 && i != 8 && i != 12 && i != 16 && i != 32 && i != 64))
-        {
+      {
         errorText = "Illegal value ";
-        }
+      }
 
       if (errorText)
-        {
+      {
         this->ComputeInternalFileName(this->DataExtent[4] + fileIndex);
         this->Parser->SetFileName(this->InternalFileName);
         vtkDICOMDictEntry de = meta->FindDictEntry(*tags);
         this->SetErrorCode(vtkErrorCode::FileFormatError);
         if (v.IsValid())
-          {
+        {
           vtkErrorMacro(<< errorText << i << " for " << de.GetTag()
                         << " \"" << de.GetName() << "\" in "
                         << this->InternalFileName);
-          }
+        }
         else
-          {
+        {
           vtkErrorMacro(<< errorText << "for " << de.GetTag()
                         << " \"" << de.GetName() << "\" in"
                         << this->InternalFileName);
-          }
-        return false;
         }
+        return false;
       }
     }
+  }
 
   return true;
 }
@@ -538,35 +544,35 @@ int vtkDICOMReader::RequestInformation(
 
   // How many files are to be loaded?
   if (this->FileNames)
-    {
+  {
     vtkIdType numFileNames = this->FileNames->GetNumberOfValues();
     this->DataExtent[4] = 0;
     this->DataExtent[5] = static_cast<int>(numFileNames - 1);
-    }
+  }
   else if (this->FileName)
-    {
+  {
     this->DataExtent[4] = 0;
     this->DataExtent[5] = 0;
-    }
+  }
   int numFiles = this->DataExtent[5] - this->DataExtent[4] + 1;
 
   if (numFiles <= 0)
-    {
+  {
     this->SetErrorCode(vtkErrorCode::FileFormatError);
     if (this->FileNames)
-      {
+    {
       vtkErrorMacro("No filenames were provided for reader.");
-      }
+    }
     else
-      {
+    {
       vtkErrorMacro("Bad DataExtent " << this->DataExtent[4]
                     << "," << this->DataExtent[5] << ".");
-      }
+    }
 
     // Reset the data extent to legal values
     this->DataExtent[4] = 0;
     this->DataExtent[5] = 0;
-    }
+  }
 
   // Reset the time information
   this->TimeDimension = 0;
@@ -575,15 +581,15 @@ int vtkDICOMReader::RequestInformation(
   // Clear the meta data, prepare the parser.
   this->MetaData->Initialize();
   if (numFiles > 0)
-    {
+  {
     this->MetaData->SetNumberOfInstances(numFiles);
-    }
+  }
 
   if (this->Parser)
-    {
+  {
     this->Parser->Delete();
     this->FileOffsetArray->Delete();
-    }
+  }
 
   // Parser reads just the meta data, not the pixel data.
   this->Parser = vtkDICOMParser::New();
@@ -597,49 +603,49 @@ int vtkDICOMReader::RequestInformation(
   this->FileOffsetArray->SetNumberOfTuples(numFiles);
 
   for (int idx = 0; idx < numFiles; idx++)
-    {
+  {
     this->ComputeInternalFileName(this->DataExtent[4] + idx);
     this->Parser->SetFileName(this->InternalFileName);
     this->Parser->SetIndex(idx);
     this->Parser->Update();
 
     if (this->Parser->GetErrorCode())
-      {
+    {
       break;
-      }
+    }
 
     // save the offset to the pixel data
     vtkTypeInt64 offset[2];
     offset[0] = this->Parser->GetFileOffset();
     offset[1] = this->Parser->GetFileSize();
     this->FileOffsetArray->SetTupleValue(idx, offset);
-    }
+  }
 
   // Files are read in the order provided, but they might have
   // to be re-sorted to create a proper volume.  The FileIndexArray
   // holds the sorted order of the files.
   this->StackIDs->Initialize();
   if (this->GetErrorCode() == vtkErrorCode::NoError)
-    {
+  {
     if (this->Sorting && this->Sorter)
-      {
+    {
       this->SortFiles(this->FileIndexArray, this->FrameIndexArray);
-      }
+    }
     else
-      {
+    {
       this->NoSortFiles(this->FileIndexArray, this->FrameIndexArray);
-      }
+    }
 
     // Verify the consistency of the data, e.g. verify that the dimensions
     // and data type are the same for all files.
     this->ValidateStructure(this->FileIndexArray, this->FrameIndexArray);
-    }
+  }
 
   if (this->GetErrorCode() != vtkErrorCode::NoError)
-    {
+  {
     // Last chance to bail out
     return false;
-    }
+  }
 
   // Set the indexing arrays for the meta data
   this->MetaData->SetFileIndexArray(this->FileIndexArray);
@@ -676,9 +682,9 @@ int vtkDICOMReader::RequestInformation(
   // (the DataExtent gives the number of files)
   this->FileDimensionality = 2;
   if (slices > this->DataExtent[5] - this->DataExtent[4] + 1)
-    {
+  {
     this->FileDimensionality = 3;
-    }
+  }
 
   // DICOM uses a upper-left origin
   this->FileLowerLeft = 0;
@@ -692,39 +698,39 @@ int vtkDICOMReader::RequestInformation(
   vtkDICOMValue pixelAspectRatio = this->MetaData->GetAttributeValue(
     fileIndex, frameIndex, DC::PixelAspectRatio);
   if (pixelAspectRatio.GetNumberOfValues() == 2)
-    {
+  {
     // use double, even though data is stored as integer strings
     double ya = pixelAspectRatio.GetDouble(0);
     double xa = pixelAspectRatio.GetDouble(1);
     if (xa > 0)
-      {
+    {
       ratio = ya/xa;
-      }
     }
+  }
   else if (pixelAspectRatio.GetNumberOfValues() == 1)
-    {
+  {
     // ratio should be expressed as two values,
     // so this is only to support incorrect files
     ratio = pixelAspectRatio.AsDouble();
-    }
+  }
   if (ratio > 0)
-    {
+  {
     this->DataSpacing[0] = this->DataSpacing[1]/ratio;
-    }
+  }
 
   // Set spacing from PixelSpacing
   vtkDICOMValue pixelSpacing = this->MetaData->GetAttributeValue(
     fileIndex, frameIndex, DC::PixelSpacing);
   if (pixelSpacing.GetNumberOfValues() == 2)
-    {
+  {
     double spacing[2];
     pixelSpacing.GetValues(spacing, 2);
     if (spacing[0] > 0 && spacing[1] > 0)
-      {
+    {
       this->DataSpacing[0] = spacing[0];
       this->DataSpacing[1] = spacing[1];
-      }
     }
+  }
 
   // offset is part of the transform, so set origin to zero
   this->DataOrigin[0] = 0.0;
@@ -745,43 +751,43 @@ int vtkDICOMReader::RequestInformation(
   int scalarType = 0;
 
   if (bitsAllocated <= 8)
-    {
+  {
     scalarType = (pixelRepresentation ? VTK_SIGNED_CHAR : VTK_UNSIGNED_CHAR);
-    }
+  }
   else if (bitsAllocated <= 16)
-    {
+  {
     scalarType = (pixelRepresentation ? VTK_SHORT : VTK_UNSIGNED_SHORT);
-    }
+  }
   else if (bitsAllocated <= 32)
-    {
+  {
     if (this->MetaData->GetAttributeValue(
           fileIndex, DC::FloatPixelData).IsValid())
-      {
+    {
       scalarType = VTK_FLOAT;
-      }
+    }
     else
-      {
+    {
       scalarType = (pixelRepresentation ? VTK_INT : VTK_UNSIGNED_INT);
-      }
     }
+  }
   else if (bitsAllocated <= 64)
-    {
+  {
     if (this->MetaData->GetAttributeValue(
           fileIndex, DC::DoubleFloatPixelData).IsValid())
-      {
+    {
       scalarType = VTK_DOUBLE;
-      }
+    }
     else
-      {
+    {
       scalarType = (pixelRepresentation ? VTK_TYPE_INT64: VTK_TYPE_UINT64);
-      }
     }
+  }
 
   // number of components
   if (numComponents <= 0)
-    {
+  {
     numComponents = 1;
-    }
+  }
 
   this->DataScalarType = scalarType;
   this->NumberOfPackedComponents =
@@ -793,7 +799,7 @@ int vtkDICOMReader::RequestInformation(
 
   // photometric interpretation
   // "MONOCHROME1" "MONOCHROME2"
-  // "PALETTE_COLOR" "RGB" (convert palette color to RGB)
+  // "PALETTE COLOR" "RGB" (convert palette color to RGB)
   // "HSV" "ARGB" "CMYK" (all three are retired)
   // "YBR_FULL" "YBR_FULL_422" (use CCIR 601-2 to convert to RGB)
   // "YBR_PARTIAL_422" "YBR_PARTIAL_420" (use CCIR 601-2 to convert to RGB)
@@ -824,17 +830,17 @@ int vtkDICOMReader::RequestInformation(
         fileIndex, frameIndex, DC::RescaleSlope).IsValid() &&
       this->MetaData->GetAttributeValue(
         fileIndex, frameIndex, DC::RescaleIntercept).IsValid())
-    {
+  {
     bool mismatch = false;
     double mMax = VTK_DOUBLE_MIN;
     double bMax = VTK_DOUBLE_MIN;
 
     vtkIdType numSlices = this->FileIndexArray->GetNumberOfTuples();
     for (vtkIdType iSlice = 0; iSlice < numSlices; iSlice++)
-      {
+    {
       int numComp = this->FileIndexArray->GetNumberOfComponents();
       for (int iComp = 0; iComp < numComp; iComp++)
-        {
+      {
         int iFile = this->FileIndexArray->GetComponent(iSlice, iComp);
         int iFrame = this->FrameIndexArray->GetComponent(iSlice, iComp);
 
@@ -843,23 +849,23 @@ int vtkDICOMReader::RequestInformation(
         double b = this->MetaData->GetAttributeValue(
           iFile, iFrame, DC::RescaleIntercept).AsDouble();
         if ((iSlice != 0 || iComp != 0) && (m != mMax || b != bMax))
-          {
+        {
           mismatch = true;
-          }
+        }
         if (m > mMax)
-          {
+        {
           mMax = m;
-          }
+        }
         if (b > bMax)
-          {
+        {
           bMax = b;
-          }
         }
       }
+    }
     this->NeedsRescale = (mismatch && this->AutoRescale);
     this->RescaleSlope = mMax;
     this->RescaleIntercept = bMax;
-    }
+  }
 
   // === Image Orientation in DICOM files ===
   //
@@ -878,7 +884,7 @@ int vtkDICOMReader::RequestInformation(
 
   // go through the slices in reverse order, so we end on the first
   for (vtkIdType iSlice = numSlices-1; iSlice >= 0; --iSlice)
-    {
+  {
     int iFile = this->FileIndexArray->GetComponent(iSlice, 0);
     int iFrame = this->FrameIndexArray->GetComponent(iSlice, 0);
     vtkDICOMValue pv = this->MetaData->GetAttributeValue(
@@ -886,23 +892,23 @@ int vtkDICOMReader::RequestInformation(
     vtkDICOMValue ov = this->MetaData->GetAttributeValue(
       fileIndex, frameIndex, DC::ImageOrientationPatient);
     if (pv.GetNumberOfValues() == 3 && ov.GetNumberOfValues() == 6)
-      {
+    {
       pv.GetValues(point, 3);
       ov.GetValues(orient, 6);
       vtkMath::Cross(&orient[0], &orient[3], normal);
       if (vtkMath::Normalize(normal) < 1e-10)
-        {
+      {
         orient[0] = 1.0; orient[1] = 0.0; orient[2] = 0.0;
         orient[3] = 0.0; orient[4] = 1.0; orient[5] = 0.0;
         normal[0] = 0.0; normal[1] = 0.0; normal[2] = 1.0;
-        }
+      }
       // re-orthogonalize x vector (improve precision)
       vtkMath::Cross(&orient[3], normal, &orient[0]);
       vtkMath::Normalize(&orient[0]);
       vtkMath::Normalize(&orient[3]);
 
       if (this->MemoryRowOrder == vtkDICOMReader::BottomUp)
-        {
+      {
         // calculate position of point at lower left
         double yspacing = this->DataSpacing[1];
         point[0] = point[0] + orient[3]*yspacing*(rows - 1);
@@ -912,23 +918,23 @@ int vtkDICOMReader::RequestInformation(
         orient[3] = -orient[3];
         orient[4] = -orient[4];
         orient[5] = -orient[5];
-        }
+      }
 
       size_t ip = points.size();
       points.resize(ip + 3);
       for (int ii = 0; ii < 3; ii++)
-        {
+      {
         centroid[ii] += point[ii];
         points[ip+ii] = point[ii];
-        }
       }
     }
+  }
 
   // compute Z vector by fitting points to a line
   double vector[3] = { normal[0], normal[1], normal[2] };
   size_t nPoints = points.size()/3;
   if (nPoints > 0)
-    {
+  {
     centroid[0] /= nPoints;
     centroid[1] /= nPoints;
     centroid[2] /= nPoints;
@@ -938,27 +944,27 @@ int vtkDICOMReader::RequestInformation(
     double *A[3] = { &storage[0], &storage[3], &storage[6] };
     double *E[3] = { &storage[9], &storage[12], &storage[15] };
     for (size_t iPoint = 0; iPoint < nPoints; iPoint++)
-      {
+    {
       for (int ii = 0; ii < 3; ii++)
-        {
+      {
         for (int jj = 0; jj < 3; jj++)
-          {
+        {
           A[ii][jj] = ((points[3*iPoint + ii] - centroid[ii]) *
                        (points[3*iPoint + jj] - centroid[jj]));
-          }
         }
       }
+    }
     double eigenvalues[3];
     vtkMath::Jacobi(A, eigenvalues, E);
 
     // only use eigenvector if the points fit a line very precisely
     if (eigenvalues[1]*eigenvalues[1] + eigenvalues[2]*eigenvalues[2] <
         1e-6*eigenvalues[0]*eigenvalues[0])
-      {
+    {
       // create the vector, dot(vector,normal) should be unity
       double vdn = E[0][0]*normal[0] + E[1][0]*normal[1] + E[2][0]*normal[2];
       if (vdn > 0)
-        {
+      {
         vector[0] = E[0][0]/vdn;
         vector[1] = E[1][0]/vdn;
         vector[2] = E[2][0]/vdn;
@@ -967,14 +973,14 @@ int vtkDICOMReader::RequestInformation(
         double vcn[3];
         vtkMath::Cross(vector, normal, vcn);
         if (vtkMath::Norm(vcn) < 1e-4)
-          {
+        {
           // use normal (more precise) if they are the same
           vector[0] = normal[0];
           vector[1] = normal[1];
           vector[2] = normal[2];
-          }
         }
       }
+    }
 
     // build the patient matrix
     double pm[16];
@@ -984,17 +990,17 @@ int vtkDICOMReader::RequestInformation(
     pm[12] = 0.0; pm[13] = 0.0; pm[14] = 0.0; pm[15] = 1.0;
 
     this->PatientMatrix->DeepCopy(pm);
-    }
+  }
   else
-    {
+  {
     this->PatientMatrix->Identity();
-    }
+  }
 
   // Set the medical image properties
   if (this->MedicalImageProperties)
-    {
+  {
     this->UpdateMedicalImageProperties();
-    }
+  }
 
   // Set the output information.
   vtkInformation* outInfo = outputVector->GetInformationObject(0);
@@ -1023,24 +1029,24 @@ void vtkDICOMReaderRescaleBuffer(T *p, double m, double b, size_t bytecount)
 {
   size_t n = bytecount/sizeof(T);
   if (n > 0 && (m != 1.0 || b != 0.0))
-    {
+  {
     double minval = vtkTypeTraits<T>::Min();
     double maxval = vtkTypeTraits<T>::Max();
     do
-      {
+    {
       double val = (*p)*m + b;
       if (val < minval)
-        {
+      {
         val = minval;
-        }
+      }
       if (val > maxval)
-        {
+      {
         val = maxval;
-        }
-      *p++ = static_cast<T>(vtkMath::Round(val));
       }
-    while (--n);
+      *p++ = static_cast<T>(vtkMath::Round(val));
     }
+    while (--n);
+  }
 }
 
 } // end anonymous namespace
@@ -1067,44 +1073,128 @@ void vtkDICOMReader::RescaleBuffer(
     fileIdx, DC::PixelRepresentation).AsInt();
 
   if (bitsAllocated <= 8)
-    {
+  {
     if (pixelRep == 0)
-      {
+    {
       vtkDICOMReaderRescaleBuffer(
         static_cast<unsigned char *>(buffer), m, b, bufferSize);
-      }
+    }
     else
-      {
+    {
       vtkDICOMReaderRescaleBuffer(
         static_cast<signed char *>(buffer), m, b, bufferSize);
-      }
     }
+  }
   else if (bitsAllocated <= 16)
-    {
+  {
     if (pixelRep == 0)
-      {
+    {
       vtkDICOMReaderRescaleBuffer(
         static_cast<unsigned short *>(buffer), m, b, bufferSize);
-      }
+    }
     else
-      {
+    {
       vtkDICOMReaderRescaleBuffer(
         static_cast<short *>(buffer), m, b, bufferSize);
-      }
     }
+  }
   else if (bitsAllocated <= 32)
-    {
+  {
     if (pixelRep == 0)
-      {
+    {
       vtkDICOMReaderRescaleBuffer(
         static_cast<unsigned int *>(buffer), m, b, bufferSize);
-      }
+    }
     else
-      {
+    {
       vtkDICOMReaderRescaleBuffer(
         static_cast<int *>(buffer), m, b, bufferSize);
-      }
     }
+  }
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMReader::YBRToRGB(
+  int fileIdx, int, void *buffer, vtkIdType bufferSize)
+{
+  // digital luminance levels and color levels from Rec. 601
+  const int ylevels = 220;
+  const int clevels = 225;
+
+  // the digital black level from Rec. 601
+  double ymin = 16.0;
+
+  // the color constants from Rec. 601
+  const double Kb = 0.114;
+  const double Kr = 0.299;
+  double Kg = 1.0 - Kb - Kr;
+
+  // compute the matrix for YPbPr to RGB conversion
+  double matrix[3][3] = {
+    { 1.0,  0.0,                 2.0*(1.0-Kr)       },
+    { 1.0, -2.0*Kb*(1.0-Kb)/Kg, -2.0*Kr*(1.0-Kr)/Kg },
+    { 1.0,  2.0*(1.0-Kb),        0.0                }
+  };
+
+  // get information from the meta data
+  vtkDICOMMetaData *meta = this->MetaData;
+  const vtkDICOMValue& photometric = meta->GetAttributeValue(
+    fileIdx, DC::PhotometricInterpretation);
+  const vtkDICOMValue& transferSyntax = meta->GetAttributeValue(
+    fileIdx, DC::TransferSyntaxUID);
+
+  // catch JPEG baseline images with incorrect PhotometricInterpretation
+  if (transferSyntax.Matches("1.2.840.10008.1.2.4.50") ||
+      photometric.Matches("YBR_FULL*"))
+  {
+    // use full-range, therefore black level is zero
+    ymin = 0.0;
+  }
+  else if (photometric.Matches("YBR_PARTIAL*"))
+  {
+    // stretch the matrix so that full-range RGB is produced
+    for (int i = 0; i < 3; i++)
+    {
+      matrix[i][0] *= 255.0/(ylevels - 1);
+      matrix[i][1] *= 255.0/(clevels - 1);
+      matrix[i][2] *= 255.0/(clevels - 1);
+    }
+  }
+  else
+  {
+    // no YBR here, so exit!
+    return;
+  }
+
+  if (bufferSize >= 3)
+  {
+    unsigned char *cp = static_cast<unsigned char *>(buffer);
+    vtkIdType n = bufferSize/3;
+    double ybr[3];
+    double rgb[3];
+    do
+    {
+      ybr[0] = cp[0] - ymin;
+      ybr[1] = cp[1] - 128.0;
+      ybr[2] = cp[2] - 128.0;
+
+      vtkMath::Multiply3x3(matrix, ybr, rgb);
+
+      rgb[0] = (rgb[0] >= 0.0 ? rgb[0] : 0.0);
+      rgb[0] = (rgb[0] <= 255.0 ? rgb[0] : 255.0);
+      rgb[1] = (rgb[1] >= 0.0 ? rgb[1] : 0.0);
+      rgb[1] = (rgb[1] <= 255.0 ? rgb[1] : 255.0);
+      rgb[2] = (rgb[2] >= 0.0 ? rgb[2] : 0.0);
+      rgb[2] = (rgb[2] <= 255.0 ? rgb[2] : 255.0);
+
+      cp[0] = static_cast<unsigned char>(vtkMath::Floor(rgb[0] + 0.5));
+      cp[1] = static_cast<unsigned char>(vtkMath::Floor(rgb[1] + 0.5));
+      cp[2] = static_cast<unsigned char>(vtkMath::Floor(rgb[2] + 0.5));
+
+      cp += 3;
+    }
+    while (--n);
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1112,13 +1202,13 @@ void vtkDICOMReader::UnpackBits(
   const void *filePtr, void *buffer, vtkIdType bufferSize, int bits)
 {
   if (bits == 12)
-    {
+  {
     const unsigned char *readPtr =
       static_cast<const unsigned char *>(filePtr);
     unsigned char *writePtr =
       static_cast<unsigned char *>(buffer);
     for (vtkIdType n = bufferSize/2; n > 0; n -= 2)
-      {
+    {
       unsigned int a1 = readPtr[0];
       unsigned int a2 = readPtr[1];
       unsigned int b1 = (a1 << 4) | (a2 & 0x0f);
@@ -1134,36 +1224,36 @@ void vtkDICOMReader::UnpackBits(
 
       readPtr += 3;
       writePtr += 4;
-      }
     }
+  }
   else if (bits == 1)
-    {
+  {
     const unsigned char *readPtr =
       static_cast<const unsigned char *>(filePtr);
     unsigned char *writePtr =
       static_cast<unsigned char *>(buffer);
     for (vtkIdType n = bufferSize/8; n > 0; n--)
-      {
+    {
       unsigned int a = *readPtr;
       for (int i = 0; i < 8; i++)
-        {
+      {
         writePtr[i] = (a & 1);
         a >>= 1;
-        }
+      }
       readPtr++;
       writePtr += 8;
-      }
+    }
     size_t r = (bufferSize % 8);
     if (r > 0)
-      {
+    {
       unsigned int a = *readPtr;
       for (size_t j = 0; j < r; j++)
-        {
+      {
         writePtr[j] = static_cast<unsigned char>(a & 1);
         a >>= 1;
-        }
       }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1180,19 +1270,19 @@ bool vtkDICOMReader::ReadFileNative(
   vtkDICOMFile infile(filename, vtkDICOMFile::In);
 
   if (infile.GetError())
-    {
+  {
     this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
     vtkErrorMacro("ReadFile: Can't read the file " << filename);
     return false;
-    }
+  }
 
   if (!infile.SetPosition(offset))
-    {
+  {
     this->SetErrorCode(vtkErrorCode::PrematureEndOfFileError);
     vtkErrorMacro("DICOM file is truncated, some data is missing.");
     infile.Close();
     return false;
-    }
+  }
 
   std::string transferSyntax = this->MetaData->GetAttributeValue(
     fileIdx, DC::TransferSyntaxUID).AsString();
@@ -1209,7 +1299,7 @@ bool vtkDICOMReader::ReadFileNative(
   size_t readSize = bufferSize;
   size_t resultSize = 0;
   if (transferSyntax == "1.2.840.10008.1.2.5")
-    {
+  {
     vtkDICOMImageCodec codec(transferSyntax);
 
     unsigned int numFrames = this->MetaData->GetAttributeValue(
@@ -1220,9 +1310,9 @@ bool vtkDICOMReader::ReadFileNative(
     readSize = static_cast<size_t>(
       offsetAndSize[1] - offsetAndSize[0]);
     if (readSize < 8)
-      {
+    {
       readSize = 8;
-      }
+    }
     unsigned char *rleBuffer = new unsigned char[readSize];
     unsigned char *filePtr = rleBuffer;
     resultSize = infile.Read(filePtr, readSize);
@@ -1231,7 +1321,7 @@ bool vtkDICOMReader::ReadFileNative(
     vtkIdType frameSize = bufferSize/numFrames;
     bool isOffsetTable = true;
     while (bytesRemaining >= 8 && bufferPos < bufferSize)
-      {
+    {
       // get the item header
       unsigned int tagkey = vtkDICOMUtilities::UnpackUnsignedInt(filePtr);
       unsigned int length = vtkDICOMUtilities::UnpackUnsignedInt(filePtr + 4);
@@ -1239,31 +1329,31 @@ bool vtkDICOMReader::ReadFileNative(
       bytesRemaining -= 8;
       // make sure the tag is valid
       if (tagkey != 0xE000FFFE)
-        {
+      {
         break;
-        }
+      }
       if (length > bytesRemaining)
-        {
+      {
         // actual file size should have been at least this much larger
         readSize += length - bytesRemaining;
-        length = bytesRemaining;
-        }
+        length = static_cast<unsigned int>(bytesRemaining);
+      }
       // first item is the offset table
       if (!isOffsetTable)
-        {
+      {
         // unpack an RLE fragment
         codec.Decode(this->MetaData,
           filePtr, length, buffer + bufferPos, frameSize);
         bufferPos += frameSize;
-        }
+      }
       filePtr += length;
       bytesRemaining -= length;
       isOffsetTable = false;
-      }
-    delete [] rleBuffer;
     }
+    delete [] rleBuffer;
+  }
   else if (bitsAllocated == 12)
-    {
+  {
     // unpack 12 bits little endian into 16 bits little endian,
     // the result will have to be swapped if machine is BE (the
     // swapping is done at the end of this function)
@@ -1272,9 +1362,9 @@ bool vtkDICOMReader::ReadFileNative(
     resultSize = infile.Read(filePtr, readSize);
 
     vtkDICOMReader::UnpackBits(filePtr, buffer, bufferSize, bitsAllocated);
-    }
+  }
   else if (bitsAllocated == 1)
-    {
+  {
     // unpack 1 bit into 8 bits, source assumed to be either OB
     // or little endian OW, never big endian OW
     readSize = (bufferSize + 7)/8;
@@ -1282,31 +1372,31 @@ bool vtkDICOMReader::ReadFileNative(
     resultSize = infile.Read(filePtr, readSize);
 
     vtkDICOMReader::UnpackBits(filePtr, buffer, bufferSize, bitsAllocated);
-    }
+  }
   else
-    {
+  {
     resultSize = infile.Read(buffer, readSize);
-    }
+  }
 
   bool success = true;
   if (infile.EndOfFile() || resultSize != readSize)
-    {
+  {
     this->SetErrorCode(vtkErrorCode::PrematureEndOfFileError);
     vtkErrorMacro("DICOM file is truncated, " <<
       (readSize - resultSize) << " bytes are missing.");
     success = false;
-    }
+  }
   else if (infile.GetError())
-    {
+  {
     this->SetErrorCode(vtkErrorCode::FileFormatError);
     vtkErrorMacro("Error in DICOM file, cannot read.");
     success = false;
-    }
+  }
   else if (fileBigEndian != memoryBigEndian)
-    {
+  {
     int scalarSize = vtkDataArray::GetDataTypeSize(this->DataScalarType);
     vtkByteSwap::SwapVoidRange(buffer, bufferSize/scalarSize, scalarSize);
-    }
+  }
 
   infile.Close();
   return success;
@@ -1318,6 +1408,8 @@ bool vtkDICOMReader::ReadFileDelegated(
   unsigned char *buffer, vtkIdType bufferSize)
 {
 #if defined(DICOM_USE_DCMTK)
+  // For JPEG, DCMTK will do the YBR to RGB
+  this->NeedsYBRToRGB = false;
 
   DcmFileFormat *fileformat = new DcmFileFormat();
   fileformat->loadFile(filename);
@@ -1325,12 +1417,12 @@ bool vtkDICOMReader::ReadFileDelegated(
     EXS_LittleEndianExplicit, NULL);
 
   if (!status.good())
-    {
+  {
     vtkErrorMacro("DCMTK error: " << status.text());
     this->SetErrorCode(vtkErrorCode::FileFormatError);
     delete fileformat;
     return false;
-    }
+  }
 
   unsigned long count;
   const Uint8 *pixelData;
@@ -1342,25 +1434,25 @@ bool vtkDICOMReader::ReadFileDelegated(
     fileIdx, DC::BitsAllocated).AsInt();
 
   if (bitsAllocated == 12 && imageSize >= bufferSize/2 + (bufferSize+3)/4)
-    {
+  {
     vtkDICOMReader::UnpackBits(pixelData, buffer, bufferSize, bitsAllocated);
-    }
+  }
   else if (bitsAllocated == 1 && imageSize >= (bufferSize + 7)/8)
-    {
+  {
     vtkDICOMReader::UnpackBits(pixelData, buffer, bufferSize, bitsAllocated);
-    }
+  }
   else if (imageSize >= bufferSize)
-    {
+  {
     memcpy(buffer, pixelData, bufferSize);
-    }
+  }
   else
-    {
+  {
     vtkErrorMacro(<< filename << ": The uncompressed image size is "
                   << imageSize << " bytes, expected "
                   << bufferSize << " bytes.");
     delete fileformat;
     return false;
-    }
+  }
 
   delete fileformat;
   return true;
@@ -1372,21 +1464,21 @@ bool vtkDICOMReader::ReadFileDelegated(
   gdcm::ImageReader reader;
   reader.SetFileName(filename);
   if(!reader.Read())
-    {
+  {
     vtkErrorMacro("The GDCM ImageReader could not read the image.");
     this->SetErrorCode(vtkErrorCode::FileFormatError);
     return false;
-    }
+  }
 
   gdcm::Image &image = reader.GetImage();
   if (static_cast<vtkIdType>(image.GetBufferLength()) < bufferSize)
-    {
+  {
     vtkErrorMacro(<< filename << ": The uncompressed image size is "
                   << image.GetBufferLength() << " bytes, expected "
                   << bufferSize << " bytes.");
     this->SetErrorCode(vtkErrorCode::FileFormatError);
     return false;
-    }
+  }
 
   image.GetBuffer(reinterpret_cast<char *>(buffer));
   return true;
@@ -1420,9 +1512,9 @@ bool vtkDICOMReader::ReadOneFile(
       transferSyntax == "1.2.840.10008.1.2.5" ||  // RLE compressed
       transferSyntax == "1.2.840.113619.5.2"  ||  // GE LE with BE data
       transferSyntax == "")
-    {
+  {
     return this->ReadFileNative(filename, fileIdx, buffer, bufferSize);
-    }
+  }
 
   return this->ReadFileDelegated(filename, fileIdx, buffer, bufferSize);
 }
@@ -1435,9 +1527,9 @@ int vtkDICOMReader::RequestData(
 {
   // check whether the reader is in an error state
   if (this->GetErrorCode() != vtkErrorCode::NoError)
-    {
+  {
     return false;
-    }
+  }
 
   // which output port did the request come from
   int outputPort =
@@ -1445,49 +1537,49 @@ int vtkDICOMReader::RequestData(
 
   // for now, this reader has only one output
   if (outputPort > 0)
-    {
+  {
     return true;
-    }
+  }
 
   vtkInformation* outInfo = outputVector->GetInformationObject(0);
 
   int extent[6];
   outInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent);
   if (this->FileDimensionality == 2)
-    {
+  {
     // limit the number of slices to the requested update extent
     int uExtent[6];
     outInfo->Get(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), uExtent);
     extent[4] = uExtent[4];
     extent[5] = uExtent[5];
-    }
+  }
 
   // make a list of all the files inside the update extent
   std::vector<vtkDICOMReaderFileInfo> files;
   int nComp = this->FileIndexArray->GetNumberOfComponents();
   for (int sIdx = extent[4]; sIdx <= extent[5]; sIdx++)
-    {
+  {
     for (int cIdx = 0; cIdx < nComp; cIdx++)
-      {
+    {
       int fileIdx = this->FileIndexArray->GetComponent(sIdx, cIdx);
       int frameIdx = this->FrameIndexArray->GetComponent(sIdx, cIdx);
       std::vector<vtkDICOMReaderFileInfo>::iterator iter = files.begin();
       while (iter != files.end() && iter->FileIndex != fileIdx)
-        {
+      {
         ++iter;
-        }
+      }
       if (iter == files.end())
-        {
+      {
         int n = this->MetaData->GetAttributeValue(
           fileIdx, DC::NumberOfFrames).AsInt();
         n = (n > 0 ? n : 1);
         files.push_back(vtkDICOMReaderFileInfo(fileIdx, n));
         iter = files.end();
         --iter;
-        }
-      iter->Frames.push_back(vtkDICOMReaderFrameInfo(frameIdx, sIdx, cIdx));
       }
+      iter->Frames.push_back(vtkDICOMReaderFrameInfo(frameIdx, sIdx, cIdx));
     }
+  }
 
   // get the data object, allocate memory
   vtkImageData *data =
@@ -1529,15 +1621,15 @@ int vtkDICOMReader::RequestData(
   bool planarToPacked = (filePixelSize != pixelSize);
   unsigned char *rowBuffer = 0;
   if (flipImage)
-    {
+  {
     rowBuffer = new unsigned char[fileRowSize];
-    }
+  }
   unsigned char *fileBuffer = 0;
   int framesInPreviousFile = -1;
 
   // loop through all files in the update extent
   for (size_t idx = 0; idx < files.size(); idx++)
-    {
+  {
     if (this->AbortExecute) { break; }
 
     this->UpdateProgress(static_cast<double>(idx)/
@@ -1552,32 +1644,39 @@ int vtkDICOMReader::RequestData(
     // we need a file buffer if input frames don't match output slices
     bool needBuffer = (planarToPacked || numFrames != framesInFile);
     for (int sIdx = 0; sIdx < numFrames && !needBuffer; sIdx++)
-      {
+    {
       needBuffer = (sIdx != frames[sIdx].FrameIndex);
-      }
+    }
 
     unsigned char *bufferPtr = 0;
 
     if (needBuffer)
-      {
+    {
       if (numFrames != framesInPreviousFile)
-        {
+      {
         // allocate a buffer for planar-to-packed conversion
         delete [] fileBuffer;
         fileBuffer = new unsigned char[fileFrameSize*framesInFile];
         framesInPreviousFile = numFrames;
-        }
-      bufferPtr = fileBuffer;
       }
+      bufferPtr = fileBuffer;
+    }
     else
-      {
+    {
       // read directly into the output
       int sliceIdx = frames[0].SliceIndex;
       int componentIdx = frames[0].ComponentIndex;
       bufferPtr = (dataPtr +
                    (sliceIdx - extent[4])*sliceSize +
                    componentIdx*filePixelSize*numPlanes);
-      }
+    }
+
+    // ReadOneFile will set NeedsYBRToRGB to false if it does YBR->RGB itself
+    // (note: NeedsYBRToRGB will is ignored unless PhotometricInterpretation
+    // is YBR_FULL* or YBR_PARTIAL*)
+    this->NeedsYBRToRGB = (this->AutoYBRToRGB &&
+                           numComponents == 3 &&
+                           scalarSize == 1);
 
     this->ComputeInternalFileName(fileIdx);
     this->ReadOneFile(this->InternalFileName, fileIdx,
@@ -1585,7 +1684,7 @@ int vtkDICOMReader::RequestData(
 
     // iterate through all frames contained in the file
     for (int sIdx = 0; sIdx < numFrames; sIdx++)
-      {
+    {
       int frameIdx = frames[sIdx].FrameIndex;
       int sliceIdx = frames[sIdx].SliceIndex;
       int componentIdx = frames[sIdx].ComponentIndex;
@@ -1599,52 +1698,58 @@ int vtkDICOMReader::RequestData(
       // rescale if Rescale was different for different files
       if (this->NeedsRescale &&
           this->MetaData->GetAttributeValue(fileIdx, DC::PixelData).IsValid())
-        {
+      {
         this->RescaleBuffer(fileIdx, frameIdx, bufferPtr, sliceSize);
-        }
+      }
 
       // iterate through all color planes in the slice
       unsigned char *planePtr = framePtr;
       for (int pIdx = 0; pIdx < numPlanes; pIdx++)
-        {
+      {
         // flip the data if necessary
         if (flipImage)
-          {
+        {
           int numRows = extent[3] - extent[2] + 1;
           int halfRows = numRows/2;
           for (int yIdx = 0; yIdx < halfRows; yIdx++)
-            {
+          {
             unsigned char *row1 = planePtr + yIdx*fileRowSize;
             unsigned char *row2 = planePtr + (numRows-yIdx-1)*fileRowSize;
             memcpy(rowBuffer, row1, fileRowSize);
             memcpy(row1, row2, fileRowSize);
             memcpy(row2, rowBuffer, fileRowSize);
-            }
           }
+        }
 
         // convert planes into vector components
         if (planarToPacked)
-          {
+        {
           const unsigned char *tmpInPtr = planePtr;
           unsigned char *tmpOutPtr = slicePtr;
           int m = sliceSize/pixelSize;
           for (int i = 0; i < m; i++)
-            {
+          {
             vtkIdType n = filePixelSize;
             do { *tmpOutPtr++ = *tmpInPtr++; } while (--n);
             tmpOutPtr += pixelSize - filePixelSize;
-            }
-          slicePtr += filePixelSize;
           }
+          slicePtr += filePixelSize;
+        }
         else if (slicePtr != planePtr)
-          {
+        {
           memcpy(slicePtr, planePtr, filePlaneSize);
-          }
+        }
 
         planePtr += filePlaneSize;
-        }
+      }
+
+      // convert to RGB if data was read from file as YUV
+      if (this->NeedsYBRToRGB)
+      {
+        this->YBRToRGB(fileIdx, frameIdx, slicePtr, sliceSize);
       }
     }
+  }
 
   delete [] rowBuffer;
   delete [] fileBuffer;
@@ -1659,40 +1764,40 @@ int vtkDICOMReader::RequestData(
 void vtkDICOMReader::RelayError(vtkObject *o, unsigned long e, void *data)
 {
   if (e == vtkCommand::ErrorEvent)
-    {
+  {
     vtkDICOMParser *parser = vtkDICOMParser::SafeDownCast(o);
     if (parser && parser->GetErrorCode())
-      {
+    {
       this->SetErrorCode(parser->GetErrorCode());
-      }
+    }
     else
-      {
+    {
       this->SetErrorCode(vtkErrorCode::UnknownError);
-      }
+    }
 
     if (data)
-      {
+    {
       vtkErrorMacro(<< static_cast<char *>(data));
-      }
+    }
     else
-      {
+    {
       vtkErrorMacro(<< "An unknown error ocurred!");
-      }
     }
+  }
   else
-    {
+  {
     this->InvokeEvent(e, data);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 vtkMedicalImageProperties *vtkDICOMReader::GetMedicalImageProperties()
 {
   if (this->MedicalImageProperties == 0)
-    {
+  {
     this->MedicalImageProperties = vtkMedicalImageProperties::New();
     this->UpdateMedicalImageProperties();
-    }
+  }
 
   return this->MedicalImageProperties;
 }
@@ -1704,10 +1809,13 @@ void vtkDICOMReader::UpdateMedicalImageProperties()
   vtkMatrix4x4 *matrix = this->PatientMatrix;
   vtkMedicalImageProperties *properties = this->MedicalImageProperties;
 
-  properties->SetPatientName(
-    meta->GetAttributeValue(DC::PatientName).GetCharData());
-  properties->SetPatientID(
-    meta->GetAttributeValue(DC::PatientID).GetCharData());
+  const vtkDICOMValue *vptr;
+  vptr = &meta->GetAttributeValue(DC::PatientName);
+  properties->SetPatientName(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
+  vptr = &meta->GetAttributeValue(DC::PatientID);
+  properties->SetPatientID(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
   properties->SetPatientAge(
     meta->GetAttributeValue(DC::PatientAge).GetCharData());
   properties->SetPatientSex(
@@ -1730,24 +1838,32 @@ void vtkDICOMReader::UpdateMedicalImageProperties()
     meta->GetAttributeValue(DC::InstanceNumber).GetCharData());
   properties->SetSeriesNumber(
     meta->GetAttributeValue(DC::SeriesNumber).GetCharData());
-  properties->SetSeriesDescription(
-    meta->GetAttributeValue(DC::SeriesDescription).GetCharData());
-  properties->SetStudyID(
-    meta->GetAttributeValue(DC::StudyID).GetCharData());
-  properties->SetStudyDescription(
-    meta->GetAttributeValue(DC::StudyDescription).GetCharData());
+  vptr = &meta->GetAttributeValue(DC::SeriesDescription);
+  properties->SetSeriesDescription(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
+  vptr = &meta->GetAttributeValue(DC::StudyID);
+  properties->SetStudyID(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
+  vptr = &meta->GetAttributeValue(DC::StudyDescription);
+  properties->SetStudyDescription(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
   properties->SetModality(
     meta->GetAttributeValue(DC::Modality).GetCharData());
-  properties->SetManufacturer(
-    meta->GetAttributeValue(DC::Manufacturer).GetCharData());
-  properties->SetManufacturerModelName(
-    meta->GetAttributeValue(DC::ManufacturerModelName).GetCharData());
-  properties->SetStationName(
-    meta->GetAttributeValue(DC::StationName).GetCharData());
-  properties->SetInstitutionName(
-    meta->GetAttributeValue(DC::InstitutionName).GetCharData());
-  properties->SetConvolutionKernel(
-    meta->GetAttributeValue(DC::ConvolutionKernel).GetCharData());
+  vptr = &meta->GetAttributeValue(DC::Manufacturer);
+  properties->SetManufacturer(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
+  vptr = &meta->GetAttributeValue(DC::ManufacturerModelName);
+  properties->SetManufacturerModelName(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
+  vptr = &meta->GetAttributeValue(DC::StationName);
+  properties->SetStationName(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
+  vptr = &meta->GetAttributeValue(DC::InstitutionName);
+  properties->SetInstitutionName(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
+  vptr = &meta->GetAttributeValue(DC::ConvolutionKernel);
+  properties->SetConvolutionKernel(vptr->IsValid() ?
+    vptr->AsUTF8String().c_str() : NULL);
   properties->SetSliceThickness(
     meta->GetAttributeValue(DC::SliceThickness).GetCharData());
   properties->SetKVP(
@@ -1775,31 +1891,31 @@ void vtkDICOMReader::UpdateMedicalImageProperties()
   n = (m < n ? m : n);
   properties->RemoveAllWindowLevelPresets();
   for (int i = 0; i < n; i++)
-    {
+  {
     properties->AddWindowLevelPreset(
       center.GetDouble(i), width.GetDouble(i));
-    }
+  }
 
   const vtkDICOMValue& comment =
     meta->GetAttributeValue(DC::WindowCenterWidthExplanation);
-  m = comment.GetNumberOfValues();
+  m = static_cast<int>(comment.GetNumberOfValues());
   m = (n < m ? n : m);
   for (int j = 0; j < m; j++)
-    {
+  {
     properties->SetNthWindowLevelPresetComment(
       j, comment.GetString(j).c_str());
-    }
+  }
 
   double dircos[6] = { 1.0, 0.0, 0.0, 0.0, 1.0, 0.0 };
   if (matrix)
-    {
+  {
     for (int jj = 0; jj < 2; jj++)
-      {
+    {
       for (int ii = 0; ii < 3; ii++)
-        {
+      {
         dircos[ii + 3*jj] = matrix->GetElement(ii, jj);
-        }
       }
     }
+  }
   properties->SetDirectionCosine(dircos);
 }
diff --git a/Source/vtkDICOMReader.h b/Source/vtkDICOMReader.h
index d316de3..0532beb 100644
--- a/Source/vtkDICOMReader.h
+++ b/Source/vtkDICOMReader.h
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -11,10 +11,12 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkDICOMReader - Read DICOM image files.
-// .SECTION Description
-// This class reads a series of DICOM files into a vtkImageData object,
-// and also provides access to the DICOM meta data for each file.
+/*! \class vtkDICOMReader
+ *  \brief Read DICOM image files.
+ *
+ *  This class reads a series of DICOM files into a vtkImageData object,
+ *  and also provides access to the DICOM meta data for each file.
+ */
 
 #ifndef vtkDICOMReader_h
 #define vtkDICOMReader_h
@@ -35,145 +37,187 @@ class vtkDICOMSliceSorter;
 class VTKDICOM_EXPORT vtkDICOMReader : public vtkImageReader2
 {
 public:
-  // Description:
-  // Static method for construction.
-  static vtkDICOMReader *New();
   vtkTypeMacro(vtkDICOMReader, vtkImageReader2);
 
-  // Description:
-  // Print information about this object.
+  //! Static method for construction.
+  static vtkDICOMReader *New();
+
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Valid extensions for this file type.
+  //@{
+  //! Valid extensions for this file type.
   virtual const char* GetFileExtensions() {
     return ".dcm .dc"; }
 
-  // Description:
-  // Return a descriptive name that might be useful in a GUI.
+  //! Return a descriptive name that might be useful in a GUI.
   virtual const char* GetDescriptiveName() {
     return "DICOM"; }
 
-  // Description:
-  // Return true if this reader can read the given file.
+  //! Return true if this reader can read the given file.
   int CanReadFile(const char* filename);
-
-  // Description:
-  // Set the Stack ID of the stack to load, for named stacks.
-  // If the series has multiple stacks, then by default the reader
-  // will only load the first stack.  This method allows you to select
-  // a different stack, if you know the DICOM StackID for the stack.
+  //@}
+
+  //@{
+  //! Set the Stack ID of the stack to load, for named stacks.
+  /*!
+   *  If the series has multiple stacks, then by default the reader
+   *  will only load the first stack.  This method allows you to select
+   *  a different stack, if you know the DICOM StackID for the stack.
+   */
   void SetDesiredStackID(const char *stackId);
   const char *GetDesiredStackID() { return this->DesiredStackID; }
 
-  // Description:
-  // Get a list of the stacks that are present in the input files.
-  // A stack is a contiguous array of slices that form a volume.
+  //! Get a list of the stacks that are present in the input files.
+  /*!
+   *  A stack is a contiguous array of slices that form a volume.
+   */
   vtkStringArray *GetStackIDs() { return this->StackIDs; }
-
-  // Description:
-  // Get an array that converts slice index to input file index.
-  // If the reader has generated scalar components, then this will
-  // be a two-dimensional array and calling array->GetComponent(i,j)
-  // will return the file index for slice i and scalar component j
-  // for monochrome images, or for slice i and scalar component 3*j
-  // for RGB images (or more precisely, at scalar component N*j where
-  // N is the SamplesPerPixel value from the DICOM metadata).  If the
-  // data has just one component, then use j=0. If you used SetFileNames()
-  // to provide a list of files to the reader, then use this array to
-  // find out which file provided which slice, or to index into the
-  // MetaData object to get the metadata for a particular slice.
+  //@}
+
+  //@{
+  //! Get an array that converts slice index to input file index.
+  /*!
+   *  If the reader has generated scalar components, then this will
+   *  be a two-dimensional array and calling array->GetComponent(i,j)
+   *  will return the file index for slice i and scalar component j
+   *  for monochrome images, or for slice i and scalar component 3*j
+   *  for RGB images (or more precisely, at scalar component N*j where
+   *  N is the SamplesPerPixel value from the DICOM metadata).  If the
+   *  data has just one component, then use j=0. If you used SetFileNames()
+   *  to provide a list of files to the reader, then use this array to
+   *  find out which file provided which slice, or to index into the
+   *  MetaData object to get the metadata for a particular slice.
+   */
   vtkIntArray *GetFileIndexArray() { return this->FileIndexArray; }
 
-  // Description:
-  // Get an array that converts slice index to frame index.
-  // The purpose of this array is to identify individual frames in
-  // multi-frame DICOM files.  The dimensions of this array are identical
-  // to the FileIndexArray.  Use FileIndexArray to identify the file,
-  // then use FrameIndexArray to identify the frame within that file.
+  //! Get an array that converts slice index to frame index.
+  /*!
+   *  The purpose of this array is to identify individual frames in
+   *  multi-frame DICOM files.  The dimensions of this array are identical
+   *  to the FileIndexArray.  Use FileIndexArray to identify the file,
+   *  then use FrameIndexArray to identify the frame within that file.
+   */
   vtkIntArray *GetFrameIndexArray() { return this->FrameIndexArray; }
-
-  // Description:
-  // Get the meta data for the DICOM files.
-  // The GetAttributeValue() method of vtkDICOMMataData takes optional
-  // file and frame indices, which specify the file and the frame within
-  // that file to get the attribute from.  If you have a slice index rather
-  // than a file index and frame index, then use the FileIndexArray and
-  // FrameIndexArray to convert the slice index into file and frame indices.
+  //@}
+
+  //@{
+  //! Get the meta data for the DICOM files.
+  /*!
+   *  The GetAttributeValue() method of vtkDICOMMataData takes optional
+   *  file and frame indices, which specify the file and the frame within
+   *  that file to get the attribute from.  If you have a slice index rather
+   *  than a file index and frame index, then use the FileIndexArray and
+   *  FrameIndexArray to convert the slice index into file and frame indices.
+   */
   vtkDICOMMetaData *GetMetaData() { return this->MetaData; }
+  //@}
 
-  // Description:
-  // If the files have been pre-sorted, the sorting can be disabled.
+  //@{
+  //! If the files have been pre-sorted, the sorting can be disabled.
   vtkGetMacro(Sorting, int);
   vtkSetMacro(Sorting, int);
   vtkBooleanMacro(Sorting, int)
-
-  // Description:
-  // Set a custom sorter to be used to sort files and frames into slices.
-  // The default sorter uses the attributes "ImagePositionPatient" and
-  // "ImageOrientationPatient" to spatially arrange the slices.
+  //@}
+
+  //@{
+  //! Set a custom sorter to be used to sort files and frames into slices.
+  /*!
+   *  The default sorter uses the attributes "ImagePositionPatient" and
+   *  "ImageOrientationPatient" to spatially arrange the slices.
+   */
   void SetSorter(vtkDICOMSliceSorter *sorter);
   vtkDICOMSliceSorter *GetSorter() { return this->Sorter; }
-
-  // Description:
-  // Read the time dimension as scalar components (default: Off).
-  // If this is on, then each time point will be stored as a scalar
-  // component in the image data.  If the data has both a time dimension
-  // and a vector dimension, then the number of components will be the
-  // product of these two dimensions, i.e. the components will store
-  // a sequence of vectors, one vector for each time point.
+  //@}
+
+  //@{
+  //! Read the time dimension as scalar components (default: Off).
+  /*!
+   *  If this is on, then each time point will be stored as a scalar
+   *  component in the image data.  If the data has both a time dimension
+   *  and a vector dimension, then the number of components will be the
+   *  product of these two dimensions, i.e. the components will store
+   *  a sequence of vectors, one vector for each time point.
+   */
   vtkGetMacro(TimeAsVector, int);
   vtkSetMacro(TimeAsVector, int);
   vtkBooleanMacro(TimeAsVector, int);
+  //@}
 
-  // Description:
-  // Get the time dimension if the DICOM series has one.
+  //@{
+  //! Get the time dimension if the DICOM series has one.
   int GetTimeDimension() { return this->TimeDimension; }
   double GetTimeSpacing() { return this->TimeSpacing; }
+  //@}
 
-  // Description:
-  // Set the desired time index (set to -1 for all).
+  //@{
+  //! Set the desired time index (set to -1 for all).
   vtkSetMacro(DesiredTimeIndex, int);
   vtkGetMacro(DesiredTimeIndex, int);
-
-  // Description:
-  // Turn off automatic rescaling of intensity values.
-  // By default, of the reader sees different RescaleSlope and
-  // RescaleIntercept values for different slices, then it will
-  // adjust the pixel values so that they can all use the same
-  // slope and intercept.  This is a lossy process, so you might
-  // want to turn it off and use vtkDICOMApplyRescale instead.
+  //@}
+
+  //@{
+  //! Turn off automatic conversion of YBR images to RGB.
+  /*!
+   *  By default, YBR images are always converted to RGB (though the
+   *  photometric interpretation in the metadata will remain the same).
+   */
+  vtkGetMacro(AutoYBRToRGB, int);
+  vtkSetMacro(AutoYBRToRGB, int);
+  vtkBooleanMacro(AutoYBRToRGB, int);
+  //@}
+
+  //@{
+  //! Turn off automatic rescaling of intensity values.
+  /*!
+   *  By default, if the RescaleSlope and RescaleIntercept values differ
+   *  between slices (as occurs for all PET images and some CT images),
+   *  then the reader will adjust the pixel values for the slices so
+   *  that the same RescaleSlope and RescaleIntercept can be used for
+   *  all slices.  This adjustment is a lossy process, so a preferable
+   *  option is to call AutoRescaleOff() and use vtkDICOMApplyRescale
+   *  to apply the pixel value rescaling instead.
+   */
   vtkGetMacro(AutoRescale, int);
   vtkSetMacro(AutoRescale, int);
   vtkBooleanMacro(AutoRescale, int);
-
-  // Description:
-  // Get the slope and intercept for rescaling the scalar values.
-  // These values allow calibration of the data to real values.
-  // Use the equation v = u*RescaleSlope + RescaleIntercept.
+  //@}
+
+  //@{
+  //! Get the slope and intercept for rescaling the scalar values.
+  /*!
+   *  These values allow calibration of the data to real values.
+   *  Use the equation v = u*RescaleSlope + RescaleIntercept.
+   */
   double GetRescaleSlope() { return this->RescaleSlope; }
   double GetRescaleIntercept() { return this->RescaleIntercept; }
-
-  // Description:
-  // Get a matrix to place the image within DICOM patient coords.
-  // This matrix is constructed from the ImageOrientationPatient
-  // and ImagePositionPatient meta data attributes.  See the
-  // SetMemoryRowOrder method for additional information.
+  //@}
+
+  //@{
+  //! Get a matrix to place the image within DICOM patient coords.
+  /*!
+   *  This matrix is constructed from the ImageOrientationPatient
+   *  and ImagePositionPatient meta data attributes.  See the
+   *  SetMemoryRowOrder method for additional information.
+   */
   vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; }
+  //@}
 
-  // Description:
-  // Get a MedicalImageProperties object for this file.
+  //@{
+  //! Get a MedicalImageProperties object for this file.
   vtkMedicalImageProperties *GetMedicalImageProperties();
+  //@}
 
-  // Description:
-  // Enumeration for top-down vs. bottom-up ordering.
+  //! Enumeration for top-down vs. bottom-up ordering.
   enum RowOrder { FileNative, TopDown, BottomUp };
 
-  // Description:
-  // Set the ordering of the image rows in memory.
-  // If the order is BottomUp (which is the default) then
-  // the images will be flipped when they are read from disk.
-  // The native orientation of DICOM images is top-to-bottom.
+  //@{
+  //! Set the ordering of the image rows in memory.
+  /*!
+   *  If the order is BottomUp (which is the default) then
+   *  the images will be flipped when they are read from disk.
+   *  The native orientation of DICOM images is top-to-bottom.
+   */
   void SetMemoryRowOrder(int order);
   void SetMemoryRowOrderToFileNative() {
     this->SetMemoryRowOrder(FileNative); }
@@ -183,151 +227,147 @@ public:
     this->SetMemoryRowOrder(BottomUp); }
   int GetMemoryRowOrder() { return this->MemoryRowOrder; }
   const char *GetMemoryRowOrderAsString();
+  //@}
 
 protected:
   vtkDICOMReader();
   ~vtkDICOMReader();
 
-  // Description:
-  // Read the header information.
+  //@{
+  //! Read the header information.
   virtual int RequestInformation(
     vtkInformation* request, vtkInformationVector** inputVector,
     vtkInformationVector* outputVector);
 
-  // Description:
-  // Read the voxel data.
+  //! Read the voxel data.
   virtual int RequestData(
     vtkInformation* request, vtkInformationVector** inputVector,
     vtkInformationVector* outputVector);
+  //@}
 
-  // Description:
-  // Read one file.  Specify the offset to the PixelData.
+  //@{
+  //! Read one file.  Specify the offset to the PixelData.
   virtual bool ReadOneFile(
     const char *filename, int idx,
     unsigned char *buffer, vtkIdType bufferSize);
 
-  // Description:
-  // Unpack 1 bit to 8 bits or 12 bits to 16 bits.
+  //! Unpack 1 bit to 8 bits or 12 bits to 16 bits.
   void UnpackBits(
     const void *source, void *buffer, vtkIdType bufferSize, int bits);
 
-  // Description:
-  // Read an DICOM file directly.
+  //! Read an DICOM file directly.
   virtual bool ReadFileNative(
     const char *filename, int idx,
     unsigned char *buffer, vtkIdType bufferSize);
 
-  // Description:
-  // Read a DICOM file via DCMTK or GDCM.
+  //! Read a DICOM file via DCMTK or GDCM.
   virtual bool ReadFileDelegated(
     const char *filename, int idx,
     unsigned char *buffer, vtkIdType bufferSize);
+  //@}
 
-  // Description:
-  // Rescale the data in the buffer.
+  //@{
+  //! Rescale the data in the buffer.
   virtual void RescaleBuffer(
     int fileIdx, int frameIdx, void *buffer, vtkIdType bufferSize);
 
-  // Description:
-  // Convert parser errors into reader errors.
-  void RelayError(vtkObject *o, unsigned long e, void *data);
+  //! Convert buffer from YUV to RGB.
+  virtual void YBRToRGB(
+    int fileIdx, int frameIdx, void *buffer, vtkIdType bufferSize);
+  //@}
 
-  // Description:
-  // Verify that the files can be composed into a volume.
-  // This is called after SortFiles has been called.  It should invoke an
-  // error event and return zero upon failure.
+  //@{
+  //! Convert parser errors into reader errors.
+  void RelayError(vtkObject *o, unsigned long e, void *data);
+  //@}
+
+  //@{
+  //! Verify that the files can be composed into a volume.
+  /*!
+   *  This is called after SortFiles has been called.  It should invoke an
+   *  error event and return zero upon failure.
+   */
   virtual bool ValidateStructure(
     vtkIntArray *fileArray, vtkIntArray *frameArray);
 
-  // Description:
-  // Sort the input files, put the sort in the supplied arrays.
+  //! Sort the input files, put the sort in the supplied arrays.
   virtual void SortFiles(vtkIntArray *fileArray, vtkIntArray *frameArray);
 
-  // Description:
-  // Do not sort the files, just build the arrays.
+  //! Do not sort the files, just build the arrays.
   void NoSortFiles(vtkIntArray *fileArray, vtkIntArray *frameArray);
+  //@}
 
-  // Description:
-  // Update the medical image properties;
+  //@{
+  //! Update the medical image properties;
   virtual void UpdateMedicalImageProperties();
+  //@}
 
-  // Description:
-  // Select whether to sort the files.
+  //! Select whether to sort the files.
   int Sorting;
 
-  // Description:
-  // Information for rescaling data to quantitative units.
+  //! Information for rescaling data to quantitative units.
   double RescaleIntercept;
   double RescaleSlope;
 
-  // Description:
-  // The orientation matrix for the DICOM file.
+  //! The orientation matrix for the DICOM file.
   vtkMatrix4x4 *PatientMatrix;
 
-  // Description:
-  // The meta data for the image.
+  //! The meta data for the image.
   vtkDICOMMetaData *MetaData;
 
-  // Description:
-  // The MedicalImageProperties, for compatibility with other readers.
+  //! The MedicalImageProperties, for compatibility with other readers.
   vtkMedicalImageProperties *MedicalImageProperties;
 
-  // Description:
-  // The parser that is used to read the file.
+  //! The parser that is used to read the file.
   vtkDICOMParser *Parser;
 
-  // Description:
-  // The sorter that orders the slices within the volume.
+  //! The sorter that orders the slices within the volume.
   vtkDICOMSliceSorter *Sorter;
 
-  // Description:
-  // The offsets to the pixel data in each file.
+  //! The offsets to the pixel data in each file.
   vtkTypeInt64Array *FileOffsetArray;
 
-  // Description:
-  // An array to convert slice indices to input files
+  //! An array to convert slice indices to input files
   vtkIntArray *FileIndexArray;
 
-  // Description:
-  // An array to convert slice indices to input frames
+  //! An array to convert slice indices to input frames
   vtkIntArray *FrameIndexArray;
 
-  // Description:
-  // An array that holds the stack IDs.
+  //! An array that holds the stack IDs.
   vtkStringArray *StackIDs;
 
-  // Description:
-  // The row order to use when storing the data in memory.
+  //! The row order to use when storing the data in memory.
   int MemoryRowOrder;
 
-  // Description:
-  // This indicates that the data must be rescaled.
+  //! This indicates that the data must be rescaled.
   int NeedsRescale;
   int AutoRescale;
 
-  // Description:
-  // The number of packed pixel components in the input file.
-  // This is for packed, rather than planar, components.
+  //! This indicates that the data must be converted to RGB.
+  int NeedsYBRToRGB;
+  int AutoYBRToRGB;
+
+  //! The number of packed pixel components in the input file.
+  /*!
+   *  This is for packed, rather than planar, components.
+   */
   int NumberOfPackedComponents;
 
-  // Description:
-  // The number of color planes in the file.
+  //! The number of color planes in the file.
   int NumberOfPlanarComponents;
 
-  // Description:
-  // Time dimension variables.
+  //! Time dimension variables.
   int TimeAsVector;
   int TimeDimension;
   int DesiredTimeIndex;
   double TimeSpacing;
 
-  // Description:
-  // The stack to load.
+  //! The stack to load.
   char DesiredStackID[20];
 
 private:
-  vtkDICOMReader(const vtkDICOMReader&);  // Not implemented.
-  void operator=(const vtkDICOMReader&);  // Not implemented.
+  vtkDICOMReader(const vtkDICOMReader&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMReader&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMReader_h
diff --git a/Source/vtkDICOMSCGenerator.cxx b/Source/vtkDICOMSCGenerator.cxx
index 5348618..9d15c57 100644
--- a/Source/vtkDICOMSCGenerator.cxx
+++ b/Source/vtkDICOMSCGenerator.cxx
@@ -46,25 +46,25 @@ bool vtkDICOMSCGenerator::GenerateSCMultiFrameImageModule(
   // The BurnedInAnnotation attribute is mandatory
   std::string bia;
   if (source)
-    {
+  {
     bia = source->GetAttributeValue(
       DC::BurnedInAnnotation).AsString();
-    }
+  }
   if (bia != "YES")
-    {
+  {
     bia = "NO";
-    }
+  }
   vtkDICOMMetaData *meta = this->MetaData;
   meta->SetAttributeValue(DC::BurnedInAnnotation, bia);
 
   // These are mandatory, and must be set to these values
   if (meta->GetAttributeValue(DC::BitsStored).AsInt() != 1)
-    {
+  {
     meta->SetAttributeValue(DC::PresentationLUTShape, "IDENTITY");
     meta->SetAttributeValue(DC::RescaleIntercept, 0.0);
     meta->SetAttributeValue(DC::RescaleSlope, 1.0);
     meta->SetAttributeValue(DC::RescaleType, "US");
-    }
+  }
 
   // get dimensions of the data set: x,y,z,t,v
   int nframes = this->NumberOfFrames;
@@ -83,26 +83,26 @@ bool vtkDICOMSCGenerator::GenerateSCMultiFrameImageModule(
   int vdim = (dims[4] > 0 ? dims[4] : 1);
   int tdim = (dims[3] > 0 ? dims[3] : 1);
   for (int f = 0; f < nframes; f++)
-    {
+  {
     int t = (f / vdim) % tdim;
     int z = f / (vdim * tdim);
     zvector[f] = z*spacing[2];
     tvector[f] = (t == 0 ? 0.0 : spacing[3]);
-    }
+  }
 
   if (dims[3] > 0 || (dims[2] == 0 && nframes == 1))
-    {
+  {
     pointers[npointers++] = DC::FrameTimeVector;
     meta->SetAttributeValue(
       DC::FrameTimeVector,
       vtkDICOMValue(vtkDICOMVR::DS, tvector, nframes));
-    }
+  }
   if (dims[2] > 0)
-    {
+  {
     pointers[npointers++] = DC::SliceLocationVector;
     meta->SetAttributeValue(DC::SliceLocationVector,
       vtkDICOMValue(vtkDICOMVR::DS, zvector, nframes));
-    }
+  }
 
   meta->RemoveAttribute(DC::FrameTime);
   meta->SetAttributeValue(
@@ -159,22 +159,22 @@ bool vtkDICOMSCGenerator::GenerateSCEquipmentModule(vtkDICOMMetaData *source)
   // ConversionType is a mandatory attribute
   std::string ct;
   if (source)
-    {
+  {
     ct = source->GetAttributeValue(DC::ConversionType).AsString();
-    }
+  }
   if (ct == "")
-    {
+  {
     ct = "WSD"; // workstation
-    }
+  }
   vtkDICOMMetaData *meta = this->MetaData;
   meta->SetAttributeValue(DC::ConversionType, ct);
 
   // Modality is optional for Secondary Capture
   std::string m = meta->GetAttributeValue(DC::Modality).AsString();
   if (m == "" || m == "OT")
-    {
+  {
     meta->RemoveAttribute(DC::Modality);
-    }
+  }
 
   // optional and conditional: direct copy of values with no checks
   static const DC::EnumType optional[] = {
@@ -205,30 +205,30 @@ bool vtkDICOMSCGenerator::GenerateSCMultiFrameInstance(vtkInformation *info)
 
   const char *SOPClass = 0;
   if (scalarType == VTK_UNSIGNED_CHAR)
-    {
+  {
     this->SetPixelRestrictions(
        RepresentationUnsigned,
        BitsStored8,
        numComponents);
 
     if (numComponents < 3)
-      {
+    {
       SOPClass = "1.2.840.10008.5.1.4.1.1.7.2";
-      }
+    }
     else
-      {
+    {
       SOPClass = "1.2.840.10008.5.1.4.1.1.7.4";
-      }
     }
+  }
   else
-    {
+  {
     this->SetPixelRestrictions(
        RepresentationUnsigned,
        BitsStored10 | BitsStored12 | BitsStored16,
        1);
 
     SOPClass = "1.2.840.10008.5.1.4.1.1.7.3";
-    }
+  }
 
   this->InitializeMetaData(info);
 
@@ -249,9 +249,9 @@ bool vtkDICOMSCGenerator::GenerateSCMultiFrameInstance(vtkInformation *info)
       !this->GenerateDeviceModule(source) ||
       !this->GenerateSpecimenModule(source) ||
       !this->GenerateSCMultiFrameImageModule(source))
-    {
+  {
     return false;
-    }
+  }
 
   return true;
 }
@@ -270,9 +270,9 @@ bool vtkDICOMSCGenerator::GenerateSCInstance(vtkInformation *info)
   int samplesPerPixel = 1;
 
   if (scalarType == VTK_UNSIGNED_CHAR)
-    {
+  {
     samplesPerPixel = numComponents;
-    }
+  }
 
   this->SetPixelRestrictions(
     RepresentationUnsigned | RepresentationSigned,
@@ -299,9 +299,9 @@ bool vtkDICOMSCGenerator::GenerateSCInstance(vtkInformation *info)
       !this->GenerateSpecimenModule(source) ||
       !this->GenerateSCImageModule(source) ||
       !this->GenerateOverlayPlaneModule(source))
-    {
+  {
     return false;
-    }
+  }
 
   return true;
 }
@@ -310,9 +310,9 @@ bool vtkDICOMSCGenerator::GenerateSCInstance(vtkInformation *info)
 bool vtkDICOMSCGenerator::GenerateInstance(vtkInformation *info)
 {
   if (this->MultiFrame == 0)
-    {
+  {
     return this->GenerateSCInstance(info);
-    }
+  }
 
   return this->GenerateSCMultiFrameInstance(info);
 }
diff --git a/Source/vtkDICOMSCGenerator.h b/Source/vtkDICOMSCGenerator.h
index 91440f9..3c8884c 100644
--- a/Source/vtkDICOMSCGenerator.h
+++ b/Source/vtkDICOMSCGenerator.h
@@ -67,8 +67,8 @@ protected:
   virtual bool GenerateSCMultiFrameInstance(vtkInformation *info);
 
 private:
-  vtkDICOMSCGenerator(const vtkDICOMSCGenerator&);  // Not implemented.
-  void operator=(const vtkDICOMSCGenerator&);  // Not implemented.
+  vtkDICOMSCGenerator(const vtkDICOMSCGenerator&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMSCGenerator&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMSCGenerator_h
diff --git a/Source/vtkDICOMSequence.cxx b/Source/vtkDICOMSequence.cxx
index f368664..d80b2dd 100644
--- a/Source/vtkDICOMSequence.cxx
+++ b/Source/vtkDICOMSequence.cxx
@@ -16,6 +16,18 @@
 
 #include <assert.h>
 
+// provide extern declarations for all the template methods we use
+#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1700)
+extern template
+void vtkDICOMValue::AppendInit<vtkDICOMItem>(vtkDICOMVR);
+
+extern template
+void vtkDICOMValue::AppendValue<vtkDICOMItem>(const vtkDICOMItem&);
+
+extern template
+void vtkDICOMValue::SetValue<vtkDICOMItem>(size_t, const vtkDICOMItem&);
+#endif
+
 //----------------------------------------------------------------------------
 // For use by methods that must return an invalid value
 const vtkDICOMValue vtkDICOMSequence::InvalidValue;
@@ -24,14 +36,44 @@ const vtkDICOMValue vtkDICOMSequence::InvalidValue;
 const vtkDICOMItem vtkDICOMSequence::EmptyItem;
 
 //----------------------------------------------------------------------------
+vtkDICOMSequence::vtkDICOMSequence()
+{
+  this->V.AppendInit<vtkDICOMItem>(vtkDICOMVR::SQ);
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMSequence::vtkDICOMSequence(unsigned int n)
+{
+  this->V.AllocateSequenceData(vtkDICOMVR::SQ, n);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMSequence::Clear()
+{
+  this->V.AppendInit<vtkDICOMItem>(vtkDICOMVR::SQ);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMSequence::AddItem(const vtkDICOMItem& item)
+{
+  this->V.AppendValue(item);
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMSequence::SetItem(size_t i, const vtkDICOMItem& item)
+{
+  this->V.SetValue(i, item);
+}
+
+//----------------------------------------------------------------------------
 const vtkDICOMValue &vtkDICOMSequence::GetAttributeValue(
     size_t i, vtkDICOMTag tag) const
 {
   const vtkDICOMItem *ptr = this->V.GetSequenceData();
   if (ptr != 0 && i < this->V.GetNumberOfValues())
-    {
+  {
     return ptr[i].GetAttributeValue(tag);
-    }
+  }
   return vtkDICOMSequence::InvalidValue;
 }
 
@@ -41,9 +83,9 @@ const vtkDICOMValue &vtkDICOMSequence::GetAttributeValue(
 {
   const vtkDICOMItem *ptr = this->V.GetSequenceData();
   if (ptr != 0 && i < this->V.GetNumberOfValues())
-    {
+  {
     return ptr[i].GetAttributeValue(tagpath);
-    }
+  }
   return vtkDICOMSequence::InvalidValue;
 }
 
@@ -52,9 +94,9 @@ const vtkDICOMItem &vtkDICOMSequence::GetItem(size_t i) const
 {
   const vtkDICOMItem *ptr = this->V.GetSequenceData();
   if (ptr != 0 && i < this->V.GetNumberOfValues())
-    {
+  {
     return ptr[i];
-    }
+  }
   return vtkDICOMSequence::EmptyItem;
 }
 
diff --git a/Source/vtkDICOMSequence.h b/Source/vtkDICOMSequence.h
index b595878..ca4ed54 100644
--- a/Source/vtkDICOMSequence.h
+++ b/Source/vtkDICOMSequence.h
@@ -31,24 +31,28 @@ class vtkDICOMTagPath;
 class VTKDICOM_EXPORT vtkDICOMSequence
 {
 public:
+  //@{
   //! Construct a growable sequence with no items.
-  vtkDICOMSequence() {
-    this->V.AppendInit<vtkDICOMItem>(vtkDICOMVR::SQ); }
+  vtkDICOMSequence();
 
   //! Construct a sequence of fixed size.
-  explicit vtkDICOMSequence(unsigned int n) {
-    this->V.AllocateSequenceData(vtkDICOMVR::SQ, n); }
+  explicit vtkDICOMSequence(unsigned int n);
+  //@}
 
+  //@{
   //! Clear a sequence, remove its contents and make it empty.
-  void Clear() {
-    this->V.AppendInit<vtkDICOMItem>(vtkDICOMVR::SQ); }
+  void Clear();
+  //@}
 
+  //@{
   //! Get a value from an item in the sequence.
   const vtkDICOMValue &GetAttributeValue(
     size_t i, vtkDICOMTag tag) const;
   const vtkDICOMValue &GetAttributeValue(
     size_t i, const vtkDICOMTagPath &p) const;
+  //@}
 
+  //@{
   //! Add an item to the sequence.
   /*!
    *  After calling this method, GetNumberOfItems() will report
@@ -56,20 +60,20 @@ public:
    *  the special value 0xffffffff to indicate that this is a delimited
    *  sequence rather than a fixed-size sequence.
    */
-  void AddItem(const vtkDICOMItem& item) {
-    this->V.AppendValue(item); }
+  void AddItem(const vtkDICOMItem& item);
 
   //! Get the number of items in the sequence.
   size_t GetNumberOfItems() const {
     return this->V.GetNumberOfValues(); }
+  //@}
 
+  //@{
   //! Set an item in the sequence.
   /*!
    *  This method can only be used if space as been allocated within
    *  the sequence by specifying a size when calling the constructor.
    */
-  void SetItem(size_t i, const vtkDICOMItem& item) {
-    this->V.SetValue(i, item); }
+  void SetItem(size_t i, const vtkDICOMItem& item);
 
   //! Get an item from the sequence.
   const vtkDICOMItem& GetItem(size_t i) const;
@@ -77,11 +81,9 @@ public:
   //! Get a pointer to the items in the sequence.
   const vtkDICOMItem *GetSequenceData() const {
     return this->V.GetSequenceData(); }
+  //@}
 
-  //! Check that the sequence was constructed from a valid value.
-  bool IsValid() const {
-    return this->V.IsValid(); }
-
+  //@{
   //! Copy constructor.
   vtkDICOMSequence(const vtkDICOMSequence& o) : V(o.V) {}
 
@@ -89,6 +91,12 @@ public:
   vtkDICOMSequence(const vtkDICOMValue& o) : V(o) {
     if (o.GetVR() != vtkDICOMVR::SQ) { this->V.Clear(); } }
 
+  //! Check that the sequence was constructed from a valid value.
+  bool IsValid() const {
+    return this->V.IsValid(); }
+  //@}
+
+  //@{
   //! Assignment operator.
   vtkDICOMSequence& operator=(const vtkDICOMSequence& o) {
     this->V = o.V; return *this; }
@@ -97,6 +105,7 @@ public:
   vtkDICOMSequence& operator=(const vtkDICOMValue& o) {
     if (o.GetVR() == vtkDICOMVR::SQ) { this->V = o; }
     else { this->V.Clear(); } return *this; }
+  //@}
 
 private:
   friend class vtkDICOMValue;
diff --git a/Source/vtkDICOMSliceSorter.cxx b/Source/vtkDICOMSliceSorter.cxx
index 6b85c05..1477a01 100644
--- a/Source/vtkDICOMSliceSorter.cxx
+++ b/Source/vtkDICOMSliceSorter.cxx
@@ -49,21 +49,21 @@ vtkDICOMSliceSorter::vtkDICOMSliceSorter()
 vtkDICOMSliceSorter::~vtkDICOMSliceSorter()
 {
   if (this->FileIndexArray)
-    {
+  {
     this->FileIndexArray->Delete();
-    }
+  }
   if (this->FrameIndexArray)
-    {
+  {
     this->FrameIndexArray->Delete();
-    }
+  }
   if (this->StackIDs)
-    {
+  {
     this->StackIDs->Delete();
-    }
+  }
   if (this->MetaData)
-    {
+  {
     this->MetaData->Delete();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -73,13 +73,13 @@ void vtkDICOMSliceSorter::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "MetaData: ";
   if (this->MetaData)
-    {
+  {
     os << this->MetaData << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
 
   os << indent << "DesiredStackID: "
      << (*this->DesiredStackID ? "(empty)" : this->DesiredStackID) << "\n";
@@ -103,35 +103,35 @@ void vtkDICOMSliceSorter::PrintSelf(ostream& os, vtkIndent indent)
 void vtkDICOMSliceSorter::SetMetaData(vtkDICOMMetaData *meta)
 {
   if (this->MetaData != meta)
-    {
+  {
     if (this->MetaData)
-      {
+    {
       this->MetaData->Delete();
-      }
+    }
     if (meta)
-      {
+    {
       meta->Register(this);
-      }
+    }
     this->MetaData = meta;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMSliceSorter::SetDesiredStackID(const char *stackId)
 {
   if (stackId == 0)
-    {
+  {
     stackId = "";
-    }
+  }
 
   // the maximum length of a stackId is 16
   if (strncmp(this->DesiredStackID, stackId, 16) != 0)
-    {
+  {
     strncpy(this->DesiredStackID, stackId, 16);
     this->DesiredStackID[17] = '\0';
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -191,9 +191,9 @@ const vtkDICOMValue& vtkDICOMSliceSorterGetFrameAttributeValue(
   const vtkDICOMValue& v =
     frameSeq.GetAttributeValue(i, vtkDICOMTagPath(stag, 0, vtag));
   if (v.IsValid())
-    {
+  {
     return v;
-    }
+  }
   return sharedSeq.GetAttributeValue(0, vtkDICOMTagPath(stag, 0, vtag));
 }
 
@@ -205,11 +205,11 @@ double vtkDICOMSliceSorterComputeLocation(
   double location = 0.0;
 
   if (pv.GetNumberOfValues() != 3 || ov.GetNumberOfValues() != 6)
-    {
+  {
     *checkPtr = false;
-    }
+  }
   else
-    {
+  {
     double orientation[6], normal[3], position[3];
     pv.GetValues(position, 3);
     ov.GetValues(orientation, 6);
@@ -220,24 +220,24 @@ double vtkDICOMSliceSorterComputeLocation(
     location = vtkMath::Dot(normal, position);
 
     if (checkOrientation[9] == 0)
-      {
+    {
       // save the orientation and position for later checks
       for (int i = 0; i < 3; i++)
-        {
+      {
         checkOrientation[i] = orientation[i];
         checkOrientation[3+i] = orientation[3+i];
         checkOrientation[6+i] = position[i];
         checkOrientation[10+i] = normal[i];
-        }
+      }
       // indicate that checkOrientation has been set
       checkOrientation[9] = 1.0;
-      }
+    }
     else
-      {
+    {
       const double directionTolerance = 1e-4;
       const double positionTolerance = 1e-3;
       for (int i = 0; i < 2; i++)
-        {
+      {
         // make sure the orientation vectors stay the same
         double *vec = &orientation[3*i];
         double *checkVec = &checkOrientation[3*i];
@@ -248,16 +248,16 @@ double vtkDICOMSliceSorterComputeLocation(
         // (actually compute the square of the sine, it's easier)
         double d = 1.0;
         if (b > 0 && c > 0)
-          {
+        {
           d = 1.0 - (a*a)/(b*c);
-          }
+        }
         // the tolerance is in radians (small angle approximation)
         if (d > directionTolerance*directionTolerance)
-          {
+        {
           // not all slices have the same orientation
           *checkPtr = false;
-          }
         }
+      }
       // make sure the positions line up
       double *checkPosition = &checkOrientation[6];
       double v[3];
@@ -270,13 +270,13 @@ double vtkDICOMSliceSorterComputeLocation(
       if (checkOrientation[13] == 0 &&
           v[0]*v[0] + v[1]*v[1] + v[2]*v[2] >
           positionTolerance*positionTolerance)
-        {
+      {
         for (int i = 0; i < 3; i++)
-          {
+        {
           checkOrientation[10+i] = vdir*v[i];
-          }
-        vtkMath::Normalize(&checkOrientation[10]);
         }
+        vtkMath::Normalize(&checkOrientation[10]);
+      }
 
       // compare vector to check vector
       double w = vtkMath::Norm(&checkOrientation[10]);
@@ -289,33 +289,33 @@ double vtkDICOMSliceSorterComputeLocation(
       // the position tolerance is in millimetres
       if (d > (positionTolerance*positionTolerance +
                t*t*directionTolerance*directionTolerance))
-        {
+      {
         // positions don't line up along the normal
         *checkPtr = false;
-        }
+      }
       else if (checkOrientation[13] != 0 && vtkMath::Norm(v) > w)
-        {
+      {
         // use new vector as check vector if it is longer
         for (int i = 0; i < 3; i++)
-          {
+        {
           checkOrientation[10+i] = vdir*v[i];
-          }
         }
       }
+    }
     if (*checkPtr == false)
-      {
+    {
       // re-set the check orientation to the current stack
       for (int i = 0; i < 3; i++)
-        {
+      {
         checkOrientation[i] = orientation[i];
         checkOrientation[3+i] = orientation[3+i];
         checkOrientation[6+i] = position[i];
         checkOrientation[10+i] = normal[i];
-        }
+      }
       // mark the check vector as unset
       checkOrientation[13] = 0;
-      }
     }
+  }
 
   return location;
 }
@@ -331,39 +331,39 @@ double vtkDICOMSliceSorterComputeSpacing(
   int o = 0;
 
   while (m != 0)
-    {
+  {
     // compute the mean spacing and the variance in spacing
     double s1 = 0.0;
     double s2 = 0.0;
     size_t n = 0;
     o = 0;
     for (size_t i = 1; i < info.size(); i++)
-      {
+    {
       // first verify that locations aren't identical
       if (vtkDICOMSliceSorterSortInfo::CompareLocation(info[i-1], info[i]))
-        {
+      {
         // compute the offset
         double d = info[i].ComputedLocation - info[i-1].ComputedLocation;
         double dd = (d - a)*(d - a);
         // make sure offset is within 3 sigma or 10% of average offset
         if (dd < 0.01*a*a || dd < 9*v)
-          {
+        {
           s1 += d;
           s2 += d*d;
           n++;
-          }
+        }
         else
-          {
+        {
           o++;
-          }
         }
       }
+    }
 
     // no results!
     if (n == 0)
-      {
+    {
       break;
-      }
+    }
 
     // compute the mean and variance
     a = s1 / n;
@@ -371,13 +371,13 @@ double vtkDICOMSliceSorterComputeSpacing(
 
     // break if within tolerance or if results haven't changed
     if (v/(a*a) < 1e-6 || n == m)
-      {
+    {
       break;
-      }
+    }
 
     // save count to use as check
     m = n;
-    }
+  }
 
   *missing = o;
   return a;
@@ -439,17 +439,17 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
 
   // sort by instance first
   for (int i = 0; i < numFiles; i++)
-    {
+  {
     int inst = meta->GetAttributeValue(i, DC::InstanceNumber).AsInt();
     info.push_back(vtkDICOMSliceSorterSortInfo(i, inst));
-    }
+  }
   std::stable_sort(info.begin(), info.end(),
     vtkDICOMSliceSorterSortInfo::CompareInstance);
   std::vector<int> fileOrder(info.size());
   for (int i = 0; i < numFiles; i++)
-    {
+  {
     fileOrder[i] = info[i].FileNumber;
-    }
+  }
   info.clear();
 
   // important position-related variables
@@ -460,20 +460,20 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
     meta->GetAttributeValue(DC::SpacingBetweenSlices).AsDouble();
   double spacingSign = 1.0;
   if (spacingBetweenSlices == 0)
-    {
+  {
     spacingBetweenSlices = 1.0;
-    }
+  }
   else if (spacingBetweenSlices < 0)
-    {
+  {
     spacingBetweenSlices = -spacingBetweenSlices;
     spacingSign = -1.0;
-    }
+  }
 
   // important time-related variables
   int temporalSpacing = 1.0;
 
   if (meta->HasAttribute(DC::SharedFunctionalGroupsSequence))
-    {
+  {
     // a special stackInfo for the desired stack
     std::vector<vtkDICOMSliceSorterSortInfo> stackInfo;
     vtkDICOMValue firstStackId;
@@ -484,7 +484,7 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
 
     // files have enhanced frame information
     for (int ii = 0; ii < numFiles; ii++)
-      {
+    {
       int i = fileOrder[ii];
       int inst = meta->GetAttributeValue(i, DC::InstanceNumber).AsInt();
       int numberOfFrames =
@@ -497,70 +497,70 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
         meta->GetAttributeValue(i, DC::SharedFunctionalGroupsSequence);
 
       if (ii == 0 && numberOfFrames > 0)
-        {
+      {
         firstStackId = vtkDICOMSliceSorterGetFrameAttributeValue(
           frameSeq, sharedSeq, 0, DC::FrameContentSequence,
           DC::StackID);
-        }
+      }
 
       // attributes for getting time information
       vtkDICOMTag timeSequence;
       vtkDICOMTag timeTag;
 
       if (numberOfFrames > 0)
-        {
+      {
         // time information can come from these attributes
         if (vtkDICOMSliceSorterGetFrameAttributeValue(
               frameSeq, sharedSeq, 0, DC::CardiacSynchronizationSequence,
               DC::NominalCardiacTriggerDelayTime).IsValid())
-          {
+        {
           timeSequence = DC::CardiacSynchronizationSequence;
           timeTag = DC::NominalCardiacTriggerDelayTime;
-          }
+        }
         else if (vtkDICOMSliceSorterGetFrameAttributeValue(
                    frameSeq, sharedSeq, 0, DC::TemporalPositionSequence,
                    DC::TemporalPositionTimeOffset).IsValid())
-          {
+        {
           timeSequence = DC::TemporalPositionSequence;
           timeTag = DC::TemporalPositionTimeOffset;
           temporalSpacing = 1000.0; // convert seconds to milliseconds
-          }
+        }
         else if (vtkDICOMSliceSorterGetFrameAttributeValue(
                   frameSeq, sharedSeq, 0, DC::FrameContentSequence,
                   DC::TemporalPositionIndex).IsValid())
-          {
+        {
           timeSequence = DC::FrameContentSequence;
           timeTag = DC::TemporalPositionIndex;
-          }
+        }
         else if (vtkDICOMSliceSorterGetFrameAttributeValue(
                   frameSeq, sharedSeq, 0, DC::MREchoSequence,
                   DC::EffectiveEchoTime).IsValid())
-          {
+        {
           timeSequence = DC::MREchoSequence;
           timeTag = DC::EffectiveEchoTime;
-          }
         }
+      }
 
       // position counter
       int position = 0;
       double lastTime = 0.0;
 
       for (int k = 0; k < numberOfFrames; k++)
-        {
+      {
         // time: use chosen time tag, if present
         double t = 0.0;
         if (timeTag.GetGroup() != 0)
-          {
+        {
           t = vtkDICOMSliceSorterGetFrameAttributeValue(
             frameSeq, sharedSeq, k, timeSequence, timeTag).AsDouble();
-          }
+        }
 
         // adjust position only if time did not change
         if (fabs(t - lastTime) < 1e-3 || k == 0)
-          {
+        {
           position = k;
           lastTime = t;
-          }
+        }
 
         // get the StackID
         vtkDICOMValue stackId = vtkDICOMSliceSorterGetFrameAttributeValue(
@@ -568,25 +568,25 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
           DC::StackID);
 
         if (stackId.IsValid())
-          {
+        {
           // append new StackIDs to this->StackIDs
           vtkIdType stacksFound = this->StackIDs->GetNumberOfValues();
           std::string stackName = stackId.AsString();
           vtkIdType si;
           for (si = 0; si < stacksFound; si++)
-            {
+          {
             if (stackName == this->StackIDs->GetValue(si)) { break; }
-            }
+          }
           if (si == stacksFound)
-            {
+          {
             this->StackIDs->InsertNextValue(stackName);
-            }
+          }
 
           // position: look for InStackPositionNumber
           position = vtkDICOMSliceSorterGetFrameAttributeValue(
             frameSeq, sharedSeq, k, DC::FrameContentSequence,
             DC::InStackPositionNumber).AsInt();
-          }
+        }
 
         // check for valid Image Plane Module information
         vtkDICOMValue pv = vtkDICOMSliceSorterGetFrameAttributeValue(
@@ -598,7 +598,7 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
 
         // check if the StackId is the one the user specified
         if (stackId == desiredStackId)
-          {
+        {
           // compute location from orientation and IPP
           double location = vtkDICOMSliceSorterComputeLocation(
             pv, ov, stackCheckNormal, &canSortStackByIPP);
@@ -607,9 +607,9 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
 
           stackInfo.push_back(
             vtkDICOMSliceSorterSortInfo(i, k, inst, position, location, t));
-          }
+        }
         else if (stackId == firstStackId)
-          {
+        {
           // compute location from orientation and IPP
           double location = vtkDICOMSliceSorterComputeLocation(
             pv, ov, checkOrientation, &canSortByLocation);
@@ -618,54 +618,54 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
           // force output of one single volume
           if ((ii > 0 || k > 0) && !firstStackId.IsValid() &&
               pv.IsValid() && !canSortByLocation)
-            {
+          {
             canSortByLocation = true;
             volumeBreaks.push_back(info.size());
-            }
+          }
 
           info.push_back(
             vtkDICOMSliceSorterSortInfo(i, k, inst, position, location, t));
-          }
         }
       }
+    }
 
     // if frames with the desired stack ID were found, use them
     if (stackInfo.size() > 0)
-      {
+    {
       canSortByLocation = canSortStackByIPP;
       info = stackInfo;
-      }
     }
+  }
   else
-    {
+  {
     // ways to get time information
     vtkDICOMTag timeTag;
     if (meta->GetAttributeValue(DC::CardiacNumberOfImages).AsInt() > 1)
-      {
+    {
       timeTag = DC::TriggerTime;
-      }
+    }
     else if (meta->GetAttributeValue(
               DC::NumberOfTemporalPositions).AsInt() > 1)
-      {
+    {
       timeTag = DC::TemporalPositionIdentifier;
       temporalSpacing =
         meta->GetAttributeValue(DC::TemporalResolution).AsDouble();
-      }
+    }
     else if (meta->HasAttribute(DC::TemporalPositionIndex))
-      {
+    {
       timeTag = DC::TemporalPositionIndex;
-      }
+    }
     else if (meta->HasAttribute(DC::EchoTime))
-      {
+    {
       timeTag = DC::EchoTime;
-      }
+    }
 
     // position counter
     int position = 0;
     double lastTime = 0.0;
 
     for (int ii = 0; ii < numFiles; ii++)
-      {
+    {
       int i = fileOrder[ii];
 
       // get the instance number
@@ -686,33 +686,33 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
 
       // force output of one single rectilinear volume
       if (ii > 0 && !canSortByLocation && pv.IsValid())
-        {
+      {
         canSortByLocation = true;
         volumeBreaks.push_back(info.size());
-        }
+      }
 
       int numberOfFrames =
         meta->GetAttributeValue(i, DC::NumberOfFrames).AsInt();
       if (numberOfFrames <= 1)
-        {
+      {
         double t = 0.0;
         if (timeTag.GetGroup() != 0)
-          {
+        {
           t = meta->GetAttributeValue(i, timeTag).AsDouble();
-          }
+        }
 
         // adjust position only if time did not change
         if (fabs(t - lastTime) < 1e-3 || ii == 0)
-          {
+        {
           position = inst;
           lastTime = t;
-          }
+        }
 
         info.push_back(
           vtkDICOMSliceSorterSortInfo(i, 0, inst, position, location, t));
-        }
+      }
       else
-        {
+      {
         // multi-frame image
         double frameTimeSpacing = 0;
         vtkDICOMValue timeVector;
@@ -721,212 +721,230 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
         vtkDICOMValue locationVector;
         vtkDICOMValue fip =
           meta->GetAttributeValue(i, DC::FrameIncrementPointer);
-        unsigned int n = fip.GetNumberOfValues();
-        for (unsigned int j = 0; j < n; j++)
-          {
+        size_t n = fip.GetNumberOfValues();
+        for (size_t j = 0; j < n; j++)
+        {
           vtkDICOMTag tag = fip.GetTag(j);
           if (tag == DC::FrameTime)
-            { // for CINE
+          { // for CINE
             frameTimeSpacing = meta->GetAttributeValue(i, tag).AsDouble();
-            }
+          }
           else if (tag == DC::FrameTimeVector)
-            { // for CINE
+          { // for CINE
             timeVector = meta->GetAttributeValue(i, tag);
-            }
+          }
           else if (tag == DC::SliceLocationVector)
-            { // generic
+          { // generic
             locationVector = meta->GetAttributeValue(i, tag);
             canSortByLocation = true;
-            }
+          }
           else if (tag == DC::TimeSlotVector)
-            { // for NM
+          { // for NM
             timeSlotVector = meta->GetAttributeValue(i, tag);
-            }
+          }
           else if (tag == DC::SliceVector)
-            { // for NM
+          { // for NM
             sliceVector = meta->GetAttributeValue(i, tag);
-            }
+          }
           // in dynamic NM, the total number of time frames is the
           // sum of the number of frames in all collected phases,
           // we do not support dynamic NM yet
-          }
+        }
 
         if (timeSlotVector.IsValid() || sliceVector.IsValid())
-          {
+        {
           // tomographic NM
           for (int k = 0; k < numberOfFrames; k++)
-            {
+          {
             double t = 0.0;
             double frameloc = location;
             if (k < static_cast<int>(timeSlotVector.GetNumberOfValues()))
-              {
+            {
               t = (timeSlotVector.GetDouble(k) - 1.0)*frameTimeSpacing;
-              }
+            }
             if (k < static_cast<int>(sliceVector.GetNumberOfValues()))
-              {
+            {
               position = sliceVector.GetInt(k) - 1;
               frameloc += position*spacingSign;
-              }
+            }
             info.push_back(
               vtkDICOMSliceSorterSortInfo(i, k, inst, position, frameloc, t));
-            }
           }
+        }
         else
-          {
+        {
           // CINE
           double t = 0.0;
           for (int k = 0; k < numberOfFrames; k++)
-            {
+          {
             if (k > 0)
-              {
+            {
               if (k < static_cast<int>(timeVector.GetNumberOfValues()))
-                {
+              {
                 frameTimeSpacing = timeVector.GetDouble(k);
-                }
-              t += frameTimeSpacing;
               }
+              t += frameTimeSpacing;
+            }
             if (k < static_cast<int>(locationVector.GetNumberOfValues()))
-              {
+            {
               location = locationVector.GetDouble(k);
               location /= spacingBetweenSlices;
-              }
+            }
             info.push_back(
               vtkDICOMSliceSorterSortInfo(i, k, inst, inst, location, t));
-            }
           }
         }
       }
     }
+  }
 
   // orientation changes suggest that multiple volumes are present
   if (volumeBreaks.size() > 0)
-    {
+  {
     // count the number of unique positions
     size_t pcount = 0;
     for (size_t j = 0; j < info.size(); j++)
-      {
+    {
       int p = info[j].PositionNumber;
       size_t k;
       for (k = 0; k < j; k++)
-        {
+      {
         if (info[k].PositionNumber == p) { break; }
-        }
-      pcount += (k == j);
       }
+      pcount += (k == j);
+    }
 
     if (volumeBreaks.size() + 1 > pcount/2)
-      {
+    {
       // too many unique volumes would be created, assume
       // that the acquisition was not rectilinear.
       canSortByLocation = false;
-      }
+    }
     else
+    {
+      // breaks will be used to indicate new stacks
+      volumeBreaks.push_back(info.size());
+
+      size_t stt = 0;
+      size_t sttlen = volumeBreaks[0];
+      for (size_t k = 0; k < volumeBreaks.size(); k++)
       {
-      // load just one of the rectilinear stacks that are present
-      size_t stt = strtoul(this->DesiredStackID, 0, 10);
-      if (stt > volumeBreaks.size())
+        // build the list of StackIDs
+        vtkVariant var(k);
+        this->StackIDs->InsertNextValue(var.ToString());
+        size_t len = volumeBreaks[k] - (k == 0 ? 0 : volumeBreaks[k-1]);
+        // identify the first stack with multiple images
+        if (sttlen == 1 && len > sttlen)
         {
-        stt = 0;
+          stt = k;
+          sttlen = len;
         }
-      volumeBreaks.push_back(info.size());
+      }
+
+      // if DesiredStackID is set, use it
+      if (this->DesiredStackID[0] != '\0')
+      {
+        stt = strtoul(this->DesiredStackID, 0, 10);
+      }
+
+      // load just one of the rectilinear stacks that are present
+      if (stt >= volumeBreaks.size())
+      {
+        stt = 0;
+      }
       info.erase(info.begin() + volumeBreaks[stt], info.end());
       if (stt > 0)
-        {
+      {
         info.erase(info.begin(), info.begin() + volumeBreaks[stt-1]);
-        }
-      for (size_t k = 0; k < volumeBreaks.size(); k++)
-        {
-        vtkVariant var(k);
-        this->StackIDs->InsertNextValue(var.ToString());
-        }
       }
     }
+  }
 
   // sort by position, count the number of slices per location
   int numSlices = static_cast<int>(info.size());
   int slicesPerLocation = 0;
   if (numSlices > 1)
-    {
+  {
     if (canSortByLocation)
-      {
+    {
       std::stable_sort(info.begin(), info.end(),
         vtkDICOMSliceSorterSortInfo::CompareLocation);
-      }
+    }
     else
-      {
+    {
       std::stable_sort(info.begin(), info.end(),
         vtkDICOMSliceSorterSortInfo::ComparePosition);
-      }
+    }
 
     // look for slices at the same location
     std::vector<vtkDICOMSliceSorterSortInfo>::iterator iter = info.begin();
     int slicesAtThisLocation = 0;
     while (iter != info.end())
-      {
+    {
       std::vector<vtkDICOMSliceSorterSortInfo>::iterator nextIter = iter + 1;
       slicesAtThisLocation++;
       bool positionIncreased = false;
       if (nextIter != info.end())
-        {
+      {
         // use the tolerance built into CompareLocation
         if (canSortByLocation)
-          {
+        {
           positionIncreased =
             vtkDICOMSliceSorterSortInfo::CompareLocation(*iter, *nextIter);
-          }
+        }
         else
-          {
+        {
           positionIncreased =
             vtkDICOMSliceSorterSortInfo::ComparePosition(*iter, *nextIter);
-          }
         }
+      }
       if (nextIter == info.end() || positionIncreased)
-        {
+      {
         if (slicesPerLocation == 0)
-          {
+        {
           slicesPerLocation = slicesAtThisLocation;
-          }
+        }
         else if (slicesPerLocation != slicesAtThisLocation)
-          {
+        {
           slicesPerLocation = -1;
-          }
-        slicesAtThisLocation = 0;
         }
-      iter = nextIter;
+        slicesAtThisLocation = 0;
       }
+      iter = nextIter;
     }
+  }
   if (slicesPerLocation == 0)
-    {
+  {
     slicesPerLocation = 1;
-    }
+  }
   else if (slicesPerLocation == -1)
-    {
+  {
     slicesPerLocation = 1;
     vtkWarningMacro("Multidimensional series appears to be missing slices,"
                     " representation will be inaccurate.");
-    }
+  }
 
   // count number of unique time points
   int temporalPositions = 0;
   double tMin = VTK_DOUBLE_MAX;
   double tMax = VTK_DOUBLE_MIN;
   for (int i = 0; i < slicesPerLocation; i++)
-    {
+  {
     double d = info[i].Time;
     tMin = (d > tMin ? tMin : d);
     tMax = (d < tMax ? tMax : d);
     int u = 1;
     for (int j = 0; j < i; j++)
-      {
+    {
       u &= !(fabs(info[j].Time - d) < 1e-3);
-      }
-    temporalPositions += u;
     }
+    temporalPositions += u;
+  }
   // compute temporalSpacing from the apparent time spacing
   if (temporalPositions > 1)
-    {
+  {
     temporalSpacing *= (tMax - tMin)/(temporalPositions - 1);
-    }
+  }
 
   // compute the number of slices in the output image
   int spatialLocations = numSlices/slicesPerLocation;
@@ -934,34 +952,34 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
   if (temporalPositions > 0 &&
       this->TimeAsVector == 0 &&
       this->DesiredTimeIndex < 0)
-    {
+  {
     locations *= temporalPositions;
-    }
+  }
 
   // recompute slice spacing from position info
   if (canSortByLocation)
-    {
+  {
     double locDiff = 0;
     if (locations > 1)
-      {
+    {
       int missing = 0;
       locDiff = vtkDICOMSliceSorterComputeSpacing(info, &missing);
       if (missing > 0)
-        {
+      {
         vtkWarningMacro("Series has " << missing <<
                         " gaps due to missing slices.");
-        }
+      }
       if (locations > spatialLocations)
-        {
+      {
         // squeeze time slices between spatial slices
         locDiff *= spatialLocations*1.0/locations;
-        }
       }
+    }
     if (locDiff > 0)
-      {
+    {
       spacingBetweenSlices *= locDiff;
-      }
     }
+  }
 
   // write out the sorted indices
   bool flipOrder = (this->ReverseSlices != 0);
@@ -970,14 +988,14 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
   int numberOfComponents = filesPerOutputSlice;
   int desiredTimeIndex = this->DesiredTimeIndex;
   if (desiredTimeIndex < 0)
-    {
+  {
     desiredTimeIndex = 0;
-    }
+  }
   else
-    {
+  {
     desiredTimeIndex %= temporalPositions;
     numberOfComponents /= temporalPositions;
-    }
+  }
 
   files->SetNumberOfComponents(numberOfComponents);
   files->SetNumberOfTuples(locations);
@@ -985,21 +1003,21 @@ void vtkDICOMSliceSorter::SortFiles(vtkIntArray *files, vtkIntArray *frames)
   frames->SetNumberOfTuples(locations);
 
   for (int loc = 0; loc < locations; loc++)
-    {
+  {
     int l = loc/locationsPerSpatialLocation;
     int j = loc - l*locationsPerSpatialLocation;
     if (flipOrder)
-      {
+    {
       l = spatialLocations - l - 1;
-      }
+    }
     for (int k = 0; k < numberOfComponents; k++)
-      {
+    {
       int i = ((l*locationsPerSpatialLocation + j)*filesPerOutputSlice +
                desiredTimeIndex*numberOfComponents + k);
       files->SetComponent(loc, k, info[i].FileNumber);
       frames->SetComponent(loc, k, info[i].FrameNumber);
-      }
     }
+  }
 
   // save the slice spacing and time information
   this->SliceSpacing = spacingBetweenSlices;
diff --git a/Source/vtkDICOMSliceSorter.h b/Source/vtkDICOMSliceSorter.h
index e8f54fe..1e643df 100644
--- a/Source/vtkDICOMSliceSorter.h
+++ b/Source/vtkDICOMSliceSorter.h
@@ -34,83 +34,104 @@ public:
   void PrintSelf(ostream& os, vtkIndent indent);
   static vtkDICOMSliceSorter *New();
 
-  // Description:
-  // Set the Stack ID of the stack to use, for named stacks.
-  // If the series has multiple stacks, then by default only the
-  // first stack will be used.  This method allows you to select
-  // a different stack, if you know the DICOM StackID for the stack.
+  //@{
+  //! Set the Stack ID of the stack to use, for named stacks.
+  /*!
+   *  If the series has multiple stacks, then by default only the
+   *  first stack will be used.  This method allows you to select
+   *  a different stack, if you know the DICOM StackID for the stack.
+   */
   void SetDesiredStackID(const char *stackId);
   const char *GetDesiredStackID() { return this->DesiredStackID; }
 
-  // Description:
-  // Get a list of the stacks that are present.
-  // A stack is a contiguous array of slices that form a volume.
+  //! Get a list of the stacks that are present.
+  /*!
+   *  A stack is a contiguous array of slices that form a volume.
+   */
   vtkStringArray *GetStackIDs() { return this->StackIDs; }
-
-  // Description:
-  // Get an array that converts slice index to input file index.
-  // The array can be two-dimensional and calling array->GetComponent(i,j)
-  // will return the file index for slice i and scalar component j
-  // for monochrome images, or for slice i and scalar component 3*j
-  // for RGB images (or more precisely, at scalar component N*j where
-  // N is the SamplesPerPixel value from the DICOM metadata).  If the
-  // data has just one component, then use j=0.  Use this array to index
-  // into the MetaData object to get the metadata for a particular slice.
+  //@}
+
+  //@{
+  //! Get an array that converts slice index to input file index.
+  /*!
+   *  The array can be two-dimensional and calling array->GetComponent(i,j)
+   *  will return the file index for slice i and scalar component j
+   *  for monochrome images, or for slice i and scalar component 3*j
+   *  for RGB images (or more precisely, at scalar component N*j where
+   *  N is the SamplesPerPixel value from the DICOM metadata).  If the
+   *  data has just one component, then use j=0.  Use this array to index
+   *  into the MetaData object to get the metadata for a particular slice.
+   */
   vtkIntArray *GetFileIndexArray() { return this->FileIndexArray; }
 
-  // Description:
-  // Get an array that converts slice index to frame index.
-  // The purpose of this array is to identify individual frames in
-  // multi-frame DICOM files.  The dimensions of this array are identical
-  // to the FileIndexArray.  Use FileIndexArray to identify the file,
-  // then use FrameIndexArray to identify the frame within that file.
+  //! Get an array that converts slice index to frame index.
+  /*!
+   *  The purpose of this array is to identify individual frames in
+   *  multi-frame DICOM files.  The dimensions of this array are identical
+   *  to the FileIndexArray.  Use FileIndexArray to identify the file,
+   *  then use FrameIndexArray to identify the frame within that file.
+   */
   vtkIntArray *GetFrameIndexArray() { return this->FrameIndexArray; }
-
-  // Description:
-  // Set the meta data for the DICOM files.
-  // The GetAttributeValue() method of vtkDICOMMetaData takes optional
-  // file and frame indices, which specify the file and the frame within
-  // that file to get the attribute from.  If you have a slice index rather
-  // than a file index and frame index, then use the FileIndexArray and
-  // FrameIndexArray to convert the slice index into file and frame indices.
+  //@}
+
+  //@{
+  //! Set the meta data for the DICOM files.
+  /*!
+   *  The GetAttributeValue() method of vtkDICOMMetaData takes optional
+   *  file and frame indices, which specify the file and the frame within
+   *  that file to get the attribute from.  If you have a slice index rather
+   *  than a file index and frame index, then use the FileIndexArray and
+   *  FrameIndexArray to convert the slice index into file and frame indices.
+   */
   void SetMetaData(vtkDICOMMetaData *meta);
   vtkDICOMMetaData *GetMetaData() { return this->MetaData; }
-
-  // Description:
-  // Read the time dimension as scalar components (default: Off).
-  // If this is on, then each time point will be stored as a scalar
-  // component in the image data.  If the data has both a time dimension
-  // and a vector dimension, then the number of components will be the
-  // product of these two dimensions, i.e. the components will store
-  // a sequence of vectors, one vector for each time point.
+  //@}
+
+  //@{
+  //! Read the time dimension as scalar components (default: Off).
+  /*!
+   *  If this is on, then each time point will be stored as a scalar
+   *  component in the image data.  If the data has both a time dimension
+   *  and a vector dimension, then the number of components will be the
+   *  product of these two dimensions, i.e. the components will store
+   *  a sequence of vectors, one vector for each time point.
+   */
   vtkGetMacro(TimeAsVector, int);
   vtkSetMacro(TimeAsVector, int);
   vtkBooleanMacro(TimeAsVector, int);
+  //@}
 
-  // Description:
-  // Get the time dimension if the DICOM series has one.
+  //@{
+  //! Get the time dimension if the DICOM series has one.
   int GetTimeDimension() { return this->TimeDimension; }
   double GetTimeSpacing() { return this->TimeSpacing; }
+  //@}
 
-  // Description:
-  // Set the desired time index (set to -1 for all).
+  //@{
+  //! Set the desired time index (set to -1 for all).
   vtkSetMacro(DesiredTimeIndex, int);
   vtkGetMacro(DesiredTimeIndex, int);
+  //@}
 
-  // Description:
-  // Set whether to reverse the slice order.
-  // This is desired if the images are to be flipped.
+  //@{
+  //! Set whether to reverse the slice order.
+  /*!
+   *  This is desired if the images are to be flipped.
+   */
   vtkGetMacro(ReverseSlices, int);
   vtkSetMacro(ReverseSlices, int);
   vtkBooleanMacro(ReverseSlices, int);
+  //@}
 
-  // Description:
-  // Get the slice spacing for the volume.
+  //@{
+  //! Get the slice spacing for the volume.
   double GetSliceSpacing() { return this->SliceSpacing; }
+  //@}
 
-  // Description:
-  // Update the arrays.
+  //@{
+  //! Update the arrays.
   void Update();
+  //@}
 
 protected:
   vtkDICOMSliceSorter();
@@ -153,8 +174,8 @@ protected:
   double SliceSpacing;
 
 private:
-  vtkDICOMSliceSorter(const vtkDICOMSliceSorter&);  // Not implemented.
-  void operator=(const vtkDICOMSliceSorter&);  // Not implemented.
+  vtkDICOMSliceSorter(const vtkDICOMSliceSorter&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMSliceSorter&) VTK_DELETE_FUNCTION;
 };
 
 #endif
diff --git a/Source/vtkDICOMSorter.h b/Source/vtkDICOMSorter.h
index fc07575..3dfdbb3 100644
--- a/Source/vtkDICOMSorter.h
+++ b/Source/vtkDICOMSorter.h
@@ -20,23 +20,27 @@
 class VTKDICOM_EXPORT vtkDICOMSorter : public vtkDICOMFileSorter
 {
 public:
+  //@{
   vtkTypeMacro(vtkDICOMSorter,vtkDICOMFileSorter);
   void PrintSelf(ostream& os, vtkIndent indent);
   static vtkDICOMSorter *New();
+  //@}
 
+  //@{
   //! Get the first series in a particular study.
   int GetFirstSeriesInStudy(int study);
 
   //! Get the number of series in a particular study.
   int GetNumberOfSeriesInStudy(int study);
+  //@}
 
 protected:
   vtkDICOMSorter();
   ~vtkDICOMSorter();
 
 private:
-  vtkDICOMSorter(const vtkDICOMSorter&);  // Not implemented.
-  void operator=(const vtkDICOMSorter&);  // Not implemented.
+  vtkDICOMSorter(const vtkDICOMSorter&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMSorter&) VTK_DELETE_FUNCTION;
 };
 
 #endif
diff --git a/Source/vtkDICOMTag.cxx b/Source/vtkDICOMTag.cxx
index 385df68..4abe906 100644
--- a/Source/vtkDICOMTag.cxx
+++ b/Source/vtkDICOMTag.cxx
@@ -26,14 +26,14 @@ ostream& operator<<(ostream& o, const vtkDICOMTag& a)
   char *cp = text;
   *cp++ = '(';
   for (int j = 0; j < 2; j++)
-    {
+  {
     for (int i = 12; i >= 0; i -= 4)
-      {
+    {
       char d = ((t[j] >> i) & 0x000F);
       *cp++ = (d < 10 ? '0' + d : 'A' - 10 + d);
-      }
-    *cp++ = ',';
     }
+    *cp++ = ',';
+  }
   cp[-1] = ')';
   *cp = '\0';
 
diff --git a/Source/vtkDICOMTag.h b/Source/vtkDICOMTag.h
index 7855975..92b9593 100644
--- a/Source/vtkDICOMTag.h
+++ b/Source/vtkDICOMTag.h
@@ -28,6 +28,7 @@ public:
     unsigned int Key;
   };
 
+  //@{
   vtkDICOMTag() : Key(0) {}
 
   //! Construct a tag from group, element numbers.
@@ -38,7 +39,9 @@ public:
 
   //! Construct a tag object from a static tag.
   vtkDICOMTag(StaticTag tag) : Key(tag.Key) {}
+  //@}
 
+  //@{
   //! Get the 16-bit group identifier.
   unsigned short GetGroup() const {
     return static_cast<unsigned short>(this->Key >> 16); }
@@ -46,12 +49,16 @@ public:
   //! Get the 16-bit element identifier.
   unsigned short GetElement() const {
     return static_cast<unsigned short>(this->Key); }
+  //@}
 
+  //@{
   //! Compute a hash value, used for accelerating lookups.
   unsigned int ComputeHash() const {
     unsigned int h = (((this->Key >> 6) & 0x03FF03FF) ^ this->Key);
     return (h ^ (h << 16)) >> 16; }
+  //@}
 
+  //@{
   bool operator==(const vtkDICOMTag& b) const {
     return (this->Key == b.Key); }
 
@@ -69,6 +76,7 @@ public:
 
   bool operator>(const vtkDICOMTag& b) const {
     return (this->Key > b.Key); }
+  //@}
 
 private:
   unsigned int Key;
diff --git a/Source/vtkDICOMTagPath.cxx b/Source/vtkDICOMTagPath.cxx
index 53ab85a..99e86a9 100644
--- a/Source/vtkDICOMTagPath.cxx
+++ b/Source/vtkDICOMTagPath.cxx
@@ -13,23 +13,72 @@
 =========================================================================*/
 #include "vtkDICOMTagPath.h"
 
+//----------------------------------------------------------------------------
 ostream& operator<<(ostream& o, const vtkDICOMTagPath& a)
 {
   o << "[";
   o << a.GetHead();
   if (a.HasTail())
-    {
+  {
     vtkDICOMTagPath b = a;
     while (b.HasTail())
-      {
+    {
       o << ",";
       o << b.GetIndex();
       o << ",";
       o << b.GetHead();
       b = b.GetTail();
-      }
     }
+  }
   o << "]";
 
   return o;
 }
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator==(const vtkDICOMTagPath& b) const
+{
+  return (this->Head == b.Head &&
+          this->Index == b.Index &&
+          this->Tail == b.Tail &&
+          this->Index2 == b.Index2 &&
+          this->Tail2 == b.Tail2);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator!=(const vtkDICOMTagPath& b) const
+{
+  return !(*this == b);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator<(const vtkDICOMTagPath& b) const
+{
+  return (this->Head < b.Head ||
+          (this->Head == b.Head &&
+           (this->Index < b.Index ||
+            (this->Index == b.Index &&
+             (this->Tail < b.Tail ||
+              (this->Tail == b.Tail &&
+               (this->Index2 < b.Index2 ||
+                (this->Index2 == b.Index2 &&
+                 (this->Tail2 < b.Tail2)))))))));
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator>(const vtkDICOMTagPath& b) const
+{
+  return !(*this < b || *this == b);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator<=(const vtkDICOMTagPath& b) const
+{
+  return (*this < b || *this == b);
+}
+
+//----------------------------------------------------------------------------
+bool vtkDICOMTagPath::operator>=(const vtkDICOMTagPath& b) const
+{
+  return !(*this < b);
+}
diff --git a/Source/vtkDICOMTagPath.h b/Source/vtkDICOMTagPath.h
index 6d9bdc5..6778d5b 100644
--- a/Source/vtkDICOMTagPath.h
+++ b/Source/vtkDICOMTagPath.h
@@ -27,6 +27,7 @@
 class VTKDICOM_EXPORT vtkDICOMTagPath
 {
 public:
+  //@{
   //! Construct a tag path with an empty head and tail.
   vtkDICOMTagPath() : Head(), Index(0), Tail(), Index2(0), Tail2() {}
 
@@ -42,7 +43,9 @@ public:
   //! Construct a tag path from just a single tag.
   explicit vtkDICOMTagPath(vtkDICOMTag tag) :
     Head(tag), Index(0), Tail(), Index2(0), Tail2() {}
+  //@}
 
+  //@{
   //! If there is no tail, then Head is the end of the path.
   bool HasTail() const {
     return (this->Tail > vtkDICOMTag()); }
@@ -58,6 +61,16 @@ public:
   //! Get the remainder of the path.
   vtkDICOMTagPath GetTail() const {
     return vtkDICOMTagPath(this->Tail, this->Index2, this->Tail2); }
+  //@}
+
+  //@{
+  bool operator==(const vtkDICOMTagPath& b) const;
+  bool operator!=(const vtkDICOMTagPath& b) const;
+  bool operator<=(const vtkDICOMTagPath& b) const;
+  bool operator>=(const vtkDICOMTagPath& b) const;
+  bool operator<(const vtkDICOMTagPath& b) const;
+  bool operator>(const vtkDICOMTagPath& b) const;
+  //@}
 
 private:
   vtkDICOMTag Head;
diff --git a/Source/vtkDICOMToRAS.cxx b/Source/vtkDICOMToRAS.cxx
index 9a75a97..4f3656b 100644
--- a/Source/vtkDICOMToRAS.cxx
+++ b/Source/vtkDICOMToRAS.cxx
@@ -39,22 +39,22 @@ vtkDICOMToRAS::vtkDICOMToRAS()
   this->ReorderRows = 1;
   this->ReorderColumns = 1;
   for (int i = 0; i < 16; i++)
-    {
+  {
     this->Matrix[i] = 0.0;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
 vtkDICOMToRAS::~vtkDICOMToRAS()
 {
   if (this->RASMatrix)
-    {
+  {
     this->RASMatrix->Delete();
-    }
+  }
   if (this->PatientMatrix)
-    {
+  {
     this->PatientMatrix->Delete();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -64,35 +64,35 @@ void vtkDICOMToRAS::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "PatientMatrix:";
   if (this->PatientMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "RASMatrix:";
   if (this->RASMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->RASMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "RASToDICOM: " << this->RASToDICOM << "\n";
 
@@ -111,10 +111,10 @@ void vtkDICOMToRAS::SetRASToDICOM(int val)
 {
   val = (val != 0);
   if (val != this->RASToDICOM)
-    {
+  {
     this->RASToDICOM = val;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -122,10 +122,10 @@ void vtkDICOMToRAS::SetRASMatrixHasPosition(int val)
 {
   val = (val != 0);
   if (val != this->RASMatrixHasPosition)
-    {
+  {
     this->RASMatrixHasPosition = val;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -133,10 +133,10 @@ void vtkDICOMToRAS::SetAllowColumnReordering(int val)
 {
   val = (val != 0);
   if (val != this->AllowColumnReordering)
-    {
+  {
     this->AllowColumnReordering = val;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -144,10 +144,10 @@ void vtkDICOMToRAS::SetAllowRowReordering(int val)
 {
   val = (val != 0);
   if (val != this->AllowRowReordering)
-    {
+  {
     this->AllowRowReordering = val;
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -160,10 +160,10 @@ void vtkDICOMToRAS::CheckNeedToReorder()
   vtkMatrix4x4 *inputMatrix = (this->RASToDICOM  == 0 ?
     this->PatientMatrix : this->RASMatrix);
   if (inputMatrix)
-    {
+  {
     inputMatrix->MultiplyPoint(hdir, hdir);
     inputMatrix->MultiplyPoint(vdir, vdir);
-    }
+  }
 
   // do the DICOM-to-RAS sign changes
   hdir[0] = -hdir[0];
@@ -172,7 +172,7 @@ void vtkDICOMToRAS::CheckNeedToReorder()
   vdir[1] = -vdir[1];
 
   if (this->RASToDICOM)
-    {
+  {
     // for DICOM, hdir should be left (+x) or posterior (+y)
     this->ReorderColumns = (this->AllowColumnReordering &&
                             hdir[0] + hdir[1] < 0);
@@ -180,9 +180,9 @@ void vtkDICOMToRAS::CheckNeedToReorder()
     // for RAS, vdir should be inferior (-z) or posterior (+y)
     this->ReorderRows = (this->AllowRowReordering &&
                          vdir[1] - vdir[2] < 0);
-    }
+  }
   else
-    {
+  {
     // for RAS, hdir should be right (+x) or anterior (+y)
     this->ReorderColumns = (this->AllowColumnReordering &&
                             hdir[0] + hdir[1] < 0);
@@ -190,7 +190,7 @@ void vtkDICOMToRAS::CheckNeedToReorder()
     // for RAS, vdir should be superior (+z) or anterior (+y)
     this->ReorderRows = (this->AllowRowReordering &&
                          vdir[1] + vdir[2] < 0);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -200,17 +200,17 @@ void vtkDICOMToRAS::ComputeMatrix(
   double *matrix = this->Matrix;
 
   if (this->PatientMatrix && this->RASToDICOM == 0)
-    {
+  {
     vtkMatrix4x4::DeepCopy(matrix, this->PatientMatrix);
-    }
+  }
   else if (this->RASMatrix && this->RASToDICOM != 0)
-    {
+  {
     vtkMatrix4x4::DeepCopy(matrix, this->RASMatrix);
-    }
+  }
   else
-    {
+  {
     vtkMatrix4x4::Identity(matrix);
-    }
+  }
 
   // what corner of the input image will become the (0,0,0) corner
   // of the output image?
@@ -221,7 +221,7 @@ void vtkDICOMToRAS::ComputeMatrix(
 
   double bounds[6];
   for (int i = 0; i < 3; i++)
-    {
+  {
     bounds[2*i] = extent[2*i]*spacing[i] + origin[i];
     bounds[2*i + 1] = extent[2*i + 1]*spacing[i] + origin[i];
     origin[i] = bounds[2*i + flip[i]];
@@ -230,26 +230,26 @@ void vtkDICOMToRAS::ComputeMatrix(
     extent[2*i] = 0;
 
     if (flip[i])
-      {
+    {
       // reverse along columns for flips
       origin[i] = -origin[i];
       matrix[i] = -matrix[i];
       matrix[4 + i] = -matrix[4 + i];
       matrix[8 + i] = -matrix[8 + i];
-      }
+    }
 
     if (i == 0 || i == 1)
-      {
+    {
       // reverse along rows for LPS to RAS conversion
       matrix[4*i] = -matrix[4*i];
       matrix[4*i + 1] = -matrix[4*i + 1];
       matrix[4*i + 2] = -matrix[4*i + 2];
       matrix[4*i + 3] = -matrix[4*i + 3];
-      }
     }
+  }
 
   if (this->RASMatrixHasPosition || this->RASToDICOM)
-    {
+  {
     // origin moves into position (last column of matrix)
     double offset[4];
     offset[0] = origin[0];
@@ -266,9 +266,9 @@ void vtkDICOMToRAS::ComputeMatrix(
     origin[0] = 0.0;
     origin[1] = 0.0;
     origin[2] = 0.0;
-    }
+  }
   else
-    {
+  {
     // position moves into origin
     double offset[4];
     offset[0] = matrix[3];
@@ -287,7 +287,7 @@ void vtkDICOMToRAS::ComputeMatrix(
     origin[0] += offset[0];
     origin[1] += offset[1];
     origin[2] += offset[2];
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -298,36 +298,36 @@ void vtkDICOMToRAS::UpdateMatrix()
 
   vtkMatrix4x4 *outMatrix;
   if (this->RASToDICOM == 0)
-    {
+  {
     if (this->RASMatrix == 0)
-      {
+    {
       this->RASMatrix = vtkMatrix4x4::New();
-      }
-    outMatrix = this->RASMatrix;
     }
+    outMatrix = this->RASMatrix;
+  }
   else
-    {
+  {
     if (this->PatientMatrix == 0)
-      {
+    {
       this->PatientMatrix = vtkMatrix4x4::New();
-      }
-    outMatrix = this->PatientMatrix;
     }
+    outMatrix = this->PatientMatrix;
+  }
 
   const double *inElements = this->Matrix;
   double *outElements = *outMatrix->Element;
 
   bool changed = false;
   for (int i = 0; i < 16; i++)
-    {
+  {
     changed |= (inElements[i] != outElements[i]);
-    }
+  }
 
   // this ensures that the timestamp isn't changed unless values changed
   if (changed)
-    {
+  {
     outMatrix->DeepCopy(this->Matrix);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -354,9 +354,9 @@ int vtkDICOMToRAS::RequestInformation(
 
   // if converting to DICOM, add patient matrix to information
   if (this->RASToDICOM && this->RASMatrix)
-    {
+  {
     outInfo->Set(vtkDICOMAlgorithm::PATIENT_MATRIX(), this->Matrix, 16);
-    }
+  }
 
   outInfo->Set(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent, 6);
   outInfo->Set(vtkDataObject::SPACING(), spacing, 3);
@@ -388,17 +388,17 @@ int vtkDICOMToRAS::RequestUpdateExtent(
   flip[2] = flip[0] ^ flip[1];
 
   for (int i = 0; i < 3; i++)
-    {
+  {
     int offset = outExt[2*i];
     int size = outExt[2*i + 1] - outExt[2*i] + 1;
     int wholeSize = wholeExt[2*i + 1] - wholeExt[2*i] + 1;
     if (flip[i])
-      {
+    {
       offset = wholeSize - size - offset;
-      }
+    }
     inExt[2*i] = wholeExt[2*i] + offset;
     inExt[2*i + 1] = inExt[2*i] + size - 1;
-    }
+  }
 
   inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(), outExt, 6);
 
@@ -414,19 +414,19 @@ int vtkDICOMToRAS::RequestData(
   // output the matrix that goes with the image
   vtkMatrix4x4 *outMatrix = 0;
   if (this->RASToDICOM == 0)
-    {
+  {
     if (this->RASMatrix == 0)
-      {
+    {
       this->RASMatrix = vtkMatrix4x4::New();
-      }
-    outMatrix = this->RASMatrix;
     }
+    outMatrix = this->RASMatrix;
+  }
   else
-    {
+  {
     if (this->PatientMatrix == 0)
-      {
+    {
       this->PatientMatrix = vtkMatrix4x4::New();
-      }
+    }
     outMatrix = this->PatientMatrix;
 
     // copy the supplied matrix to the data information
@@ -434,22 +434,22 @@ int vtkDICOMToRAS::RequestData(
     vtkDataObject *outData = outInfo->Get(vtkDataObject::DATA_OBJECT());
     vtkInformation *dataInfo = outData->GetInformation();
     dataInfo->CopyEntry(outInfo, vtkDICOMAlgorithm::PATIENT_MATRIX());
-    }
+  }
 
   const double *inElements = this->Matrix;
   double *outElements = *outMatrix->Element;
 
   bool changed = false;
   for (int i = 0; i < 16; i++)
-    {
+  {
     changed |= (inElements[i] != outElements[i]);
-    }
+  }
 
   // this ensures that the timestamp isn't changed unless values changed
   if (changed)
-    {
+  {
     outMatrix->DeepCopy(this->Matrix);
-    }
+  }
 
   return this->Superclass::RequestData(request, inputVector, outputVector);
 }
@@ -479,20 +479,20 @@ void vtkDICOMToRASExecute(
   vtkIdType inIncY = inIncX*(inExt[1] - inExt[0] + 1);
   vtkIdType inIncZ = inIncY*(inExt[3] - inExt[2] + 1);
   if (flip[0])
-    {
+  {
     inPtr += inIncX*(sizeX - 1);
     inIncX = -inIncX;
-    }
+  }
   if (flip[1])
-    {
+  {
     inPtr += inIncY*(sizeY - 1);
     inIncY = -inIncY;
-    }
+  }
   if (flip[2])
-    {
+  {
     inPtr += inIncZ*(sizeZ - 1);
     inIncZ = -inIncZ;
-    }
+  }
 
   // progress tracking
   vtkIdType progressGoal = static_cast<vtkIdType>(sizeZ)*sizeY;
@@ -502,41 +502,41 @@ void vtkDICOMToRASExecute(
   // loop through the data and rearrange it
   const T *inPtrZ = inPtr;
   for (int k = 0; k < sizeZ; k++)
-    {
+  {
     const T *inPtrY = inPtrZ;
     for (int j = 0; j < sizeY; j++)
-      {
+    {
       if (progress != NULL && (progressCount % progressStep) == 0)
-        {
+      {
         progress->UpdateProgress(progressCount*1.0/progressGoal);
-        }
+      }
       progressCount++;
 
       const T *inPtrX = inPtrY;
       if (numComponents == 1)
-        {
+      {
         for (int i = 0; i < sizeX; i++)
-          {
+        {
           *outPtr++ = *inPtrX;
           inPtrX += inIncX;
-          }
         }
+      }
       else
-        {
+      {
         for (int i = 0; i < sizeX; i++)
-          {
+        {
           int c = numComponents;
           const T *inPtrC = inPtrX;
           do { *outPtr++ = *inPtrC++; } while (--c);
           inPtrX += inIncX;
-          }
         }
+      }
       inPtrY += inIncY;
       outPtr += outSkipY;
-      }
+    }
     inPtrZ += inIncZ;
     outPtr += outSkipZ;
-    }
+  }
 }
 
 } // end anonymous namespace
@@ -569,17 +569,17 @@ void vtkDICOMToRAS::ThreadedRequestData(
 
   int inExecuteExt[6];
   for (int i = 0; i < 3; i++)
-    {
+  {
     int offset = outExecuteExt[2*i];
     int size = outExecuteExt[2*i + 1] - outExecuteExt[2*i] + 1;
     int wholeSize = inWholeExt[2*i + 1] - inWholeExt[2*i] + 1;
     if (flip[i])
-      {
+    {
       offset = wholeSize - size - offset;
-      }
+    }
     inExecuteExt[2*i] = inWholeExt[2*i] + offset;
     inExecuteExt[2*i + 1] = inExecuteExt[2*i] + size - 1;
-    }
+  }
 
   int numComponents = input->GetNumberOfScalarComponents();
 
@@ -594,21 +594,21 @@ void vtkDICOMToRAS::ThreadedRequestData(
 
   // call the execute method
   if (outScalarType == inScalarType)
-    {
+  {
     switch (inScalarType)
-      {
+    {
       vtkTemplateAliasMacro(
         vtkDICOMToRASExecute(
           static_cast<const VTK_TT *>(inPtr), static_cast<VTK_TT *>(outPtr),
           flip, numComponents, inExt, outExt, outExecuteExt, progress));
       default:
         vtkErrorMacro("Execute: Unknown ScalarType");
-      }
     }
+  }
   else
-    {
+  {
     vtkErrorMacro("ThreadedRequestData: output scalar type does not match "
                   "input scalar type");
-    }
+  }
 
 }
diff --git a/Source/vtkDICOMToRAS.h b/Source/vtkDICOMToRAS.h
index 0cc76ac..d119149 100644
--- a/Source/vtkDICOMToRAS.h
+++ b/Source/vtkDICOMToRAS.h
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2012-2015 David Gobbi
+  Copyright (c) 2012-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -11,17 +11,17 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkDICOMToRAS - Convert DICOM orientation to RAS orientation
-// .SECTION Description
-// This class will modify an image and its position-and-orientation matrix
-// so that the patient coordinate system follows the conventions of NIFTI
-// and MINC, i.e. the x, y, and z axes will point in the right, anterior,
-// and superior directions respectively.  Optionally, the row and column
-// ordering of the image will also be modified so that the row direction
-// preferentially points right or anterior, and the column direction
-// preferentially points superior or anterior.
-// .SECTION Thanks
-// This class was contributed to VTK by David Gobbi.
+/*! \class vtkDICOMToRAS
+ *  \brief Convert DICOM orientation to RAS orientation
+ *
+ *  This class will modify an image and its position-and-orientation matrix
+ *  so that the patient coordinate system follows the conventions of NIFTI
+ *  and MINC, i.e. the x, y, and z axes will point in the right, anterior,
+ *  and superior directions respectively.  Optionally, the row and column
+ *  ordering of the image will also be modified so that the row direction
+ *  preferentially points right or anterior, and the column direction
+ *  preferentially points superior or anterior.
+ */
 
 #ifndef vtkDICOMToRAS_h
 #define vtkDICOMToRAS_h
@@ -35,90 +35,107 @@ class vtkMatrix4x4;
 class VTKDICOM_EXPORT vtkDICOMToRAS : public vtkThreadedImageAlgorithm
 {
 public:
-  // Description:
-  // Static method for construction.
+  //! Static method for construction.
   static vtkDICOMToRAS *New();
   vtkTypeMacro(vtkDICOMToRAS, vtkThreadedImageAlgorithm);
 
-  // Description:
-  // Print information about this object.
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Perform RAS to DICOM instead of DICOM to RAS.
+  //@{
+  //! Perform RAS to DICOM instead of DICOM to RAS.
   void SetRASToDICOM(int v);
   void RASToDICOMOn() { this->SetRASToDICOM(1); }
   void RASToDICOMOff() { this->SetRASToDICOM(0); }
   int GetRASToDICOM() { return this->RASToDICOM; }
-
-  // Description:
-  // Get a matrix to place the image within DICOM patient coords.
-  // This matrix is constructed from the ImageOrientationPatient
-  // and ImagePositionPatient meta data attributes.  See the
-  // SetMemoryRowOrder method for additional information.
+  //@}
+
+  //@{
+  //! Get a matrix to place the image within DICOM patient coords.
+  /*!
+   *  This matrix is constructed from the ImageOrientationPatient
+   *  and ImagePositionPatient meta data attributes.  See the
+   *  SetMemoryRowOrder method for additional information.
+   */
   void SetPatientMatrix(vtkMatrix4x4 *matrix);
   vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; }
-
-  // Description:
-  // Get a matrix that follows the RAS convention that can be used
-  // with the output image.  This matrix is only valid for the output
-  // image, it is not valid for the input image.
+  //@}
+
+  //@{
+  //! Get a matrix that follows the RAS convention that can be used
+  /*!
+   *  with the output image.  This matrix is only valid for the output
+   *  image, it is not valid for the input image.
+   */
   void SetRASMatrix(vtkMatrix4x4 *matrix);
   vtkMatrix4x4 *GetRASMatrix() { return this->RASMatrix; }
-
-  // Description:
-  // Update the RAS matrix without updating the output data.
-  // This requires that an input has been set, because the origin,
-  // spacing, and extent of the input data must be known in order
-  // to compute the matrix.
+  //@}
+
+  //@{
+  //! Update the RAS matrix without updating the output data.
+  /*!
+   *  This requires that an input has been set, because the origin,
+   *  spacing, and extent of the input data must be known in order
+   *  to compute the matrix.
+   */
   void UpdateMatrix();
-
-  // Description:
-  // Specify whether the RAS matrix should include the position in its
-  // final column (NIFTI style), or whether the final column should be
-  // zero and the position instead used to compute a new Origin for the
-  // output image.  If this option is On, then the Origin of the output
-  // image will be (0,0,0), and if it is Off, then the position stored
-  // the matrix will be (0,0,0).
+  //@}
+
+  //@{
+  //! Specify whether the RAS matrix should include the position in its
+  /*!
+   *  final column (NIFTI style), or whether the final column should be
+   *  zero and the position instead used to compute a new Origin for the
+   *  output image.  If this option is On, then the Origin of the output
+   *  image will be (0,0,0), and if it is Off, then the position stored
+   *  the matrix will be (0,0,0).
+   */
   void SetRASMatrixHasPosition(int v);
   void RASMatrixHasPositionOn() { this->SetRASMatrixHasPosition(1); }
   void RASMatrixHasPositionOff() { this->SetRASMatrixHasPosition(0); }
   int GetRASMatrixHasPosition() { return this->RASMatrixHasPosition; }
-
-  // Description:
-  // Allow the columns to be reordered so that columns with higher indices
-  // are further to the right or further anterior.  Note that if you turn
-  // this option on, then you are implicitly allowing slice reordering to
-  // occur as well.  If you turn both ColumnReordering and SliceReordering
-  // off, then the input data will be directly passed to the output.
+  //@}
+
+  //@{
+  //! Allow the columns to be reordered so that columns with higher indices
+  /*!
+   *  are further to the right or further anterior.  Note that if you turn
+   *  this option on, then you are implicitly allowing slice reordering to
+   *  occur as well.  If you turn both ColumnReordering and SliceReordering
+   *  off, then the input data will be directly passed to the output.
+   */
   void SetAllowColumnReordering(int v);
   void AllowColumnReorderingOn() { this->SetAllowColumnReordering(1); }
   void AllowColumnReorderingOff() { this->SetAllowColumnReordering(0); }
   int GetAllowColumnReordering() { return this->AllowColumnReordering; }
-
-  // Description:
-  // Allow the rows to be reordered so that rows with higher indices
-  // are further superior or further anterior.  Note that if you turn
-  // this option on, then you are implicitly allowing slice reordering to
-  // occur as well.  If you turn both ColumnReordering and SliceReordering
-  // off, then the input data will be directly passed to the output.
+  //@}
+
+  //@{
+  //! Allow the rows to be reordered so that rows with higher indices
+  /*!
+   *  are further superior or further anterior.  Note that if you turn
+   *  this option on, then you are implicitly allowing slice reordering to
+   *  occur as well.  If you turn both ColumnReordering and SliceReordering
+   *  off, then the input data will be directly passed to the output.
+   */
   void SetAllowRowReordering(int v);
   void AllowRowReorderingOn() { this->SetAllowRowReordering(1); }
   void AllowRowReorderingOff() { this->SetAllowRowReordering(0); }
   int GetAllowRowReordering() { return this->AllowRowReordering; }
+  //@}
 
 protected:
   vtkDICOMToRAS();
   ~vtkDICOMToRAS();
 
-  // Description:
-  // Check whether the data will be reordered in cols or rows.
+  //! Check whether the data will be reordered in cols or rows.
   void CheckNeedToReorder();
 
-  // Description:
-  // Compute the RAS matrix and store it in this->Matrix.
-  // If extent doesn't start at zero, make it so that it does.
-  // Also change the origin if RASMatrixHasPosition is Off.
+  //! Compute the RAS matrix and store it in this->Matrix.
+  /*!
+   *  If extent doesn't start at zero, make it so that it does.
+   *  Also change the origin if RASMatrixHasPosition is Off.
+   */
   void ComputeMatrix(int extent[6], double spacing[3], double origin[3]);
 
   virtual int RequestInformation(
@@ -150,8 +167,8 @@ protected:
   double Matrix[16];
 
 private:
-  vtkDICOMToRAS(const vtkDICOMToRAS&);  // Not implemented.
-  void operator=(const vtkDICOMToRAS&);  // Not implemented.
+  vtkDICOMToRAS(const vtkDICOMToRAS&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMToRAS&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMToRAS_h
diff --git a/Source/vtkDICOMUIDGenerator.cxx b/Source/vtkDICOMUIDGenerator.cxx
new file mode 100644
index 0000000..2e5f61b
--- /dev/null
+++ b/Source/vtkDICOMUIDGenerator.cxx
@@ -0,0 +1,523 @@
+/*=========================================================================
+
+  Program: DICOM for VTK
+
+  Copyright (c) 2012-2016 David Gobbi
+  All rights reserved.
+  See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#include "vtkDICOMUIDGenerator.h"
+
+#include "vtkDICOMFile.h"
+#include "vtkDICOMUtilities.h"
+
+#include <vtkObjectFactory.h>
+#include <vtkStringArray.h>
+
+#include <string.h>
+
+// needed for random number generation and time
+#ifdef _WIN32
+#include <windows.h>
+#include <wincrypt.h>
+#endif
+
+vtkStandardNewMacro(vtkDICOMUIDGenerator);
+vtkDICOMUIDGenerator *vtkDICOMUIDGenerator::Default;
+
+//----------------------------------------------------------------------------
+// A helper class to delete static variables when program exits.
+static unsigned int vtkDICOMUIDGeneratorInitializerCounter;
+
+// Perform initialization of static variables.
+vtkDICOMUIDGeneratorInitializer::vtkDICOMUIDGeneratorInitializer()
+{
+  if (vtkDICOMUIDGeneratorInitializerCounter++ == 0)
+  {
+    vtkDICOMUIDGenerator::Default = vtkDICOMUIDGenerator::New();
+  }
+}
+
+// Perform cleanup of static variables.
+vtkDICOMUIDGeneratorInitializer::~vtkDICOMUIDGeneratorInitializer()
+{
+  if (--vtkDICOMUIDGeneratorInitializerCounter == 0)
+  {
+    if (vtkDICOMUIDGenerator::Default)
+    {
+      vtkDICOMUIDGenerator::Default->Delete();
+    }
+  }
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMUIDGenerator::vtkDICOMUIDGenerator()
+{
+  this->UIDPrefix = NULL;
+}
+
+//----------------------------------------------------------------------------
+vtkDICOMUIDGenerator::~vtkDICOMUIDGenerator()
+{
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMUIDGenerator::PrintSelf(ostream& os, vtkIndent indent)
+{
+  this->Superclass::PrintSelf(os, indent);
+
+  os << indent << "UIDPrefix: "
+     << (this->UIDPrefix ? this->UIDPrefix : "(NULL)") << "\n";
+}
+
+//----------------------------------------------------------------------------
+const char *vtkDICOMUIDGenerator::GetUIDPrefix()
+{
+  const char *prefix = this->UIDPrefix;
+  if (prefix == NULL)
+  {
+    prefix = vtkDICOMUtilities::GetUIDPrefix();
+  }
+  return prefix;
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMUIDGenerator::SetUIDPrefix(const char *uid)
+{
+  if (uid)
+  {
+    this->UIDPrefix = this->UIDPrefixStore;
+    strncpy(this->UIDPrefix, uid, 63);
+    this->UIDPrefix[63] = '\0';
+  }
+  else
+  {
+    this->UIDPrefix = NULL;
+  }
+}
+
+//----------------------------------------------------------------------------
+namespace {
+
+// divide a hex string by 10, return remainder
+int vtkDivideHexStringBy10(char *value)
+{
+  char *cp = value;
+
+  // convert hex string to binary
+  unsigned int x = 0;
+  while (*cp != '\0')
+  {
+    // skip any hyphens
+    if (*cp == '-')
+    {
+      cp++;
+      continue;
+    }
+
+    // convert hex digit to a nibble
+    unsigned int d = *cp;
+    if ((d -= '0') > 9)
+    {
+      if ((d -= ('A' - '0' - 10)) > 15)
+      {
+        d -= ('a' - 'A');
+      }
+    }
+
+    // append the nibble
+    x <<= 4;
+    x += d;
+
+    // divide by 10
+    unsigned int y = (10 << 3);
+    unsigned int z = 0;
+    int i;
+    for (i = 0; i < 4; i++)
+    {
+      z <<= 1;
+      int nx = x - y;
+      if (nx >= 0)
+      {
+        x = nx;
+        z++;
+      }
+      y >>= 1;
+    }
+
+    // convert quotient to new hex digit
+    if ((z += '0') > '9')
+    {
+      z += ('A' - '0' - 10);
+    }
+
+    *cp++ = static_cast<char>(z);
+  }
+
+  // return the remainder
+  return static_cast<int>(x);
+}
+
+// convert a hex uuid string to a decimal uid string, the
+// supplied uid will be at most 1.5 times as long as the uuid
+void vtkConvertHexToDecimal(const char *uuid, char *uid)
+{
+  // max characters in a uuid and uid
+  const unsigned int uuidlen = 36;
+  const unsigned int uidlen = 64;
+
+  char x[uuidlen + 4];
+  char y[uidlen + 4];
+
+  if (uuid[0] == '0' && uuid[1] == 'x')
+  {
+    uuid += 2;
+  }
+
+  strncpy(x, uuid, uuidlen);
+  x[uuidlen] = '\0';
+
+  char *cp = y + uidlen;
+  *cp = '\0';
+
+  char *dp = x;
+  do
+  {
+    *(--cp) = vtkDivideHexStringBy10(x) + '0';
+    // remove any leading zeros
+    while (*dp == '0' || *dp == '-')
+    {
+      dp++;
+    }
+  }
+  while (*dp != '\0');
+
+  // copy out the result
+  strcpy(uid, cp);
+}
+
+// convert a byte into two hexadecimal digits
+inline void vtkGenerateHexDigits(unsigned char y, char cp[2])
+{
+  unsigned int z = (y >> 4);
+  for (int j = 0; j < 2; j++)
+  {
+    if ((z += '0') > '9')
+    {
+      z += ('A' - '0' - 10);
+    }
+    cp[j] = static_cast<char>(z);
+    z = (y & 0x0F);
+  }
+}
+
+// convert n bytes into 2*n hexadecimal digits
+void vtkConvertBytesToHex(const unsigned char *bytes, size_t n, char *cp)
+{
+  for (size_t i = 0; i < n; i++)
+  {
+    vtkGenerateHexDigits(*bytes, cp);
+    bytes++;
+    cp += 2;
+  }
+  *cp = '\0';
+}
+
+// generate a 36-character uuid from a 128-bit random number
+// (the supplied pointer must have 37 bytes of available space)
+void vtkConvertRandomToUUID(const unsigned char bytes[16], char *uuid)
+{
+  // copy it so that we can modify it
+  char r[16];
+  for (int j = 0; j < 16; j++)
+  {
+    r[j] = bytes[j];
+  }
+
+  // set bits to show that this is a version 4 uuid
+  r[6] = ((r[6] & 0x0f) | 0x40);
+
+  // set the uuid variant to "0b10" (0b == binary)
+  r[8] = ((r[8] & 0x3f) | 0x80);
+
+  // convert the uuid into hexidecimal text
+  char *cp = uuid;
+  for (unsigned int i = 0; i < 16; i++)
+  {
+    // add hyphens to the uuid (just to be pedantic)
+    if (i == 4 || i == 6 || i == 8 || i == 10)
+    {
+      *cp++ = '-';
+    }
+
+    vtkGenerateHexDigits(r[i], cp);
+    cp += 2;
+  }
+
+  *cp = '\0';
+}
+
+// convert a 36-character uuid to a 44-character uid
+void vtkConvertUUIDToUID(const char *uuid, char *uid)
+{
+  strncpy(uid, "2.25.", 5);
+  vtkConvertHexToDecimal(uuid, uid + 5);
+}
+
+// read from the random number generator
+void vtkGenerateRandomBytes(unsigned char *bytes, vtkIdType n)
+{
+  int r = 0;
+#ifdef _WIN32
+  // use the Windows cryptography interface (WinXP and later)
+  HCRYPTPROV hProv;
+  r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
+                          CRYPT_SILENT);
+  if (r == 0 && GetLastError() == NTE_BAD_KEYSET)
+  {
+    r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
+                            CRYPT_SILENT | CRYPT_NEWKEYSET);
+  }
+  if (r != 0)
+  {
+    r = CryptGenRandom(hProv, n, reinterpret_cast<BYTE *>(bytes));
+    CryptReleaseContext(hProv, 0);
+  }
+#else
+  vtkDICOMFile infile("/dev/urandom", vtkDICOMFile::In);
+  if (infile.GetError() == 0)
+  {
+    size_t m = infile.Read(bytes, n);
+    r = (m == static_cast<size_t>(n));
+    infile.Close();
+  }
+#endif
+  if (r == 0)
+  {
+    memset(bytes, '\0', n);
+    vtkGenericWarningMacro(
+      "vtkDICOMUIDGenerator::GenerateUID() failed to read from "
+      "the random number generator");
+  }
+}
+
+// to add a little bit of recognizability to UIDs
+char vtkDICOMTagToDigit(vtkDICOMTag tag)
+{
+  char d = '1';
+
+  if (tag == DC::SOPInstanceUID ||
+      tag == DC::MediaStorageSOPInstanceUID)
+  {
+    d = '2';
+  }
+  else if (tag == DC::SeriesInstanceUID ||
+           tag == DC::ConcatenationUID)
+  {
+    d = '3';
+  }
+  else if (tag == DC::StudyInstanceUID)
+  {
+    d = '4';
+  }
+  else if (tag == DC::FrameOfReferenceUID ||
+           tag == DC::VolumeFrameOfReferenceUID ||
+           tag == DC::SourceFrameOfReferenceUID ||
+           tag == DC::SynchronizationFrameOfReferenceUID ||
+           tag == DC::TableFrameOfReferenceUID)
+  {
+    d = '5';
+  }
+
+  return d;
+}
+
+// get the number of random bytes to generate after this prefix
+vtkIdType vtkRandomBytesForPrefix(const char *prefix)
+{
+  size_t n = strlen(prefix);
+  if (n > 0 && prefix[n-1] != '.')
+  {
+    n++;
+  }
+  n = 64 - n;
+  vtkIdType m = 0;
+  if (n > 40)
+  {
+    m = 16; // use 128 bit random number
+  }
+  else
+  {
+    m = 12; // use 96 bit random number
+  }
+
+  return m;
+}
+
+// generate a prefixed UID using the provided random bytes
+void vtkGeneratePrefixedUID(
+  const unsigned char *r, vtkIdType m, const char *prefix, char d,
+  char uid[64])
+{
+  size_t i = 0;
+  while (*prefix != '\0' && i < 62)
+  {
+    uid[i++] = *prefix++;
+  }
+  if (i > 0 && i < 62 && uid[i-1] != '.')
+  {
+    uid[i++] = '.';
+  }
+
+  char hexs[36];
+  vtkConvertBytesToHex(r, m, hexs);
+  char decs[40];
+  vtkConvertHexToDecimal(hexs, decs);
+
+  // generate the leading digit as the UID type
+  if (d >= '1' && d <= '9')
+  {
+    // decimal digits required to store an integer with N-1 bytes
+    static const int maxDigits[16] = {
+      3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39
+    };
+
+    uid[i++] = d;
+    // add zeros so all uids will be the same length
+    size_t n = maxDigits[(m-1) & 0x0f];
+    for (size_t l = strlen(decs); l < n && i < 63; l++)
+    {
+      uid[i++] = '0';
+    }
+  }
+
+  const char *cp = decs;
+  while (i < 63 && *cp != '\0')
+  {
+    uid[i++] = *cp++;
+  }
+
+  while (i < 64)
+  {
+    uid[i++] = '\0';
+  }
+}
+
+} // end anonymous namespace
+
+//----------------------------------------------------------------------------
+std::string vtkDICOMUIDGenerator::GenerateUID(vtkDICOMTag tag)
+{
+  const char *prefix = this->GetUIDPrefix();
+  char uid[64];
+
+  if (prefix[0] == '\0' ||
+      (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' &&
+       prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0')))
+  {
+    // generate a 128-bit random number
+    unsigned char r[16];
+    vtkGenerateRandomBytes(r, 16);
+
+    // convert to a hex uuid
+    char uuid[40];
+    vtkConvertRandomToUUID(r, uuid);
+
+    // convert the hex uuid into a DICOM UID with root 2.25
+    vtkConvertUUIDToUID(uuid, uid);
+  }
+  else
+  {
+    // after prefix, add a "UID type" digit followed by random digits
+    unsigned char r[16];
+    vtkIdType m = vtkRandomBytesForPrefix(prefix);
+    vtkGenerateRandomBytes(r, m);
+    char d = vtkDICOMTagToDigit(tag);
+    vtkGeneratePrefixedUID(r, m, prefix, d, uid);
+  }
+
+  return uid;
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMUIDGenerator::GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids)
+{
+  const char *prefix = this->GetUIDPrefix();
+
+  bool useUUIDForUID =
+    (prefix[0] == '\0' ||
+      (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' &&
+       prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0')));
+
+  vtkIdType m = 16;
+  char d = '0';
+  if (!useUUIDForUID)
+  {
+    m = vtkRandomBytesForPrefix(prefix);
+    d = vtkDICOMTagToDigit(tag);
+  }
+
+  // read from random number generator
+  vtkIdType n = uids->GetNumberOfValues();
+  unsigned char *r = new unsigned char[n*m];
+  vtkGenerateRandomBytes(r, n*m);
+
+  for (vtkIdType i = 0; i < n; i++)
+  {
+    char uid[64];
+
+    if (useUUIDForUID)
+    {
+      char uuid[40];
+      vtkConvertRandomToUUID(r + i*m, uuid);
+      vtkConvertUUIDToUID(uuid, uid);
+    }
+    else
+    {
+      vtkGeneratePrefixedUID(r + i*m, m, prefix, d, uid);
+    }
+
+    // put uids into the array in order (simple insertion sort)
+    vtkIdType j = 0;
+    for (; j < i; j++)
+    {
+      if (vtkDICOMUtilities::CompareUIDs(uids->GetValue(j), uid) > 0)
+      {
+        break;
+      }
+    }
+    for (vtkIdType k = i; k > j; --k)
+    {
+      uids->SetValue(k, uids->GetValue(k - 1));
+    }
+    uids->SetValue(j, uid);
+  }
+
+  delete [] r;
+}
+
+//----------------------------------------------------------------------------
+void vtkDICOMUIDGenerator::SetDefault(vtkDICOMUIDGenerator *uidgen)
+{
+  if (uidgen != vtkDICOMUIDGenerator::Default)
+  {
+    if (vtkDICOMUIDGenerator::Default)
+    {
+      vtkDICOMUIDGenerator::Default->Delete();
+    }
+    if (uidgen)
+    {
+      uidgen->Register(NULL);
+    }
+    else
+    {
+      uidgen = vtkDICOMUIDGenerator::New();
+    }
+    vtkDICOMUIDGenerator::Default = uidgen;
+  }
+}
diff --git a/Source/vtkDICOMUIDGenerator.h b/Source/vtkDICOMUIDGenerator.h
new file mode 100644
index 0000000..771db15
--- /dev/null
+++ b/Source/vtkDICOMUIDGenerator.h
@@ -0,0 +1,131 @@
+/*=========================================================================
+
+  Program: DICOM for VTK
+
+  Copyright (c) 2012-2016 David Gobbi
+  All rights reserved.
+  See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
+
+     This software is distributed WITHOUT ANY WARRANTY; without even
+     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+     PURPOSE.  See the above copyright notice for more information.
+
+=========================================================================*/
+#ifndef vtkDICOMUIDGenerator_h
+#define vtkDICOMUIDGenerator_h
+
+#include <vtkObject.h>
+#include <vtkStdString.h> // For std::string
+#include "vtkDICOMModule.h" // For export macro
+#include "vtkDICOMTag.h" // For method parameter
+
+class vtkStringArray;
+
+//! Generate UIDs for written DICOM files.
+/*!
+ *  This class generates UIDs that begin with a specified prefix, and are
+ *  are followed by a sequence of digits that are sufficiently random that
+ *  the possibility of UID collisions is vanishingly small.  The default
+ *  prefix 2.25. (which can be used by anyone) is followed by a 128-bit
+ *  random number.  Other prefixes (which can only be used by a designated
+ *  organization) are followed by a 128-bit random number if the prefix is
+ *  shorter than 24 chars, or a 96-bit random number if the prefix is 24
+ *  chars or longer.
+ */
+class VTKDICOM_EXPORT vtkDICOMUIDGenerator : public vtkObject
+{
+public:
+  //! Static method for construction.
+  //@{
+  static vtkDICOMUIDGenerator *New();
+  vtkTypeMacro(vtkDICOMUIDGenerator, vtkObject);
+  //@}
+
+  //! Print information about this object.
+  virtual void PrintSelf(ostream& os, vtkIndent indent);
+
+  //@{
+  //! Set a UID prefix to use when generating UIDs.
+  /*!
+   *  If this is not set, or if it is set to NULL, then the default
+   *  prefix set via vtkDICOMUtilities::SetUIDPrefix() will be used.
+   *  Its default is the 2.25. prefix.
+   */
+  void SetUIDPrefix(const char *prefix);
+
+  //! Get the current UID prefix.
+  /*!
+   *  If no prefix was set, then this will return the same value as
+   *  vtkDICOMUtilities::GetUIDPrefix().
+   */
+  const char *GetUIDPrefix();
+  //@}
+
+  //@{
+  //! Generate a UID for the provided tag.
+  /*
+   *  The generator uses the tag as a hint when generating the UIDs,
+   *  for example the SOPInstanceUID might have a different format from
+   *  the FrameOfReferenceUID.
+   */
+  virtual std::string GenerateUID(vtkDICOMTag tag);
+
+  //! Generate a series of UIDs, sorted from low to high.
+  /*!
+   *  Before passing the string array, call SetNumberOfValues() on
+   *  the array to specify the number of UIDs that you want to be
+   *  stored in it.  The stored UIDs will be sorted, low to high.
+   *  Generating a batch of UIDs is more efficient than calling
+   *  GenerateUID() repeatedly.
+   */
+  virtual void GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids);
+  //@}
+
+  //@{
+  //! Set the default UID generator.
+  /*!
+   *  This can be used to set an application-wide UID generator.
+   */
+  static void SetDefault(vtkDICOMUIDGenerator *uidgen);
+
+  //! Get the default UID generator.
+  static vtkDICOMUIDGenerator *GetDefault() {
+    return vtkDICOMUIDGenerator::Default; }
+  //@}
+
+protected:
+  vtkDICOMUIDGenerator();
+  ~vtkDICOMUIDGenerator();
+
+  char *UIDPrefix;
+  char UIDPrefixStore[64];
+  static vtkDICOMUIDGenerator *Default;
+
+private:
+  friend class vtkDICOMUIDGeneratorInitializer;
+
+  vtkDICOMUIDGenerator(const vtkDICOMUIDGenerator&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMUIDGenerator&) VTK_DELETE_FUNCTION;
+};
+
+//! @cond
+//! Initializer (Schwarz counter).
+/*!
+ *  This ensures that the vtkDICOMUIDGenerator module is initialized before
+ *  any other module that includes this header file.
+ */
+class VTKDICOM_EXPORT vtkDICOMUIDGeneratorInitializer
+{
+public:
+  vtkDICOMUIDGeneratorInitializer();
+  ~vtkDICOMUIDGeneratorInitializer();
+private:
+  vtkDICOMUIDGeneratorInitializer(const vtkDICOMUIDGeneratorInitializer&);
+  vtkDICOMUIDGeneratorInitializer& operator=(
+    const vtkDICOMUIDGeneratorInitializer&);
+};
+
+static vtkDICOMUIDGeneratorInitializer vtkDICOMUIDGeneratorInitializerInstance;
+//! @endcond
+
+#endif // vtkDICOMUIDGenerator_h
diff --git a/Source/vtkDICOMUtilities.cxx b/Source/vtkDICOMUtilities.cxx
index a25135c..0496728 100644
--- a/Source/vtkDICOMUtilities.cxx
+++ b/Source/vtkDICOMUtilities.cxx
@@ -16,6 +16,7 @@
 #include <vtkStringArray.h>
 #include <vtkObjectFactory.h>
 #include "vtkDICOMUtilities.h"
+#include "vtkDICOMUIDGenerator.h"
 #include "vtkDICOMFile.h"
 #include "vtkDICOMConfig.h"
 
@@ -39,403 +40,18 @@
 
 vtkStandardNewMacro(vtkDICOMUtilities);
 
-namespace {
-
-// divide a hex string by 10, return remainder
-int vtkDivideHexStringBy10(char *value)
-{
-  char *cp = value;
-
-  // convert hex string to binary
-  unsigned int x = 0;
-  while (*cp != '\0')
-    {
-    // skip any hyphens
-    if (*cp == '-')
-      {
-      cp++;
-      continue;
-      }
-
-    // convert hex digit to a nibble
-    unsigned int d = *cp;
-    if ((d -= '0') > 9)
-      {
-      if ((d -= ('A' - '0' - 10)) > 15)
-        {
-        d -= ('a' - 'A');
-        }
-      }
-
-    // append the nibble
-    x <<= 4;
-    x += d;
-
-    // divide by 10
-    unsigned int y = (10 << 3);
-    unsigned int z = 0;
-    int i;
-    for (i = 0; i < 4; i++)
-      {
-      z <<= 1;
-      int nx = x - y;
-      if (nx >= 0)
-        {
-        x = nx;
-        z++;
-        }
-      y >>= 1;
-      }
-
-    // convert quotient to new hex digit
-    if ((z += '0') > '9')
-      {
-      z += ('A' - '0' - 10);
-      }
-
-    *cp++ = static_cast<char>(z);
-    }
-
-  // return the remainder
-  return static_cast<int>(x);
-}
-
-// convert a hex uuid string to a decimal uid string, the
-// supplied uid will be at most 1.5 times as long as the uuid
-void vtkConvertHexToDecimal(const char *uuid, char *uid)
-{
-  // max characters in a uuid and uid
-  const unsigned int uuidlen = 36;
-  const unsigned int uidlen = 64;
-
-  char x[uuidlen + 4];
-  char y[uidlen + 4];
-
-  if (uuid[0] == '0' && uuid[1] == 'x')
-    {
-    uuid += 2;
-    }
-
-  strncpy(x, uuid, uuidlen);
-  x[uuidlen] = '\0';
-
-  char *cp = y + uidlen;
-  *cp = '\0';
-
-  char *dp = x;
-  do
-    {
-    *(--cp) = vtkDivideHexStringBy10(x) + '0';
-    // remove any leading zeros
-    while (*dp == '0' || *dp == '-')
-      {
-      dp++;
-      }
-    }
-  while (*dp != '\0');
-
-  // copy out the result
-  strcpy(uid, cp);
-}
-
-// convert a byte into two hexadecimal digits
-inline void vtkGenerateHexDigits(unsigned char y, char cp[2])
-{
-  unsigned int z = (y >> 4);
-  for (int j = 0; j < 2; j++)
-    {
-    if ((z += '0') > '9')
-      {
-      z += ('A' - '0' - 10);
-      }
-    cp[j] = static_cast<char>(z);
-    z = (y & 0x0F);
-    }
-}
-
-// convert n bytes into 2*n hexadecimal digits
-void vtkConvertBytesToHex(const unsigned char *bytes, size_t n, char *cp)
-{
-  for (size_t i = 0; i < n; i++)
-    {
-    vtkGenerateHexDigits(*bytes, cp);
-    bytes++;
-    cp += 2;
-    }
-  *cp = '\0';
-}
-
-// generate a 36-character uuid from a 128-bit random number
-// (the supplied pointer must have 37 bytes of available space)
-void vtkConvertRandomToUUID(const unsigned char bytes[16], char *uuid)
-{
-  // copy it so that we can modify it
-  char r[16];
-  for (int j = 0; j < 16; j++)
-    {
-    r[j] = bytes[j];
-    }
-
-  // set bits to show that this is a version 4 uuid
-  r[6] = ((r[6] & 0x0f) | 0x40);
-
-  // set the uuid variant to "0b10" (0b == binary)
-  r[8] = ((r[8] & 0x3f) | 0x80);
-
-  // convert the uuid into hexidecimal text
-  char *cp = uuid;
-  for (unsigned int i = 0; i < 16; i++)
-    {
-    // add hyphens to the uuid (just to be pedantic)
-    if (i == 4 || i == 6 || i == 8 || i == 10)
-      {
-      *cp++ = '-';
-      }
-
-    vtkGenerateHexDigits(r[i], cp);
-    cp += 2;
-    }
-
-  *cp = '\0';
-}
-
-// convert a 36-character uuid to a 44-character uid
-void vtkConvertUUIDToUID(const char *uuid, char *uid)
-{
-  strncpy(uid, "2.25.", 5);
-  vtkConvertHexToDecimal(uuid, uid + 5);
-}
-
-// read from the random number generator
-void vtkGenerateRandomBytes(unsigned char *bytes, vtkIdType n)
-{
-  int r = 0;
-#ifdef _WIN32
-  // use the Windows cryptography interface (WinXP and later)
-  HCRYPTPROV hProv;
-  r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
-                          CRYPT_SILENT);
-  if (r == 0 && GetLastError() == NTE_BAD_KEYSET)
-    {
-    r = CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,
-                            CRYPT_SILENT | CRYPT_NEWKEYSET);
-    }
-  if (r != 0)
-    {
-    r = CryptGenRandom(hProv, n, reinterpret_cast<BYTE *>(bytes));
-    CryptReleaseContext(hProv, 0);
-    }
-#else
-  vtkDICOMFile infile("/dev/urandom", vtkDICOMFile::In);
-  if (infile.GetError() == 0)
-    {
-    size_t m = infile.Read(bytes, n);
-    r = (m == static_cast<size_t>(n));
-    infile.Close();
-    }
-#endif
-  if (r == 0)
-    {
-    memset(bytes, '\0', n);
-    vtkGenericWarningMacro(
-      "vtkDICOMUtilities::GenerateUID() failed to read from "
-      "the random number generator");
-    }
-}
-
-// to add a little bit of recognizability to UIDs
-char vtkDICOMTagToDigit(vtkDICOMTag tag)
-{
-  char d = '1';
-
-  if (tag == DC::SOPInstanceUID ||
-      tag == DC::MediaStorageSOPInstanceUID)
-    {
-    d = '2';
-    }
-  else if (tag == DC::SeriesInstanceUID ||
-           tag == DC::ConcatenationUID)
-    {
-    d = '3';
-    }
-  else if (tag == DC::StudyInstanceUID)
-    {
-    d = '4';
-    }
-  else if (tag == DC::FrameOfReferenceUID ||
-           tag == DC::VolumeFrameOfReferenceUID ||
-           tag == DC::SourceFrameOfReferenceUID ||
-           tag == DC::SynchronizationFrameOfReferenceUID ||
-           tag == DC::TableFrameOfReferenceUID)
-    {
-    d = '5';
-    }
-
-  return d;
-}
-
-// get the number of random bytes to generate after this prefix
-vtkIdType vtkRandomBytesForPrefix(const char *prefix)
-{
-  size_t n = strlen(prefix);
-  if (n > 0 && prefix[n-1] != '.')
-    {
-    n++;
-    }
-  n = 64 - n;
-  vtkIdType m = 0;
-  if (n > 40)
-    {
-    m = 16; // use 128 bit random number
-    }
-  else
-    {
-    m = 12; // use 96 bit random number
-    }
-
-  return m;
-}
-
-// generate a prefixed UID using the provided random bytes
-void vtkGeneratePrefixedUID(
-  const unsigned char *r, vtkIdType m, const char *prefix, char d,
-  char uid[64])
-{
-  size_t i = 0;
-  while (*prefix != '\0' && i < 62)
-    {
-    uid[i++] = *prefix++;
-    }
-  if (i > 0 && i < 62 && uid[i-1] != '.')
-    {
-    uid[i++] = '.';
-    }
-
-  char hexs[36];
-  vtkConvertBytesToHex(r, m, hexs);
-  char decs[40];
-  vtkConvertHexToDecimal(hexs, decs);
-
-  // generate the leading digit as the UID type
-  if (d >= '1' && d <= '9')
-    {
-    // decimal digits required to store an integer with N-1 bytes
-    static const int maxDigits[16] = {
-      3, 5, 8, 10, 13, 15, 17, 20, 22, 25, 27, 29, 32, 34, 37, 39
-    };
-
-    uid[i++] = d;
-    // add zeros so all uids will be the same length
-    size_t n = maxDigits[(m-1) & 0x0f];
-    for (size_t l = strlen(decs); l < n && i < 63; l++)
-      {
-      uid[i++] = '0';
-      }
-    }
-
-  const char *cp = decs;
-  while (i < 63 && *cp != '\0')
-    {
-    uid[i++] = *cp++;
-    }
-
-  while (i < 64)
-    {
-    uid[i++] = '\0';
-    }
-}
-
-} // end anonymous namespace
-
 //----------------------------------------------------------------------------
 std::string vtkDICOMUtilities::GenerateUID(vtkDICOMTag tag)
 {
-  const char *prefix = vtkDICOMUtilities::UIDPrefix;
-  char uid[64];
-
-  if (prefix[0] == '\0' ||
-      (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' &&
-       prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0')))
-    {
-    // generate a 128-bit random number
-    unsigned char r[16];
-    vtkGenerateRandomBytes(r, 16);
-
-    // convert to a hex uuid
-    char uuid[40];
-    vtkConvertRandomToUUID(r, uuid);
-
-    // convert the hex uuid into a DICOM UID with root 2.25
-    vtkConvertUUIDToUID(uuid, uid);
-    }
-  else
-    {
-    // after prefix, add a "UID type" digit followed by random digits
-    unsigned char r[16];
-    vtkIdType m = vtkRandomBytesForPrefix(prefix);
-    vtkGenerateRandomBytes(r, m);
-    char d = vtkDICOMTagToDigit(tag);
-    vtkGeneratePrefixedUID(r, m, prefix, d, uid);
-    }
-
-  return uid;
+  vtkDICOMUIDGenerator *uidgen = vtkDICOMUIDGenerator::GetDefault();
+  return uidgen->GenerateUID(tag);
 }
 
 //----------------------------------------------------------------------------
 void vtkDICOMUtilities::GenerateUIDs(vtkDICOMTag tag, vtkStringArray *uids)
 {
-  const char *prefix = vtkDICOMUtilities::UIDPrefix;
-
-  bool useUUIDForUID =
-    (prefix[0] == '\0' ||
-      (prefix[0] == '2' && prefix[1] == '.' && prefix[2] == '2' &&
-       prefix[3] == '5' && (prefix[4] == '.' || prefix[4] == '\0')));
-
-  vtkIdType m = 16;
-  char d = '0';
-  if (!useUUIDForUID)
-    {
-    m = vtkRandomBytesForPrefix(prefix);
-    d = vtkDICOMTagToDigit(tag);
-    }
-
-  // read from random number generator
-  vtkIdType n = uids->GetNumberOfValues();
-  unsigned char *r = new unsigned char[n*m];
-  vtkGenerateRandomBytes(r, n*m);
-
-  for (vtkIdType i = 0; i < n; i++)
-    {
-    char uid[64];
-
-    if (useUUIDForUID)
-      {
-      char uuid[40];
-      vtkConvertRandomToUUID(r + i*m, uuid);
-      vtkConvertUUIDToUID(uuid, uid);
-      }
-    else
-      {
-      vtkGeneratePrefixedUID(r + i*m, m, prefix, d, uid);
-      }
-
-    // put uids into the array in order (simple insertion sort)
-    vtkIdType j = 0;
-    for (; j < i; j++)
-      {
-      if (vtkDICOMUtilities::CompareUIDs(uids->GetValue(j), uid) > 0)
-        {
-        break;
-        }
-      }
-    for (vtkIdType k = i; k > j; --k)
-      {
-      uids->SetValue(k, uids->GetValue(k - 1));
-      }
-    uids->SetValue(j, uid);
-    }
-
-  delete [] r;
+  vtkDICOMUIDGenerator *uidgen = vtkDICOMUIDGenerator::GetDefault();
+  uidgen->GenerateUIDs(tag, uids);
 }
 
 //----------------------------------------------------------------------------
@@ -444,39 +60,39 @@ int vtkDICOMUtilities::CompareUIDs(const char *u1, const char *u2)
   int r = 0;
 
   if (u1 == 0 || u2 == 0)
-    {
+  {
     // if one or both are null
     r = (u2 == 0 ? r : -1);
     r = (u1 == 0 ? r : 1);
-    }
+  }
   else
-    {
+  {
     while (r == 0 && *u1 != 0 && *u2 != 0)
-      {
+    {
       int i1 = 0;
       int i2 = 0;
       do { i1++; } while (isdigit(u1[i1]));
       do { i2++; } while (isdigit(u2[i2]));
       r = i1 - i2; // longer number wins
       if (r == 0)
-        { // lexically compare numbers of the same length
+      { // lexically compare numbers of the same length
         do { r = *u1++ - *u2++; } while (r == 0 && --i1 != 0);
-        }
       }
+    }
 
     if (r == 0)
-      {
+    {
       // uid with remaining parts wins
       r = (*u2 == 0 ? r : -1);
       r = (*u1 == 0 ? r : 1);
-      }
+    }
     else
-      {
+    {
       // convert r to sgn(r)
       r = (r >= 0 ? r : -1);
       r = (r <= 0 ? r : 1);
-      }
     }
+  }
 
   return r;
 }
@@ -492,7 +108,7 @@ long long vtkDICOMUtilities::GetUTC(long long *offset)
                   static_cast<long long>(ft.dwLowDateTime));
 
   if (offset)
-    {
+  {
     // get the current timezone offset by subtracting UTC from local time
     TIME_ZONE_INFORMATION tzi;
     GetTimeZoneInformation(&tzi);
@@ -506,15 +122,15 @@ long long vtkDICOMUtilities::GetUTC(long long *offset)
     long long tzo = ((static_cast<long long>(lft.dwHighDateTime) << 32) +
                      static_cast<long long>(lft.dwLowDateTime) - t1);
     if (tzo >= 0)
-      {
+    {
       tzo = (tzo + 5000000)/10000000;
-      }
+    }
     else
-      {
+    {
       tzo = -((-tzo + 5000000)/10000000);
-      }
-    *offset = tzo*1000000;
     }
+    *offset = tzo*1000000;
+  }
 
   // convert file time to unix time
   return t1/10 - 11644473600000000ll;
@@ -525,21 +141,21 @@ long long vtkDICOMUtilities::GetUTC(long long *offset)
   gettimeofday(&tv, 0);
   long long t = (tv.tv_sec*1000000ll + tv.tv_usec);
   if (offset)
-    {
+  {
     static long long lastT = 0;
     if (t - lastT > 1000000ll)
-      {
+    {
       // this is needed on some systems to set timezone info,
       // because it might do I/O do it at most once per second
       tzset();
       lastT = t;
-      }
+    }
     // use localtime to get the offset from utc
     struct tm tmv;
     time_t tod = static_cast<time_t>(t/1000000);
     localtime_r(&tod, &tmv);
     *offset = tmv.tm_gmtoff*1000000ll;
-    }
+  }
 
   return t;
 
@@ -564,32 +180,32 @@ std::string vtkDICOMUtilities::GenerateDateTime(
   // all time stamps for the data set
   if (z && strlen(z) == 5 && (z[0] == '+' || z[0] == '-') &&
       isdigit(z[1]) && isdigit(z[2]) && isdigit(z[3]) && isdigit(z[4]))
-    {
+  {
     int zh = (z[1] - '0')*10 + (z[2] - '0');
     int zm = (z[3] - '0')*10 + (z[4] - '0');
     zs = (zh*3600 + zm*60) * (z[0] == '-' ? -1 : +1) * 1000000ll;
-    }
+  }
 
   if (z == 0 || z[0] == '\0' || t == VTK_LONG_LONG_MIN)
-    {
+  {
     long long *zsp = 0;
     if (z == 0 || z[0] == '\0')
-      {
+    {
       zsp = &zs;
-      }
+    }
 
     long long t1 = vtkDICOMUtilities::GetUTC(zsp);
 
     if (t == VTK_LONG_LONG_MIN)
-      {
+    {
       t = t1;
-      }
     }
+  }
 
   // generate a new timezone offset string
   char tzs[6] = { '+', '0', '0', '0', '0', '\0' };
   if (z == 0 || z[0] == '\0')
-    {
+  {
     long long zst = zs/1000000;
     tzs[0] = (zst < 0 ? '-' : '+');
     zst = (zst < 0 ? -zst : zst);
@@ -597,7 +213,7 @@ std::string vtkDICOMUtilities::GenerateDateTime(
             static_cast<int>((zst/3600)%24),
             static_cast<int>((zst%3600)/60));
     z = tzs;
-    }
+  }
 
   // add the time zone offset (in microseconds)
   t += zs;
@@ -619,9 +235,9 @@ std::string vtkDICOMUtilities::GenerateDateTime(
   int m = j + 2 - (12 * ell);
   int y = 100 * (n - 49) + i + ell;
   if (y > 9999)
-    {
+  {
     y = 9999;
-    }
+  }
 
   // convert microseconds to hours/minutes/seconds.microseconds
   int S = static_cast<int>(tus/1000000);
@@ -646,34 +262,34 @@ long long vtkDICOMUtilities::ConvertDateTime(const char *datetime)
   const char *epoch = "19700101000000.000000+0000";
   char normalized[27];
   for (int i = 0; i < 27; i++)
-    {
+  {
     normalized[i] = epoch[i];
-    }
+  }
   char *tp = normalized;
   const char *cp = datetime;
   while (*tp != 0 && *cp >= '0' && *cp <= '9')
-    {
+  {
     *tp++ = *cp++;
-    }
+  }
   if (*tp == '.' && *cp == '.')
-    {
+  {
     *tp++ = *cp++;
     while (*tp != 0 && *cp >= '0' && *cp <= '9')
-      {
+    {
       *tp++ = *cp++;
-      }
     }
+  }
   if (*cp == '-' || *cp == '+')
-    {
+  {
     tp = normalized + 21;
     *tp++ = *cp++;
     while (*tp != 0 && *cp >= '0' && *cp <= '9')
-      {
+    {
       *tp++ = *cp++;
-      }
     }
+  }
   else
-    {
+  {
     // use local time zone
     long long offset = 0;
     vtkDICOMUtilities::GetUTC(&offset);
@@ -689,7 +305,7 @@ long long vtkDICOMUtilities::ConvertDateTime(const char *datetime)
     tp[3] = M/10 + '0';
     tp[4] = M%10 + '0';
     tp[5] = 0;
-    }
+  }
 
   // convert normalized datetime to year, month, day etc.
   // first, convert all digits (and only digits) to binary values
@@ -697,9 +313,9 @@ long long vtkDICOMUtilities::ConvertDateTime(const char *datetime)
   normalized[14] += '0';
   normalized[21] += '0';
   for (int i = 0; i < 26; i++)
-    {
+  {
     normalized[i] -= '0';
-    }
+  }
 
   int y = tp[0]*1000 + tp[1]*100 + tp[2]*10 + tp[3];
   int m = tp[4]*10 + tp[5];
@@ -713,9 +329,9 @@ long long vtkDICOMUtilities::ConvertDateTime(const char *datetime)
   // get the timezone offset, in seconds
   int tzs = (tp[22]*600 + tp[23]*60 + tp[24]*10 + tp[25])*60;
   if (tp[21] == '-')
-    {
+  {
     tzs = -tzs;
-    }
+  }
 
   // use algorithm from Henry F. Fliegel and Thomas C. Van Flandern
   // to compute the day according to Gregorian calendar
@@ -738,73 +354,82 @@ bool vtkDICOMUtilities::IsDICOMFile(const char *filename)
   unsigned char buffer[256];
 
   if (filename == 0)
-    {
+  {
     return false;
-    }
+  }
 
   vtkDICOMFile infile(filename, vtkDICOMFile::In);
 
   if (infile.GetError() != 0)
-    {
+  {
     return false;
-    }
+  }
 
   // valid file should be at least 256 chars long (probably longer)
   size_t size = infile.GetSize();
   if (size < sizeof(buffer))
-    {
+  {
     return 0;
-    }
+  }
   size = sizeof(buffer);
 
   size_t rsize = infile.Read(buffer, size);
   infile.Close();
   if (rsize != static_cast<size_t>(size))
-    {
+  {
     return false;
-    }
+  }
 
   const unsigned char *cp = buffer;
 
   // Look for the magic number and the first meta header tag.
   size_t skip = 128;
   for (int i = 0; i < 2; i++)
-    {
+  {
     if (size > skip + 8)
-      {
+    {
       cp = &buffer[skip];
       if (cp[0] == 'D' && cp[1] == 'I' && cp[2] == 'C' && cp[3] == 'M' &&
           cp[4] == 2 && cp[5] == 0 && cp[6] == 0 && cp[7] == 0)
-        {
+      {
         return true;
-        }
       }
+    }
     // Some non-standard files have DICM at the beginning.
     skip = 0;
-    }
+  }
 
   // File must be a reasonable size.
   if (size < 256)
-    {
+  {
     return false;
-    }
+  }
 
   cp = buffer;
 
   // If no magic number found, look for a valid meta header.
   if (cp[0] == 2 && cp[1] == 0 && cp[2] == 0 && cp[3] == 0 &&
       cp[4] == 'U' && cp[5] == 'L' && cp[6] == 4 && cp[7] == 0)
-    {
+  {
     return true;
-    }
+  }
 
-  // Finally, look for little-endian implicit ACR-NEMA.
-  if (cp[0] == 8 && cp[1] == 0 && cp[2] == 0 && cp[3] == 0 &&
-      cp[4] == 4 && cp[5] == 0 && cp[6] == 0 && cp[7] == 0 &&
-      cp[12] == 8 && cp[13] == 0 && (cp[14] != 0 || cp[15] != 0))
+  // Look for two valid implicitly-encoded data elements in Group 0x0008,
+  // where the first element must be (0008,0016) or less (e.g. SOPClassUID)
+  // with a size of 64 or less, and the second element must be (0008,0018)
+  // or less (e.g. SOPInstanceUID) with a size of 64 or less.
+  if (cp[0] == 0x08 && cp[1] == 0x00 && cp[2] <= 0x16 && cp[3] == 0x00 &&
+      cp[4] <= 0x40 && cp[5] == 0x00 && cp[6] == 0x00 && cp[7] == 0x00)
+  {
+    unsigned char e = cp[2];
+    cp += (cp[4] + 8);
+    if (cp[0] == 0x08 && cp[1] == 0x00 && cp[2] <= 0x18 && cp[3] == 0x00 &&
+        cp[4] <= 0x40 && cp[5] == 0x00 && cp[6] == 0x00 && cp[7] == 0x00 &&
+        cp[2] > e)
     {
-    return true;
+      return true;
     }
+  }
 
   return false;
 }
@@ -848,7 +473,7 @@ void vtkDICOMUtilities::SetImplementationClassUID(const char *uid)
 
 char vtkDICOMUtilities::ImplementationVersionName[17] =
   VTK_DICOM_VERSION_CREATOR("VTK_DICOM",
-    DICOM_MAJOR_VERSION, DICOM_MINOR_VERSION, DICOM_BUILD_VERSION);
+    DICOM_MAJOR_VERSION, DICOM_MINOR_VERSION, DICOM_PATCH_VERSION);
 
 const char *vtkDICOMUtilities::GetImplementationVersionName()
 {
@@ -880,78 +505,79 @@ bool vtkDICOMUtilities::PatternMatches(
   const char *fp = val + vl;
 
   while (cp != ep && dp != fp)
-    {
+  {
     if (*cp == '*')
-      {
+    {
       cp++;
       // if '*' is the final character, it matches the remainder of val
       if (cp == ep)
-        {
+      {
         dp = fp;
-        }
+      }
       else
-        {
+      {
         while (dp != fp)
-          {
+        {
           if (*cp == '?' || *dp == *cp)
-            {
+          {
             // check if the remainder of val matches remainder of pattern
             if (PatternMatches(cp, ep-cp, dp, fp-dp))
-              {
+            {
               break;
-              }
             }
+          }
           // else let the "*" eat one more codepoint of "val"
           if (static_cast<signed char>(*dp++) < 0)
-            {
+          {
             while (dp != fp && (*dp & 0xC0) == 0x80)
-              {
+            {
               dp++;
-              }
             }
           }
         }
       }
+    }
     else if (*cp == '?')
-      {
-      // the '?' matches a whole codepoint, not just one character
+    {
+      // the '?' matches a whole codepoint, not just one byte
       cp++;
       if (static_cast<signed char>(*dp++) < 0)
-        {
+      {
         while (dp != fp && (*dp & 0xC0) == 0x80)
-          {
+        {
           dp++;
-          }
         }
       }
+    }
     else if (*cp == *dp)
-      {
+    {
       // make sure the entire codepoint matches
       cp++;
       if (static_cast<signed char>(*dp++) < 0)
+      {
+        while (cp != ep && dp != fp &&
+               ((*cp & 0xC0) == 0x80 || (*dp & 0xC0) == 0x80))
         {
-        while (cp != ep && dp != fp && (*cp & 0xC0) == 0x80)
-          {
           if (*dp != *cp)
-            {
+          {
             return false;
-            }
+          }
           cp++;
           dp++;
-          }
         }
       }
+    }
     else
-      {
+    {
       return false;
-      }
     }
+  }
 
   // skip over any remaining '*' wildcards
   while (cp != ep && *cp == '*')
-    {
+  {
     cp++;
-    }
+  }
 
   // make sure we've reached the end of both the pattern and the value
   return (cp == ep && dp == fp);
diff --git a/Source/vtkDICOMUtilities.h b/Source/vtkDICOMUtilities.h
index 88df199..151a8a6 100644
--- a/Source/vtkDICOMUtilities.h
+++ b/Source/vtkDICOMUtilities.h
@@ -25,6 +25,7 @@ class vtkStringArray;
 class VTKDICOM_EXPORT vtkDICOMUtilities : public vtkObject
 {
 public:
+  //@{
   //! VTK new method (for Java and Tcl wrappers)
   static vtkDICOMUtilities *New();
 
@@ -33,7 +34,9 @@ public:
 
   //! Print a summary of the contents of this object.
   void PrintSelf(ostream& os, vtkIndent indent);
+  //@}
 
+  //@{
   //! Set a UID prefix to use when generating UIDs.
   /*!
    *  This is optional, if you do not own a UID prefix then the publicly
@@ -41,7 +44,9 @@ public:
    */
   static void SetUIDPrefix(const char *prefix);
   static const char *GetUIDPrefix();
+  //@}
 
+  //@{
   //! Generate a UID for the provided tag.
   static std::string GenerateUID(vtkDICOMTag tag);
 
@@ -57,7 +62,9 @@ public:
 
   //! Numerically compare two UIDs, returns -1, 0, or +1.
   static int CompareUIDs(const char *u1, const char *u2);
+  //@}
 
+  //@{
   //! Generate a DICOM date time string in the given timezone.
   /*!
    *  The time zone is to be given in the DICOM format of
@@ -97,7 +104,9 @@ public:
    *  can pass a null pointer.
    */
   static long long GetUTC(long long *offset);
+  //@}
 
+  //@{
   //! Check if the specified file is a DICOM file.
   /*!
    *  This will return true if the file exists, is readable, and
@@ -105,7 +114,9 @@ public:
    *  the file look like DICOM data elements.
    */
   static bool IsDICOMFile(const char *filename);
+  //@}
 
+  //@{
   //! Get the UID for this DICOM implementation.
   static const char *GetImplementationClassUID();
 
@@ -127,7 +138,9 @@ public:
    *  The ImplementationVersionName appears in the DICOM meta header.
    */
   static void SetImplementationVersionName(const char *name);
+  //@}
 
+  //@{
   //! Unpack one little-endian int from a stream of bytes.
   /*!
    *  This is a very common operation that is required in many different
@@ -146,7 +159,9 @@ public:
     cp[1] = static_cast<unsigned char>(i >> 8);
     cp[2] = static_cast<unsigned char>(i >> 16);
     cp[3] = static_cast<unsigned char>(i >> 24); }
+  //@}
 
+  //@{
   //! Return true if the pattern matches the given string (utf-8).
   /*!
    *  This performs simple matching with "*" and "?" as the only wildcard.
@@ -158,12 +173,15 @@ public:
   //! Match patterns on non-terminated strings.
   static bool PatternMatches(
     const char *pattern, size_t pl, const char *val, size_t vl);
+  //@}
 
+  //@{
   //! Get the name associated with the given UID.
   static const char *GetUIDName(const char *uid);
 
   //! Get the CID from the UID.
   unsigned short GetCIDFromUID(const char *uid);
+  //@}
 
 protected:
   vtkDICOMUtilities() {}
@@ -174,8 +192,8 @@ protected:
   static char ImplementationVersionName[17];
 
 private:
-  vtkDICOMUtilities(const vtkDICOMUtilities&);  // Not implemented.
-  void operator=(const vtkDICOMUtilities&);  // Not implemented.
+  vtkDICOMUtilities(const vtkDICOMUtilities&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMUtilities&) VTK_DELETE_FUNCTION;
 };
 
 #endif /* vtkDICOMUtilities_h */
diff --git a/Source/vtkDICOMUtilitiesUIDTable.cxx b/Source/vtkDICOMUtilitiesUIDTable.cxx
index 421c987..eca009d 100644
--- a/Source/vtkDICOMUtilitiesUIDTable.cxx
+++ b/Source/vtkDICOMUtilitiesUIDTable.cxx
@@ -15,23 +15,23 @@ struct UIDTableEntry
   const char *Name;
 };
 
-UIDTableEntry UIDTable[] = {
+const UIDTableEntry UIDTable[] = {
 { 1, 15, 1, 0, 0 },
 { 16, 42, 1, 0, 0 },
 { 157, 11, 6, 0, 0 },
-{ 170, 1, 1, 0, 0 },
-{ 196, 1, 2, 0, 0 },
-{ 197, 1, 1, 0, 0 },
-{ 1142, 1, 1, 0, 0 },
-{ 2205, 1, 1, 0, 0 },
-{ 2208, 1, 1, 0, 0 },
-{ 2210, 24, 1, 0, 0 },
+{ 175, 1, 1, 0, 0 },
+{ 201, 1, 2, 0, 0 },
+{ 202, 1, 1, 0, 0 },
+{ 1224, 1, 1, 0, 0 },
+{ 2345, 1, 1, 0, 0 },
+{ 2348, 1, 1, 0, 0 },
+{ 2350, 24, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 2234, 2, 0, 0, 0 },
+{ 2374, 2, 0, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.1.1
   "Verification SOP Class" },
 { 58, 6, 1, 0, // 1.2.840.10008.1.2
@@ -54,7 +54,8 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 151, 2, 1, 0, 0 },
+{ 151, 2, 1, 0, // 1.2.840.10008.1.20 (Retired)
+  "Papyrus 3 Implicit VR Little Endian" },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -258,22 +259,32 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 169, 1, 4, 0, 0 },
+{ 169, 6, 4, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.2.6.1
   "DICOM UID Registry" },
 { 0, 0, 0, 0, // 1.2.840.10008.2.16.4
   "DICOM Controlled Terminology" },
-{ 171, 2, 1, 0, 0 },
-{ 173, 1, 1, 0, 0 },
-{ 174, 6, 1, 0, 0 },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.5
+  "Adult Mouse Anatomy Ontology" },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.6
+  "Uberon Ontology" },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.7
+  "Integrated Taxonomic Information System (ITIS) Taxonomic Serial Number (TSN)" },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.8
+  "Mouse Genome Initiative (MGI)" },
+{ 0, 0, 0, 0, // 1.2.840.10008.2.16.9
+  "PubChem Compound CID" },
+{ 176, 2, 1, 0, 0 },
+{ 178, 1, 1, 0, 0 },
+{ 179, 6, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.3.1.1.1
   "DICOM Application Context Name" },
-{ 180, 4, 1, 0, 0 },
-{ 184, 1, 1, 0, 0 },
-{ 185, 5, 1, 0, 0 },
-{ 0, 0, 0, 0, 0 },
+{ 185, 4, 1, 0, 0 },
+{ 189, 1, 1, 0, 0 },
 { 190, 5, 1, 0, 0 },
-{ 195, 1, 1, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 195, 5, 1, 0, 0 },
+{ 200, 1, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.3.1.2.1.1 (Retired)
   "Detached Patient Management SOP Class" },
 { 0, 0, 0, 0, 0 },
@@ -304,23 +315,23 @@ UIDTableEntry UIDTable[] = {
   "Detached Interpretation Management SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.4.2
   "Storage Service Class" },
-{ 198, 4, 1, 0, 0 },
-{ 202, 40, 1, 0, 0 },
+{ 203, 4, 1, 0, 0 },
+{ 207, 40, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 250, 45, 1, 0, 0 },
+{ 255, 45, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.1
   "Basic Film Session SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.2
   "Basic Film Box SOP Class" },
 { 0, 0, 0, 0, 0 },
-{ 242, 2, 1, 0, // 1.2.840.10008.5.1.1.4
+{ 247, 2, 1, 0, // 1.2.840.10008.5.1.1.4
   "Basic Grayscale Image Box SOP Class" },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 244, 1, 1, 0, // 1.2.840.10008.5.1.1.9
+{ 249, 1, 1, 0, // 1.2.840.10008.5.1.1.9
   "Basic Grayscale Print Management Meta SOP Class" },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -330,11 +341,11 @@ UIDTableEntry UIDTable[] = {
   "Print Job SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.15
   "Basic Annotation Box SOP Class" },
-{ 245, 1, 376, 0, // 1.2.840.10008.5.1.1.16
+{ 250, 1, 376, 0, // 1.2.840.10008.5.1.1.16
   "Printer SOP Class" },
-{ 246, 1, 376, 0, // 1.2.840.10008.5.1.1.17
+{ 251, 1, 376, 0, // 1.2.840.10008.5.1.1.17
   "Printer SOP Instance" },
-{ 247, 1, 1, 0, // 1.2.840.10008.5.1.1.18
+{ 252, 1, 1, 0, // 1.2.840.10008.5.1.1.18
   "Basic Color Print Management Meta SOP Class" },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -343,7 +354,7 @@ UIDTableEntry UIDTable[] = {
   "VOI LUT Box SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.23
   "Presentation LUT SOP Class" },
-{ 248, 1, 1, 0, // 1.2.840.10008.5.1.1.24 (Retired)
+{ 253, 1, 1, 0, // 1.2.840.10008.5.1.1.24 (Retired)
   "Image Overlay Box SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.25 (Retired)
   "Print Queue SOP Instance" },
@@ -368,7 +379,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 249, 1, 1, 0, // 1.2.840.10008.5.1.1.40
+{ 254, 1, 1, 0, // 1.2.840.10008.5.1.1.40
   "Display System SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.4.1
   "Basic Color Image Box SOP Class" },
@@ -386,7 +397,7 @@ UIDTableEntry UIDTable[] = {
   "Basic Print Image Overlay Box SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.1.40.1
   "Display System SOP Instance" },
-{ 295, 2, 1, 0, 0 },
+{ 300, 2, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -418,51 +429,51 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.31
   "Modality Worklist Information Model - FIND" },
-{ 1098, 3, 1, 0, // 1.2.840.10008.5.1.4.32 (Retired)
+{ 1179, 3, 1, 0, // 1.2.840.10008.5.1.4.32 (Retired)
   "General Purpose Worklist Management Meta SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.33
   "Instance Availability Notification SOP Class" },
-{ 1101, 9, 1, 0, 0 },
+{ 1182, 10, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1119, 3, 1, 0, 0 },
-{ 1122, 4, 1, 0, 0 },
-{ 1126, 4, 1, 0, 0 },
+{ 1201, 3, 1, 0, 0 },
+{ 1204, 4, 1, 0, 0 },
+{ 1208, 4, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.41
   "Product Characteristics Query SOP Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.42
   "Substance Approval Query SOP Class" },
-{ 1130, 4, 1, 0, 0 },
-{ 1134, 4, 1, 0, 0 },
-{ 1138, 4, 1, 0, 0 },
-{ 297, 601, 1, 0, 0 },
-{ 1081, 5, 1, 0, 0 },
-{ 898, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.1
+{ 1212, 4, 1, 0, 0 },
+{ 1216, 4, 1, 0, 0 },
+{ 1220, 4, 1, 0, 0 },
+{ 302, 601, 1, 0, 0 },
+{ 1162, 5, 1, 0, 0 },
+{ 903, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.1
   "Computed Radiography Image Storage" },
-{ 904, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.2
+{ 909, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.2
   "CT Image Storage" },
-{ 906, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.3 (Retired)
+{ 911, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.3 (Retired)
   "Ultrasound Multi-frame Image Storage" },
-{ 907, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.4
+{ 912, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.4
   "MR Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.5 (Retired)
   "Nuclear Medicine Image Storage" },
-{ 911, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.6 (Retired)
+{ 916, 2, 1, 0, // 1.2.840.10008.5.1.4.1.1.6 (Retired)
   "Ultrasound Image Storage" },
-{ 913, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.7
+{ 918, 4, 1, 0, // 1.2.840.10008.5.1.4.1.1.7
   "Secondary Capture Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.8 (Retired)
   "Standalone Overlay Storage" },
-{ 917, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.9 (Retired)
+{ 922, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.9 (Retired)
   "Standalone Curve Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.10 (Retired)
   "Standalone Modality LUT Storage" },
-{ 932, 7, 1, 0, // 1.2.840.10008.5.1.4.1.1.11 (Retired)
+{ 937, 7, 1, 0, // 1.2.840.10008.5.1.4.1.1.11 (Retired)
   "Standalone VOI LUT Storage" },
-{ 939, 3, 1, 0, 0 },
-{ 944, 1, 1, 0, 0 },
-{ 950, 2, 1, 0, 0 },
+{ 944, 77, 1, 0, 0 },
+{ 1023, 1, 1, 0, 0 },
+{ 1029, 2, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -490,6 +501,8 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.40 (Retired)
+  "1.2.840.10008.5.1.4.1.1.40" },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -515,13 +528,11 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 0, 0, 0, 0, 0 },
-{ 952, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.66
+{ 1031, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.66
   "Raw Data Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.67
   "Real World Value Mapping Storage" },
-{ 958, 2, 1, 0, 0 },
-{ 0, 0, 0, 0, 0 },
+{ 1037, 2, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -529,20 +540,21 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 960, 2, 1, 0, 0 },
-{ 977, 8, 1, 0, 0 },
-{ 985, 1, 1, 0, 0 },
-{ 986, 1, 1, 0, 0 },
-{ 987, 1, 1, 0, 0 },
-{ 988, 1, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
+{ 1039, 2, 1, 0, 0 },
+{ 1056, 8, 1, 0, 0 },
+{ 1064, 1, 1, 0, 0 },
+{ 1065, 1, 1, 0, 0 },
+{ 1066, 1, 1, 0, 0 },
+{ 1067, 1, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 989, 70, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
+{ 1068, 71, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
+{ 1139, 1, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -556,7 +568,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1059, 2, 1, 0, 0 },
+{ 1140, 2, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -580,7 +592,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1061, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.128
+{ 1142, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.128
   "Positron Emission Tomography Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.129 (Retired)
   "Standalone PET Curve Storage" },
@@ -937,7 +949,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1062, 9, 1, 0, 0 },
+{ 1143, 9, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -957,7 +969,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1071, 6, 1, 0, 0 },
+{ 1152, 6, 1, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
@@ -1057,12 +1069,12 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 0, 0 },
-{ 1079, 2, 1, 0, 0 },
-{ 901, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.1
+{ 1160, 2, 1, 0, 0 },
+{ 906, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.1
   "Digital X-Ray Image Storage - For Presentation" },
-{ 902, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.2
+{ 907, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.2
   "Digital Mammography X-Ray Image Storage - For Presentation" },
-{ 903, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.3
+{ 908, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.1.3
   "Digital Intra-Oral X-Ray Image Storage - For Presentation" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.1.1.1
   "Digital X-Ray Image Storage - For Processing" },
@@ -1096,13 +1108,13 @@ UIDTableEntry UIDTable[] = {
   "Multi-frame Grayscale Word Secondary Capture Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.7.4
   "Multi-frame True Color Secondary Capture Image Storage" },
-{ 923, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.9.1 (Retired)
+{ 928, 3, 1, 0, // 1.2.840.10008.5.1.4.1.1.9.1 (Retired)
   "Waveform Storage - Trial" },
-{ 926, 1, 1, 0, 0 },
-{ 927, 1, 1, 0, 0 },
-{ 928, 2, 1, 0, 0 },
-{ 930, 1, 1, 0, 0 },
 { 931, 1, 1, 0, 0 },
+{ 932, 1, 1, 0, 0 },
+{ 933, 2, 1, 0, 0 },
+{ 935, 1, 1, 0, 0 },
+{ 936, 1, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.1.1
   "12-lead ECG Waveform Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.9.1.2
@@ -1135,17 +1147,92 @@ UIDTableEntry UIDTable[] = {
   "Grayscale Planar MPR Volumetric Presentation State Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.11.7
   "Compositing Planar MPR Volumetric Presentation State Storage" },
-{ 942, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.1
+{ 1021, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.1
   "X-Ray Angiographic Image Storage" },
-{ 943, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.2
+{ 1022, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.12.2
   "X-Ray Radiofluoroscopic Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.3 (Retired)
   "X-Ray Angiographic Bi-Plane Image Storage" },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, 0 },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.77 (Retired)
+  "1.2.840.10008.5.1.4.1.1.12.77" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.1.1
   "Enhanced XA Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.12.2.1
   "Enhanced XRF Image Storage" },
-{ 945, 5, 1, 0, 0 },
+{ 1024, 5, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.13.1.1
   "X-Ray 3D Angiographic Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.13.1.2
@@ -1171,24 +1258,24 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.5
   "Surface Segmentation Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.66.6
-  "Tractography Results" },
+  "Tractography Results Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.68.1
   "Surface Scan Mesh Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.68.2
   "Surface Scan Point Cloud Storage" },
-{ 962, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1 (Retired)
+{ 1041, 6, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1 (Retired)
   "VL Image Storage - Trial" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.2 (Retired)
   "VL Multi-frame Image Storage - Trial" },
-{ 968, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1
+{ 1047, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1
   "VL Endoscopic Image Storage" },
-{ 969, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.2
+{ 1048, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.2
   "VL Microscopic Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.3
   "VL Slide-Coordinates Microscopic Image Storage" },
-{ 970, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.4
+{ 1049, 1, 1, 0, // 1.2.840.10008.5.1.4.1.1.77.1.4
   "VL Photographic Image Storage" },
-{ 971, 6, 1, 0, 0 },
+{ 1050, 6, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.6
   "VL Whole Slide Microscopy Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.77.1.1.1
@@ -1320,6 +1407,10 @@ UIDTableEntry UIDTable[] = {
   "Colon CAD SR Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.70
   "Implantation Plan SR Storage" },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.88.71
+  "Acquisition Context SR Storage" },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.90.1
+  "Content Assessment Results Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.104.1
   "Encapsulated PDF Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.104.2
@@ -1346,7 +1437,7 @@ UIDTableEntry UIDTable[] = {
   "RT Ion Beams Treatment Record Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.1
   "DICOS CT Image Storage" },
-{ 1077, 2, 1, 0, 0 },
+{ 1158, 2, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.3
   "DICOS Threat Detection Report Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.501.4
@@ -1363,11 +1454,11 @@ UIDTableEntry UIDTable[] = {
   "Eddy Current Image Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.1.601.2
   "Eddy Current Multi-frame Image Storage" },
-{ 1086, 3, 1, 0, 0 },
-{ 1089, 3, 1, 0, 0 },
-{ 1092, 3, 1, 0, 0 },
-{ 1095, 2, 2, 0, 0 },
-{ 1097, 1, 3, 0, 0 },
+{ 1167, 3, 1, 0, 0 },
+{ 1170, 3, 1, 0, 0 },
+{ 1173, 3, 1, 0, 0 },
+{ 1176, 2, 2, 0, 0 },
+{ 1178, 1, 3, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.1.1
   "Patient Root Query/Retrieve Information Model - FIND" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.1.2.1.2
@@ -1404,11 +1495,11 @@ UIDTableEntry UIDTable[] = {
   "RT Conventional Machine Verification - Trial" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.3 (Retired)
   "RT Ion Machine Verification - Trial" },
-{ 1110, 4, 1, 0, // 1.2.840.10008.5.1.4.34.4 (Retired)
+{ 1192, 4, 1, 0, // 1.2.840.10008.5.1.4.34.4 (Retired)
   "Unified Worklist and Procedure Step Service Class - Trial" },
-{ 1114, 1, 1, 0, // 1.2.840.10008.5.1.4.34.5
+{ 1196, 1, 1, 0, // 1.2.840.10008.5.1.4.34.5
   "UPS Global Subscription SOP Instance" },
-{ 1115, 4, 1, 0, // 1.2.840.10008.5.1.4.34.6
+{ 1197, 4, 1, 0, // 1.2.840.10008.5.1.4.34.6
   "Unified Worklist and Procedure Step Service Class" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.7
   "RT Beams Delivery Instruction Storage" },
@@ -1416,6 +1507,8 @@ UIDTableEntry UIDTable[] = {
   "RT Conventional Machine Verification" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.9
   "RT Ion Machine Verification" },
+{ 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.10
+  "RT Brachy Application Setup Delivery Instruction Storage" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.4.1 (Retired)
   "Unified Procedure Step - Push SOP Class - Trial" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.34.4.2 (Retired)
@@ -1480,7 +1573,7 @@ UIDTableEntry UIDTable[] = {
   "Implant Template Group Information Model - MOVE" },
 { 0, 0, 0, 0, // 1.2.840.10008.5.1.4.45.4
   "Implant Template Group Information Model - GET" },
-{ 1143, 1062, 1, 0, 0 },
+{ 1225, 1120, 1, 0, 0 },
 { 0, 0, 0, 2, // 1.2.840.10008.6.1.1
   "Anatomic Modifier" },
 { 0, 0, 0, 4, // 1.2.840.10008.6.1.2
@@ -1864,7 +1957,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 3677, // 1.2.840.10008.6.1.191
   "Summary Codes ECG" },
 { 0, 0, 0, 3678, // 1.2.840.10008.6.1.192
-  "Qt Correction Algorithms" },
+  "QT Correction Algorithms" },
 { 0, 0, 0, 3679, // 1.2.840.10008.6.1.193 (Retired)
   "ECG Morphology Descriptions" },
 { 0, 0, 0, 3680, // 1.2.840.10008.6.1.194
@@ -1960,7 +2053,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 3742, // 1.2.840.10008.6.1.239
   "Medication Administration, PCI" },
 { 0, 0, 0, 3743, // 1.2.840.10008.6.1.240
-  "Clopidogrel/ticlopidine Administration" },
+  "Clopidogrel/Ticlopidine Administration" },
 { 0, 0, 0, 3744, // 1.2.840.10008.6.1.241
   "EF Testing Method" },
 { 0, 0, 0, 3745, // 1.2.840.10008.6.1.242
@@ -2034,7 +2127,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 3820, // 1.2.840.10008.6.1.276
   "Non-invasive Vascular Procedures" },
 { 0, 0, 0, 3821, // 1.2.840.10008.6.1.277
-  "Papillary Muscle Included/excluded" },
+  "Papillary Muscle Included/Excluded" },
 { 0, 0, 0, 3823, // 1.2.840.10008.6.1.278
   "Respiratory Status" },
 { 0, 0, 0, 3826, // 1.2.840.10008.6.1.279
@@ -2084,7 +2177,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 4017, // 1.2.840.10008.6.1.301
   "Anatomic Region Modifier for Intra-oral Radiography" },
 { 0, 0, 0, 4018, // 1.2.840.10008.6.1.302
-  "Primary Anatomic Structure for Intra-oral Radiography (permanent Dentition - Designation of Teeth)" },
+  "Primary Anatomic Structure for Intra-oral Radiography (Permanent Dentition - Designation of Teeth)" },
 { 0, 0, 0, 4019, // 1.2.840.10008.6.1.303
   "Primary Anatomic Structure for Intra-oral Radiography (Deciduous Dentition - Designation of Teeth)" },
 { 0, 0, 0, 4020, // 1.2.840.10008.6.1.304
@@ -2106,7 +2199,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 4042, // 1.2.840.10008.6.1.312
   "XA/XRF Anatomy Imaged" },
 { 0, 0, 0, 4050, // 1.2.840.10008.6.1.313
-  "Drug Or Contrast Agent Characteristics" },
+  "Drug or Contrast Agent Characteristics" },
 { 0, 0, 0, 4051, // 1.2.840.10008.6.1.314
   "General Devices" },
 { 0, 0, 0, 4052, // 1.2.840.10008.6.1.315
@@ -2142,71 +2235,71 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 6000, // 1.2.840.10008.6.1.330
   "Overall Breast Composition" },
 { 0, 0, 0, 6001, // 1.2.840.10008.6.1.331
-  "Overall Breast Composition From BI-RADS(R)" },
+  "Overall Breast Composition from BI-RADS(R)" },
 { 0, 0, 0, 6002, // 1.2.840.10008.6.1.332
-  "Change Since Last Mammogram Or Prior Surgery" },
+  "Change Since Last Mammogram or Prior Surgery" },
 { 0, 0, 0, 6003, // 1.2.840.10008.6.1.333
-  "Change Since Last Mammogram Or Prior Surgery From BI-RADS(R)" },
+  "Change Since Last Mammogram or Prior Surgery from BI-RADS(R)" },
 { 0, 0, 0, 6004, // 1.2.840.10008.6.1.334
   "Mammography Characteristics of Shape" },
 { 0, 0, 0, 6005, // 1.2.840.10008.6.1.335
-  "Characteristics of Shape From BI-RADS(R)" },
+  "Characteristics of Shape from BI-RADS(R)" },
 { 0, 0, 0, 6006, // 1.2.840.10008.6.1.336
   "Mammography Characteristics of Margin" },
 { 0, 0, 0, 6007, // 1.2.840.10008.6.1.337
-  "Characteristics of Margin From BI-RADS(R)" },
+  "Characteristics of Margin from BI-RADS(R)" },
 { 0, 0, 0, 6008, // 1.2.840.10008.6.1.338
   "Density Modifier" },
 { 0, 0, 0, 6009, // 1.2.840.10008.6.1.339
-  "Density Modifier From BI-RADS(R)" },
+  "Density Modifier from BI-RADS(R)" },
 { 0, 0, 0, 6010, // 1.2.840.10008.6.1.340
   "Mammography Calcification Types" },
 { 0, 0, 0, 6011, // 1.2.840.10008.6.1.341
-  "Calcification Types From BI-RADS(R)" },
+  "Calcification Types from BI-RADS(R)" },
 { 0, 0, 0, 6012, // 1.2.840.10008.6.1.342
   "Calcification Distribution Modifier" },
 { 0, 0, 0, 6013, // 1.2.840.10008.6.1.343
-  "Calcification Distribution Modifier From BI-RADS(R)" },
+  "Calcification Distribution Modifier from BI-RADS(R)" },
 { 0, 0, 0, 6014, // 1.2.840.10008.6.1.344
   "Mammography Single Image Finding" },
 { 0, 0, 0, 6015, // 1.2.840.10008.6.1.345
-  "Single Image Finding From BI-RADS(R)" },
+  "Single Image Finding from BI-RADS(R)" },
 { 0, 0, 0, 6016, // 1.2.840.10008.6.1.346
   "Mammography Composite Feature" },
 { 0, 0, 0, 6017, // 1.2.840.10008.6.1.347
-  "Composite Feature From BI-RADS(R)" },
+  "Composite Feature from BI-RADS(R)" },
 { 0, 0, 0, 6018, // 1.2.840.10008.6.1.348
   "Clockface Location or Region" },
 { 0, 0, 0, 6019, // 1.2.840.10008.6.1.349
-  "Clockface Location Or Region From BI-RADS(R)" },
+  "Clockface Location or Region from BI-RADS(R)" },
 { 0, 0, 0, 6020, // 1.2.840.10008.6.1.350
   "Quadrant Location" },
 { 0, 0, 0, 6021, // 1.2.840.10008.6.1.351
-  "Quadrant Location From BI-RADS(R)" },
+  "Quadrant Location from BI-RADS(R)" },
 { 0, 0, 0, 6022, // 1.2.840.10008.6.1.352
   "Side" },
 { 0, 0, 0, 6023, // 1.2.840.10008.6.1.353
-  "Side From BI-RADS(R)" },
+  "Side from BI-RADS(R)" },
 { 0, 0, 0, 6024, // 1.2.840.10008.6.1.354
   "Depth" },
 { 0, 0, 0, 6025, // 1.2.840.10008.6.1.355
-  "Depth From BI-RADS(R)" },
+  "Depth from BI-RADS(R)" },
 { 0, 0, 0, 6026, // 1.2.840.10008.6.1.356
   "Mammography Assessment" },
 { 0, 0, 0, 6027, // 1.2.840.10008.6.1.357
-  "Assessment From BI-RADS(R)" },
+  "Assessment from BI-RADS(R)" },
 { 0, 0, 0, 6028, // 1.2.840.10008.6.1.358
   "Mammography Recommended Follow-up" },
 { 0, 0, 0, 6029, // 1.2.840.10008.6.1.359
-  "Recommended Follow-up From BI-RADS(R)" },
+  "Recommended Follow-up from BI-RADS(R)" },
 { 0, 0, 0, 6030, // 1.2.840.10008.6.1.360
   "Mammography Pathology Codes" },
 { 0, 0, 0, 6031, // 1.2.840.10008.6.1.361
-  "Benign Pathology Codes From BI-RADS(R)" },
+  "Benign Pathology Codes from BI-RADS(R)" },
 { 0, 0, 0, 6032, // 1.2.840.10008.6.1.362
-  "High Risk Lesions Pathology Codes From BI-RADS(R)" },
+  "High Risk Lesions Pathology Codes from BI-RADS(R)" },
 { 0, 0, 0, 6033, // 1.2.840.10008.6.1.363
-  "Malignant Pathology Codes From BI-RADS(R)" },
+  "Malignant Pathology Codes from BI-RADS(R)" },
 { 0, 0, 0, 6034, // 1.2.840.10008.6.1.364
   "Intended Use of CAD Output" },
 { 0, 0, 0, 6035, // 1.2.840.10008.6.1.365
@@ -2248,7 +2341,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 6054, // 1.2.840.10008.6.1.383
   "Breast Imaging Findings" },
 { 0, 0, 0, 6055, // 1.2.840.10008.6.1.384
-  "Breast Clinical Finding Or Indicated Problem" },
+  "Breast Clinical Finding or Indicated Problem" },
 { 0, 0, 0, 6056, // 1.2.840.10008.6.1.385
   "Associated Findings for Breast" },
 { 0, 0, 0, 6057, // 1.2.840.10008.6.1.386
@@ -2322,33 +2415,33 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 6100, // 1.2.840.10008.6.1.420
   "Chest Component Categories" },
 { 0, 0, 0, 6101, // 1.2.840.10008.6.1.421
-  "Chest Finding Or Feature" },
+  "Chest Finding or Feature" },
 { 0, 0, 0, 6102, // 1.2.840.10008.6.1.422
-  "Chest Finding Or Feature Modifier" },
+  "Chest Finding or Feature Modifier" },
 { 0, 0, 0, 6103, // 1.2.840.10008.6.1.423
-  "Abnormal Lines Finding Or Feature" },
+  "Abnormal Lines Finding or Feature" },
 { 0, 0, 0, 6104, // 1.2.840.10008.6.1.424
-  "Abnormal Opacity Finding Or Feature" },
+  "Abnormal Opacity Finding or Feature" },
 { 0, 0, 0, 6105, // 1.2.840.10008.6.1.425
-  "Abnormal Lucency Finding Or Feature" },
+  "Abnormal Lucency Finding or Feature" },
 { 0, 0, 0, 6106, // 1.2.840.10008.6.1.426
-  "Abnormal Texture Finding Or Feature" },
+  "Abnormal Texture Finding or Feature" },
 { 0, 0, 0, 6107, // 1.2.840.10008.6.1.427
   "Width Descriptor" },
 { 0, 0, 0, 6108, // 1.2.840.10008.6.1.428
   "Chest Anatomic Structure Abnormal Distribution" },
 { 0, 0, 0, 6109, // 1.2.840.10008.6.1.429
-  "Radiographic Anatomy Finding Or Feature" },
+  "Radiographic Anatomy Finding or Feature" },
 { 0, 0, 0, 6110, // 1.2.840.10008.6.1.430
-  "Lung Anatomy Finding Or Feature" },
+  "Lung Anatomy Finding or Feature" },
 { 0, 0, 0, 6111, // 1.2.840.10008.6.1.431
-  "Bronchovascular Anatomy Finding Or Feature" },
+  "Bronchovascular Anatomy Finding or Feature" },
 { 0, 0, 0, 6112, // 1.2.840.10008.6.1.432
-  "Pleura Anatomy Finding Or Feature" },
+  "Pleura Anatomy Finding or Feature" },
 { 0, 0, 0, 6113, // 1.2.840.10008.6.1.433
-  "Mediastinum Anatomy Finding Or Feature" },
+  "Mediastinum Anatomy Finding or Feature" },
 { 0, 0, 0, 6114, // 1.2.840.10008.6.1.434
-  "Osseous Anatomy Finding Or Feature" },
+  "Osseous Anatomy Finding or Feature" },
 { 0, 0, 0, 6115, // 1.2.840.10008.6.1.435
   "Osseous Anatomy Modifiers" },
 { 0, 0, 0, 6116, // 1.2.840.10008.6.1.436
@@ -2516,7 +2609,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 7453, // 1.2.840.10008.6.1.517
   "Performing Roles" },
 { 0, 0, 0, 7454, // 1.2.840.10008.6.1.518
-  "Species" },
+  "Animal Taxonomic Rank Values" },
 { 0, 0, 0, 7455, // 1.2.840.10008.6.1.519
   "Sex" },
 { 0, 0, 0, 7456, // 1.2.840.10008.6.1.520
@@ -2564,7 +2657,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 10008, // 1.2.840.10008.6.1.541
   "Dose Related Distance Measurements" },
 { 0, 0, 0, 10009, // 1.2.840.10008.6.1.542
-  "Measured/calculated" },
+  "Measured/Calculated" },
 { 0, 0, 0, 10010, // 1.2.840.10008.6.1.543
   "Dose Measurement Devices" },
 { 0, 0, 0, 10011, // 1.2.840.10008.6.1.544
@@ -2626,7 +2719,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 12105, // 1.2.840.10008.6.1.572
   "Intracranial Cerebral Vessels" },
 { 0, 0, 0, 12106, // 1.2.840.10008.6.1.573
-  "Intracranial Cerebral Vessels (unilateral)" },
+  "Intracranial Cerebral Vessels (Unilateral)" },
 { 0, 0, 0, 12107, // 1.2.840.10008.6.1.574
   "Upper Extremity Arteries" },
 { 0, 0, 0, 12108, // 1.2.840.10008.6.1.575
@@ -2636,13 +2729,13 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 12110, // 1.2.840.10008.6.1.577
   "Lower Extremity Veins" },
 { 0, 0, 0, 12111, // 1.2.840.10008.6.1.578
-  "Abdominal Arteries (lateral)" },
+  "Abdominal Arteries (Lateral)" },
 { 0, 0, 0, 12112, // 1.2.840.10008.6.1.579
-  "Abdominal Arteries (unilateral)" },
+  "Abdominal Arteries (Unilateral)" },
 { 0, 0, 0, 12113, // 1.2.840.10008.6.1.580
-  "Abdominal Veins (lateral)" },
+  "Abdominal Veins (Lateral)" },
 { 0, 0, 0, 12114, // 1.2.840.10008.6.1.581
-  "Abdominal Veins (unilateral)" },
+  "Abdominal Veins (Unilateral)" },
 { 0, 0, 0, 12115, // 1.2.840.10008.6.1.582
   "Renal Vessels" },
 { 0, 0, 0, 12116, // 1.2.840.10008.6.1.583
@@ -2959,9 +3052,9 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 6200, // 1.2.840.10008.6.1.787
   "Colon Overall Assessment" },
 { 0, 0, 0, 6201, // 1.2.840.10008.6.1.788
-  "Colon Finding Or Feature" },
+  "Colon Finding or Feature" },
 { 0, 0, 0, 6202, // 1.2.840.10008.6.1.789
-  "Colon Finding Or Feature Modifier" },
+  "Colon Finding or Feature Modifier" },
 { 0, 0, 0, 6203, // 1.2.840.10008.6.1.790
   "Colon Non-lesion Object Type" },
 { 0, 0, 0, 6204, // 1.2.840.10008.6.1.791
@@ -3120,7 +3213,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 12288, // 1.2.840.10008.6.1.868
   "Cardiac Ultrasound Outflow Tracts Finding Sites" },
 { 0, 0, 0, 12289, // 1.2.840.10008.6.1.869
-  "Cardiac Ultrasound Semilunar Valves, Annulate and Sinuses Finding Sites" },
+  "Cardiac Ultrasound Semilunar Valves, Annulus and Sinuses Finding Sites" },
 { 0, 0, 0, 12290, // 1.2.840.10008.6.1.870
   "Cardiac Ultrasound Pulmonary Arteries Finding Sites" },
 { 0, 0, 0, 12291, // 1.2.840.10008.6.1.871
@@ -3153,12 +3246,12 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 4239, // 1.2.840.10008.6.1.885
   "Anterior Chamber Depth Definition" },
 { 0, 0, 0, 4240, // 1.2.840.10008.6.1.886
-  "Ophthalmic Measurement Or Calculation Data Source" },
+  "Ophthalmic Measurement or Calculation Data Source" },
 { 0, 0, 0, 4241, // 1.2.840.10008.6.1.887
   "Ophthalmic Axial Length Selection Method" },
 { 0, 0, 0, 0, 0 },
 { 0, 0, 0, 4243, // 1.2.840.10008.6.1.889
-  "Ophthalmic Axial Length Quality Metric Type" },
+  "Ophthalmic Quality Metric Type" },
 { 0, 0, 0, 4244, // 1.2.840.10008.6.1.890
   "Ophthalmic Agent Concentration Units" },
 { 0, 0, 0, 91, // 1.2.840.10008.6.1.891
@@ -3388,7 +3481,7 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 12021, // 1.2.840.10008.6.1.1006
   "Fetal Long Bone Anatomic Sites" },
 { 0, 0, 0, 12022, // 1.2.840.10008.6.1.1007
-  "Fetal Cranium Bone Anatomic Sites" },
+  "Fetal Cranium Anatomic Sites" },
 { 0, 0, 0, 12023, // 1.2.840.10008.6.1.1008
   "Pelvis and Uterus Anatomic Sites" },
 { 0, 0, 0, 7222, // 1.2.840.10008.6.1.1009
@@ -3420,11 +3513,11 @@ UIDTableEntry UIDTable[] = {
 { 0, 0, 0, 4026, // 1.2.840.10008.6.1.1022
   "Primary Anatomic Structure for Intra-oral and Craniofacial Radiography" },
 { 0, 0, 0, 9401, // 1.2.840.10008.6.1.1023
-  "IEC6127 Device Position Parameters" },
+  "IEC61217 Device Position Parameters" },
 { 0, 0, 0, 9402, // 1.2.840.10008.6.1.1024
-  "IEC6127 Gantry Position Parameters" },
+  "IEC61217 Gantry Position Parameters" },
 { 0, 0, 0, 9403, // 1.2.840.10008.6.1.1025
-  "IEC6127 Patient Support Position Parameters" },
+  "IEC61217 Patient Support Position Parameters" },
 { 0, 0, 0, 7035, // 1.2.840.10008.6.1.1026
   "Actionable Finding Classification" },
 { 0, 0, 0, 7036, // 1.2.840.10008.6.1.1027
@@ -3499,12 +3592,128 @@ UIDTableEntry UIDTable[] = {
   "Diffusion Tractography Algorithm Families" },
 { 0, 0, 0, 7263, // 1.2.840.10008.6.1.1062
   "Diffusion Tractography Measurement Types" },
-{ 2206, 2, 1, 0, 0 },
+{ 0, 0, 0, 7490, // 1.2.840.10008.6.1.1063
+  "Research Animal Source Registries" },
+{ 0, 0, 0, 231, // 1.2.840.10008.6.1.1064
+  "Yes-No Only" },
+{ 0, 0, 0, 601, // 1.2.840.10008.6.1.1065
+  "Biosafety Levels" },
+{ 0, 0, 0, 602, // 1.2.840.10008.6.1.1066
+  "Biosafety Control Reasons" },
+{ 0, 0, 0, 7457, // 1.2.840.10008.6.1.1067
+  "Sex - Male Female or Both" },
+{ 0, 0, 0, 603, // 1.2.840.10008.6.1.1068
+  "Animal Room Types" },
+{ 0, 0, 0, 604, // 1.2.840.10008.6.1.1069
+  "Device Reuse" },
+{ 0, 0, 0, 605, // 1.2.840.10008.6.1.1070
+  "Animal Bedding Material" },
+{ 0, 0, 0, 606, // 1.2.840.10008.6.1.1071
+  "Animal Shelter Types" },
+{ 0, 0, 0, 607, // 1.2.840.10008.6.1.1072
+  "Animal Feed Types" },
+{ 0, 0, 0, 608, // 1.2.840.10008.6.1.1073
+  "Animal Feed Sources" },
+{ 0, 0, 0, 609, // 1.2.840.10008.6.1.1074
+  "Animal Feeding Methods" },
+{ 0, 0, 0, 610, // 1.2.840.10008.6.1.1075
+  "Water Types" },
+{ 0, 0, 0, 611, // 1.2.840.10008.6.1.1076
+  "Anesthesia Category Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 612, // 1.2.840.10008.6.1.1077
+  "Anesthesia Category Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 613, // 1.2.840.10008.6.1.1078
+  "Anesthesia Induction Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 614, // 1.2.840.10008.6.1.1079
+  "Anesthesia Induction Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 615, // 1.2.840.10008.6.1.1080
+  "Anesthesia Maintenance Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 616, // 1.2.840.10008.6.1.1081
+  "Anesthesia Maintenance Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 617, // 1.2.840.10008.6.1.1082
+  "Airway Management Method Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 618, // 1.2.840.10008.6.1.1083
+  "Airway Management Method Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 619, // 1.2.840.10008.6.1.1084
+  "Airway Management Sub-Method Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 620, // 1.2.840.10008.6.1.1085
+  "Airway Management Sub-Method Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 621, // 1.2.840.10008.6.1.1086
+  "Medication Type Code Type for Small Animal Anesthesia" },
+{ 0, 0, 0, 622, // 1.2.840.10008.6.1.1087
+  "Medication Type Code Type from Anesthesia Quality Initiative (AQI)" },
+{ 0, 0, 0, 623, // 1.2.840.10008.6.1.1088
+  "Medication for Small Animal Anesthesia" },
+{ 0, 0, 0, 624, // 1.2.840.10008.6.1.1089
+  "Inhalational Anesthesia Agents for Small Animal Anesthesia" },
+{ 0, 0, 0, 625, // 1.2.840.10008.6.1.1090
+  "Injectable Anesthesia Agents for Small Animal Anesthesia" },
+{ 0, 0, 0, 626, // 1.2.840.10008.6.1.1091
+  "Premedication Agents for Small Animal Anesthesia" },
+{ 0, 0, 0, 627, // 1.2.840.10008.6.1.1092
+  "Neuromuscular Blocking Agents for Small Animal Anesthesia" },
+{ 0, 0, 0, 628, // 1.2.840.10008.6.1.1093
+  "Ancillary Medications for Small Animal Anesthesia" },
+{ 0, 0, 0, 629, // 1.2.840.10008.6.1.1094
+  "Carrier Gases for Small Animal Anesthesia" },
+{ 0, 0, 0, 630, // 1.2.840.10008.6.1.1095
+  "Local Anesthetics for Small Animal Anesthesia" },
+{ 0, 0, 0, 631, // 1.2.840.10008.6.1.1096
+  "Phase of Procedure Requiring Anesthesia" },
+{ 0, 0, 0, 632, // 1.2.840.10008.6.1.1097
+  "Phase of Surgical Procedure Requiring Anesthesia" },
+{ 0, 0, 0, 633, // 1.2.840.10008.6.1.1098
+  "Phase of Imaging Procedure Requiring Anesthesia" },
+{ 0, 0, 0, 634, // 1.2.840.10008.6.1.1099
+  "Phase of Animal Handling" },
+{ 0, 0, 0, 635, // 1.2.840.10008.6.1.1100
+  "Heating Method" },
+{ 0, 0, 0, 636, // 1.2.840.10008.6.1.1101
+  "Temperature Sensor Device Component Type for Small Animal Procedures" },
+{ 0, 0, 0, 637, // 1.2.840.10008.6.1.1102
+  "Exogenous Substance Types" },
+{ 0, 0, 0, 638, // 1.2.840.10008.6.1.1103
+  "Exogenous Substance" },
+{ 0, 0, 0, 639, // 1.2.840.10008.6.1.1104
+  "Tumor Graft Histologic Type" },
+{ 0, 0, 0, 640, // 1.2.840.10008.6.1.1105
+  "Fibrils" },
+{ 0, 0, 0, 641, // 1.2.840.10008.6.1.1106
+  "Viruses" },
+{ 0, 0, 0, 642, // 1.2.840.10008.6.1.1107
+  "Cytokines" },
+{ 0, 0, 0, 643, // 1.2.840.10008.6.1.1108
+  "Toxins" },
+{ 0, 0, 0, 644, // 1.2.840.10008.6.1.1109
+  "Exogenous Substance Administration Sites" },
+{ 0, 0, 0, 645, // 1.2.840.10008.6.1.1110
+  "Exogenous Substance Tissue of Origin" },
+{ 0, 0, 0, 646, // 1.2.840.10008.6.1.1111
+  "Preclinical Small Animal Imaging Procedures" },
+{ 0, 0, 0, 647, // 1.2.840.10008.6.1.1112
+  "Position Reference Indicator for Frame of Reference" },
+{ 0, 0, 0, 241, // 1.2.840.10008.6.1.1113
+  "Present-Absent Only" },
+{ 0, 0, 0, 10024, // 1.2.840.10008.6.1.1114
+  "Water Equivalent Diameter Method" },
+{ 0, 0, 0, 7022, // 1.2.840.10008.6.1.1115
+  "Radiotherapy Purposes of Reference" },
+{ 0, 0, 0, 701, // 1.2.840.10008.6.1.1116
+  "Content Assessment Types" },
+{ 0, 0, 0, 702, // 1.2.840.10008.6.1.1117
+  "RT Content Assessment Types" },
+{ 0, 0, 0, 703, // 1.2.840.10008.6.1.1118
+  "Basis of Assessment" },
+{ 0, 0, 0, 7449, // 1.2.840.10008.6.1.1119
+  "Reader Specialty" },
+{ 0, 0, 0, 9233, // 1.2.840.10008.6.1.1120
+  "Requested Report Types" },
+{ 2346, 2, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.7.1.1
   "Native DICOM Model" },
 { 0, 0, 0, 0, // 1.2.840.10008.7.1.2
   "Abstract Multi-Dimensional Image Model" },
-{ 2209, 1, 1, 0, 0 },
+{ 2349, 1, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.8.1.1
   "DICOM Content Mapping Resource" },
 { 0, 0, 0, 0, // 1.2.840.10008.9.1
@@ -3555,10 +3764,10 @@ UIDTableEntry UIDTable[] = {
   "General Section Entries" },
 { 0, 0, 0, 0, // 1.2.840.10008.9.24
   "Imaging Addendum Report" },
-{ 2236, 2, 3, 0, 0 },
-{ 2277, 1, 1, 0, 0 },
-{ 2238, 31, 1, 0, 0 },
-{ 2269, 8, 1, 0, 0 },
+{ 2376, 2, 3, 0, 0 },
+{ 2417, 1, 1, 0, 0 },
+{ 2378, 31, 1, 0, 0 },
+{ 2409, 8, 1, 0, 0 },
 { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.1
   "dicomDeviceName" },
 { 0, 0, 0, 0, // 1.2.840.10008.15.0.3.2
@@ -3641,65 +3850,65 @@ UIDTableEntry UIDTable[] = {
   "Universal Coordinated Time" },
 };
 
-UIDTableEntry *GetUIDTableEntry(const char *uid)
+const UIDTableEntry *GetUIDTableEntry(const char *uid)
 {
   if (uid == 0)
-    {
+  {
     return 0;
-    }
+  }
 
   const char *prefix = "1.2.840.10008.";
   while (*prefix != '\0' && *uid != '\0' && *prefix == *uid)
-    {
+  {
     prefix++;
     uid++;
-    }
+  }
 
   if (*prefix != '\0')
-    {
+  {
     return 0;
-    }
+  }
 
-  UIDTableEntry *table = UIDTable;
+  const UIDTableEntry *table = UIDTable;
   while (*uid != '\0')
-    {
+  {
     int i = -1;
     if (*uid >= '0' && *uid <= '9')
-      {
+    {
       if (uid[0] != '0' || uid[1] != '0')
-        {
+      {
         i = 0;
         do
-          {
+        {
           i *= 10;
           i += (*uid - '0');
           uid++;
-          }
-        while (*uid >= '0' && *uid <= '9' && i < 214748364);
         }
+        while (*uid >= '0' && *uid <= '9' && i < 214748364);
       }
+    }
     if (*uid == '.')
-      {
+    {
       uid++;
       if (*uid == '\0')
-        {
+      {
         table = 0;
         break;
-        }
       }
+    }
     else if (*uid != '\0')
-      {
+    {
       table = 0;
       break;
-      }
+    }
     i -= table->First;
     if (i < 0 || i >= static_cast<int>(table->Size))
-      {
+    {
       table = 0;
       break;
-      }
-    table = &UIDTable[table->Next + i];
     }
+    table = &UIDTable[table->Next + i];
+  }
 
   return table;
 }
@@ -3709,24 +3918,24 @@ UIDTableEntry *GetUIDTableEntry(const char *uid)
 const char *vtkDICOMUtilities::GetUIDName(const char *uid)
 {
   const char *result = "";
-  UIDTableEntry *table = GetUIDTableEntry(uid);
+  const UIDTableEntry *table = GetUIDTableEntry(uid);
   if (table)
-    {
+  {
     if (table->Name)
-      {
+    {
       result = table->Name;
-      }
     }
+  }
   return result;
 }
 
 unsigned short vtkDICOMUtilities::GetCIDFromUID(const char *uid)
 {
   unsigned short result = 0;
-  UIDTableEntry *table = GetUIDTableEntry(uid);
+  const UIDTableEntry *table = GetUIDTableEntry(uid);
   if (table)
-    {
+  {
     result = table->CID;
-    }
+  }
   return result;
 }
diff --git a/Source/vtkDICOMVM.cxx b/Source/vtkDICOMVM.cxx
index c7b8ed9..fd87d3a 100644
--- a/Source/vtkDICOMVM.cxx
+++ b/Source/vtkDICOMVM.cxx
@@ -20,21 +20,21 @@ ostream& operator<<(ostream& o, const vtkDICOMVM& a)
   int s = a.GetStep();
   o << n;
   if (m > n || m < 0)
-    {
+  {
     o << "-";
     if (s > 1)
-      {
+    {
       o << s;
-      }
+    }
     if (m > 0)
-      {
+    {
       o << m;
-      }
+    }
     else
-      {
+    {
       o << "n";
-      }
     }
+  }
 
   return o;
 }
diff --git a/Source/vtkDICOMVM.h b/Source/vtkDICOMVM.h
index fd9fc41..eff5fc7 100644
--- a/Source/vtkDICOMVM.h
+++ b/Source/vtkDICOMVM.h
@@ -432,12 +432,15 @@ public:
     M8192 = 0xA000
   };
 
+  //@{
   //! Construct an empty, invalid VM.
   vtkDICOMVM() : Key(0) {}
 
   //! Construct a VM from a VM enum constant.
   vtkDICOMVM(EnumType vm) : Key(static_cast<unsigned short>(vm)) {}
+  //@}
 
+  //@{
   //! Check validity of this VM.
   bool IsValid() const { return (this->Key != 0); }
 
@@ -455,13 +458,16 @@ public:
   int GetStep() const {
     if ((this->Key & 0x8000) != 0) { return 1; }
     else { return ((this->Key & 0x80) == 0 ? 1 : ((-this->Key) & 0xff)); } }
+  //@}
 
+  //@{
   bool operator==(vtkDICOMVM b) const { return (this->Key == b.Key); }
   bool operator!=(vtkDICOMVM b) const { return (this->Key != b.Key); }
   bool operator<=(vtkDICOMVM a) const { return (this->Key <= a.Key); }
   bool operator>=(vtkDICOMVM a) const { return (this->Key >= a.Key); }
   bool operator<(vtkDICOMVM a) const { return (this->Key < a.Key); }
   bool operator>(vtkDICOMVM a) const { return (this->Key > a.Key); }
+  //@}
 
 private:
   unsigned short Key;
diff --git a/Source/vtkDICOMVR.h b/Source/vtkDICOMVR.h
index 23e915f..148f51e 100644
--- a/Source/vtkDICOMVR.h
+++ b/Source/vtkDICOMVR.h
@@ -63,6 +63,7 @@ public:
     XS = 0x21  //!< Either SS or US (for dict entries, not data elements)
   };
 
+  //@{
   //! Construct an empty, invalid VR.
   vtkDICOMVR() : Key(0) {}
 
@@ -75,7 +76,9 @@ public:
 
   //! Attempt to construct a VR from a two unsigned bytes.
   vtkDICOMVR(const unsigned char vr[2]) : Key(VRTable[vr[0]][vr[1]]) {}
+  //@}
 
+  //@{
   //! Check validity of this VR.
   bool IsValid() const { return (this->Key != 0); }
 
@@ -84,7 +87,9 @@ public:
 
   //! Get the two-character text for this VR.
   const char *GetText() const { return TextTable[this->Key]; }
+  //@}
 
+  //@{
   //! The VRs OB, OD, OF, OL, OW, SQ, UC, UN, UR, UT require a 32-bit VL.
   bool HasLongVL() const {
     return (((1ull << this->Key) & 0xb223e001u) != 0); }
@@ -113,13 +118,16 @@ public:
    */
   bool HasSingleValue() const {
     return (((1ull << this->Key) & 0x80801000u) != 0); }
+  //@}
 
+  //@{
   bool operator==(vtkDICOMVR a) const { return (this->Key == a.Key); }
   bool operator!=(vtkDICOMVR a) const { return (this->Key != a.Key); }
   bool operator<=(vtkDICOMVR a) const { return (this->Key <= a.Key); }
   bool operator>=(vtkDICOMVR a) const { return (this->Key >= a.Key); }
   bool operator<(vtkDICOMVR a) const { return (this->Key < a.Key); }
   bool operator>(vtkDICOMVR a) const { return (this->Key > a.Key); }
+  //@}
 
 private:
   unsigned char Key;
diff --git a/Source/vtkDICOMValue.cxx b/Source/vtkDICOMValue.cxx
index 18835ee..95d1836 100644
--- a/Source/vtkDICOMValue.cxx
+++ b/Source/vtkDICOMValue.cxx
@@ -58,48 +58,48 @@ void StringConversion(
   const char *cp, vtkDICOMVR vr, OT *v, size_t i, size_t n)
 {
   if (vr == vtkDICOMVR::IS || vr == vtkDICOMVR::DS)
-    {
+  {
     for (size_t j = 0; j < i && *cp != '\0'; j++)
-      {
+    {
       bool bk = false;
       do
-        {
+      {
         bk = (*cp == '\\');
         cp++;
-        }
-      while (!bk && *cp != '\0');
       }
+      while (!bk && *cp != '\0');
+    }
 
     for (size_t k = 0; k < n && *cp != '\0'; k++)
-      {
+    {
       if (vr == vtkDICOMVR::DS)
-        {
+      {
         *v++ = static_cast<OT>(strtod(cp, NULL));
-        }
+      }
       else
-        {
+      {
         *v++ = static_cast<OT>(strtol(cp, NULL, 10));
-        }
+      }
       bool bk = false;
       do
-        {
+      {
         bk = (*cp == '\\');
         cp++;
-        }
-      while (!bk && *cp != '\0');
       }
+      while (!bk && *cp != '\0');
     }
+  }
   else if (n > 0)
-    {
+  {
     do { *v++ = 0; } while (--n);
-    }
+  }
 }
 
 // specialize conversion for vtkDICOMTag
 void StringConversionAT(const char *cp, vtkDICOMTag *v, size_t n)
 {
   for (size_t k = 0; k < n && *cp != '\0'; k++)
-    {
+  {
     while (!IsHexDigit(*cp) && *cp != '\\' && *cp != '\0')  { cp++; }
     const char *dp = cp;
     while (IsHexDigit(*dp)) { dp++; }
@@ -110,12 +110,12 @@ void StringConversionAT(const char *cp, vtkDICOMTag *v, size_t n)
 
     bool bk = false;
     do
-      {
+    {
       bk = (*cp == '\\');
       cp++;
-      }
-    while (!bk && *cp != '\0');
     }
+    while (!bk && *cp != '\0');
+  }
 }
 
 // custom allocator
@@ -123,20 +123,20 @@ void *ValueMalloc(size_t size)
 {
   void *vp = 0;
   while ((vp = malloc(size)) == 0)
-    {
+  {
     // for C++11, get_new_handler is preferred
     std::new_handler global_handler = std::set_new_handler(0);
     std::set_new_handler(global_handler);
 
     if (global_handler)
-      {
+    {
       global_handler();
-      }
+    }
     else
-      {
+    {
       throw std::bad_alloc();
-      }
     }
+  }
 
   return vp;
 }
@@ -164,8 +164,8 @@ vtkDICOMValue::ValueT<T>::ValueT(vtkDICOMVR vr, size_t vn)
   this->CharacterSet = 0;
   this->Overflow = OVERFLOW_BYTE(vn);
   this->VR = vr;
-  this->VL = vn*sizeof(T);
-  this->NumberOfValues = vn;
+  this->VL = static_cast<unsigned int>(vn*sizeof(T));
+  this->NumberOfValues = static_cast<unsigned int>(vn);
 }
 
 // Construct a string value.
@@ -177,7 +177,7 @@ vtkDICOMValue::ValueT<char>::ValueT(vtkDICOMVR vr, size_t vn)
   this->CharacterSet = 0;
   this->Overflow = OVERFLOW_BYTE(vn);
   this->VR = vr;
-  this->VL = vn;
+  this->VL = static_cast<unsigned int>(vn);
   this->NumberOfValues = (vn > 0);
 }
 
@@ -189,8 +189,9 @@ vtkDICOMValue::ValueT<unsigned char>::ValueT(vtkDICOMVR vr, size_t vn)
   this->CharacterSet = 0;
   this->Overflow = OVERFLOW_BYTE(vn);
   this->VR = vr;
-  this->VL = vn + (vn & 1); // pad VL to make it even
-  this->NumberOfValues = vn;
+  // pad VL to make it even
+  this->VL = static_cast<unsigned int>(vn + (vn & 1));
+  this->NumberOfValues = static_cast<unsigned int>(vn);
 }
 
 // Construct a list of attribute tags.
@@ -201,15 +202,15 @@ vtkDICOMValue::ValueT<vtkDICOMTag>::ValueT(vtkDICOMVR vr, size_t vn)
   this->CharacterSet = 0;
   this->Overflow = OVERFLOW_BYTE(vn);
   this->VR = vr;
-  this->VL = 4*vn;
-  this->NumberOfValues = vn;
+  this->VL = static_cast<unsigned int>(4*vn);
+  this->NumberOfValues = static_cast<unsigned int>(vn);
   vtkDICOMTag *dp = this->Data;
   for (size_t i = 0; i < vn; i++)
-    {
+  {
     // call constructor manually with placement new
     new(dp) vtkDICOMTag();
     dp++;
-    }
+  }
 }
 
 // Construct a sequence of items.
@@ -221,14 +222,14 @@ vtkDICOMValue::ValueT<vtkDICOMItem>::ValueT(vtkDICOMVR vr, size_t vn)
   this->Overflow = OVERFLOW_BYTE(vn);
   this->VR = vr; // better be SQ
   this->VL = 0;
-  this->NumberOfValues = vn;
+  this->NumberOfValues = static_cast<unsigned int>(vn);
   vtkDICOMItem *dp = this->Data;
   for (size_t i = 0; i < vn; i++)
-    {
+  {
     // call constructor manually with placement new
     new(dp) vtkDICOMItem();
     dp++;
-    }
+  }
 }
 
 // Construct a list of values.
@@ -240,14 +241,14 @@ vtkDICOMValue::ValueT<vtkDICOMValue>::ValueT(vtkDICOMVR vr, size_t vn)
   this->Overflow = OVERFLOW_BYTE(vn);
   this->VR = vr;
   this->VL = 0;
-  this->NumberOfValues = vn;
+  this->NumberOfValues = static_cast<unsigned int>(vn);
   vtkDICOMValue *dp = this->Data;
   for (size_t i = 0; i < vn; i++)
-    {
+  {
     // call constructor manually with placement new
     new(dp) vtkDICOMValue();
     dp++;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -323,9 +324,9 @@ char *vtkDICOMValue::AllocateCharData(
 {
   char *data = this->Allocate<char>(vr, vn);
   if (vr.HasSpecificCharacterSet() && this->V)
-    {
+  {
     this->V->CharacterSet = cs.GetKey();
-    }
+  }
   return data;
 }
 
@@ -389,32 +390,32 @@ vtkDICOMValue *vtkDICOMValue::AllocateMultiplexData(
 void vtkDICOMValue::ComputeNumberOfValuesForCharData()
 {
   if (this->V && this->V->Type == VTK_CHAR)
-    {
+  {
     if (this->V->VL == 0)
-      {
+    {
       this->V->NumberOfValues = 0;
-      }
+    }
     else if (this->V->VR.HasSingleValue())
-      {
+    {
       this->V->NumberOfValues = 1;
-      }
+    }
     else
-      {
+    {
       const char *ptr = static_cast<const ValueT<char> *>(this->V)->Data;
       unsigned int n = 1;
       size_t vl = this->V->VL;
       if (this->V->CharacterSet == 0)
-        {
+      {
         do { n += (*ptr++ == '\\'); } while (--vl);
-        }
+      }
       else
-        {
+      {
         vtkDICOMCharacterSet cs = this->GetCharacterSet();
         n += cs.CountBackslashes(ptr, vl);
-        }
-      this->V->NumberOfValues = n;
       }
+      this->V->NumberOfValues = n;
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -441,9 +442,9 @@ unsigned char *vtkDICOMValue::ReallocateUnsignedCharData(size_t vn)
 
   // decrement the refcount of the old V
   if (--(v->ReferenceCount) == 0)
-    {
+  {
     vtkDICOMValue::FreeValue(v);
-    }
+  }
 
   return ptr;
 }
@@ -460,182 +461,182 @@ void vtkDICOMValue::CreateValue(vtkDICOMVR vr, const T *data, size_t n)
   this->V = 0;
 
   if (vr == VR::OX)
-    {
+  {
     // OX means "OB or OW", use type to find out which
     vr = (vt == VTK_UNSIGNED_CHAR ? VR::OB : VR::OW);
-    }
+  }
   else if (vr == VR::XS)
-    {
+  {
     // XS means "SS or US", use type to find out which
     vr = (vt == VTK_UNSIGNED_SHORT ? VR::US : VR::SS);
-    }
+  }
 
   // use VR to set data type, then convert input to that type
   if (vr == VR::FD)
-    {
+  {
     double *ptr = this->AllocateDoubleData(vr, n);
     NumericalConversion(data, ptr, n);
-    }
+  }
   else if (vr == VR::FL)
-    {
+  {
     float *ptr = this->AllocateFloatData(vr, n);
     NumericalConversion(data, ptr, n);
-    }
+  }
   else if (vr == VR::UL)
-    {
+  {
     unsigned int *ptr = this->AllocateUnsignedIntData(vr, n);
     NumericalConversion(data, ptr, n);
-    }
+  }
   else if (vr == VR::SL)
-    {
+  {
     int *ptr = this->AllocateIntData(vr, n);
     NumericalConversion(data, ptr, n);
-    }
+  }
   else if (vr == VR::US)
-    {
+  {
     unsigned short *ptr = this->AllocateUnsignedShortData(vr, n);
     NumericalConversion(data, ptr, n);
-    }
+  }
   else if (vr == VR::SS)
-    {
+  {
     short *ptr = this->AllocateShortData(vr, n);
     NumericalConversion(data, ptr, n);
-    }
+  }
   else if (vr == VR::DS)
-    {
+  {
     char *cp = this->AllocateCharData(vr, 17*n);
     char *dp = cp;
     for (size_t i = 0; i < n; i++)
-      {
+    {
       double d = static_cast<double>(data[i]);
       // clamp to the range allowed for DICOM decimal strings
       if (d > 9.999999999e+99)
-        {
+      {
         d = 9.999999999e+99;
-        }
+      }
       else if (d < -9.999999999e+99)
-        {
+      {
         d = -9.999999999e+99;
-        }
+      }
       else if (fabs(d) < 1e-99 || vtkMath::IsNan(d))
-        {
+      {
         d = 0.0;
-        }
+      }
       // use a precision that will use 16 characters maximum
       sprintf(cp, "%.10g", d);
       size_t dl = strlen(cp);
       // look for extra leading zeros on exponent
       if (dl >= 5 && (cp[dl-5] == 'e' || cp[dl-5] =='E') && cp[dl-3] == '0')
-        {
+      {
         cp[dl-3] = cp[dl-2];
         cp[dl-2] = cp[dl-1];
         cp[dl-1] = '\0';
         dl--;
-        }
+      }
       cp += dl;
       *cp++ = '\\';
-      }
+    }
     if (cp != dp) { --cp; }
     this->V->NumberOfValues = static_cast<unsigned int>(n);
     this->V->VL = static_cast<unsigned int>(cp - dp);
     if (this->V->VL & 1)
-      { // pad to even number of chars
+    { // pad to even number of chars
       *cp++ = ' ';
       this->V->VL++;
-      }
-    *cp = '\0';
     }
+    *cp = '\0';
+  }
   else if (vr == VR::IS)
-    {
+  {
     char *cp = this->AllocateCharData(vr, 13*n);
     char *dp = cp;
     for (size_t i = 0; i < n; i++)
-      {
+    {
       sprintf(cp, "%i", static_cast<int>(data[i]));
       cp += strlen(cp);
       *cp++ = '\\';
-      }
+    }
     if (cp != dp) { --cp; }
     this->V->NumberOfValues = static_cast<unsigned int>(n);
     this->V->VL = static_cast<unsigned int>(cp - dp);
     if (this->V->VL & 1)
-      { // pad to even number of chars
+    { // pad to even number of chars
       *cp++ = ' ';
       this->V->VL++;
-      }
-    *cp = '\0';
     }
+    *cp = '\0';
+  }
   else if (vr == VR::OB || vr == VR::UN)
-    {
+  {
     size_t m = n*sizeof(T);
     int pad = (m & 1);
     unsigned char *ptr = this->AllocateUnsignedCharData(vr, m + pad);
     memcpy(ptr, data, m);
     if (pad) { ptr[m] = 0; } // pad to even
     this->V->NumberOfValues = static_cast<unsigned int>(m);
-    }
+  }
   else if (vr == VR::OW)
-    {
+  {
     if (vt == VTK_SHORT)
-      {
+    {
       short *ptr = this->AllocateShortData(vr, n);
       memcpy(ptr, data, n*2);
-      }
+    }
     else
-      {
+    {
       unsigned short *ptr = this->AllocateUnsignedShortData(vr, n*sizeof(T)/2);
       memcpy(ptr, data, n*sizeof(T));
-      }
     }
+  }
   else if (vr == VR::OL)
-    {
+  {
     if (vt == VTK_INT)
-      {
+    {
       int *ptr = this->AllocateIntData(vr, n);
       memcpy(ptr, data, n*4);
-      }
+    }
     else
-      {
+    {
       unsigned int *ptr = this->AllocateUnsignedIntData(vr, n*sizeof(T)/4);
       memcpy(ptr, data, n*sizeof(T));
-      }
     }
+  }
   else if (vr == VR::OF)
-    {
+  {
     float *ptr = this->AllocateFloatData(vr, n*sizeof(T)/4);
     memcpy(ptr, data, n*sizeof(T));
-    }
+  }
   else if (vr == VR::OD)
-    {
+  {
     double *ptr = this->AllocateDoubleData(vr, n*sizeof(T)/8);
     memcpy(ptr, data, n*sizeof(T));
-    }
+  }
   else if (vr == VR::AT)
-    {
+  {
     if (sizeof(T) > 2)
-      {
+    {
       // subsequent values represent 32-bit keys
       vtkDICOMTag *ptr = this->AllocateTagData(vr, n);
       for (size_t i = 0; i < n; i++)
-        {
+      {
         unsigned int k = static_cast<unsigned int>(data[i]);
         unsigned short g = static_cast<unsigned short>(k >> 16);
         unsigned short e = static_cast<unsigned short>(k);
         ptr[i] = vtkDICOMTag(g,e);
-        }
       }
+    }
     else
-      {
+    {
       // subsequent values represent group,element pairs
       vtkDICOMTag *ptr = this->AllocateTagData(vr, n/2);
       for (size_t i = 0; i < n; i += 2)
-        {
+      {
         unsigned short g = static_cast<unsigned short>(data[i]);
         unsigned short e = static_cast<unsigned short>(data[i+1]);
         ptr[i/2] = vtkDICOMTag(g,e);
-        }
       }
     }
+  }
 }
 
 template<>
@@ -649,13 +650,13 @@ void vtkDICOMValue::CreateValue<vtkDICOMTag>(
   this->V = 0;
 
   if (vr == VR::AT)
-    {
+  {
     vtkDICOMTag *ptr = this->AllocateTagData(vr, n);
     for (size_t i = 0; i < n; i++)
-      {
+    {
       ptr[i] = data[i];
-      }
     }
+  }
 }
 
 template<>
@@ -669,13 +670,13 @@ void vtkDICOMValue::CreateValue<vtkDICOMItem>(
   this->V = 0;
 
   if (vr == VR::SQ)
-    {
+  {
     vtkDICOMItem *ptr = this->AllocateSequenceData(vr, n);
     for (size_t i = 0; i < n; i++)
-      {
+    {
       ptr[i] = data[i];
-      }
     }
+  }
 }
 
 template<>
@@ -690,7 +691,7 @@ void vtkDICOMValue::CreateValue<char>(
 
   // directly copy data into these VRs without conversion
   if (vr.HasSingleValue())
-    {
+  {
     int pad = (m & 1);
     char *ptr = this->AllocateCharData(vr, m + pad);
     memcpy(ptr, data, m);
@@ -698,51 +699,51 @@ void vtkDICOMValue::CreateValue<char>(
     if (pad) { ptr[m++] = ' '; }
     ptr[m] = '\0';
     this->V->NumberOfValues = 1;
-    }
+  }
   else if (vr == VR::OW)
-    {
+  {
     unsigned short *ptr = this->AllocateUnsignedShortData(vr, m/2);
     memcpy(ptr, data, m);
-    }
+  }
   else if (vr == VR::OL)
-    {
+  {
     unsigned int *ptr = this->AllocateUnsignedIntData(vr, m/4);
     memcpy(ptr, data, m);
-    }
+  }
   else if (vr == VR::OF)
-    {
+  {
     float *ptr = this->AllocateFloatData(vr, m/4);
     memcpy(ptr, data, m);
-    }
+  }
   else if (vr == VR::OD)
-    {
+  {
     double *ptr = this->AllocateDoubleData(vr, m/8);
     memcpy(ptr, data, m);
-    }
+  }
   else if (vr == VR::UN || vr == VR::OB || vr == VR::OX)
-    {
+  {
     int pad = (m & 1);
     unsigned char *ptr = this->AllocateUnsignedCharData(vr, m + pad);
     memcpy(ptr, data, m);
     // pad to even length with a null
     if (pad != 0) { ptr[m] = 0; }
-    }
+  }
 
   if (this->V)
-    {
+  {
     return;
-    }
+  }
 
   // count the number of backslash-separated values
   size_t n = (m > 0);
   for (size_t i = 0; i < m; i++)
-    {
+  {
     n += (data[i] == '\\');
-    }
+  }
 
   // convert input string to the specified VR
   if (vr.HasTextValue())
-    {
+  {
     int pad = (m & 1);
     char *cp = this->AllocateCharData(vr, m);
     strncpy(cp, data, m);
@@ -750,42 +751,42 @@ void vtkDICOMValue::CreateValue<char>(
     if (pad && vr != VR::UI) { cp[m++] = ' '; }
     cp[m] = '\0';
     this->V->NumberOfValues = static_cast<unsigned int>(n);
-    }
+  }
   else if (vr == VR::FD)
-    {
+  {
     double *ptr = this->AllocateDoubleData(vr, n);
     StringConversion(data, VR::DS, ptr, 0, n);
-    }
+  }
   else if (vr == VR::FL)
-    {
+  {
     float *ptr = this->AllocateFloatData(vr, n);
     StringConversion(data, VR::DS, ptr, 0, n);
-    }
+  }
   else if (vr == VR::UL)
-    {
+  {
     unsigned int *ptr = this->AllocateUnsignedIntData(vr, n);
     StringConversion(data, VR::IS, ptr, 0, n);
-    }
+  }
   else if (vr == VR::SL)
-    {
+  {
     int *ptr = this->AllocateIntData(vr, n);
     StringConversion(data, VR::IS, ptr, 0, n);
-    }
+  }
   else if (vr == VR::US)
-    {
+  {
     unsigned short *ptr = this->AllocateUnsignedShortData(vr, n);
     StringConversion(data, VR::IS, ptr, 0, n);
-    }
+  }
   else if (vr == VR::SS || vr == VR::XS)
-    {
+  {
     short *ptr = this->AllocateShortData(vr, n);
     StringConversion(data, VR::IS, ptr, 0, n);
-    }
+  }
   else if (vr == VR::AT)
-    {
+  {
     vtkDICOMTag *ptr = this->AllocateTagData(vr, n);
     StringConversionAT(data, ptr, n);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -886,14 +887,14 @@ void vtkDICOMValue::CreateValueWithSpecificCharacterSet(
 {
   this->CreateValue(vr, data, l);
   if (vr.HasSpecificCharacterSet() && this->V)
-    {
+  {
     this->V->CharacterSet = cs.GetKey();
     // character set might change interpretation of backslashes
     if (cs.GetKey() > vtkDICOMCharacterSet::ISO_IR_192)
-      {
+    {
       this->ComputeNumberOfValuesForCharData();
-      }
     }
+  }
 }
 
 vtkDICOMValue::vtkDICOMValue(
@@ -916,49 +917,49 @@ vtkDICOMValue::vtkDICOMValue(vtkDICOMVR vr)
   this->V = 0;
 
   if (vr.HasTextValue())
-    {
+  {
     this->AllocateCharData(vr, 0);
-    }
+  }
   else if (vr == VR::OW || vr == VR::OX)
-    {
+  {
     this->AllocateUnsignedShortData(VR::OW, 0);
-    }
+  }
   else if (vr == VR::OF || vr == VR::FL)
-    {
+  {
     this->AllocateFloatData(vr, 0);
-    }
+  }
   else if (vr == VR::OD || vr == VR::FD)
-    {
+  {
     this->AllocateDoubleData(vr, 0);
-    }
+  }
   else if (vr == VR::OB || vr == VR::UN)
-    {
+  {
     this->AllocateUnsignedCharData(vr, 0);
-    }
+  }
   else if (vr == VR::OL || vr == VR::UL)
-    {
+  {
     this->AllocateUnsignedIntData(vr, 0);
-    }
+  }
   else if (vr == VR::SL)
-    {
+  {
     this->AllocateIntData(vr, 0);
-    }
+  }
   else if (vr == VR::US)
-    {
+  {
     this->AllocateUnsignedShortData(vr, 0);
-    }
+  }
   else if (vr == VR::SS || vr == VR::XS)
-    {
+  {
     this->AllocateShortData(VR::SS, 0);
-    }
+  }
   else if (vr == VR::AT)
-    {
+  {
     this->AllocateTagData(vr, 0);
-    }
+  }
   else if (vr == VR::SQ)
-    {
+  {
     this->AllocateSequenceData(vr, 0);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -967,30 +968,30 @@ vtkDICOMValue::vtkDICOMValue(vtkDICOMVR vr)
 void vtkDICOMValue::FreeValue(Value *v)
 {
   if (v)
-    {
+  {
     if (v->Type == VTK_DICOM_ITEM)
-      {
+    {
       vtkDICOMItem *dp = static_cast<ValueT<vtkDICOMItem> *>(v)->Data;
       for (size_t i = 0; i < v->NumberOfValues; i++)
-        {
+      {
         // placement new was used, so destructor must be called manually
         dp->~vtkDICOMItem();
         dp++;
-        }
       }
+    }
     else if (v->Type == VTK_DICOM_VALUE)
-      {
+    {
       vtkDICOMValue *dp = static_cast<ValueT<vtkDICOMValue> *>(v)->Data;
       for (size_t i = 0; i < v->NumberOfValues; i++)
-        {
+      {
         // placement new was used, so destructor must be called manually
         dp->~vtkDICOMValue();
         dp++;
-        }
       }
+    }
 
     ValueFree(v);
-    }
+  }
 }
 //----------------------------------------------------------------------------
 template<class T>
@@ -1011,9 +1012,9 @@ void vtkDICOMValue::AppendValue(const T &item)
 {
   // do nothing if not initialized yet
   if (this->V == 0)
-    {
+  {
     return;
-    }
+  }
 
   T *ptr = static_cast<vtkDICOMValue::ValueT<T> *>(this->V)->Data;
 
@@ -1021,33 +1022,33 @@ void vtkDICOMValue::AppendValue(const T &item)
   size_t nn = 0;
   // reallocate if not unique reference, or not yet growable
   if (this->V->ReferenceCount != 1 || this->V->VL != 0xffffffff)
-    {
+  {
     // get next power of two that is greater than n
     nn = 1;
     do { nn <<= 1; } while (nn <= n);
-    }
+  }
   // reallocate if n is a power of two
   else if (n > 1 && ((n - 1) & n) == 0)
-    {
+  {
     nn = 2*n;
-    }
+  }
   // reallocate the array
   if (nn != 0)
-    {
+  {
     vtkDICOMValue::Value *v = this->V;
     ++(v->ReferenceCount);
     const T *cptr = ptr;
     ptr = this->Allocate<T>(v->VR, nn);
     this->V->NumberOfValues = static_cast<unsigned int>(n);
     for (size_t i = 0; i < n; i++)
-      {
+    {
       ptr[i] = cptr[i];
-      }
+    }
     if (--(v->ReferenceCount) == 0)
-      {
+    {
       vtkDICOMValue::FreeValue(v);
-      }
     }
+  }
 
   // mark as growable
   this->V->VL = 0xffffffff;
@@ -1070,15 +1071,15 @@ void vtkDICOMValue::SetValue(size_t i, const T &item)
   // reallocate the array if we aren't the sole owner
   assert(this->V->ReferenceCount == 1);
   if (this->V->ReferenceCount != 1)
-    {
+  {
     size_t m = this->V->NumberOfValues;
     const T *cptr = ptr;
     ptr = this->Allocate<T>(this->V->VR, m);
     for (size_t j = 0; j < m; j++)
-      {
+    {
       ptr[j] = cptr[j];
-      }
     }
+  }
 
   ptr[i] = item;
 }
@@ -1091,9 +1092,9 @@ const char *vtkDICOMValue::GetCharData() const
 {
   const char *ptr = 0;
   if (this->V && this->V->Type == VTK_CHAR)
-    {
+  {
     ptr = static_cast<const ValueT<char> *>(this->V)->Data;
-    }
+  }
   return ptr;
 }
 
@@ -1101,9 +1102,9 @@ const unsigned char *vtkDICOMValue::GetUnsignedCharData() const
 {
   const unsigned char *ptr = 0;
   if (this->V && this->V->Type == VTK_UNSIGNED_CHAR)
-    {
+  {
     ptr = static_cast<const ValueT<unsigned char> *>(this->V)->Data;
-    }
+  }
   return ptr;
 }
 
@@ -1111,18 +1112,18 @@ const short *vtkDICOMValue::GetShortData() const
 {
   const short *ptr = 0;
   if (this->V)
-    {
+  {
     if (this->V->Type == VTK_SHORT)
-      {
+    {
       ptr = static_cast<const ValueT<short> *>(this->V)->Data;
-      }
+    }
     else if (this->V->Type == VTK_UNSIGNED_SHORT &&
              this->V->VR == vtkDICOMVR::OW)
-      {
+    {
       ptr = reinterpret_cast<const short *>(
         static_cast<const ValueT<unsigned short> *>(this->V)->Data);
-      }
     }
+  }
   return ptr;
 }
 
@@ -1130,18 +1131,18 @@ const unsigned short *vtkDICOMValue::GetUnsignedShortData() const
 {
   const unsigned short *ptr = 0;
   if (this->V)
-    {
+  {
     if (this->V->Type == VTK_UNSIGNED_SHORT)
-      {
+    {
       ptr = static_cast<const ValueT<unsigned short> *>(this->V)->Data;
-      }
+    }
     else if (this->V->Type == VTK_SHORT &&
              this->V->VR == vtkDICOMVR::OW)
-      {
+    {
       ptr = reinterpret_cast<const unsigned short *>(
         static_cast<const ValueT<short> *>(this->V)->Data);
-      }
     }
+  }
   return ptr;
 }
 
@@ -1149,18 +1150,18 @@ const int *vtkDICOMValue::GetIntData() const
 {
   const int *ptr = 0;
   if (this->V)
-    {
+  {
     if (this->V->Type == VTK_INT)
-      {
+    {
       ptr = static_cast<const ValueT<int> *>(this->V)->Data;
-      }
+    }
     else if (this->V->Type == VTK_UNSIGNED_INT &&
              this->V->VR == vtkDICOMVR::OL)
-      {
+    {
       ptr = reinterpret_cast<const int *>(
         static_cast<const ValueT<unsigned int> *>(this->V)->Data);
-      }
     }
+  }
   return ptr;
 }
 
@@ -1168,18 +1169,18 @@ const unsigned int *vtkDICOMValue::GetUnsignedIntData() const
 {
   const unsigned int *ptr = 0;
   if (this->V)
-    {
+  {
     if (this->V->Type == VTK_UNSIGNED_INT)
-      {
+    {
       ptr = static_cast<const ValueT<unsigned int> *>(this->V)->Data;
-      }
+    }
     else if (this->V->Type == VTK_INT &&
              this->V->VR == vtkDICOMVR::OL)
-      {
+    {
       ptr = reinterpret_cast<const unsigned int *>(
         static_cast<const ValueT<int> *>(this->V)->Data);
-      }
     }
+  }
   return ptr;
 }
 
@@ -1187,9 +1188,9 @@ const float *vtkDICOMValue::GetFloatData() const
 {
   const float *ptr = 0;
   if (this->V && this->V->Type == VTK_FLOAT)
-    {
+  {
     ptr = static_cast<const ValueT<float> *>(this->V)->Data;
-    }
+  }
   return ptr;
 }
 
@@ -1197,9 +1198,9 @@ const double *vtkDICOMValue::GetDoubleData() const
 {
   const double *ptr = 0;
   if (this->V && this->V->Type == VTK_DOUBLE)
-    {
+  {
     ptr = static_cast<const ValueT<double> *>(this->V)->Data;
-    }
+  }
   return ptr;
 }
 
@@ -1207,9 +1208,9 @@ const vtkDICOMTag *vtkDICOMValue::GetTagData() const
 {
   const vtkDICOMTag *ptr = 0;
   if (this->V && this->V->Type == VTK_DICOM_TAG)
-    {
+  {
     ptr = static_cast<const ValueT<vtkDICOMTag> *>(this->V)->Data;
-    }
+  }
   return ptr;
 }
 
@@ -1217,9 +1218,9 @@ const vtkDICOMItem *vtkDICOMValue::GetSequenceData() const
 {
   const vtkDICOMItem *ptr = 0;
   if (this->V && this->V->Type == VTK_DICOM_ITEM)
-    {
+  {
     ptr = static_cast<const ValueT<vtkDICOMItem> *>(this->V)->Data;
-    }
+  }
   return ptr;
 }
 
@@ -1227,9 +1228,9 @@ const vtkDICOMValue *vtkDICOMValue::GetMultiplexData() const
 {
   const vtkDICOMValue *ptr = 0;
   if (this->V && this->V->Type == VTK_DICOM_VALUE)
-    {
+  {
     ptr = static_cast<const ValueT<vtkDICOMValue> *>(this->V)->Data;
-    }
+  }
   return ptr;
 }
 
@@ -1237,9 +1238,9 @@ vtkDICOMValue *vtkDICOMValue::GetMultiplex()
 {
   vtkDICOMValue *ptr = 0;
   if (this->V && this->V->Type == VTK_DICOM_VALUE)
-    {
+  {
     ptr = static_cast<ValueT<vtkDICOMValue> *>(this->V)->Data;
-    }
+  }
   return ptr;
 }
 
@@ -1248,7 +1249,7 @@ template<class VT>
 void vtkDICOMValue::GetValuesT(VT *v, size_t c, size_t s) const
 {
   switch (this->V->Type)
-    {
+  {
     case VTK_CHAR:
       StringConversion(
         static_cast<const ValueT<char> *>(this->V)->Data, this->V->VR,
@@ -1283,17 +1284,17 @@ void vtkDICOMValue::GetValuesT(VT *v, size_t c, size_t s) const
         static_cast<const ValueT<double> *>(this->V)->Data+s, v, c);
       break;
     case VTK_DICOM_TAG:
-      {
+    {
       const vtkDICOMTag *tptr =
         static_cast<const ValueT<vtkDICOMTag> *>(this->V)->Data + s;
       for (size_t i = 0; i < c; i += 2)
-        {
-        v[i] = static_cast<VT>(tptr[i/2].GetGroup());
-        v[i+1] = static_cast<VT>(tptr[i/2].GetElement());
-        }
+      {
+        v[i] = tptr[i/2].GetGroup();
+        v[i+1] = tptr[i/2].GetElement();
       }
-      break;
     }
+      break;
+  }
 }
 
 template<>
@@ -1301,10 +1302,10 @@ void vtkDICOMValue::GetValuesT<std::string>(
   std::string *v, size_t c, size_t s) const
 {
   for (size_t i = 0; i < c; i++)
-    {
+  {
     v->clear();
     this->AppendValueToString(*v++, s++);
-    }
+  }
 }
 
 template<>
@@ -1312,14 +1313,14 @@ void vtkDICOMValue::GetValuesT<vtkDICOMTag>(
   vtkDICOMTag *v, size_t c, size_t s) const
 {
   if (this->V->Type == VTK_DICOM_TAG)
-    {
+  {
     const vtkDICOMTag *ptr =
       static_cast<const ValueT<vtkDICOMTag> *>(this->V)->Data + s;
     for (size_t i = 0; i < c; i++)
-      {
+    {
       *v++ = *ptr++;
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1383,9 +1384,9 @@ unsigned char vtkDICOMValue::GetUnsignedChar(size_t i) const
 {
   unsigned char v = 0;
   if (this->V && i < this->V->NumberOfValues)
-    {
+  {
     this->GetValuesT(&v, 1, i);
-    }
+  }
   return v;
 }
 
@@ -1393,9 +1394,9 @@ short vtkDICOMValue::GetShort(size_t i) const
 {
   short v = 0;
   if (this->V && i < this->V->NumberOfValues)
-    {
+  {
     this->GetValuesT(&v, 1, i);
-    }
+  }
   return v;
 }
 
@@ -1403,9 +1404,9 @@ unsigned short vtkDICOMValue::GetUnsignedShort(size_t i) const
 {
   unsigned short v = 0;
   if (this->V && i < this->V->NumberOfValues)
-    {
+  {
     this->GetValuesT(&v, 1, i);
-    }
+  }
   return v;
 }
 
@@ -1413,9 +1414,9 @@ int vtkDICOMValue::GetInt(size_t i) const
 {
   int v = 0;
   if (this->V && i < this->V->NumberOfValues)
-    {
+  {
     this->GetValuesT(&v, 1, i);
-    }
+  }
   return v;
 }
 
@@ -1423,9 +1424,9 @@ unsigned int vtkDICOMValue::GetUnsignedInt(size_t i) const
 {
   unsigned int v = 0;
   if (this->V && i < this->V->NumberOfValues)
-    {
+  {
     this->GetValuesT(&v, 1, i);
-    }
+  }
   return v;
 }
 
@@ -1433,9 +1434,9 @@ float vtkDICOMValue::GetFloat(size_t i) const
 {
   float v = 0.0;
   if (this->V && i < this->V->NumberOfValues)
-    {
+  {
     this->GetValuesT(&v, 1, i);
-    }
+  }
   return v;
 }
 
@@ -1443,23 +1444,23 @@ double vtkDICOMValue::GetDouble(size_t i) const
 {
   double v = 0.0;
   if (this->V && i < this->V->NumberOfValues)
-    {
+  {
     this->GetValuesT(&v, 1, i);
-    }
+  }
   return v;
 }
 
 std::string vtkDICOMValue::GetUTF8String(size_t i) const
 {
   if (this->V && this->V->CharacterSet != 0)
-    {
+  {
     if (this->V && i < this->V->NumberOfValues)
-      {
+    {
       std::string v;
       this->AppendValueToUTF8String(v, i);
       return v;
-      }
     }
+  }
 
   return this->GetString(i);
 }
@@ -1468,9 +1469,9 @@ std::string vtkDICOMValue::GetString(size_t i) const
 {
   std::string v;
   if (this->V && i < this->V->NumberOfValues)
-    {
+  {
     this->AppendValueToString(v, i);
-    }
+  }
   return v;
 }
 
@@ -1479,9 +1480,9 @@ vtkDICOMTag vtkDICOMValue::GetTag(size_t i) const
   vtkDICOMTag v;
   if (this->V && this->V->VR == vtkDICOMVR::AT &&
       i < this->V->NumberOfValues)
-    {
+  {
     this->GetValuesT(&v, 1, i);
-    }
+  }
   return v;
 }
 
@@ -1489,11 +1490,11 @@ const vtkDICOMItem& vtkDICOMValue::GetItem(size_t i) const
 {
   if (this->V && this->V->Type == VTK_DICOM_ITEM &&
       i < this->V->NumberOfValues)
-    {
+  {
     const vtkDICOMItem *ptr =
       static_cast<const ValueT<vtkDICOMItem> *>(this->V)->Data;
     return ptr[i];
-    }
+  }
   return vtkDICOMValue::EmptyItem;
 }
 
@@ -1502,9 +1503,9 @@ unsigned char vtkDICOMValue::AsUnsignedChar() const
 {
   unsigned char v = 0;
   if (this->V && this->V->NumberOfValues >= 1)
-    {
+  {
     this->GetValuesT(&v, 1, 0);
-    }
+  }
   return v;
 }
 
@@ -1512,9 +1513,9 @@ short vtkDICOMValue::AsShort() const
 {
   short v = 0;
   if (this->V && this->V->NumberOfValues >= 1)
-    {
+  {
     this->GetValuesT(&v, 1, 0);
-    }
+  }
   return v;
 }
 
@@ -1522,9 +1523,9 @@ unsigned short vtkDICOMValue::AsUnsignedShort() const
 {
   unsigned short v = 0;
   if (this->V && this->V->NumberOfValues >= 1)
-    {
+  {
     this->GetValuesT(&v, 1, 0);
-    }
+  }
   return v;
 }
 
@@ -1532,9 +1533,9 @@ int vtkDICOMValue::AsInt() const
 {
   int v = 0;
   if (this->V && this->V->NumberOfValues >= 1)
-    {
+  {
     this->GetValuesT(&v, 1, 0);
-    }
+  }
   return v;
 }
 
@@ -1542,9 +1543,9 @@ unsigned int vtkDICOMValue::AsUnsignedInt() const
 {
   unsigned int v = 0;
   if (this->V && this->V->NumberOfValues >= 1)
-    {
+  {
     this->GetValuesT(&v, 1, 0);
-    }
+  }
   return v;
 }
 
@@ -1552,9 +1553,9 @@ float vtkDICOMValue::AsFloat() const
 {
   float v = 0.0;
   if (this->V && this->V->NumberOfValues >= 1)
-    {
+  {
     this->GetValuesT(&v, 1, 0);
-    }
+  }
   return v;
 }
 
@@ -1562,9 +1563,9 @@ double vtkDICOMValue::AsDouble() const
 {
   double v = 0.0;
   if (this->V && this->V->NumberOfValues >= 1)
-    {
+  {
     this->GetValuesT(&v, 1, 0);
-    }
+  }
   return v;
 }
 
@@ -1572,22 +1573,22 @@ std::string vtkDICOMValue::AsUTF8String() const
 {
   const char *cp = this->GetCharData();
   if (cp)
-    {
+  {
     vtkDICOMCharacterSet cs(this->V->CharacterSet);
     size_t l = this->V->VL;
     while (l > 0 && cp[l-1] == '\0') { l--; }
     if (this->V->VR.HasSingleValue())
-      {
+    {
       while (l > 0 && cp[l-1] == ' ') { l--; }
       return cs.ConvertToUTF8(cp, l);
-      }
+    }
     else
-      {
+    {
       // convert each value separately
       const char *ep = cp + l;
       std::string s;
       while (cp != ep && *cp != '\0')
-        {
+      {
         size_t n = cs.NextBackslash(cp, ep);
         while (n > 0 && *cp == ' ') { cp++; n--; }
         size_t m = n;
@@ -1595,14 +1596,14 @@ std::string vtkDICOMValue::AsUTF8String() const
         s.append(cs.ConvertToUTF8(cp, m));
         cp += n;
         if (cp != ep && *cp == '\\')
-          {
+        {
           s.append(cp, 1);
           cp++;
-          }
         }
-      return s;
       }
+      return s;
     }
+  }
 
   return vtkDICOMValue::AsString();
 }
@@ -1611,22 +1612,22 @@ std::string vtkDICOMValue::AsString() const
 {
   const char *cp = this->GetCharData();
   if (cp)
-    {
+  {
     size_t l = this->V->VL;
     while (l > 0 && cp[l-1] == '\0') { l--; }
     if (this->V->VR.HasSingleValue())
-      {
+    {
       while (l > 0 && cp[l-1] == ' ') { l--; }
       return std::string(cp, l);
-      }
+    }
     else
-      {
+    {
       // convert each value separately
       vtkDICOMCharacterSet cs(this->V->CharacterSet);
       const char *ep = cp + l;
       std::string s;
       while (cp != ep && *cp != '\0')
-        {
+      {
         size_t n = cs.NextBackslash(cp, ep);
         while (n > 0 && *cp == ' ') { cp++; n--; }
         size_t m = n;
@@ -1634,14 +1635,14 @@ std::string vtkDICOMValue::AsString() const
         s.append(cp, m);
         cp += n;
         if (cp != ep && *cp == '\\')
-          {
+        {
           s.append(cp, 1);
           cp++;
-          }
         }
-      return s;
       }
+      return s;
     }
+  }
 
   std::string v;
   if (this->V && this->V->VR != vtkDICOMVR::UN &&
@@ -1651,17 +1652,17 @@ std::string vtkDICOMValue::AsString() const
       this->V->VR != vtkDICOMVR::OL &&
       this->V->VR != vtkDICOMVR::OF &&
       this->V->VR != vtkDICOMVR::OD)
-    {
+  {
     size_t n = this->V->NumberOfValues;
     for (size_t i = 0; i < n; i++)
-      {
+    {
       if (i > 0)
-        {
+      {
         v.append("\\");
-        }
-      this->AppendValueToString(v, i);
       }
+      this->AppendValueToString(v, i);
     }
+  }
   return v;
 }
 
@@ -1670,9 +1671,9 @@ vtkDICOMTag vtkDICOMValue::AsTag() const
   vtkDICOMTag v;
   if (this->V && this->V->VR == vtkDICOMVR::AT &&
       this->V->NumberOfValues >= 1)
-    {
+  {
     this->GetValuesT(&v, 1, 0);
-    }
+  }
   return v;
 }
 
@@ -1691,34 +1692,34 @@ void vtkDICOMValue::Substring(
   const char *dp = ep;
 
   if (this->V->NumberOfValues > 1 && ++i > 0)
-    {
+  {
     if (this->V->CharacterSet == 0)
-      {
+    {
       dp = cp - 1;
       do
-        {
+      {
         cp = dp + 1;
         do { dp++; } while (*dp != '\\' && dp != ep);
-        }
-      while (--i != 0 && dp != ep);
       }
+      while (--i != 0 && dp != ep);
+    }
     else
-      {
+    {
       vtkDICOMCharacterSet cs(this->V->CharacterSet);
       for (;;)
-        {
+      {
         dp = cp + cs.NextBackslash(cp, ep);
         if (--i == 0 || *dp != '\\') { break; }
         cp = dp + 1;
-        }
       }
     }
+  }
 
   // remove any spaces used as padding
   if (!this->V->VR.HasSingleValue())
-    {
+  {
     while (cp != dp && cp[0] == ' ') { cp++; }
-    }
+  }
   while (cp != dp && dp[-1] == ' ') { dp--; }
 
   start = cp;
@@ -1731,20 +1732,20 @@ void vtkDICOMValue::AppendValueToUTF8String(
 {
   if (this->V && this->V->Type == VTK_CHAR &&
       this->V->CharacterSet != 0)
-    {
+  {
     const char *cp = static_cast<const ValueT<char> *>(this->V)->Data;
     const char *dp = cp + (i == 0 ? this->V->VL : 0);
     if (!this->V->VR.HasSingleValue())
-      {
+    {
       this->Substring(i, cp, dp);
-      }
+    }
     vtkDICOMCharacterSet cs(this->V->CharacterSet);
     str += cs.ConvertToUTF8(cp, dp-cp);
-    }
+  }
   else
-    {
+  {
     this->AppendValueToString(str, i);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1760,27 +1761,27 @@ void vtkDICOMValue::AppendValueToString(
   vtkDICOMTag a;
 
   if (this->V == 0)
-    {
+  {
     return;
-    }
+  }
 
   assert(i < this->V->NumberOfValues);
 
   switch (this->V->Type)
-    {
+  {
     case VTK_CHAR:
       cp = static_cast<const ValueT<char> *>(this->V)->Data;
       dp = cp + (i == 0 ? this->V->VL : 0);
       if (this->V->VR.HasSingleValue())
-        {
+      {
         // strip trailing spaces
         while (dp != cp && dp[-1] == ' ') { --dp; }
-        }
+      }
       else
-        {
+      {
         // get just one of the values, strip leading & trailing spaces
         this->Substring(i, cp, dp);
-        }
+      }
       break;
     case VTK_UNSIGNED_CHAR:
       d = static_cast<const ValueT<unsigned char> *>(this->V)->Data[i];
@@ -1806,27 +1807,27 @@ void vtkDICOMValue::AppendValueToString(
     case VTK_DICOM_TAG:
       a = static_cast<const ValueT<vtkDICOMTag> *>(this->V)->Data[i];
       break;
-    }
+  }
 
   if (this->V->Type == VTK_CHAR)
-    {
+  {
     while (cp != dp && dp[-1] == '\0') { --dp; }
     str.append(cp, dp);
-    }
+  }
   else if (this->V->Type == VTK_FLOAT ||
            this->V->Type == VTK_DOUBLE)
-    {
+  {
     // force consistent printing of "inf", "nan" regardless of platform
     if (vtkMath::IsNan(f))
-      {
+    {
       str.append("nan");
-      }
+    }
     else if (vtkMath::IsInf(f))
-      {
+    {
       str.append((f < 0) ? "-inf" : "inf");
-      }
+    }
     else
-      {
+    {
       char text[32];
       // guard against printing non-significant digits:
       // use exponential form if printing in "%f" format
@@ -1836,34 +1837,34 @@ void vtkDICOMValue::AppendValueToString(
            fabs(f) <= 9007199254740992.0) || // 2^53
           (this->V->Type == VTK_FLOAT &&
            fabs(f) <= 16777216.0)) // 2^24
-        {
+      {
         if (this->V->Type == VTK_DOUBLE)
-          {
+        {
           sprintf(text, "%#.16g", f);
-          }
+        }
         else
-          {
+        {
           sprintf(text, "%#.8g", f);
-          }
+        }
         // make sure there is a zero after the decimal point
         size_t l = strlen(text);
         if (l > 0 && text[l-1] == '.')
-          {
+        {
           text[l++] = '0';
           text[l] = '\0';
-          }
         }
+      }
       else
-        {
+      {
         if (this->V->Type == VTK_DOUBLE)
-          {
+        {
           sprintf(text, "%.15e", f);
-          }
+        }
         else
-          {
+        {
           sprintf(text, "%.7e", f);
-          }
         }
+      }
 
       // trim trailing zeros, except the one following decimal point
       size_t ti = 0;
@@ -1874,52 +1875,52 @@ void vtkDICOMValue::AppendValueToString(
 
       // if exponent has three digits, clear the first if it is zero
       if (tj >= 5 && text[tj-5] == 'e' && text[tj-3] == '0')
-        {
+      {
         text[tj-3] = text[tj-2];
         text[tj-2] = text[tj-1];
         tj--;
-        }
+      }
 
       text[tj] = '\0';
       str.append(text);
-      }
     }
+  }
   else if (this->V->Type == VTK_UNSIGNED_CHAR ||
            this->V->Type == VTK_SHORT ||
            this->V->Type == VTK_UNSIGNED_SHORT ||
            this->V->Type == VTK_INT ||
            this->V->Type == VTK_UNSIGNED_INT)
-    {
+  {
     // simple code to convert an integer to a string
     char text[16];
     size_t ti = 16;
 
     // if d is nonzero, set u to abs(d)
     if (d > 0)
-      {
+    {
       u = d;
-      }
+    }
     if (d < 0)
-      {
+    {
       u = -d;
-      }
+    }
     // convert u to a string
     do
-      {
+    {
       text[--ti] = '0' + static_cast<char>(u % 10);
       u /= 10;
-      }
+    }
     while (u != 0);
     // add sign
     if (d < 0)
-      {
+    {
       text[--ti] = '-';
-      }
+    }
 
     str.append(&text[ti], &text[16]);
-    }
+  }
   else if (this->V->Type == VTK_DICOM_TAG)
-    {
+  {
     char text[12];
     int t[2];
     t[0] = a.GetGroup();
@@ -1927,18 +1928,18 @@ void vtkDICOMValue::AppendValueToString(
     char *tp = text;
     *tp++ = '(';
     for (int j = 0; j < 2; j++)
-      {
+    {
       for (int k = 12; k >= 0; k -= 4)
-        {
+      {
         char c = ((t[j] >> k) & 0x000F);
         *tp++ = (c < 10 ? '0' + c : 'A' - 10 + c);
-        }
-      *tp++ = ',';
       }
+      *tp++ = ',';
+    }
     tp[-1] = ')';
     *tp = '\0';
     str.append(text, &text[11]);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -1951,11 +1952,11 @@ bool vtkDICOMValue::ValueT<T>::Compare(const Value *a, const Value *b)
   bool r = (a->VL == b->VL);
   size_t n = a->VL/sizeof(T);
   if (n != 0 && r)
-    {
+  {
     const T *ap = static_cast<const ValueT<T> *>(a)->Data;
     const T *bp = static_cast<const ValueT<T> *>(b)->Data;
     do { r &= (*ap++ == *bp++); } while (r && --n);
-    }
+  }
   return r;
 }
 
@@ -1967,13 +1968,13 @@ bool vtkDICOMValue::ValueT<char>::Compare(
   r &= (a->CharacterSet == b->CharacterSet);
   size_t n = a->VL;
   if (n != 0 && r)
-    {
+  {
     const unsigned char *ap =
       static_cast<const ValueT<unsigned char> *>(a)->Data;
     const unsigned char *bp =
       static_cast<const ValueT<unsigned char> *>(b)->Data;
     do { r &= (*ap++ == *bp++); } while (r && --n);
-    }
+  }
   return r;
 }
 
@@ -1984,22 +1985,22 @@ bool vtkDICOMValue::ValueT<unsigned char>::Compare(
   bool r = (a->VL == b->VL);
   size_t n = a->VL;
   if (a->VL == 0xFFFFFFFF)
-    {
+  {
     n = a->NumberOfValues;
     r &= (n == b->NumberOfValues);
 #ifdef VTK_DICOM_USE_OVERFLOW_BYTE
     n += (static_cast<size_t>(a->Overflow) << 32);
     r &= (a->Overflow == b->Overflow);
 #endif
-    }
+  }
   if (n != 0 && r)
-    {
+  {
     const unsigned char *ap =
       static_cast<const ValueT<unsigned char> *>(a)->Data;
     const unsigned char *bp =
       static_cast<const ValueT<unsigned char> *>(b)->Data;
     do { r &= (*ap++ == *bp++); } while (r && --n);
-    }
+  }
   return r;
 }
 
@@ -2010,13 +2011,13 @@ bool vtkDICOMValue::ValueT<vtkDICOMItem>::Compare(
   size_t n = a->NumberOfValues; // do not use VL/sizeof()
   bool r = (n == b->NumberOfValues);
   if (n != 0 && r)
-    {
+  {
     const vtkDICOMItem *ap =
       static_cast<const ValueT<vtkDICOMItem> *>(a)->Data;
     const vtkDICOMItem *bp =
       static_cast<const ValueT<vtkDICOMItem> *>(b)->Data;
     do { r &= (*ap++ == *bp++); } while (r && --n);
-    }
+  }
   return r;
 }
 
@@ -2027,13 +2028,13 @@ bool vtkDICOMValue::ValueT<vtkDICOMValue>::Compare(
   size_t n = a->NumberOfValues; // do not use VL/sizeof()
   bool r = (n == b->NumberOfValues);
   if (n != 0 && r)
-    {
+  {
     const vtkDICOMValue *ap =
       static_cast<const ValueT<vtkDICOMValue> *>(a)->Data;
     const vtkDICOMValue *bp =
       static_cast<const ValueT<vtkDICOMValue> *>(b)->Data;
     do { r &= (*ap++ == *bp++); } while (r && --n);
-    }
+  }
   return r;
 }
 
@@ -2046,36 +2047,36 @@ bool vtkDICOMValue::ValueT<T>::CompareEach(const Value *a, const Value *b)
 {
   bool r = true;
   if (a->NumberOfValues > 0 && b->NumberOfValues > 0)
-    {
+  {
     size_t n = a->NumberOfValues;
     size_t mm = b->NumberOfValues;
     const T *ap = static_cast<const ValueT<T> *>(a)->Data;
     const T *bbp = static_cast<const ValueT<T> *>(b)->Data;
     do
-      {
+    {
       size_t m = mm;
       const T *bp = bbp;
       do
-        {
+      {
         r = (*ap == *bp);
         bp++;
-        }
+      }
       while (--m && !r);
       if (r)
-        {
+      {
         // set new start for inner loop
         bbp = bp;
         mm = m;
         if (mm == 0)
-          {
+        {
           r = (n == 1);
           break;
-          }
         }
-      ap++;
       }
-    while (--n && r);
+      ap++;
     }
+    while (--n && r);
+  }
 
   return r;
 }
@@ -2084,13 +2085,16 @@ bool vtkDICOMValue::ValueT<T>::CompareEach(const Value *a, const Value *b)
 bool vtkDICOMValue::PatternMatchesMulti(
     const char *pattern, const char *val, vtkDICOMVR vr)
 {
-  bool inclusive = (vr == vtkDICOMVR::UI);
-  bool ordered = (vr == vtkDICOMVR::IS || vr == vtkDICOMVR::DS);
+  typedef vtkDICOMVR VR;
+  bool inclusive = (vr == VR::UI);
+  bool ordered = (vr == VR::IS || vr == VR::DS);
+  bool nowildcards = (vr == VR::UI || vr == VR::AS ||
+                      vr == VR::IS || vr == VR::DS);
   bool match = !inclusive;
 
   const char *pp = pattern;
   while (match ^ inclusive)
-    {
+  {
     // get pattern value start and end
     const char *pd = pp;
     while (*pd != '\0' && *pd != '\\') { pd++; }
@@ -2102,7 +2106,7 @@ bool vtkDICOMValue::PatternMatchesMulti(
     match = false;
     const char *vp = val;
     while (!match)
-      {
+    {
       // get value start and end
       const char *vd = vp;
       while (*vd != '\0' && *vd != '\\') { vd++; }
@@ -2111,22 +2115,37 @@ bool vtkDICOMValue::PatternMatchesMulti(
       while (*vp == ' ') { vp++; }
       while (vf != vp && vf[-1] == ' ') { --vf; }
 
-      match = vtkDICOMUtilities::PatternMatches(pp, pf-pp, vp, vf-vp);
+      if (nowildcards)
+      {
+        // if VR doesn't allow wildcards, use simple string comparison
+        // (start at back, because UIDs often share the same prefix).
+        const char *cf = pf;
+        match = (pf-pp == vf-vp);
+        while (match && cf != pp)
+        {
+          match = (*(--vf) == *(--cf));
+        }
+      }
+      else
+      {
+        // use wildcard pattern matching
+        match = vtkDICOMUtilities::PatternMatches(pp, pf-pp, vp, vf-vp);
+      }
 
       // break if no values remain
       if (*vd == '\0') { break; }
       vp = vd + 1;
-      }
+    }
     if (match && ordered)
-      {
+    {
       // set inner loop start to current position
       val = vp;
-      }
+    }
 
     // break if no patterns remain
     if (*pd == '\0') { break; }
     pp = pd + 1;
-    }
+  }
 
   return match;
 }
@@ -2142,13 +2161,13 @@ bool vtkDICOMValue::PatternMatchesPersonName(
 
   const char *pp = pattern;
   while (!match)
-    {
+  {
     // normalize the pattern
     vtkDICOMValue::NormalizePersonName(pp, normalizedPattern, true);
 
     const char *vp = val;
     while (!match)
-      {
+    {
       // normalize the name
       vtkDICOMValue::NormalizePersonName(vp, normalizedName);
 
@@ -2160,13 +2179,13 @@ bool vtkDICOMValue::PatternMatchesPersonName(
       while (*vp != '\0' && *vp != '\\') { vp++; }
       if (*vp == '\0') { break; }
       vp++;
-      }
+    }
 
     // break if no patterns remain
     while (*pp != '\0' && *pp != '\\') { pp++; }
     if (*pp == '\0') { break; }
     pp++;
-    }
+  }
 
   return match;
 }
@@ -2183,7 +2202,7 @@ void vtkDICOMValue::NormalizePersonName(
 
   // loop over component groups
   for (int i = 0; i < 3; i++)
-    {
+  {
     // set maximum length of extended component group to 85 bytes
     // (because 85*3 + 1 == 256, and 85 > 64 where 64 is max for PN)
     char *groupStart = dp;
@@ -2191,67 +2210,67 @@ void vtkDICOMValue::NormalizePersonName(
 
     // loop over components
     for (int j = 0; j < 5; j++)
-      {
+    {
       // save start location
       char *componentStart = dp;
       // copy characters
       while (*cp != '^' && *cp != '=' && *cp != '\\' &&
              *cp != '\0' && dp != ep)
-        {
+      {
         *dp++ = *cp++;
-        }
+      }
 
       // strip trailing spaces and periods
       while (dp != componentStart && (dp[-1] == ' ' || dp[-1] == '.'))
-        {
+      {
         --dp;
-        }
+      }
 
       if (dp != ep)
-        {
+      {
         // if query, replace empty components with wildcard
         if (isquery && dp == componentStart) { *dp++ = '*'; }
 
         // mark end of component
         if (j != 4) { *dp++ = '^'; }
-        }
+      }
       else if (isquery && dp != componentStart)
-        {
+      {
         // back up by one unicode code point, replace with wildcard
         do { --dp; } while (dp != componentStart && (*dp & 0xC0) == 0x80);
         *dp++ = '*';
-        }
+      }
 
       // go to next component of input
       if (*cp == '^') { cp++; }
-      }
+    }
 
     // collapse repeated wildcards
     if (isquery)
-      {
+    {
       while (dp - groupStart > 2 && dp[-3] == '*' &&
              dp[-2] == '^' && dp[-1] == '*')
-        {
+      {
         dp -= 2;
-        }
       }
+    }
 
     // mark end of component group
     if (i != 2) { *dp++ = '='; }
 
     // go to next component group of input
     if (*cp == '=') { cp++; }
-    }
+  }
 
   // collapse repeated wildcards
   if (isquery)
-    {
+  {
     while (dp - output > 2 && dp[-3] == '*' &&
            dp[-2] == '=' && dp[-1] == '*')
-      {
+    {
       dp -= 2;
-      }
     }
+  }
 
   // terminate
   *dp = '\0';
@@ -2268,29 +2287,29 @@ size_t vtkDICOMValue::NormalizeDateTime(
   // use UNIX epoch as our arbitrary time base
   static const char epoch[22] = "19700101000000.000000";
   for (int i = 0; i < 22; i++)
-    {
+  {
     output[i] = epoch[i];
-    }
+  }
 
   char *tp = output;
   if (vr == vtkDICOMVR::TM)
-    {
+  {
     tp += 8;
-    }
+  }
 
   const char *cp = input;
   while (*tp != 0 && *cp >= '0' && *cp <= '9')
-    {
+  {
     *tp++ = *cp++;
-    }
+  }
   if (*tp == '.' && *cp == '.')
-    {
+  {
     *tp++ = *cp++;
     while (*tp != 0 && *cp >= '0' && *cp <= '9')
-      {
+    {
       *tp++ = *cp++;
-      }
     }
+  }
 
   return static_cast<size_t>(tp - output);
 }
@@ -2316,30 +2335,30 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
 
   // keys with no value match (universal matching)
   if (value.V == 0)
-    {
+  {
     return true;
-    }
+  }
   if (value.V->Type != VTK_DICOM_ITEM)
-    {
+  {
     // for everything but sequences, check if the length is zero
     if (value.V->VL == 0)
-      {
+    {
       return true;
-      }
     }
+  }
   else if (value.GetNumberOfValues() == 0 ||
            static_cast<const ValueT<vtkDICOMItem> *>(value.V)->Data
              ->GetNumberOfDataElements() == 0)
-    {
+  {
     // empty sequences match
     return true;
-    }
+  }
 
   if (this->V == 0 || this->V->VR != value.V->VR)
-    {
+  {
     // match is impossible if VRs differ
     return false;
-    }
+  }
 
   bool match = false;
   vtkDICOMVR vr = this->V->VR;
@@ -2347,17 +2366,17 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
 
   // First, do comparisons for string values
   if (type == VTK_CHAR)
-    {
+  {
     // Does the pattern string have wildcards?
     bool wildcard = false;
     const char *pattern = static_cast<const ValueT<char> *>(value.V)->Data;
     size_t pl = 0;
     while (pattern[pl] != '\0' && pl < value.V->VL)
-      {
+    {
       char c = pattern[pl++];
       wildcard |= (c == '*');
       wildcard |= (c == '?');
-      }
+    }
     while (pl > 0 && pattern[pl-1] == ' ') { pl--; }
 
     // Get string value and remove any trailing nulls and spaces
@@ -2370,22 +2389,22 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
         (vr == vtkDICOMVR::DA ||
          vr == vtkDICOMVR::TM ||
          vr == vtkDICOMVR::DT))
-      {
+    {
       // Find the position of the hyphen
       size_t hp = 0;
       while (hp < pl && pattern[hp] != '-') { hp++; }
       if (vr == vtkDICOMVR::DT && hp + 5 < pl)
-        {
+      {
         // Check if the hyphen was part of the timezone offset
         if (pattern[hp+5] == '-')
-          {
+        {
           hp += 5;
-          }
+        }
         else if (hp != 4 && pattern[hp+5] == '\0')
-          {
+        {
           hp = 0;
-          }
         }
+      }
       // Get a pointer to the part of pattern after the hyphen
       const char *dp = &pattern[hp];
       bool hyphen = (*dp == '-');
@@ -2398,181 +2417,181 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
       vtkDICOMValue::NormalizeDateTime(cp, d, vr);
       r1[0] = '\0';
       if (pattern[0] != '\0' && pattern[0] != '-')
-        {
+      {
         n1 = vtkDICOMValue::NormalizeDateTime(pattern, r1, vr);
-        }
+      }
       r2[0] = '\0';
       if (dp[0] != '\0' && dp[0] != '-')
-        {
+      {
         n2 = vtkDICOMValue::NormalizeDateTime(dp, r2, vr);
-        }
+      }
 
       // Perform lexical comparison on normalized datetime
       if (!hyphen)
-        {
+      {
         match = (strncmp(d, r1, n1) == 0);
-        }
+      }
       else if (*r1 != '\0')
-        {
+      {
         match = (strncmp(d, r1, n1) >= 0);
-        }
+      }
       else if (*r2 != '\0')
-        {
+      {
         match = (strncmp(r2, d, n2) >= 0);
-        }
+      }
       else
-        {
+      {
         match = (strncmp(r2, d, n2) >= 0 && strncmp(d, r1, n1) >= 0);
-        }
       }
+    }
     else
-      {
+    {
       // Perform wildcard matching and list matching
       std::string str;
       std::string pstr;
       if (vr == vtkDICOMVR::PN)
-        {
+      {
         // Convert to lowercase UTF8 before matching
         vtkDICOMCharacterSet cs = this->GetCharacterSet();
         const char *ep = cp + l;
         while (cp != ep && *cp != '\0')
-          {
+        {
           size_t n = cs.NextBackslash(cp, ep);
           str.append(cs.CaseFoldedUTF8(cp, n));
           cp += n;
           if (cp != ep && *cp == '\\')
-            {
+          {
             str.append(cp, 1);
             cp++;
-            }
           }
+        }
         cp = str.c_str();
         l = str.length();
         pstr = value.GetCharacterSet().CaseFoldedUTF8(pattern, pl);
         pattern = pstr.c_str();
         pl = pstr.length();
-        }
+      }
       else if (vr.HasSpecificCharacterSet())
-        {
+      {
         if (this->V->CharacterSet != vtkDICOMCharacterSet::ISO_IR_6 &&
             this->V->CharacterSet != vtkDICOMCharacterSet::ISO_IR_192)
-          {
+        {
           // Convert value to UTF8 before matching
           str = this->AsUTF8String();
           cp = str.c_str();
           l = str.length();
-          }
+        }
         if (value.V->CharacterSet != vtkDICOMCharacterSet::ISO_IR_6 &&
             value.V->CharacterSet != vtkDICOMCharacterSet::ISO_IR_192)
-          {
+        {
           // Convert pattern to UTF8 before matching
           pstr = value.AsUTF8String();
           pattern = pstr.c_str();
           pl = pstr.length();
-          }
         }
+      }
       if (vr == vtkDICOMVR::PN)
-        {
+      {
         match = vtkDICOMValue::PatternMatchesPersonName(pattern, cp);
-        }
+      }
       else if (vr.HasSingleValue())
-        {
+      {
         match = vtkDICOMUtilities::PatternMatches(pattern, pl, cp, l);
-        }
+      }
       else
-        {
+      {
         match = vtkDICOMValue::PatternMatchesMulti(pattern, cp, vr);
-        }
       }
     }
+  }
   else if (type == VTK_DICOM_VALUE)
-    {
+  {
     // Match if any of the contained values match
     vtkDICOMValue *vp = static_cast<ValueT<vtkDICOMValue> *>(this->V)->Data;
     size_t vn = this->GetNumberOfValues();
     for (size_t i = 0; i < vn && !match; i++)
-      {
+    {
       match = vp->Matches(value);
       vp++;
-      }
     }
+  }
   else if (type == VTK_DICOM_ITEM)
-    {
+  {
     // Match if any item matches
     vtkDICOMItem *item = static_cast<ValueT<vtkDICOMItem> *>(value.V)->Data;
     vtkDICOMItem *ip = static_cast<ValueT<vtkDICOMItem> *>(this->V)->Data;
     size_t n = this->GetNumberOfValues();
     for (size_t i = 0; i < n && !match; i++)
-      {
+    {
       vtkDICOMDataElementIterator iter = item->Begin();
       vtkDICOMDataElementIterator iterEnd = item->End();
       match = true;
       while (match && iter != iterEnd)
-        {
+      {
         vtkDICOMTag tag = iter->GetTag();
         // The SpecificCharacterSet is always considered to match.  Its
         // presence in the query describes the character encoding of the
         // query, so that query strings can be converted to utf-8 at the
         // point of comparison with the data set strings.
         if (tag != DC::SpecificCharacterSet)
-          {
+        {
           match = ip->GetAttributeValue(tag).Matches(iter->GetValue());
-          }
-        ++iter;
         }
-      ip++;
+        ++iter;
       }
+      ip++;
     }
+  }
   else if (type == VTK_DICOM_TAG)
-    {
+  {
     // Comparing tags between data sets should just always return "true"
     match = true;
-    }
+  }
   else if (vr == vtkDICOMVR::OB || vr == vtkDICOMVR::UN)
-    {
+  {
     // OB and UN must match exactly
     match = ValueT<unsigned char>::Compare(value.V, this->V);
-    }
+  }
   else if (vr == vtkDICOMVR::OW)
-    {
+  {
     // OW must match exactly
     match = ValueT<unsigned short>::Compare(value.V, this->V);
-    }
+  }
   else if (vr == vtkDICOMVR::OL)
-    {
+  {
     // OL must match exactly
     match = ValueT<unsigned int>::Compare(value.V, this->V);
-    }
+  }
   else if (vr == vtkDICOMVR::OF)
-    {
+  {
     // OF must match exactly
     match = ValueT<float>::Compare(value.V, this->V);
-    }
+  }
   else if (vr == vtkDICOMVR::OD)
-    {
+  {
     // OF must match exactly
     match = ValueT<double>::Compare(value.V, this->V);
-    }
+  }
   else if (type == VTK_SHORT || type == VTK_UNSIGNED_SHORT)
-    {
+  {
     // Match if any value matches
     match = ValueT<short>::CompareEach(value.V, this->V);
-    }
+  }
   else if (type == VTK_INT || type == VTK_UNSIGNED_INT)
-    {
+  {
     // Match if any value matches
     match = ValueT<int>::CompareEach(value.V, this->V);
-    }
+  }
   else if (type == VTK_FLOAT)
-    {
+  {
     // Match if any value matches
     match = ValueT<float>::CompareEach(value.V, this->V);
-    }
+  }
   else if (type == VTK_DOUBLE)
-    {
+  {
     // Match if any value matches
     match = ValueT<double>::CompareEach(value.V, this->V);
-    }
+  }
 
   return match;
 }
@@ -2581,24 +2600,24 @@ bool vtkDICOMValue::Matches(const vtkDICOMValue& value) const
 bool vtkDICOMValue::Matches(const std::string& value) const
 {
   if (value.length() == 0)
-    {
+  {
     // to support universal matching
     return true;
-    }
+  }
 
   if (this->V)
-    {
+  {
     if (this->V->VR.HasTextValue())
-      {
+    {
       return this->Matches(vtkDICOMValue(
         this->V->VR, this->V->CharacterSet, value));
-      }
+    }
     else
-      {
+    {
       vtkDICOMValue v(this->V->VR, value);
       return (v.AsString() == value && this->Matches(v));
-      }
     }
+  }
 
   return false;
 }
@@ -2607,10 +2626,10 @@ bool vtkDICOMValue::Matches(const std::string& value) const
 bool vtkDICOMValue::Matches(double value) const
 {
   if (this->V && this->V->VL > 0 && this->V->VR.HasNumericValue())
-    {
+  {
     vtkDICOMValue v(this->V->VR, value);
     return (v.AsDouble() == value && this->Matches(v));
-    }
+  }
 
   return false;
 }
@@ -2623,15 +2642,15 @@ bool vtkDICOMValue::operator==(const vtkDICOMValue& o) const
   bool r = true;
 
   if (a != b)
-    {
+  {
     r = false;
     if (a != 0 && b != 0)
-      {
+    {
       if (a->VR == b->VR && a->VL == b->VL && a->Type == b->Type)
-        {
+      {
         r = true;
         switch (a->Type)
-          {
+        {
           case VTK_CHAR:
             r = ValueT<char>::Compare(a, b);
             break;
@@ -2658,10 +2677,10 @@ bool vtkDICOMValue::operator==(const vtkDICOMValue& o) const
           case VTK_DICOM_VALUE:
             r = ValueT<vtkDICOMValue>::Compare(a, b);
             break;
-          }
         }
       }
     }
+  }
 
   return r;
 }
@@ -2673,104 +2692,104 @@ ostream& operator<<(ostream& os, const vtkDICOMValue& v)
   const char *cp = v.GetCharData();
 
   if (!v.IsValid())
-    {
+  {
     os << "empty[0]";
-    }
+  }
   else if (vr == vtkDICOMVR::UN)
-    {
+  {
     os << "unknown[" << v.GetNumberOfValues() << "]";
-    }
+  }
   else if (vr == vtkDICOMVR::ST ||
            vr == vtkDICOMVR::LT ||
            vr == vtkDICOMVR::UT)
-    {
+  {
     // might have control characters, don't print it
     os << "text[" << v.GetVL() << "]";
-    }
+  }
   else if (cp)
-    {
+  {
     const char *dp = cp + v.GetVL();
     while (cp != dp && *cp == ' ') { cp++; }
     while (cp != dp && dp[-1] == ' ') { dp--; }
     if (cp != dp)
-      {
+    {
       if (dp[-1] == '\0' || *dp == '\0')
-        {
+      {
         os << cp;
-        }
+      }
       else
-        {
+      {
         std::string s = std::string(cp, dp);
         os << s.c_str();
-        }
       }
     }
+  }
   else if (vr == vtkDICOMVR::AT)
-    {
+  {
     const vtkDICOMTag *tp = v.GetTagData();
     size_t m = v.GetNumberOfValues();
     if (tp)
-      {
+    {
       for (size_t j = 0; j < m; j++)
-        {
+      {
         if (j > 0) { os << ","; }
         os << tp[j];
-        }
       }
+    }
     else
-      {
+    {
       os << "tags[" << m << "]";
-      }
     }
+  }
   else if (vr == vtkDICOMVR::SQ)
-    {
+  {
     os << "items[" << v.GetNumberOfValues() << "]";
-    }
+  }
   else if (vr == vtkDICOMVR::OB)
-    {
+  {
     os << "bytes[" << v.GetNumberOfValues() << "]";
-    }
+  }
   else if (vr == vtkDICOMVR::OW)
-    {
+  {
     os << "words[" << v.GetNumberOfValues() << "]";
-    }
+  }
   else if (vr == vtkDICOMVR::OW)
-    {
+  {
     os << "longwords[" << v.GetNumberOfValues() << "]";
-    }
+  }
   else if (vr == vtkDICOMVR::OF)
-    {
+  {
     os << "floats[" << v.GetNumberOfValues() << "]";
-    }
+  }
   else if (vr == vtkDICOMVR::OD)
-    {
+  {
     os << "doubles[" << v.GetNumberOfValues() << "]";
-    }
+  }
   else
-    {
+  {
     const vtkDICOMValue *vp = v.GetMultiplexData();
     if (vp)
-      {
+    {
       // value is a multiplex of per-instance values
       os << "values[" << v.GetNumberOfValues() << "]";
-      }
+    }
     else
-      {
+    {
       std::string s;
       size_t m = v.GetNumberOfValues();
       size_t n = (m <= 16 ? m : 16);
       for (size_t i = 0; i < n; i++)
-        {
+      {
         s.append((i == 0 ? "" : ","));
         v.AppendValueToUTF8String(s, i);
-        }
+      }
       if (m > n)
-        {
+      {
         s.append(",...");
-        }
-      os << s.c_str();
       }
+      os << s.c_str();
     }
+  }
 
   return os;
 }
diff --git a/Source/vtkDICOMValue.h b/Source/vtkDICOMValue.h
index 6cf3ca3..f5a9c88 100644
--- a/Source/vtkDICOMValue.h
+++ b/Source/vtkDICOMValue.h
@@ -76,6 +76,8 @@ private:
   };
 
 public:
+
+  //@{
   //! Construct a new value from the data that is provided.
   /*!
    *  The data will be copied into the value, with conversion if
@@ -102,7 +104,9 @@ public:
   vtkDICOMValue(vtkDICOMVR vr, const double *data, size_t count);
   vtkDICOMValue(vtkDICOMVR vr, const vtkDICOMTag *data, size_t count);
   vtkDICOMValue(vtkDICOMVR vr, const vtkDICOMItem *data, size_t count);
+  //@}
 
+  //@{
   //! Construct a string value with a specific character set.
   /*!
    *  This will set the character set that will be used to interpret
@@ -114,7 +118,9 @@ public:
                 const std::string& v);
   vtkDICOMValue(vtkDICOMVR vr, vtkDICOMCharacterSet cs,
                 const char *data, size_t l);
+  //@}
 
+  //@{
   //! Create an emtpy value.
   explicit vtkDICOMValue(vtkDICOMVR vr);
 
@@ -130,13 +136,17 @@ public:
 
   //! Construct from a sequence.
   vtkDICOMValue(const vtkDICOMSequence &v);
+  //@}
 
+  //@{
   //! Default constructor, constructs an invalid value.
   vtkDICOMValue() : V(0) {}
 
   //! Destructor releases the internal data array.
   ~vtkDICOMValue() { this->Clear(); }
+  //@}
 
+  //@{
   //! Clear the value, the result is an invalid value.
   void Clear() {
     if (this->V && --(this->V->ReferenceCount) == 0) {
@@ -145,7 +155,9 @@ public:
 
   //! Check whether this value is valid, i.e. contains data.
   bool IsValid() const { return (this->V != 0); }
+  //@}
 
+  //@{
   //! Get the VR, the representation of the data values.
   vtkDICOMVR GetVR() const { return (this->V ? this->V->VR : vtkDICOMVR()); }
 
@@ -183,7 +195,9 @@ public:
             + (static_cast<size_t>(this->V->Overflow) << 32)
 #endif
             : 0); }
+  //@}
 
+  //@{
   //! Copy "n" values into vb, starting at value "i".
   /*!
    *  Get one or more values, doing conversion from the stored type to
@@ -200,7 +214,9 @@ public:
   void GetValues(float *vb, size_t n, size_t i=0) const;
   void GetValues(double *vb, size_t n, size_t i=0) const;
   void GetValues(vtkDICOMTag *vb, size_t n, size_t i=0) const;
+  //@}
 
+  //@{
   //! Get one scalar, string, tag or item from the value.
   /*!
    *  Convert the i'th value to the desired type, if possible, and return
@@ -220,7 +236,9 @@ public:
   double GetDouble(size_t i) const;
   vtkDICOMTag GetTag(size_t i) const;
   const vtkDICOMItem& GetItem(size_t i) const;
+  //@}
 
+  //@{
   //! Get the value as a scalar, string, tag, or item.
   /*!
    *  The value is converted to the desired type, if possible, and returned.
@@ -240,7 +258,9 @@ public:
   double AsDouble() const;
   vtkDICOMTag AsTag() const;
   const vtkDICOMItem& AsItem() const;
+  //@}
 
+  //@{
   //! Get a pointer to the internal data array.
   /*!
    *  GetCharData will return a null-terminated string if VR is
@@ -266,7 +286,9 @@ public:
   const vtkDICOMTag *GetTagData() const;
   const vtkDICOMItem *GetSequenceData() const;
   const vtkDICOMValue *GetMultiplexData() const;
+  //@}
 
+  //@{
   //! Allocate space within a value object.
   /*!
    *  Allocate an array of the specified size (number of elements)
@@ -288,7 +310,9 @@ public:
   vtkDICOMTag *AllocateTagData(vtkDICOMVR vr, size_t vn);
   vtkDICOMItem *AllocateSequenceData(vtkDICOMVR vr, size_t vn);
   vtkDICOMValue *AllocateMultiplexData(vtkDICOMVR vr, size_t vn);
+  //@}
 
+  //@{
   //! Compute the number of backslash-separated string values.
   /*!
    *  After calling AllocateCharData and writing text into the allocated
@@ -305,7 +329,9 @@ public:
    *  the NumberOfValues will be vn, and the VL will be 0xffffffff.
    */
   unsigned char *ReallocateUnsignedCharData(size_t vn);
+  //@}
 
+  //@{
   //! Append value "i" to the supplied UTF8 string.
   /*
    *  String values will be converted from their native encoding
@@ -321,7 +347,9 @@ public:
    *  long, and might contain special (i.e. non-printable) characters.
    */
   void AppendValueToString(std::string &str, size_t i) const;
+  //@}
 
+  //@{
   //! Check if the value matches the specified find query value.
   /*!
    *  This method is used during "find" requests, according to the rules
@@ -353,7 +381,9 @@ public:
    *  then the match is true if at least one value matches.
    */
   bool Matches(double v) const;
+  //@}
 
+  //@{
   //! Override assignment operator for reference counting.
   vtkDICOMValue& operator=(const vtkDICOMValue& o) {
     if (this->V != o.V) {
@@ -365,10 +395,13 @@ public:
 
   //! Assign a value from a sequence object.
   vtkDICOMValue& operator=(const vtkDICOMSequence& o);
+  //@}
 
+  //@{
   //! Equality requires that all elements of the value are equal.
   bool operator==(const vtkDICOMValue& o) const;
   bool operator!=(const vtkDICOMValue& o) const { return !(*this == o); }
+  //@}
 
 private:
   //! Allocate an array of size vn for the specified vr
diff --git a/Source/vtkDICOMWriter.cxx b/Source/vtkDICOMWriter.cxx
index 15ee127..31c3c19 100644
--- a/Source/vtkDICOMWriter.cxx
+++ b/Source/vtkDICOMWriter.cxx
@@ -73,17 +73,17 @@ vtkDICOMWriter::vtkDICOMWriter()
 vtkDICOMWriter::~vtkDICOMWriter()
 {
   if (this->PatientMatrix)
-    {
+  {
     this->PatientMatrix->Delete();
-    }
+  }
   if (this->MetaData)
-    {
+  {
     this->MetaData->Delete();
-    }
+  }
   if (this->Generator)
-    {
+  {
     this->Generator->Delete();
-    }
+  }
   delete [] this->TransferSyntaxUID;
   delete [] this->SeriesDescription;
   delete [] this->ImageType;
@@ -104,31 +104,31 @@ void vtkDICOMWriter::PrintSelf(ostream& os, vtkIndent indent)
   os << indent << "ImageType: " << this->ImageType << "\n";
   os << indent << "TransferSyntaxUID: ";
   if (this->TransferSyntaxUID)
-    {
+  {
     os << this->TransferSyntaxUID << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
   os << indent << "MetaData: ";
   if (this->MetaData)
-    {
+  {
     os << this->MetaData << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
   os << indent << "Generator: ";
   if (this->Generator)
-    {
+  {
     os << this->Generator << "\n";
-    }
+  }
   else
-    {
+  {
     os << "(none)\n";
-    }
+  }
   os << indent << "TimeAsVector: "
      << (this->TimeAsVector ? "On\n" : "Off\n");
   os << indent << "TimeDimension: " << this->TimeDimension << "\n";
@@ -138,19 +138,19 @@ void vtkDICOMWriter::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "PatientMatrix:";
   if (this->PatientMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->PatientMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "MemoryRowOrder: "
      << this->GetMemoryRowOrderAsString() << "\n";
@@ -164,13 +164,13 @@ void vtkDICOMWriter::PrintSelf(ostream& os, vtkIndent indent)
 void vtkDICOMWriter::SetMemoryRowOrder(int order)
 {
   if (order >= 0 && order <= vtkDICOMWriter::BottomUp)
-    {
+  {
     if (order != this->MemoryRowOrder)
-      {
+    {
       this->MemoryRowOrder = order;
       this->Modified();
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -178,7 +178,7 @@ const char *vtkDICOMWriter::GetMemoryRowOrderAsString()
 {
   const char *text = "";
   switch (this->MemoryRowOrder)
-    {
+  {
     case vtkDICOMWriter::FileNative:
       text = "FileNative";
       break;
@@ -188,7 +188,7 @@ const char *vtkDICOMWriter::GetMemoryRowOrderAsString()
     case vtkDICOMWriter::BottomUp:
       text = "BottomUp";
       break;
-    }
+  }
 
   return text;
 }
@@ -197,13 +197,13 @@ const char *vtkDICOMWriter::GetMemoryRowOrderAsString()
 void vtkDICOMWriter::SetFileSliceOrder(int order)
 {
   if (order >= 0 && order <= vtkDICOMWriter::Reverse)
-    {
+  {
     if (order != this->FileSliceOrder)
-      {
+    {
       this->FileSliceOrder = order;
       this->Modified();
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -211,7 +211,7 @@ const char *vtkDICOMWriter::GetFileSliceOrderAsString()
 {
   const char *text = "";
   switch (this->FileSliceOrder)
-    {
+  {
     case vtkDICOMWriter::RHR:
       text = "RHR";
       break;
@@ -224,7 +224,7 @@ const char *vtkDICOMWriter::GetFileSliceOrderAsString()
     case vtkDICOMWriter::Reverse:
       text = "Reverse";
       break;
-    }
+  }
 
   return text;
 }
@@ -235,38 +235,38 @@ void vtkDICOMWriter::ComputeInternalFileName(int slice)
   size_t n = 0;
 
   if (this->FileName)
-    {
+  {
     n = strlen(this->FileName) + 1;
-    }
+  }
   else if (this->FilePrefix)
-    {
+  {
     n = strlen(this->FilePrefix) + strlen(this->FilePattern) + 10;
-    }
+  }
   else
-    {
+  {
     n = strlen(this->FilePattern) + 10;
-    }
+  }
 
   if (this->InternalFileName == 0 ||
       strlen(this->InternalFileName) + 10 < n)
-    {
+  {
     delete [] this->InternalFileName;
     this->InternalFileName = new char[n + 11];
-    }
+  }
 
   if (this->FileName)
-    {
+  {
     sprintf(this->InternalFileName, "%s", this->FileName);
-    }
+  }
   else if (this->FilePrefix)
-    {
+  {
     sprintf(this->InternalFileName,
             this->FilePattern, this->FilePrefix, slice);
-    }
+  }
   else
-    {
+  {
     sprintf(this->InternalFileName, this->FilePattern, slice);
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -280,73 +280,73 @@ void vtkDICOMWriter::FreeInternalFileName()
 int vtkDICOMWriter::GenerateMetaData(vtkInformation *info)
 {
   if (this->GeneratedMetaData)
-    {
+  {
     this->GeneratedMetaData->Delete();
     this->GeneratedMetaData = 0;
-    }
+  }
 
   if (!this->Generator)
-    {
+  {
     vtkErrorMacro("No Generator was supplied, unable to create a DICOM "
                   "data set");
     return 0;
-    }
+  }
 
   // Check whether image is stored top-to-bottom or bottom-to-top
   bool flipImage = (this->MemoryRowOrder == vtkDICOMWriter::BottomUp);
   bool reverseSlices = flipImage;
   if (this->FileSliceOrder == vtkDICOMWriter::LHR)
-    {
+  {
     reverseSlices = !flipImage;
-    }
+  }
   else if (this->FileSliceOrder == vtkDICOMWriter::Same)
-    {
+  {
     reverseSlices = false;
-    }
+  }
   else if (this->FileSliceOrder == vtkDICOMWriter::Reverse)
-    {
+  {
     reverseSlices = true;
-    }
+  }
 
   // Get the meta data from the pipeline if not given explicitly
   vtkDICOMMetaData *inMeta = this->MetaData;
   vtkMatrix4x4 *inMatrix = this->PatientMatrix;
   vtkInformation *metaInfo = info;
   if (inMeta == 0 || inMatrix == 0)
-    {
+  {
     // this code is needed for when SetInputData was used
     vtkAlgorithmOutput *sourceConnection = this->GetInputConnection(0, 0);
     if (sourceConnection)
-      {
+    {
       vtkAlgorithm *producer = sourceConnection->GetProducer();
       if (producer && vtkTrivialProducer::SafeDownCast(producer))
-        {
+      {
         vtkDataObject *inputData = producer->GetOutputDataObject(0);
         if (inputData)
-          {
+        {
           metaInfo = inputData->GetInformation();
-          }
         }
       }
     }
+  }
   if (inMeta == 0)
-    {
+  {
     inMeta = vtkDICOMMetaData::SafeDownCast(
       metaInfo->Get(vtkDICOMAlgorithm::META_DATA()));
-    }
+  }
   if (inMatrix == 0)
-    {
+  {
     double *elements = metaInfo->Get(vtkDICOMAlgorithm::PATIENT_MATRIX());
     if (elements)
-      {
+    {
       inMatrix = vtkMatrix4x4::New();
       inMatrix->DeepCopy(elements);
-      }
     }
+  }
   else
-    {
+  {
     inMatrix->Register(0);
-    }
+  }
 
   // Generate the meta data
   this->Generator->SetMultiFrame(this->FileDimensionality > 2);
@@ -360,30 +360,30 @@ int vtkDICOMWriter::GenerateMetaData(vtkInformation *info)
   this->Generator->SetSourceMetaData(inMeta);
   this->Generator->SetPatientMatrix(inMatrix);
   if (inMatrix)
-    {
+  {
     inMatrix->Delete();
-    }
+  }
   if (!this->Generator->GenerateInstance(info))
-    {
+  {
     return 0;
-    }
+  }
   this->GeneratedMetaData = this->Generator->GetMetaData();
   this->GeneratedMetaData->Register(this);
   vtkDICOMMetaData *meta = this->GeneratedMetaData;
 
   // set the series description from the member variable
   if (this->SeriesDescription && this->SeriesDescription[0] != '\0')
-    {
+  {
     char sd[65];
     strncpy(sd, this->SeriesDescription, 64);
     sd[64] = '\0';
     meta->SetAttributeValue(DC::SeriesDescription, sd);
     meta->RemoveAttribute(DC::SeriesDescriptionCodeSequence);
-    }
+  }
 
   // set the image type from the member variable
   if (this->ImageType && this->ImageType[0] != '\0')
-    {
+  {
     const char *allowedTypes[] = {
       "ORIGINAL\\PRIMARY", "DERIVED\\PRIMARY",
       "ORIGINAL\\SECONDARY", "DERIVED\\SECONDARY",
@@ -396,43 +396,43 @@ int vtkDICOMWriter::GenerateMetaData(vtkInformation *info)
     char *sdp = sd;
     char *lsdp = sd;
     while (*sdp != '\0')
-      {
+    {
       char c = *sdp++;
 
       if (((c < 'A' || c > 'Z') && (c < '0' || c > '9') &&
            c != '_' && c != ' ') || (sdp - lsdp > 16))
-        {
+      {
         vtkErrorMacro("Illegal ImageType: " << this->ImageType);
         return 0;
-        }
+      }
 
       if (*sdp == '/' || *sdp == '\\')
-        {
+      {
         *sdp++ = '\\';
         lsdp = sdp;
-        }
       }
+    }
 
     bool isAllowed = false;
     for (const char **allowed = allowedTypes; *allowed != 0; allowed++)
-      {
+    {
       size_t sl = strlen(*allowed);
       if (strncmp(*allowed, sd, sl) == 0 && (sd[sl] == '\0' || sd[sl] == '\\'))
-        {
+      {
         isAllowed = true;
         break;
-        }
       }
+    }
     if (!isAllowed)
-      {
+    {
       vtkErrorMacro("Illegal ImageType: " << this->ImageType << ", "
                     "the first part must be ORIGINAL or DERIVED, the "
                     "second part must be PRIMARY or SECONDARY");
       return 0;
-      }
+    }
 
     meta->SetAttributeValue(DC::ImageType, sd);
-    }
+  }
 
   // add an empty PixelData to be filled in by the compiler
   unsigned short empty = 0;
@@ -455,27 +455,27 @@ int vtkDICOMWriter::RequestData(
     vtkImageData::SafeDownCast(info->Get(vtkDataObject::DATA_OBJECT()));
 
   if (data == NULL)
-    {
+  {
     vtkErrorMacro("No input provided!");
     return 0;
-    }
+  }
 
   if (!this->FileName && !this->FilePattern)
-    {
+  {
     vtkErrorMacro("Write:Please specify either a FileName "
                   "or a file prefix and pattern");
     this->SetErrorCode(vtkErrorCode::NoFileNameError);
     return 0;
-    }
+  }
 
   if (!this->GeneratedMetaData)
-    {
+  {
     // Generate the meta data to go with the image
     if (!this->GenerateMetaData(info))
-      {
+    {
       return 0;
-      }
     }
+  }
 
   // Get the map from file,frame to slice.
   vtkIntArray *sliceMap = this->Generator->GetSliceIndexArray();
@@ -492,24 +492,24 @@ int vtkDICOMWriter::RequestData(
   int minFileIdx = numFiles-1;
   int maxFileIdx = 0;
   for (int fileIdx = 0; fileIdx < numFiles; fileIdx++)
-    {
+  {
     for (int frameIdx = 0; frameIdx < numFrames; frameIdx++)
-      {
+    {
       int sliceIdx = sliceMap->GetComponent(fileIdx, frameIdx);
       if (sliceIdx >= extent[4] && sliceIdx <= extent[5])
-        {
+      {
         minFileIdx = (minFileIdx < fileIdx ? minFileIdx : fileIdx);
         maxFileIdx = (maxFileIdx > fileIdx ? maxFileIdx : fileIdx);
-        }
       }
     }
+  }
 
   vtkSmartPointer<vtkDICOMCompiler> compiler =
     vtkSmartPointer<vtkDICOMCompiler>::New();
   if (this->TransferSyntaxUID)
-    {
+  {
     compiler->SetTransferSyntaxUID(this->TransferSyntaxUID);
-    }
+  }
   vtkDICOMMetaData *meta = this->GeneratedMetaData;
   compiler->SetMetaData(meta);
 
@@ -543,18 +543,18 @@ int vtkDICOMWriter::RequestData(
   bool packedToPlanar = (filePixelSize != pixelSize);
   unsigned char *rowBuffer = 0;
   if (flipImage)
-    {
+  {
     rowBuffer = new unsigned char[fileRowSize];
-    }
+  }
   unsigned char *frameBuffer = 0;
   if (flipImage || packedToPlanar)
-    {
+  {
     frameBuffer = new unsigned char[fileFrameSize];
-    }
+  }
 
   // loop through all files in the update extent
   for (int fileIdx = minFileIdx; fileIdx <= maxFileIdx; fileIdx++)
-    {
+  {
     // get the index for this file
     this->ComputeInternalFileName(fileIdx + 1);
     compiler->SetFileName(this->InternalFileName);
@@ -567,7 +567,7 @@ int vtkDICOMWriter::RequestData(
 
     // iterate through all frames in the file
     for (int frameIdx = 0; frameIdx < numFrames; frameIdx++)
-      {
+    {
       if (this->AbortExecute) { break; }
 
       this->UpdateProgress(static_cast<double>(fileIdx*numFrames + frameIdx)/
@@ -580,10 +580,10 @@ int vtkDICOMWriter::RequestData(
       unsigned char *framePtr = frameBuffer;
 
       if (!framePtr)
-        {
+      {
         // write the frame directly from image data
         framePtr = (dataPtr + (sliceIdx - extent[4])*sliceSize);
-        }
+      }
 
       // go to the correct position in image data
       unsigned char *slicePtr =
@@ -593,48 +593,48 @@ int vtkDICOMWriter::RequestData(
       // iterate through all color planes in the slice
       unsigned char *planePtr = framePtr;
       for (int pIdx = 0; pIdx < numPlanes; pIdx++)
-        {
+      {
         // convert scalar components to planes
         if (packedToPlanar)
-          {
+        {
           const unsigned char *tmpInPtr = slicePtr;
           unsigned char *tmpOutPtr = planePtr;
           int m = sliceSize/pixelSize;
           for (int i = 0; i < m; i++)
-            {
+          {
             vtkIdType n = filePixelSize;
             do { *tmpOutPtr++ = *tmpInPtr++; } while (--n);
             tmpInPtr += pixelSize - filePixelSize;
-            }
-          slicePtr += filePixelSize;
           }
+          slicePtr += filePixelSize;
+        }
         else
-          {
+        {
           memcpy(framePtr, slicePtr, fileFrameSize);
-          }
+        }
 
         // flip the data if necessary
         if (flipImage)
-          {
+        {
           int numRows = extent[3] - extent[2] + 1;
           int halfRows = numRows/2;
           for (int yIdx = 0; yIdx < halfRows; yIdx++)
-            {
+          {
             unsigned char *row1 = planePtr + yIdx*fileRowSize;
             unsigned char *row2 = planePtr + (numRows-yIdx-1)*fileRowSize;
             memcpy(rowBuffer, row1, fileRowSize);
             memcpy(row1, row2, fileRowSize);
             memcpy(row2, rowBuffer, fileRowSize);
-            }
           }
+        }
 
         planePtr += filePlaneSize;
-        }
+      }
       // write the frame to the file
       compiler->WriteFrame(framePtr, fileFrameSize);
-      }
-    compiler->Close();
     }
+    compiler->Close();
+  }
 
   delete [] rowBuffer;
   delete [] frameBuffer;
@@ -657,16 +657,16 @@ void vtkDICOMWriter::Write()
   inInfo->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), wholeExtent);
   // if streaming is on, write the slices one-at-a-time
   if (this->Streaming && this->FileDimensionality == 2)
-    {
+  {
     if (this->GenerateMetaData(inInfo))
-      {
+    {
       int extent[6] = {
         wholeExtent[0], wholeExtent[1],
         wholeExtent[2], wholeExtent[3],
         wholeExtent[4], wholeExtent[5]
       };
       for (int i = wholeExtent[4]; i <= wholeExtent[5]; i++)
-        {
+      {
         // set the update extent to the slice
         extent[4] = i;
         extent[5] = i;
@@ -674,21 +674,21 @@ void vtkDICOMWriter::Write()
         inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(),
                     extent, 6);
         this->Update();
-        }
       }
     }
+  }
   else
-    {
+  {
     // set update wholeExtent to whole wholeExtent
     inInfo->Set(vtkStreamingDemandDrivenPipeline::UPDATE_EXTENT(),
                 wholeExtent, 6);
     this->Update();
-    }
+  }
 
   // do some cleanup
   if (this->GeneratedMetaData)
-    {
+  {
     this->GeneratedMetaData->Delete();
     this->GeneratedMetaData = 0;
-    }
+  }
 }
diff --git a/Source/vtkDICOMWriter.h b/Source/vtkDICOMWriter.h
index ef42975..fd934dc 100644
--- a/Source/vtkDICOMWriter.h
+++ b/Source/vtkDICOMWriter.h
@@ -11,16 +11,16 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkDICOMWriter - Write DICOM image files.
-// .SECTION Description
-// This class writes a series of one or more DICOM files.  The default
-// behavior is to write a series of Secondary Capture files with no
-// modality-specific information.  To write other kinds of DICOM files,
-// use the SetGenerator() method to supply a generator for the type of
-// data set that you wish to write.  Currently, there are generators for
-// MR and CT data sets.
-// .SECTION Thanks
-// This class was contributed to VTK by David Gobbi.
+/*! \class vtkDICOMWriter
+ *  \brief Write DICOM image files.
+ *
+ *  This class writes a series of one or more DICOM files.  The default
+ *  behavior is to write a series of Secondary Capture files with no
+ *  modality-specific information.  To write other kinds of DICOM files,
+ *  use the SetGenerator() method to supply a generator for the type of
+ *  data set that you wish to write.  Currently, there are generators for
+ *  MR and CT data sets.
+ */
 
 #ifndef vtkDICOMWriter_h
 #define vtkDICOMWriter_h
@@ -35,80 +35,98 @@ class vtkDICOMGenerator;
 class VTKDICOM_EXPORT vtkDICOMWriter : public vtkImageWriter
 {
 public:
-  // Description:
-  // Static method for construction.
-  static vtkDICOMWriter *New();
   vtkTypeMacro(vtkDICOMWriter, vtkImageWriter);
 
-  // Description:
-  // Print information about this object.
+  //! Static method for construction.
+  static vtkDICOMWriter *New();
+
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Set a short description (max 64 chars) for the DICOM series.
-  // The default description is "VTKX.Y" where X.Y is the VTK version.
+  //@{
+  //! Set a short description (max 64 chars) for the DICOM series.
+  /*!
+   *  The default description is "VTKX.Y" where X.Y is the VTK version.
+   */
   vtkSetStringMacro(SeriesDescription);
   vtkGetStringMacro(SeriesDescription);
-
-  // Description:
-  // Set the image type, using a series of DICOM code strings.
-  // This must follow the DICOM standard, an error will be generated
-  // if it doesn't.  The default value is DERIVED/SECONDARY/OTHER,
-  // where the forward-slashes will be replaced by backslashes when
-  // the attribute is written.  Set this to NULL if you wish to use
-  // the original ImageType.
+  //@}
+
+  //@{
+  //! Set the image type, using a series of DICOM code strings.
+  /*!
+   *  This must follow the DICOM standard, an error will be generated
+   *  if it doesn't.  The default value is DERIVED/SECONDARY/OTHER,
+   *  where the forward-slashes will be replaced by backslashes when
+   *  the attribute is written.  Set this to NULL if you wish to use
+   *  the original ImageType.
+   */
   vtkSetStringMacro(ImageType);
   vtkGetStringMacro(ImageType);
-
-  // Description:
-  // Write scalar components as the time dimension (default: Off).
-  // If this is on, the writer assumes that each time slot is stored
-  // in a different scalar component of the image data.  If it is off,
-  // the writer assumes that each block of N adjacent slices correspond
-  // to the N time slots of the time dimension.
+  //@}
+
+  //@{
+  //! Write scalar components as the time dimension (default: Off).
+  /*!
+   *  If this is on, the writer assumes that each time slot is stored
+   *  in a different scalar component of the image data.  If it is off,
+   *  the writer assumes that each block of N adjacent slices correspond
+   *  to the N time slots of the time dimension.
+   */
   vtkSetMacro(TimeAsVector, int);
   vtkBooleanMacro(TimeAsVector, int);
   vtkGetMacro(TimeAsVector, int);
-
-  // Description:
-  // Set the time dimension to use in the DICOM file (or zero if none).
-  // The number of components of the input data must be divisible by the time
-  // dimension if the time dimension is not set to zero.  The vector dimension
-  // will be set to the number of components divided by the time dimension.
-  // This will be ignored if the SOP Class IOD does not permit a time
-  // dimension.
+  //@}
+
+  //@{
+  //! Set the time dimension to use in the DICOM file (or zero if none).
+  /*!
+   *  The number of components of the input data must be divisible by the time
+   *  dimension if the time dimension is not set to zero.  The vector dimension
+   *  will be set to the number of components divided by the time dimension.
+   *  This will be ignored if the SOP Class IOD does not permit a time
+   *  dimension.
+   */
   vtkSetMacro(TimeDimension, int);
   vtkGetMacro(TimeDimension, int);
   vtkSetMacro(TimeSpacing, double);
   vtkGetMacro(TimeSpacing, double);
-
-  // Description:
-  // Set the parameters to rescale integer pixel values into real values.
-  // These parameters are the intercept and slope int the equation v = m*x + b
-  // that converts the stored pixel values to real units such as Hounsfield
-  // units.  Most modalities (including MR) ignore these values, while certain
-  // modalities (such as CT) require them.
+  //@}
+
+  //@{
+  //! Set the parameters to rescale integer pixel values into real values.
+  /*!
+   *  These parameters are the intercept and slope int the equation v = m*x + b
+   *  that converts the stored pixel values to real units such as Hounsfield
+   *  units.  Most modalities (including MR) ignore these values, while certain
+   *  modalities (such as CT) require them.
+   */
   vtkSetMacro(RescaleIntercept, double);
   vtkGetMacro(RescaleIntercept, double);
   vtkSetMacro(RescaleSlope, double);
   vtkGetMacro(RescaleSlope, double);
-
-  // Description:
-  // Set the matrix that places the image in DICOM patient coords.
-  // The 3x3 portion of the matrix must be orthonormal, and the
-  // last column of the matrix is understood to be in millimetres.
+  //@}
+
+  //@{
+  //! Set the matrix that places the image in DICOM patient coords.
+  /*!
+   *  The 3x3 portion of the matrix must be orthonormal, and the
+   *  last column of the matrix is understood to be in millimetres.
+   */
   void SetPatientMatrix(vtkMatrix4x4 *);
   vtkMatrix4x4 *GetPatientMatrix() { return this->PatientMatrix; }
+  //@}
 
-  // Description:
-  // Enumeration for top-down vs. bottom-up ordering.
+  //! Enumeration for top-down vs. bottom-up ordering.
   enum RowOrder { FileNative, TopDown, BottomUp };
 
-  // Description:
-  // Set the ordering of the image rows in memory.
-  // If the order is BottomUp (which is the default) then
-  // the images will be flipped when they are read from disk.
-  // The native orientation of DICOM images is top-to-bottom.
+  //@{
+  //! Set the ordering of the image rows in memory.
+  /*!
+   *  If the order is BottomUp (which is the default) then
+   *  the images will be flipped when they are read from disk.
+   *  The native orientation of DICOM images is top-to-bottom.
+   */
   void SetMemoryRowOrder(int order);
   void SetMemoryRowOrderToFileNative() {
     this->SetMemoryRowOrder(FileNative); }
@@ -118,18 +136,20 @@ public:
     this->SetMemoryRowOrder(BottomUp); }
   int GetMemoryRowOrder() { return this->MemoryRowOrder; }
   const char *GetMemoryRowOrderAsString();
+  //@}
 
-  // Description:
-  // Enumeration for file order.
+  //! Enumeration for file order.
   enum SliceOrder { RHR, LHR, Same, Reverse };
 
-  // Description:
-  // Set the slice ordering of the files to be written.
-  // The default is RHR (right-hand-rule), which means that if your
-  // right thumb points along an image row, and your index finger points
-  // down a row (starting at the top left of the image), then a bent middle
-  // finger points in the direction of increasing slice index.  LHR is the
-  // reverse of this.  Same keeps files in the same order as VTK slices.
+  //@{
+  //! Set the slice ordering of the files to be written.
+  /*!
+   *  The default is RHR (right-hand-rule), which means that if your
+   *  right thumb points along an image row, and your index finger points
+   *  down a row (starting at the top left of the image), then a bent middle
+   *  finger points in the direction of increasing slice index.  LHR is the
+   *  reverse of this.  Same keeps files in the same order as VTK slices.
+   */
   void SetFileSliceOrder(int order);
   void SetFileSliceOrderToRHR() { this->SetFileSliceOrder(RHR); }
   void SetFileSliceOrderToLHR() { this->SetFileSliceOrder(LHR); }
@@ -137,125 +157,122 @@ public:
   void SetFileSliceOrderToReverse() { this->SetFileSliceOrder(Reverse); }
   int GetFileSliceOrder() { return this->FileSliceOrder; }
   const char *GetFileSliceOrderAsString();
-
-  // Description:
-  // Set the meta data to include with the file.
-  // The supplied meta data is only used as a hint, the writer
-  // will override attributes that aren't valid for the image.
+  //@}
+
+  //@{
+  //! Set the meta data to include with the file.
+  /*!
+   *  The supplied meta data is only used as a hint, the writer
+   *  will override attributes that aren't valid for the image.
+   */
   void SetMetaData(vtkDICOMMetaData *);
   vtkDICOMMetaData *GetMetaData();
-
-  // Description:
-  // Set the generator for image modality you wish to write.
-  // The generator combines the image information from VTK with the
-  // supplied MetaData to create the DICOM data series that will be
-  // written to disk.  The default generator will write a Secondary
-  // Capture series, rather than a series belonging to a specific
-  // imaging modality.
+  //@}
+
+  //@{
+  //! Set the generator for image modality you wish to write.
+  /*!
+   *  The generator combines the image information from VTK with the
+   *  supplied MetaData to create the DICOM data series that will be
+   *  written to disk.  The default generator will write a Secondary
+   *  Capture series, rather than a series belonging to a specific
+   *  imaging modality.
+   */
   void SetGenerator(vtkDICOMGenerator *);
   vtkDICOMGenerator *GetGenerator() { return this->Generator; }
-
-  // Description:
-  // Set the Transfer Syntax UID.
-  // Setting the transfer syntax is an experimental feature.  If not
-  // set, the transfer syntax will be 1.2.840.10008.1.2.1 (uncompressed
-  // little-endian with explicit VR).
+  //@}
+
+  //@{
+  //! Set the Transfer Syntax UID.
+  /*!
+   *  Setting the transfer syntax is an experimental feature.  If not
+   *  set, the transfer syntax will be 1.2.840.10008.1.2.1 (uncompressed
+   *  little-endian with explicit VR).
+   */
   vtkSetStringMacro(TransferSyntaxUID);
   vtkGetStringMacro(TransferSyntaxUID);
-
-  // Description:
-  // Turn on streaming, to pass one slice though the pipeline at a time.
-  // Streaming decreases memory usage for images with a large number of
-  // slices, since only one slice will have to be in memory at a time.
-  // However, streaming can be slower (sometimes much slower) than
-  // reading and processing all of the slices at once.
+  //@}
+
+  //@{
+  //! Turn on streaming, to pass one slice though the pipeline at a time.
+  /*!
+   *  Streaming decreases memory usage for images with a large number of
+   *  slices, since only one slice will have to be in memory at a time.
+   *  However, streaming can be slower (sometimes much slower) than
+   *  reading and processing all of the slices at once.
+   */
   vtkSetMacro(Streaming, int);
   vtkGetMacro(Streaming, int);
   vtkBooleanMacro(Streaming, int);
+  //@}
 
-  // Description:
-  // Write the file to disk.
+  //@{
+  //! Write the file to disk.
   virtual void Write();
+  //@}
 
 protected:
   vtkDICOMWriter();
   ~vtkDICOMWriter();
 
-  // Description:
-  // Compute the name of one of the output files.
+  //! Compute the name of one of the output files.
   void ComputeInternalFileName(int slice);
 
-  // Description:
-  // Free the filename created by ComputeInternalFileName.
+  //! Free the filename created by ComputeInternalFileName.
   void FreeInternalFileName();
 
-  // Description:
-  // Generate the meta data to be written for the files.
+  //! Generate the meta data to be written for the files.
   virtual int GenerateMetaData(vtkInformation *info);
 
-  // Description:
-  // The main execution method, which writes the file.
+  //! The main execution method, which writes the file.
   virtual int RequestData(vtkInformation *request,
                           vtkInformationVector** inputVector,
                           vtkInformationVector* outputVector);
 
-  // Description:
-  // The meta data set by the user.
+  //! The meta data set by the user.
   vtkDICOMMetaData *MetaData;
 
-  // Description:
-  // The meta data generated by the generator.
+  //! The meta data generated by the generator.
   vtkDICOMMetaData *GeneratedMetaData;
 
-  // Description:
-  // The modality-specific generator for the DICOM data object.
+  //! The modality-specific generator for the DICOM data object.
   vtkDICOMGenerator *Generator;
 
-  // Description:
-  // Whether time is stored in slices or in scalar components.
+  //! Whether time is stored in slices or in scalar components.
   int TimeAsVector;
 
-  // Description:
-  // Time dimension to use in the file.
+  //! Time dimension to use in the file.
   int TimeDimension;
   double TimeSpacing;
 
-  // Description:
-  // The parameters for rescaling the data to real values.
+  //! The parameters for rescaling the data to real values.
   double RescaleIntercept;
   double RescaleSlope;
 
-  // Description:
-  // The orientation matrix for the DICOM file.
+  //! The orientation matrix for the DICOM file.
   vtkMatrix4x4 *PatientMatrix;
 
-  // Description:
-  // A description of how the file was produced.
+  //! A description of how the file was produced.
   char *SeriesDescription;
 
-  // Description:
-  // The transfer syntax to use when writing the data.
+  //! The transfer syntax to use when writing the data.
   char *TransferSyntaxUID;
 
-  // Description:
-  // The DICOM Image Type.
+  //! The DICOM Image Type.
   char *ImageType;
 
-  // Description:
-  // The row order to use when storing the data in memory.
+  //! The row order to use when storing the data in memory.
   int MemoryRowOrder;
 
-  // Description:
-  // The slice order to use when writing the files to disk.
+  //! The slice order to use when writing the files to disk.
   int FileSliceOrder;
 
-  // Description:
-  // Whether to stream the data and write one file at a time.
+  //! Whether to stream the data and write one file at a time.
   int Streaming;
 
 private:
-  vtkDICOMWriter(const vtkDICOMWriter&);  // Not implemented.
-  void operator=(const vtkDICOMWriter&);  // Not implemented.
+  vtkDICOMWriter(const vtkDICOMWriter&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkDICOMWriter&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkDICOMWriter_h
diff --git a/Source/vtkNIFTIHeader.cxx b/Source/vtkNIFTIHeader.cxx
index f303b16..c77778b 100644
--- a/Source/vtkNIFTIHeader.cxx
+++ b/Source/vtkNIFTIHeader.cxx
@@ -59,10 +59,10 @@ void vtkNIFTIHeader::Initialize()
   this->DataType = 0;
   this->BitPix = 0;
   for (int i = 0; i < 8; i++)
-    {
+  {
     this->Dim[i] = 0;
     this->PixDim[i] = 0.0;
-    }
+  }
   this->IntentCode = 0;
   memset(this->IntentName, '\0', sizeof(this->IntentName));
   this->IntentP1 = 0.0;
@@ -90,11 +90,11 @@ void vtkNIFTIHeader::Initialize()
   this->QOffsetY = 0.0;
   this->QOffsetZ = 0.0;
   for (int i = 0; i < 4; i++)
-    {
+  {
     this->SRowX[i] = 0.0;
     this->SRowY[i] = 0.0;
     this->SRowZ[i] = 0.0;
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -110,19 +110,19 @@ void vtkNIFTIHeader::SetHeader(const nifti_1_header *hdr)
                   hdr->magic[3] == '\0');
 
   if (isnifti)
-    {
+  {
     memcpy(this->Magic, hdr->magic, sizeof(hdr->magic));
-    }
+  }
   this->VoxOffset = static_cast<vtkTypeInt64>(hdr->vox_offset);
   this->DataType = hdr->datatype;
   this->BitPix = hdr->bitpix;
   for (int i = 0; i < 8; i++)
-    {
+  {
     this->Dim[i] = hdr->dim[i];
     this->PixDim[i] = hdr->pixdim[i];
-    }
+  }
   if (isnifti)
-    {
+  {
     this->IntentCode = hdr->intent_code;
     strncpy(this->IntentName, hdr->intent_name, sizeof(hdr->intent_name));
     this->IntentP1 = hdr->intent_p1;
@@ -130,23 +130,23 @@ void vtkNIFTIHeader::SetHeader(const nifti_1_header *hdr)
     this->IntentP3 = hdr->intent_p3;
     this->SclSlope = hdr->scl_slope;
     this->SclInter = hdr->scl_inter;
-    }
+  }
   this->CalMin = hdr->cal_min;
   this->CalMax = hdr->cal_max;
   if (isnifti)
-    {
+  {
     this->SliceDuration = hdr->slice_duration;
     this->TOffset = hdr->toffset;
     this->SliceStart = hdr->slice_start;
     this->SliceEnd = hdr->slice_end;
     this->SliceCode = hdr->slice_code;
-    }
+  }
   this->XYZTUnits = hdr->xyzt_units;
   this->DimInfo = hdr->dim_info;
   strncpy(this->Descrip, hdr->descrip, sizeof(hdr->descrip));
   strncpy(this->AuxFile, hdr->aux_file, sizeof(hdr->aux_file));
   if (isnifti)
-    {
+  {
     this->QFormCode = hdr->qform_code;
     this->SFormCode = hdr->sform_code;
     this->QuaternB = hdr->quatern_b;
@@ -156,12 +156,12 @@ void vtkNIFTIHeader::SetHeader(const nifti_1_header *hdr)
     this->QOffsetY = hdr->qoffset_y;
     this->QOffsetZ = hdr->qoffset_z;
     for (int i = 0; i < 4; i++)
-      {
+    {
       this->SRowX[i] = hdr->srow_x[i];
       this->SRowY[i] = hdr->srow_y[i];
       this->SRowZ[i] = hdr->srow_z[i];
-      }
     }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -183,12 +183,13 @@ void vtkNIFTIHeader::GetHeader(nifti_1_header *hdr)
   hdr->bitpix = static_cast<short>(this->BitPix);
   hdr->slice_start = this->SliceStart;
   for (int i = 0; i < 8; i++)
-    {
+  {
     hdr->dim[i] = static_cast<short>(this->Dim[i]);
     hdr->pixdim[i] = vtkNIFTINormalizeFloat(this->PixDim[i]);
-    }
+  }
   hdr->vox_offset = static_cast<float>(this->VoxOffset);
-  strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name));
+  strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name) - 1);
+  hdr->intent_name[sizeof(hdr->intent_name) - 1] = '\0';
   hdr->scl_slope = vtkNIFTINormalizeFloat(this->SclSlope);
   hdr->scl_inter = vtkNIFTINormalizeFloat(this->SclInter);
   hdr->cal_min = vtkNIFTINormalizeFloat(this->CalMin);
@@ -200,8 +201,10 @@ void vtkNIFTIHeader::GetHeader(nifti_1_header *hdr)
   hdr->slice_end = this->SliceEnd;
   hdr->slice_code = this->SliceCode;
   hdr->xyzt_units = this->XYZTUnits;
-  strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip));
-  strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file));
+  strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip) - 1);
+  hdr->descrip[sizeof(hdr->descrip) - 1] = '\0';
+  strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file) - 1);
+  hdr->aux_file[sizeof(hdr->aux_file) - 1] = '\0';
   hdr->qform_code = static_cast<short>(this->QFormCode);
   hdr->sform_code = static_cast<short>(this->SFormCode);
   hdr->quatern_b = vtkNIFTINormalizeFloat(this->QuaternB);
@@ -211,11 +214,11 @@ void vtkNIFTIHeader::GetHeader(nifti_1_header *hdr)
   hdr->qoffset_y = vtkNIFTINormalizeFloat(this->QOffsetY);
   hdr->qoffset_z = vtkNIFTINormalizeFloat(this->QOffsetZ);
   for (int i = 0; i < 4; i++)
-    {
+  {
     hdr->srow_x[i] = vtkNIFTINormalizeFloat(this->SRowX[i]);
     hdr->srow_y[i] = vtkNIFTINormalizeFloat(this->SRowY[i]);
     hdr->srow_z[i] = vtkNIFTINormalizeFloat(this->SRowZ[i]);
-    }
+  }
 }
 
 
@@ -227,10 +230,10 @@ void vtkNIFTIHeader::SetHeader(const nifti_2_header *hdr)
   this->DataType = hdr->datatype;
   this->BitPix = hdr->bitpix;
   for (int i = 0; i < 8; i++)
-    {
+  {
     this->Dim[i] = hdr->dim[i];
     this->PixDim[i] = hdr->pixdim[i];
-    }
+  }
   this->IntentCode = hdr->intent_code;
   strncpy(this->IntentName, hdr->intent_name, sizeof(hdr->intent_name));
   this->IntentP1 = hdr->intent_p1;
@@ -258,11 +261,11 @@ void vtkNIFTIHeader::SetHeader(const nifti_2_header *hdr)
   this->QOffsetY = hdr->qoffset_y;
   this->QOffsetZ = hdr->qoffset_z;
   for (int i = 0; i < 4; i++)
-    {
+  {
     this->SRowX[i] = hdr->srow_x[i];
     this->SRowY[i] = hdr->srow_y[i];
     this->SRowZ[i] = hdr->srow_z[i];
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -273,10 +276,10 @@ void vtkNIFTIHeader::GetHeader(nifti_2_header *hdr)
   hdr->datatype = static_cast<short>(this->DataType);
   hdr->bitpix = static_cast<short>(this->BitPix);
   for (int i = 0; i < 8; i++)
-    {
+  {
     hdr->dim[i] = static_cast<short>(this->Dim[i]);
     hdr->pixdim[i] = vtkNIFTINormalizeDouble(this->PixDim[i]);
-    }
+  }
   hdr->intent_p1 = vtkNIFTINormalizeDouble(this->IntentP1);
   hdr->intent_p2 = vtkNIFTINormalizeDouble(this->IntentP2);
   hdr->intent_p3 = vtkNIFTINormalizeDouble(this->IntentP3);
@@ -289,8 +292,10 @@ void vtkNIFTIHeader::GetHeader(nifti_2_header *hdr)
   hdr->toffset = vtkNIFTINormalizeDouble(this->TOffset);
   hdr->slice_start = this->SliceStart;
   hdr->slice_end = this->SliceEnd;
-  strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip));
-  strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file));
+  strncpy(hdr->descrip, this->Descrip, sizeof(hdr->descrip) - 1);
+  hdr->descrip[sizeof(hdr->descrip) - 1] = '\0';
+  strncpy(hdr->aux_file, this->AuxFile, sizeof(hdr->aux_file) - 1);
+  hdr->aux_file[sizeof(hdr->aux_file) - 1] = '\0';
   hdr->qform_code = static_cast<short>(this->QFormCode);
   hdr->sform_code = static_cast<short>(this->SFormCode);
   hdr->quatern_b = vtkNIFTINormalizeDouble(this->QuaternB);
@@ -300,15 +305,16 @@ void vtkNIFTIHeader::GetHeader(nifti_2_header *hdr)
   hdr->qoffset_y = vtkNIFTINormalizeDouble(this->QOffsetY);
   hdr->qoffset_z = vtkNIFTINormalizeDouble(this->QOffsetZ);
   for (int i = 0; i < 4; i++)
-    {
+  {
     hdr->srow_x[i] = vtkNIFTINormalizeDouble(this->SRowX[i]);
     hdr->srow_y[i] = vtkNIFTINormalizeDouble(this->SRowY[i]);
     hdr->srow_z[i] = vtkNIFTINormalizeDouble(this->SRowZ[i]);
-    }
+  }
   hdr->slice_code = this->SliceCode;
   hdr->xyzt_units = this->XYZTUnits;
   hdr->intent_code = static_cast<short>(this->IntentCode);
-  strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name));
+  strncpy(hdr->intent_name, this->IntentName, sizeof(hdr->intent_name) - 1);
+  hdr->intent_name[sizeof(hdr->intent_name) - 1] = '\0';
   hdr->dim_info = static_cast<char>(this->DimInfo);
   memset(hdr->unused_str, '\0', 15);
 }
@@ -317,15 +323,15 @@ void vtkNIFTIHeader::GetHeader(nifti_2_header *hdr)
 void vtkNIFTIHeader::DeepCopy(vtkNIFTIHeader *o)
 {
   if (o)
-    {
+  {
     nifti_2_header hdr;
     o->GetHeader(&hdr);
     this->SetHeader(&hdr);
-    }
+  }
   else
-    {
+  {
     this->Initialize();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -338,15 +344,15 @@ void vtkNIFTIHeader::PrintSelf(ostream& os, vtkIndent indent)
   os.unsetf(std::ios::hex);
   os << indent << "Dim:";
   for (int i = 0; i < 8; i++)
-    {
+  {
     os << " " << this->Dim[i];
-    }
+  }
   os << indent << "\n";
   os << indent << "PixDim:";
   for (int i = 0; i < 8; i++)
-    {
+  {
     os << " " << this->PixDim[i];
-    }
+  }
   os << indent << "\n";
   os << indent << "VoxOffset:" << this->VoxOffset << "\n";
   os << indent << "IntentP1: " << this->IntentP1 << "\n";
@@ -369,15 +375,15 @@ void vtkNIFTIHeader::PrintSelf(ostream& os, vtkIndent indent)
   os << indent << "TOffset: " << this->TOffset << "\n";
   os << indent << "Descrip: \"";
   for (size_t j = 0; j < 80 && this->Descrip[j] != '\0'; j++)
-    {
+  {
     os << (isprint(this->Descrip[j]) ? this->Descrip[j] : '?');
-    }
+  }
   os << "\"\n";
   os << indent << "AuxFile: \"";
   for (size_t j = 0; j < 24 && this->AuxFile[j] != '\0'; j++)
-    {
+  {
     os << (isprint(this->AuxFile[j]) ? this->AuxFile[j] : '?');
-    }
+  }
   os << "\"\n";
   os << indent << "QFormCode: " << this->QFormCode << "\n";
   os << indent << "SFormCode: " << this->SFormCode << "\n";
@@ -389,33 +395,33 @@ void vtkNIFTIHeader::PrintSelf(ostream& os, vtkIndent indent)
   os << indent << "QOffsetZ: " << this->QOffsetZ << "\n";
   os << indent << "SRowX:";
   for (int i = 0; i < 4; i++)
-    {
+  {
     os << " " << this->SRowX[i];
-    }
+  }
   os << "\n";
   os << indent << "SRowY:";
   for (int i = 0; i < 4; i++)
-    {
+  {
     os << " " << this->SRowY[i];
-    }
+  }
   os << "\n";
   os << indent << "SRowZ:";
   for (int i = 0; i < 4; i++)
-    {
+  {
     os << " " << this->SRowZ[i];
-    }
+  }
   os << "\n";
   os << indent << "IntentName: \"";
   for (size_t j = 0; j < 16 && this->IntentName[j] != '\0'; j++)
-    {
+  {
     os << (isprint(this->IntentName[j]) ? this->IntentName[j] : '?');
-    }
+  }
   os << "\"\n";
   os << indent << "Magic: \"";
   for (size_t j = 0; j < 4 && this->Magic[j] != '\0'; j++)
-    {
+  {
     os << (isprint(this->Magic[j]) ? this->Magic[j] : '?');
-    }
+  }
   os << "\"\n";
 }
 
@@ -423,15 +429,15 @@ void vtkNIFTIHeader::PrintSelf(ostream& os, vtkIndent indent)
 void vtkNIFTIHeader::SetStringValue(char *x, const char *y, size_t n)
 {
   if (y == 0)
-    {
+  {
     y = "";
-    }
+  }
   if (strncmp(x, y, n) != 0)
-    {
+  {
     strncpy(x, y, n);
     x[n] = '\0';
     this->Modified();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
diff --git a/Source/vtkNIFTIHeader.h b/Source/vtkNIFTIHeader.h
index d0d5493..adb7e8a 100644
--- a/Source/vtkNIFTIHeader.h
+++ b/Source/vtkNIFTIHeader.h
@@ -12,23 +12,25 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkNIFTIHeader - Store NIfTI header information.
-// .SECTION Description
-// This class stores the header of a NIfTI file in a VTK-friendly format.
-// By using this class, it is possible to specify the header information
-// that will be stored in a file written by the vtkNIFTIWriter.  Note
-// that the SForm and QForm orientation information in this class will be
-// ignored by the writer if an SForm and QForm have been explicitly set
-// via the writer's SetSForm and SetQForm methods.  Also note that all
-// info like Dim, PixDim, DataType, etc. will be ignored by the writer
-// because this information must instead be taken from the vtkImageData
-// information.  Finally, note that the vtkNIFTIWriter will ignore the
-// Descrip field, since it has its own SetDescription method.
-// .SECTION Thanks
-// This class was contributed to VTK by the Calgary Image Processing and
-// Analysis Centre (CIPAC).
-// .SECTION See Also
-// vtkNIFTIReader, vtkNIFTIWriter
+/*! \class vtkNIFTIHeader
+ *  \brief Store NIfTI header information.
+ *
+ *  This class stores the header of a NIfTI file in a VTK-friendly format.
+ *  By using this class, it is possible to specify the header information
+ *  that will be stored in a file written by the vtkNIFTIWriter.  Note
+ *  that the SForm and QForm orientation information in this class will be
+ *  ignored by the writer if an SForm and QForm have been explicitly set
+ *  via the writer's SetSForm and SetQForm methods.  Also note that all
+ *  info like Dim, PixDim, DataType, etc. will be ignored by the writer
+ *  because this information must instead be taken from the vtkImageData
+ *  information.  Finally, note that the vtkNIFTIWriter will ignore the
+ *  Descrip field, since it has its own SetDescription method.
+ *
+ *  This class was contributed to VTK by the Calgary Image Processing and
+ *  Analysis Centre (CIPAC).
+ *
+ *  \sa vtkNIFTIReader, vtkNIFTIWriter
+ */
 
 #ifndef vtkNIFTIHeader_h
 #define vtkNIFTIHeader_h
@@ -44,8 +46,7 @@ class VTKDICOM_EXPORT vtkNIFTIHeader : public vtkObject
 {
 public:
 
-  // Description:
-  // NIFTI intent codes.
+  //! NIFTI intent codes.
   enum IntentCodeEnum {
     IntentNone = 0,
     IntentCorrel = 2,
@@ -89,8 +90,7 @@ public:
     IntentShape = 2005
   };
 
-  // Description:
-  // NIFTI transform codes.
+  //! NIFTI transform codes.
   enum XFormCodeEnum {
     XFormUnkown = 0,
     XFormScannerAnat = 1,
@@ -99,8 +99,7 @@ public:
     XFormMNI152 = 4
   };
 
-  // Description:
-  // NIFTI slice codes.
+  //! NIFTI slice codes.
   enum SliceCodeEnum {
     SliceUnknown = 0,
     SliceSeqInc = 1,
@@ -111,8 +110,7 @@ public:
     SliceAltDec2 = 6
   };
 
-  // Description:
-  // NIFTI unit codes.
+  //! NIFTI unit codes.
   enum UnitsXYZTEnum {
     UnitsUnknown = 0,
     UnitsMeter = 1,
@@ -128,11 +126,12 @@ public:
     UnitsTime = 56
   };
 
-  // Description:
-  // NIFTI data types.
-  // Types RGB24 and RGB32 are represented in VTK as a multi-component
-  // unsigned char image.  Complex values are represented as two-component
-  // images.  The NIFTI types Float128 and Complex256 are not supported.
+  //! NIFTI data types.
+  /*!
+   *  Types RGB24 and RGB32 are represented in VTK as a multi-component
+   *  unsigned char image.  Complex values are represented as two-component
+   *  images.  The NIFTI types Float128 and Complex256 are not supported.
+   */
   enum DataTypeEnum {
     TypeUInt8 = 2,
     TypeInt16 = 4,
@@ -152,145 +151,168 @@ public:
     TypeRGBA32 = 2304
   };
 
-  // Description:
-  // NIFTI header sizes.
+  //! NIFTI header sizes.
   enum HeaderSizeEnum {
     Nifti1HeaderSize = 348,
     Nifti2HeaderSize = 540
   };
 
-  // Description:
-  // Static method for construction.
+  //! Static method for construction.
   static vtkNIFTIHeader *New();
   vtkTypeMacro(vtkNIFTIHeader, vtkObject);
 
-  // Description:
-  // Print information about this object.
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Get the magic number for the NIFTI file as a null-terminated string.
+  //@{
+  //! Get the magic number for the NIFTI file as a null-terminated string.
   const char *GetMagic() { return this->Magic; }
 
-  // Description:
-  // Get the offset to the pixel data within the file.
+  //! Get the offset to the pixel data within the file.
   vtkTypeInt64 GetVoxOffset() { return this->VoxOffset; }
 
-  // Description:
-  // Get the data type.
+  //! Get the data type.
   int GetDataType() { return this->DataType; }
 
-  // Description:
-  // Get the number of bits per pixel.
+  //! Get the number of bits per pixel.
   int GetBitPix() { return this->BitPix; }
+  //@}
 
-  // Description:
-  // Get the nth dimension of the data, where GetDim(0) returns the
-  // number of dimensions that are defined for the file.
+  //@{
+  //! Get the nth dimension of the data, where 1 is first dimension.
+  /*!
+   *  GetDim(0) returns the number of dimensions that are defined for the file.
+   */
   vtkTypeInt64 GetDim(int i) {
     return (i < 0 || i > 7 ? 0 : this->Dim[i]); }
 
-  // Description:
-  // Get the sample spacing in the nth dimension. If GetPixDim(0) is
-  // negative, then the quaternion for the qform describes the correct
-  // orientation only after the slice ordering has been reversed.
+  //! Get the sample spacing in the nth dimension, 1 is first dimension.
+  /*!
+   *  If GetPixDim(0) is negative, then the quaternion for the qform describes
+   *  the correct orientation only after the slice ordering has been reversed.
+   */
   double GetPixDim(int i) {
     return (i < 0 || i > 7 ? 0.0 : this->PixDim[i]); }
-
-  // Description:
-  // Get the NIFTI intent code.  This is an enumerated value in the NIFTI
-  // header that states what the data is intended to be used for.
+  //@}
+
+  //@{
+  //! Get the NIFTI intent code.
+  /*!
+   * This is an enumerated value in the NIFTI header that states what the
+   * data is intended to be used for.
+   */
   vtkSetMacro(IntentCode, int);
   int GetIntentCode() { return this->IntentCode; }
+  //@}
 
-  // Description:
-  // Get the intent name.  This should match the intent code.
+  //@{
+  //! Get the intent name.  This should match the intent code.
   void SetIntentName(const char *name);
   const char *GetIntentName() { return this->IntentName; }
+  //@}
 
-  // Description:
-  // Get one of the NIFTI intent parameters.  The definition of these
-  // parameters varies according to the IntentCode.
+  //@{
+  //! Get one of the NIFTI intent parameters.
+  /*!
+   *  The definition of these parameters varies according to the IntentCode.
+   */
   vtkSetMacro(IntentP1, double);
   double GetIntentP1() { return this->IntentP1; }
   vtkSetMacro(IntentP2, double);
   double GetIntentP2() { return this->IntentP2; }
   vtkSetMacro(IntentP3, double);
   double GetIntentP3() { return this->IntentP3; }
+  //@}
 
-  // Description:
-  // Get the scale and slope to apply to the data in order to get
-  // the real-valued data values.
+  //@{
+  //! Get the scale and slope to apply to get real-valued data.
   vtkSetMacro(SclSlope, double);
   double GetSclSlope() { return this->SclSlope; }
   vtkSetMacro(SclInter, double);
   double GetSclInter() { return this->SclInter; }
+  //@}
 
-  // Description:
-  // Get the calibrated range of the data, i.e. the values stored in the
-  // cal_min and cal_max fields in the header.
+  //@{
+  //! Get the calibrated range (cal_min, cal_max) of the data.
   vtkSetMacro(CalMin, double);
   double GetCalMin() { return this->CalMin; }
   vtkSetMacro(CalMax, double);
   double GetCalMax() { return this->CalMax; }
+  //@}
 
-  // Description:
-  // Get the slice_duration and toffset from the header.
+  //@{
+  //! Get the slice_duration and toffset from the header.
   vtkSetMacro(SliceDuration, double);
   double GetSliceDuration() { return this->SliceDuration; }
   vtkSetMacro(TOffset, double);
   double GetTOffset() { return this->TOffset; }
+  //@}
 
-  // Description:
-  // Get the slice range for the data.
+  //@{
+  //! Get the slice range for the data.
   vtkSetMacro(SliceStart, vtkTypeInt64);
   vtkTypeInt64 GetSliceStart() { return this->SliceStart; }
   vtkSetMacro(SliceEnd, vtkTypeInt64);
   vtkTypeInt64 GetSliceEnd() { return this->SliceEnd; }
+  //@}
 
-  // Description:
-  // Get the slice code for the data.
+  //@{
+  //! Get the slice code for the data.
   vtkSetMacro(SliceCode, int);
   int GetSliceCode() { return this->SliceCode; }
+  //@}
 
-  // Description:
-  // Get a bitfield that describes the units for the first 4 dims.
+  //@{
+  //! Get a bitfield that describes the units for the first 4 dims.
   vtkSetMacro(XYZTUnits, int);
   int GetXYZTUnits() { return this->XYZTUnits; }
-
-  // Description:
-  // Get a bitfield with extra information about the dimensions, it
-  // states which dimensions are the phase encode, frequency encode,
-  // and slice encode dimensions for MRI acquisitions.
+  //@}
+
+  //@{
+  //! Get a bitfield with extra information about the dimensions, it
+  /*!
+   *  states which dimensions are the phase encode, frequency encode,
+   *  and slice encode dimensions for MRI acquisitions.
+   */
   vtkSetMacro(DimInfo, int);
   int GetDimInfo() { return this->DimInfo; }
-
-  // Description:
-  // Get a null-terminated file descriptor, this usually gives the
-  // name of the software that wrote the file. It will have a maximum
-  // length of 80 characters.
+  //@}
+
+  //@{
+  //! Get a null-terminated file descriptor, this usually gives the
+  /*!
+   *  name of the software that wrote the file. It will have a maximum
+   *  length of 80 characters.
+   */
   void SetDescrip(const char *descrip);
   const char *GetDescrip() { return this->Descrip; }
-
-  // Description:
-  // Get an auxiliary file, e.g. a color table, that is associated
-  // with this data.  The length of the filename must be a maximum of
-  // 24 characters, and it will be assumed to be in the same directory
-  // as the NIFTI file.
+  //@}
+
+  //@{
+  //! Get an auxiliary file, e.g. a color table, that is associated
+  /*!
+   *  with this data.  The length of the filename must be a maximum of
+   *  24 characters, and it will be assumed to be in the same directory
+   *  as the NIFTI file.
+   */
   void SetAuxFile(const char *auxfile);
   const char *GetAuxFile() { return this->AuxFile; }
+  //@}
 
-  // Description:
-  // Get the QForm or SForm code.
+  //@{
+  //! Get the QForm or SForm code.
   vtkSetMacro(QFormCode, int);
   int GetQFormCode() { return this->QFormCode; }
   vtkSetMacro(SFormCode, int);
   int GetSFormCode() { return this->SFormCode; }
-
-  // Description:
-  // Get information about the quaternion transformation.  Note that
-  // the vtkNIFTIWriter ignores this part of the header if a quaternion
-  // has been set via vtkNIFTIWriter::SetQFormMatrix().
+  //@}
+
+  //@{
+  //! Get information about the quaternion transformation.  Note that
+  /*!
+   *  Note that the vtkNIFTIWriter ignores this part of the header if a
+   *  quaternion has been set via vtkNIFTIWriter::SetQFormMatrix().
+   */
   vtkSetMacro(QuaternB, double);
   double GetQuaternB() { return this->QuaternB; }
   vtkSetMacro(QuaternC, double);
@@ -303,33 +325,39 @@ public:
   double GetQOffsetY() { return this->QOffsetY; }
   vtkSetMacro(QOffsetZ, double);
   double GetQOffsetZ() { return this->QOffsetZ; }
-
-  // Description:
-  // Get information about the matrix transformation.  Note that
-  // the vtkNIFTIWriter ignores this part of the header if a matrix
-  // has been set via vtkNIFTIWriter::SetSFormMatrix().
+  //@}
+
+  //@{
+  //! Get information about the matrix transformation.
+  /*!
+   *  Note that the vtkNIFTIWriter ignores this part of the header if a
+   *  matrix has been set via vtkNIFTIWriter::SetSFormMatrix().
+   */
   vtkSetVector4Macro(SRowX, double);
   vtkGetVector4Macro(SRowX, double);
   vtkSetVector4Macro(SRowY, double);
   vtkGetVector4Macro(SRowY, double);
   vtkSetVector4Macro(SRowZ, double);
   vtkGetVector4Macro(SRowZ, double);
+  //@}
 
-  // Description:
-  // Initialize the header to default values.
+  //@{
+  //! Initialize the header to default values.
   void Initialize();
+  //@}
 
-  // Description:
-  // Make a copy of the header.
+  //@{
+  //! Make a copy of the header.
   void DeepCopy(vtkNIFTIHeader *o);
+  //@}
 
-  // Description:
-  // Set the values from an existing nifti struct, or store
-  // the values in an existing nifti struct.
+  //@{
+  //! Set the values from an existing nifti struct, or vice-versa.
   void SetHeader(const nifti_1_header *hdr);
   void GetHeader(nifti_1_header *hdr);
   void SetHeader(const nifti_2_header *hdr);
   void GetHeader(nifti_2_header *hdr);
+  //@}
 
 protected:
   vtkNIFTIHeader();
@@ -374,8 +402,8 @@ protected:
   void SetStringValue(char *x, const char *y, size_t n);
 
 private:
-  vtkNIFTIHeader(const vtkNIFTIHeader&);  // Not implemented.
-  void operator=(const vtkNIFTIHeader&);  // Not implemented.
+  vtkNIFTIHeader(const vtkNIFTIHeader&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkNIFTIHeader&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkNIFTIHeader_h
diff --git a/Source/vtkNIFTIReader.cxx b/Source/vtkNIFTIReader.cxx
index 5224d37..2554e4e 100644
--- a/Source/vtkNIFTIReader.cxx
+++ b/Source/vtkNIFTIReader.cxx
@@ -29,7 +29,11 @@
 #include "vtkStringArray.h"
 #include "vtkVersion.h"
 
-#include "vtksys/SystemTools.hxx"
+#ifdef _WIN32
+// To allow use of wchar_t paths on Windows
+#include "vtkDICOMFilePath.h"
+#endif
+#include "vtkDICOMFile.h"
 
 // Header for NIFTI
 #include "vtkNIFTIHeader.h"
@@ -47,19 +51,30 @@
 #include <string.h>
 #include <string>
 
+#ifdef _WIN32
+// To allow use of wchar_t paths on Windows
+#include "vtkDICOMFilePath.h"
+#if VTK_MAJOR_VERSION >= 7
+#ifdef gzopen
+#undef gzopen
+#endif
+#define gzopen gzopen_w
+#endif
+#endif
+
 vtkStandardNewMacro(vtkNIFTIReader);
 
 //----------------------------------------------------------------------------
 vtkNIFTIReader::vtkNIFTIReader()
 {
   for (int i = 0; i < 8; i++)
-    {
+  {
     this->Dim[i] = 0;
-    }
+  }
   for (int i = 0; i < 8; i++)
-    {
+  {
     this->PixDim[i] = 1.0;
-    }
+  }
   this->TimeAsVector = 0;
   this->RescaleSlope = 1.0;
   this->RescaleIntercept = 0.0;
@@ -74,17 +89,17 @@ vtkNIFTIReader::vtkNIFTIReader()
 vtkNIFTIReader::~vtkNIFTIReader()
 {
   if (this->QFormMatrix)
-    {
+  {
     this->QFormMatrix->Delete();
-    }
+  }
   if (this->SFormMatrix)
-    {
+  {
     this->SFormMatrix->Delete();
-    }
+  }
   if (this->NIFTIHeader)
-    {
+  {
     this->NIFTIHeader->Delete();
-    }
+  }
 }
 
 //----------------------------------------------------------------------------
@@ -119,7 +134,7 @@ void vtkNIFTIReaderSwapHeader(nifti_1_header *hdr)
   // All NIFTI-specific (meaning is totally different in Analyze 7.5)
   if (strncmp(hdr->magic, "ni1", 4) == 0 ||
       strncmp(hdr->magic, "n+1", 4) == 0)
-    {
+  {
     vtkByteSwap::SwapVoidRange(&hdr->qform_code,    1, 2);
     vtkByteSwap::SwapVoidRange(&hdr->sform_code,    1, 2);
     vtkByteSwap::SwapVoidRange(&hdr->quatern_b,     1, 4);
@@ -131,7 +146,7 @@ void vtkNIFTIReaderSwapHeader(nifti_1_header *hdr)
     vtkByteSwap::SwapVoidRange(hdr->srow_x,         4, 4);
     vtkByteSwap::SwapVoidRange(hdr->srow_y,         4, 4);
     vtkByteSwap::SwapVoidRange(hdr->srow_z,         4, 4);
-    }
+  }
 }
 
 void vtkNIFTIReaderSwapHeader(nifti_2_header *hdr)
@@ -175,9 +190,9 @@ void vtkNIFTIReaderSwapHeader(nifti_2_header *hdr)
 vtkNIFTIHeader *vtkNIFTIReader::GetNIFTIHeader()
 {
   if (!this->NIFTIHeader)
-    {
+  {
     this->NIFTIHeader = vtkNIFTIHeader::New();
-    }
+  }
   return this->NIFTIHeader;
 }
 
@@ -196,35 +211,35 @@ void vtkNIFTIReader::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "QFormMatrix:";
   if (this->QFormMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->QFormMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "SFormMatrix:";
   if (this->SFormMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->SFormMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-     }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "NIFTIHeader:" << (this->NIFTIHeader ? "\n" : " (none)\n");
   os << indent << "PlanarRGB: " << (this->PlanarRGB ? "On\n" : "Off\n");
@@ -235,22 +250,22 @@ bool vtkNIFTIReader::CheckExtension(
   const char *filename, const char *ext)
 {
   if (strlen(ext) == 4 && ext[0] == '.')
-    {
+  {
     size_t n = strlen(filename);
     if (n > 2 && filename[n-3] == '.' &&
         tolower(filename[n-2]) == 'g' &&
         tolower(filename[n-1]) == 'z')
-      {
+    {
       n -= 3;
-      }
+    }
     if (n > 3 && filename[n-4] == '.' &&
         tolower(filename[n-3]) == tolower(ext[1]) &&
         tolower(filename[n-2]) == tolower(ext[2]) &&
         tolower(filename[n-1]) == tolower(ext[3]))
-      {
+    {
       return true;
-      }
     }
+  }
   return false;
 }
 
@@ -262,7 +277,7 @@ char *vtkNIFTIReader::ReplaceExtension(
 
   if (strlen(ext1) == 4 && ext1[0] == '.' &&
       strlen(ext2) == 4 && ext2[0] == '.')
-    {
+  {
     size_t n = strlen(filename);
     size_t m = n;
     newname = new char[n+4];
@@ -272,56 +287,57 @@ char *vtkNIFTIReader::ReplaceExtension(
     if (n > 2 && filename[n-3] == '.' &&
         tolower(filename[n-2]) == 'g' &&
         tolower(filename[n-1]) == 'z')
-      {
+    {
       m = n - 3;
-      }
+    }
 
     if (vtkNIFTIReader::CheckExtension(filename, ext1))
-      {
+    {
       // replace the extension
       if (isupper(filename[m-3]))
-        {
+      {
         newname[m-3] = toupper(ext2[1]);
         newname[m-2] = toupper(ext2[2]);
         newname[m-1] = toupper(ext2[3]);
-        }
+      }
       else
-        {
+      {
         newname[m-3] = tolower(ext2[1]);
         newname[m-2] = tolower(ext2[2]);
         newname[m-1] = tolower(ext2[3]);
-        }
       }
+    }
 
     // existence of file
     for (int i = 0; i < 2; i++)
+    {
+      int code = vtkDICOMFile::Access(newname, vtkDICOMFile::In);
+      if (code != vtkDICOMFile::FileNotFound)
       {
-      if (vtksys::SystemTools::FileExists(newname))
-        {
         return newname;
-        }
+      }
       if (i == 0)
-        {
+      {
         if (m < n)
-          {
+        {
           // try again without the ".gz"
           newname[m] = '\0';
           n = m;
-          }
+        }
         else
-          {
+        {
           // try again with the ".gz"
           newname[m] = '.';
           newname[m+1] = (isupper(newname[m-3]) ? 'G' : 'g');
           newname[m+2] = (isupper(newname[m-3]) ? 'Z' : 'z');
           newname[m+3] = '\0';
-          }
         }
       }
+    }
 
     delete [] newname;
     newname = 0;
-    }
+  }
 
   return newname;
 }
@@ -337,26 +353,26 @@ int vtkNIFTIReader::CheckNIFTIVersion(const nifti_1_header *hdr)
       (hdr->data_type[1] == '+' || hdr->data_type[1] == 'i') &&
       (hdr->data_type[2] >= '2' && hdr->data_type[2] <= '9') &&
       hdr->data_type[3] == '\0')
-    {
+  {
     version = (hdr->data_type[2] - '0');
 
     if (hdr->data_type[4] != '\r' ||
         hdr->data_type[5] != '\n' ||
         hdr->data_type[6] != '\032' ||
         hdr->data_type[7] != '\n')
-      {
+    {
       // Indicate that file was corrupted by newline conversion
       version = -version;
-      }
     }
+  }
   // Check for NIFTIv1
   else if (hdr->magic[0] == 'n' &&
       (hdr->magic[1] == '+' || hdr->magic[1] == 'i') &&
       hdr->magic[2] == '1' &&
       hdr->magic[3] == '\0')
-    {
+  {
     version = 1;
-    }
+  }
 
   return version;
 }
@@ -366,9 +382,9 @@ bool vtkNIFTIReader::CheckAnalyzeHeader(const nifti_1_header *hdr)
 {
   if (hdr->sizeof_hdr == 348 || // Analyze 7.5 header size
       hdr->sizeof_hdr == 1543569408) // byte-swapped 348
-    {
+  {
     return true;
-    }
+  }
   return false;
 }
 
@@ -381,19 +397,33 @@ int vtkNIFTIReader::CanReadFile(const char *filename)
     filename, ".img", ".hdr");
 
   if (hdrname == 0)
-    {
+  {
     return 0;
-    }
+  }
+
+#if _WIN32
+  vtkDICOMFilePath fp(hdrname);
+#if VTK_MAJOR_VERSION < 7
+  // convert to the local character set
+  const char *uhdrname = fp.Local();
+#else
+  // use wide character
+  const wchar_t *uhdrname = fp.Wide();
+  fprintf(stderr, "uhdrname\n");
+#endif
+#else
+  const char *uhdrname = hdrname;
+#endif
 
   // try opening file
-  gzFile file = gzopen(hdrname, "rb");
+  gzFile file = gzopen(uhdrname, "rb");
 
   delete [] hdrname;
 
   if (!file)
-    {
+  {
     return 0;
-    }
+  }
 
   // read and check the header
   bool canRead = false;
@@ -401,19 +431,19 @@ int vtkNIFTIReader::CanReadFile(const char *filename)
   int hsize = vtkNIFTIHeader::Nifti1HeaderSize; // nifti_1 header size
   int rsize = gzread(file, &hdr, hsize);
   if (rsize == hsize)
-    {
+  {
     int version = vtkNIFTIReader::CheckNIFTIVersion(&hdr);
     if (version > 0)
-      {
+    {
       // NIFTI file
       canRead = true;
-      }
+    }
     else if (version == 0)
-      {
+    {
       // Analyze 7.5 file
       canRead = vtkNIFTIReader::CheckAnalyzeHeader(&hdr);
-      }
     }
+  }
 
   gzclose(file);
 
@@ -431,9 +461,9 @@ int vtkNIFTIReader::RequestInformation(
 
   // Create the header object
   if (!this->NIFTIHeader)
-    {
+  {
     this->NIFTIHeader = vtkNIFTIHeader::New();
-    }
+  }
 
   // default byte order is native byte order
 #ifdef VTK_WORDS_BIGENDIAN
@@ -447,63 +477,80 @@ int vtkNIFTIReader::RequestInformation(
   char *hdrname = 0;
 
   if (this->FileNames)
-    {
+  {
     vtkIdType n = this->FileNames->GetNumberOfValues();
     int headers = 0;
     for (int i = 0; i < 2; i++)
-      {
+    {
       filename = this->FileNames->GetValue(i);
       // this checks for .hdr and .hdr.gz, case insensitive
       if (vtkNIFTIReader::CheckExtension(filename, ".hdr"))
-        {
+      {
         headers++;
         hdrname = new char[strlen(filename) + 1];
         strcpy(hdrname, filename);
-        }
       }
+    }
     if (n != 2 || headers != 1)
-      {
+    {
       vtkErrorMacro("There must be two files and one must be a .hdr file.");
       return 0;
-      }
     }
+  }
   else
-    {
+  {
     filename = this->GetFileName();
-    }
+  }
 
   if (filename == 0)
-    {
+  {
     vtkErrorMacro("A FileName must be provided");
     this->SetErrorCode(vtkErrorCode::NoFileNameError);
     return 0;
-    }
+  }
 
   if (hdrname == 0)
-    {
+  {
     hdrname = vtkNIFTIReader::ReplaceExtension(
       filename, ".img", ".hdr");
-    }
+  }
 
   if (hdrname == 0)
-    {
+  {
     vtkErrorMacro("Unable to locate header for file " << filename);
     this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
     return 0;
-    }
+  }
 
   vtkDebugMacro("Opening NIFTI file " << hdrname);
 
+#if _WIN32
+  vtkDICOMFilePath fph(hdrname);
+#if VTK_MAJOR_VERSION < 7
+  // convert to the local character set
+  const char *uhdrname = fph.Local();
+#else
+  // use wide character
+  const wchar_t *uhdrname = fph.Wide();
+#endif
+#else
+  const char *uhdrname = hdrname;
+#endif
+
   // try opening file
-  gzFile file = gzopen(hdrname, "rb");
+  gzFile file = 0;
+  if (uhdrname)
+  {
+    file = gzopen(uhdrname, "rb");
+  }
 
   if (!file)
-    {
+  {
     vtkErrorMacro("Cannot open file " << hdrname);
     delete [] hdrname;
     this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
     return 0;
-    }
+  }
 
   // read and check the header
   bool canRead = false;
@@ -514,10 +561,10 @@ int vtkNIFTIReader::RequestInformation(
   const int hsize = vtkNIFTIHeader::Nifti1HeaderSize;
   int rsize = gzread(file, hdr1, hsize);
   if (rsize == hsize)
-    {
+  {
     niftiVersion = vtkNIFTIReader::CheckNIFTIVersion(hdr1);
     if (niftiVersion >= 2)
-      {
+    {
       // the header was a NIFTIv2 header
       const int h2size = vtkNIFTIHeader::Nifti2HeaderSize;
       // copy what was read into the NIFTIv1 header
@@ -525,45 +572,45 @@ int vtkNIFTIReader::RequestInformation(
       // read the remainder of the NIFTIv2 header
       rsize = gzread(file, reinterpret_cast<char *>(hdr2)+hsize, h2size-hsize);
       if (rsize == h2size-hsize)
-        {
+      {
         canRead = true;
-        }
       }
+    }
     else if (niftiVersion == 1)
-      {
+    {
       // the header was a NIFTIv1 header
       canRead = true;
-      }
+    }
     else if (niftiVersion == 0)
-      {
+    {
       // Analyze 7.5 file
       canRead = vtkNIFTIReader::CheckAnalyzeHeader(hdr1);
-      }
     }
+  }
 
   if (canRead)
-    {
+  {
     if (niftiVersion >= 2)
-      {
+    {
       if (NIFTI_NEEDS_SWAP(*hdr2))
-        {
+      {
         vtkNIFTIReaderSwapHeader(hdr2);
         isLittleEndian = !isLittleEndian;
-        }
-      this->NIFTIHeader->SetHeader(hdr2);
       }
+      this->NIFTIHeader->SetHeader(hdr2);
+    }
     else
-      {
+    {
       if (NIFTI_NEEDS_SWAP(*hdr1))
-        {
+      {
         vtkNIFTIReaderSwapHeader(hdr1);
         isLittleEndian = !isLittleEndian;
-        }
+      }
       // convert NIFTIv1 header into NIFTIv2
       this->NIFTIHeader->SetHeader(hdr1);
       this->NIFTIHeader->GetHeader(hdr2);
-      }
     }
+  }
 
   gzclose(file);
 
@@ -572,7 +619,7 @@ int vtkNIFTIReader::RequestInformation(
   hdr1 = 0;
 
   if (!canRead)
-    {
+  {
     const char *message = (niftiVersion <= -2 ?
                            "NIfTI header has newline corruption " :
                            "Bad NIfTI header in file ");
@@ -580,72 +627,72 @@ int vtkNIFTIReader::RequestInformation(
     this->SetErrorCode(vtkErrorCode::UnrecognizedFileTypeError);
     delete [] hdrname;
     return 0;
-    }
+  }
 
   delete [] hdrname;
 
   // number of dimensions
   int ndim = hdr2->dim[0];
   if (ndim < 0 || ndim > 7)
-    {
+  {
     vtkErrorMacro("NIfTI image has illegal ndim of " << ndim);
     this->SetErrorCode(vtkErrorCode::FileFormatError);
     return 0;
-    }
+  }
 
   // sanity checks
   for (int i = 0; i < 8; i++)
-    {
+  {
     // voxel spacing cannot be zero
     if (hdr2->pixdim[i] == 0)
-      {
+    {
       hdr2->pixdim[i] = 1.0;
-      }
+    }
     if (i > ndim)
-      {
+    {
       // dimensions greater than ndim have size of 1
       hdr2->dim[i] = 1;
-      }
+    }
     else if (hdr2->dim[i] < 0)
-      {
+    {
       vtkErrorMacro("NIfTI image dimension " << i << " is negative");
       this->SetErrorCode(vtkErrorCode::FileFormatError);
       return 0;
-      }
+    }
     else if ((hdr2->dim[i] & 0x7fffffff) != hdr2->dim[i])
-      {
+    {
       // dimension does not fit in signed int
       vtkErrorMacro("NIfTI image dimension " << i << " is larger than int32");
       this->SetErrorCode(vtkErrorCode::FileFormatError);
       return 0;
-      }
     }
+  }
 
   if (niftiVersion > 0)
-    {
+  {
     // pass rescale info to user (do not rescale in the reader)
     this->RescaleSlope = hdr2->scl_slope;
     this->RescaleIntercept = hdr2->scl_inter;
-    }
+  }
   else
-    {
+  {
     // rescale information not available for Analyze 7.5
     this->RescaleSlope = 1.0;
     this->RescaleIntercept = 0.0;
-    }
+  }
 
   // header might be extended, vox_offset says where data starts
   this->SetHeaderSize(static_cast<unsigned long>(hdr2->vox_offset));
 
   // endianness of data
   if (isLittleEndian)
-    {
+  {
     this->SetDataByteOrderToLittleEndian();
-    }
+  }
   else
-    {
+  {
     this->SetDataByteOrderToBigEndian();
-    }
+  }
 
   // NIFTI images are stored in a single file, not one file per slice
   this->SetFileDimensionality(3);
@@ -689,32 +736,32 @@ int vtkNIFTIReader::RequestInformation(
   int numComponents = 0;
 
   for (int i = 0; typeMap[2] != 0; i++)
-    {
+  {
     if (hdr2->datatype == typeMap[i][0])
-      {
+    {
       scalarType = typeMap[i][1];
       numComponents = typeMap[i][2];
       break;
-      }
     }
+  }
 
   // if loop finished without finding a match
   if (numComponents == 0)
-    {
+  {
     vtkErrorMacro("Unrecognized NIFTI data type: " << hdr2->datatype);
     this->SetErrorCode(vtkErrorCode::FileFormatError);
     return 0;
-    }
+  }
 
   // vector planes become vector components
   if (ndim >= 5)
-    {
+  {
     numComponents *= hdr2->dim[5];
-    }
+  }
   if (ndim >= 4 && this->TimeAsVector)
-    {
+  {
     numComponents *= hdr2->dim[4];
-    }
+  }
 
   this->SetDataScalarType(scalarType);
   this->SetNumberOfScalarComponents(numComponents);
@@ -732,10 +779,10 @@ int vtkNIFTIReader::RequestInformation(
 
   // copy dim for when RequestData is called
   for (int j = 0; j < 8; j++)
-    {
+  {
     this->Dim[j] = hdr2->dim[j];
     this->PixDim[j] = hdr2->pixdim[j];
-    }
+  }
 
   // === Image Orientation in NIfTI files ===
   //
@@ -895,20 +942,20 @@ int vtkNIFTIReader::RequestInformation(
   // Initialize
   this->QFac = 1.0;
   if (this->QFormMatrix)
-    {
+  {
     this->QFormMatrix->Delete();
     this->QFormMatrix = NULL;
-    }
+  }
   if (this->SFormMatrix)
-    {
+  {
     this->SFormMatrix->Delete();
     this->SFormMatrix = NULL;
-    }
+  }
 
   // Set the QFormMatrix from the quaternion data in the header.
   // See the long discussion above for more information.
   if (niftiVersion > 0 && hdr2->qform_code > 0)
-    {
+  {
     double mmat[16];
     double rmat[3][3];
     double quat[4];
@@ -919,13 +966,13 @@ int vtkNIFTIReader::RequestInformation(
 
     quat[0] = 1.0 - quat[1]*quat[1] - quat[2]*quat[2] - quat[3]*quat[3];
     if (quat[0] > 0.0)
-      {
+    {
       quat[0] = sqrt(quat[0]);
-      }
+    }
     else
-      {
+    {
       quat[0] = 0.0;
-      }
+    }
 
     vtkMath::QuaternionToMatrix3x3(quat, rmat);
 
@@ -934,16 +981,16 @@ int vtkNIFTIReader::RequestInformation(
     // quaternion-to-matrix conversion.
     const double tol = 2.384185791015625e-07; // 2**-22
     for (int i = 0; i < 3; i++)
-      {
+    {
       for (int j = 0; j < 3; j++)
-        {
+      {
         if (fabs(rmat[i][j]) < tol)
-          {
+        {
           rmat[i][j] = 0.0;
-          }
         }
-      vtkMath::Normalize(rmat[i]);
       }
+      vtkMath::Normalize(rmat[i]);
+    }
 
     // first row
     mmat[0] = rmat[0][0];
@@ -971,23 +1018,23 @@ int vtkNIFTIReader::RequestInformation(
     this->QFac = ((hdr2->pixdim[0] < 0) ? -1.0 : 1.0);
 
     if (this->QFac < 0)
-      {
+    {
       // We will be reversing the order of the slices, so the first VTK
       // slice will be at the position of the last NIfTI slice, and we
       // must adjust the offset to compensate for this.
       mmat[3] -= rmat[0][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1);
       mmat[7] -= rmat[1][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1);
       mmat[11] -= rmat[2][2]*hdr2->pixdim[3]*(hdr2->dim[3] - 1);
-      }
+    }
 
     this->QFormMatrix = vtkMatrix4x4::New();
     this->QFormMatrix->DeepCopy(mmat);
-    }
+  }
 
   // Set the SFormMatrix from the matrix information in the header.
   // See the long discussion above for more information.
   if (niftiVersion > 0 && hdr2->sform_code > 0)
-    {
+  {
     double mmat[16];
 
     // first row
@@ -1016,12 +1063,12 @@ int vtkNIFTIReader::RequestInformation(
     // Set QFac to -1 if the determinant is negative, unless QFac
     // has already been set by the qform information.
     if (vtkMatrix4x4::Determinant(mmat) < 0 && hdr2->qform_code == 0)
-      {
+    {
       this->QFac = -1.0;
-      }
+    }
 
     if (this->QFac < 0)
-      {
+    {
       // If QFac is set to -1 then the slices will be reversed, and we must
       // reverse the slice orientation vector (the third column of the matrix)
       // to compensate.
@@ -1035,16 +1082,16 @@ int vtkNIFTIReader::RequestInformation(
       mmat[3] += hdr2->srow_x[2]*(hdr2->dim[3] - 1);
       mmat[7] += hdr2->srow_y[2]*(hdr2->dim[3] - 1);
       mmat[11] += hdr2->srow_z[2]*(hdr2->dim[3] - 1);
-      }
+    }
 
     this->SFormMatrix = vtkMatrix4x4::New();
     this->SFormMatrix->DeepCopy(mmat);
 
     if (this->SFormMatrix->Determinant() < 0)
-      {
+    {
       vtkWarningMacro("SFormMatrix is flipped compared to QFormMatrix");
-      }
     }
+  }
 
   return 1;
 }
@@ -1057,9 +1104,9 @@ int vtkNIFTIReader::RequestData(
 {
   // check whether the reader is in an error state
   if (this->GetErrorCode() != vtkErrorCode::NoError)
-    {
+  {
     return 0;
-    }
+  }
 
   // which output port did the request come from
   int outputPort =
@@ -1067,9 +1114,9 @@ int vtkNIFTIReader::RequestData(
 
   // for now, this reader has only one output
   if (outputPort > 0)
-    {
+  {
     return 1;
-    }
+  }
 
   vtkInformation* outInfo = outputVector->GetInformationObject(0);
 
@@ -1091,50 +1138,50 @@ int vtkNIFTIReader::RequestData(
   char *imgname = 0;
 
   if (this->FileNames)
-    {
+  {
     vtkIdType n = this->FileNames->GetNumberOfValues();
     int headers = 0;
     for (int i = 0; i < 2; i++)
-      {
+    {
       filename = this->FileNames->GetValue(i);
       // this checks for .hdr and .hdr.gz, case insensitive
       if (vtkNIFTIReader::CheckExtension(filename, ".hdr"))
-        {
+      {
         headers++;
-        }
+      }
       else
-        {
+      {
         imgname = new char[strlen(filename) + 1];
         strcpy(imgname, filename);
-        }
       }
+    }
     if (n != 2 || headers != 1)
-      {
+    {
       vtkErrorMacro("There must be two files and one must be a .hdr file.");
       return 0;
-      }
     }
+  }
   else
-    {
+  {
     filename = this->GetFileName();
-    }
+  }
 
   if (filename == 0)
-    {
+  {
     vtkErrorMacro("A FileName must be provided");
     return 0;
-    }
+  }
 
   if (imgname == 0)
-    {
+  {
     imgname = vtkNIFTIReader::ReplaceExtension(filename, ".hdr", ".img");
-    }
+  }
 
   if (imgname == 0)
-    {
+  {
     vtkErrorMacro("Unable to locate image for file " << filename);
     return 0;
-    }
+  }
 
   vtkDebugMacro("Opening NIFTI file " << imgname);
 
@@ -1143,14 +1190,32 @@ int vtkNIFTIReader::RequestData(
   unsigned char *dataPtr =
     static_cast<unsigned char *>(data->GetScalarPointer());
 
-  gzFile file = gzopen(imgname, "rb");
+#if _WIN32
+  vtkDICOMFilePath fpi(imgname);
+#if VTK_MAJOR_VERSION < 7
+  // convert to the local character set
+  const char *uimgname = fpi.Local();
+#else
+  // use wide character
+  const wchar_t *uimgname = fpi.Wide();
+  fprintf(stderr, "uhdrname\n");
+#endif
+#else
+  const char *uimgname = imgname;
+#endif
+
+  gzFile file = 0;
+  if (uimgname)
+  {
+    file = gzopen(uimgname, "rb");
+  }
 
   delete [] imgname;
 
   if (!file)
-    {
+  {
     return 0;
-    }
+  }
 
   // check if planar RGB is applicable (Analyze only)
   bool planarRGB = (this->PlanarRGB &&
@@ -1163,9 +1228,9 @@ int vtkNIFTIReader::RequestData(
   int timeDim = (this->Dim[0] >= 4 ? this->Dim[4] : 1);
   int vectorDim = (this->Dim[0] >= 5 ? this->Dim[5] : 1);
   if (this->TimeAsVector)
-    {
+  {
     vectorDim *= timeDim;
-    }
+  }
 
   int outSizeX = extent[1] - extent[0] + 1;
   int outSizeY = extent[3] - extent[2] + 1;
@@ -1178,50 +1243,50 @@ int vtkNIFTIReader::RequestData(
   z_off_t fileTimeIncr = fileSliceIncr*this->Dim[3];
   z_off_t fileVectorIncr = fileTimeIncr*this->Dim[4];
   if (this->TimeAsVector)
-    {
+  {
     fileVectorIncr = fileTimeIncr;
-    }
+  }
 
   // planar RGB requires different increments
   int planarSize = 1; // if > 1, indicates planar RGB
   if (planarRGB)
-    {
+  {
     planarSize = numComponents/vectorDim;
     fileVoxelIncr = scalarSize;
     fileRowIncr = fileVoxelIncr*this->Dim[1];
     filePlaneIncr = fileRowIncr*this->Dim[2];
-    }
+  }
 
   // add a buffer for planar-vector to packed-vector conversion
   unsigned char *rowBuffer = 0;
   if (vectorDim > 1 || planarRGB)
-    {
+  {
     rowBuffer = new unsigned char[outSizeX*fileVoxelIncr];
-    }
+  }
 
   // special increment to reverse the slices if needed
   vtkIdType sliceOffset = 0;
 
   if (this->GetQFac() < 0)
-    {
+  {
     // put slices in reverse order
     sliceOffset = scalarSize*numComponents;
     sliceOffset *= outSizeX;
     sliceOffset *= outSizeY;
     dataPtr += sliceOffset*(outSizeZ - 1);
-    }
+  }
 
   // special increment to handle planar RGB
   vtkIdType planarOffset = 0;
   vtkIdType planarEndOffset = 0;
   if (planarRGB)
-    {
+  {
     planarOffset = scalarSize*numComponents;
     planarOffset *= outSizeX;
     planarOffset *= outSizeY;
     planarOffset -= scalarSize;
     planarEndOffset = planarOffset - scalarSize*(planarSize - 1);
-    }
+  }
 
   // report progress every 2% of the way to completion
   this->InvokeEvent(vtkCommand::StartEvent);
@@ -1249,130 +1314,130 @@ int vtkNIFTIReader::RequestData(
   int errorCode = 0;
 
   while (!this->AbortExecute)
-    {
+  {
     if (offset)
-      {
+    {
       int rval = gzseek(file, offset, SEEK_CUR);
       if (rval == -1)
-        {
+      {
         errorCode = vtkErrorCode::FileFormatError;
         if (gzeof(file))
-          {
+        {
           errorCode = vtkErrorCode::PrematureEndOfFileError;
-          }
-        break;
         }
+        break;
       }
+    }
 
     if (vectorDim == 1 && !planarRGB)
-      {
+    {
       // read directly into the output instead of into a buffer
       rowBuffer = ptr;
-      }
+    }
 
     int code = gzread(file, rowBuffer, rowSize*scalarSize);
     if (code != rowSize*scalarSize)
-      {
+    {
       errorCode = vtkErrorCode::FileFormatError;
       if (gzeof(file))
-        {
+      {
         errorCode = vtkErrorCode::PrematureEndOfFileError;
-        }
-      break;
       }
+      break;
+    }
 
     if (swapBytes != 0 && scalarSize > 1)
-      {
+    {
       vtkByteSwap::SwapVoidRange(rowBuffer, rowSize, scalarSize);
-      }
+    }
 
     if (vectorDim == 1 && !planarRGB)
-      {
+    {
       // advance the pointer to the next row
       ptr += outSizeX*numComponents*scalarSize;
       rowBuffer = 0;
-      }
+    }
     else
-      {
+    {
       // write vector plane to packed vector component
       unsigned char *tmpPtr = rowBuffer;
       z_off_t skipOther = scalarSize*numComponents - fileVoxelIncr;
       for (int i = 0; i < outSizeX; i++)
-        {
+      {
         // write one vector component of one voxel
         z_off_t n = fileVoxelIncr;
         do { *ptr++ = *tmpPtr++; } while (--n);
         // skip past the other components
         ptr += skipOther;
-        }
       }
+    }
 
     if (++count % target == 0)
-      {
+    {
       this->UpdateProgress(0.02*count/target);
-      }
+    }
 
     // offset to skip unread sections of the file, for when
     // the update extent is less than the whole extent
     offset = fileRowIncr - outSizeX*fileVoxelIncr;
     if (++j == outSizeY)
-      {
+    {
       j = 0;
       offset += filePlaneIncr - outSizeY*fileRowIncr;
       // back up for next plane (R, G, or B) if planar mode
       ptr -= planarOffset;
       if (++p == planarSize)
-        {
+      {
         p = 0;
         ptr += planarEndOffset; // advance to start of next slice
         ptr -= 2*sliceOffset; // for reverse slice order
         if (++k == outSizeZ)
-          {
+        {
           k = 0;
           offset += fileVectorIncr - outSizeZ*fileSliceIncr;
           if (++t == timeDim)
-            {
+          {
             t = 0;
-            }
+          }
           if (++c == vectorDim)
-            {
+          {
             break;
-            }
+          }
           // back up the ptr to the beginning of the image,
           // then increment to the next vector component
           ptr = dataPtr + c*fileVoxelIncr*planarSize;
 
           if (this->TimeAsVector)
-            {
+          {
             // if timeDim is included in the vectorDim (and hence in the
             // VTK scalar components) then we have to make sure that
             // the vector components are packed before the time steps
             ptr = dataPtr + (c + t*(vectorDim - 1))/timeDim*
                             fileVoxelIncr*planarSize;
-            }
           }
         }
       }
     }
+  }
 
   if (vectorDim > 1 || planarRGB)
-    {
+  {
     delete [] rowBuffer;
-    }
+  }
 
   gzclose(file);
 
   if (errorCode)
-    {
+  {
     const char *errorText = "Error in NIFTI file, cannot read.";
     if (errorCode == vtkErrorCode::PrematureEndOfFileError)
-      {
+    {
       errorText = "NIFTI file is truncated, some data is missing.";
-      }
+    }
     this->SetErrorCode(errorCode);
     vtkErrorMacro(<< errorText);
     return 0;
-    }
+  }
 
   this->UpdateProgress(1.0);
   this->InvokeEvent(vtkCommand::EndEvent);
diff --git a/Source/vtkNIFTIReader.h b/Source/vtkNIFTIReader.h
index 3a5302e..1183610 100644
--- a/Source/vtkNIFTIReader.h
+++ b/Source/vtkNIFTIReader.h
@@ -12,22 +12,24 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkNIFTIReader - Read NIfTI-1 and NIfTI-2 medical image files
-// .SECTION Description
-// This class reads NIFTI files, either in .nii format or as separate
-// .img and .hdr files.  If two files are used, then they can be passed
-// by using SetFileNames() instead of SetFileName().  Files ending in .gz
-// are decompressed on-the-fly while they are being read.  Files with
-// complex numbers or vector dimensions will be read as multi-component
-// images.  If a NIFTI file has a time dimension, then by default only the
-// first image in the time series will be read, but the TimeAsVector
-// flag can be set to read the time steps as vector components.  Files in
-// Analyze 7.5 format are also supported by this reader.
-// .SECTION Thanks
-// This class was contributed to VTK by the Calgary Image Processing and
-// Analysis Centre (CIPAC).
-// .SECTION See Also
-// vtkNIFTIWriter, vtkNIFTIHeader
+/*! \class vtkNIFTIReader
+ *  \brief Read NIfTI-1 and NIfTI-2 medical image files
+ *
+ *  This class reads NIFTI files, either in .nii format or as separate
+ *  .img and .hdr files.  If two files are used, then they can be passed
+ *  by using SetFileNames() instead of SetFileName().  Files ending in .gz
+ *  are decompressed on-the-fly while they are being read.  Files with
+ *  complex numbers or vector dimensions will be read as multi-component
+ *  images.  If a NIFTI file has a time dimension, then by default only the
+ *  first image in the time series will be read, but the TimeAsVector
+ *  flag can be set to read the time steps as vector components.  Files in
+ *  Analyze 7.5 format are also supported by this reader.
+ *
+ *  This class was contributed to VTK by the Calgary Image Processing and
+ *  Analysis Centre (CIPAC).
+ *
+ *  \sa vtkNIFTIWriter, vtkNIFTIHeader
+ */
 
 #ifndef vtkNIFTIReader_h
 #define vtkNIFTIReader_h
@@ -44,183 +46,188 @@ struct nifti_1_header;
 class VTKDICOM_EXPORT vtkNIFTIReader : public vtkImageReader2
 {
 public:
-  // Description:
-  // Static method for construction.
+  //! Static method for construction.
   static vtkNIFTIReader *New();
   vtkTypeMacro(vtkNIFTIReader, vtkImageReader2);
 
-  // Description:
-  // Print information about this object.
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Valid extensions for this file type.
+  //@{
+  //! Valid extensions for this file type.
   virtual const char* GetFileExtensions() {
     return ".nii .nii.gz .img .img.gz .hdr .hdr.gz"; }
 
-  // Description:
-  // Return a descriptive name that might be useful in a GUI.
+  //! Return a descriptive name that might be useful in a GUI.
   virtual const char* GetDescriptiveName() {
     return "NIfTI"; }
 
-  // Description:
-  // Return true if this reader can read the given file.
+  //! Return true if this reader can read the given file.
   int CanReadFile(const char* filename);
-
-  // Description:
-  // Read the time dimension as scalar components (default: Off).
-  // If this is on, then each time point will be stored as a component in
-  // the image data.  If the file has both a time dimension and a vector
-  // dimension, then the number of components will be the product of these
-  // two dimensions, i.e. the components will store a sequence of vectors.
+  //@}
+
+  //@{
+  //! Read the time dimension as scalar components (default: Off).
+  /*!
+   *  If this is on, then each time point will be stored as a component in
+   *  the image data.  If the file has both a time dimension and a vector
+   *  dimension, then the number of components will be the product of these
+   *  two dimensions, i.e. the components will store a sequence of vectors.
+   */
   vtkGetMacro(TimeAsVector, int);
   vtkSetMacro(TimeAsVector, int);
   vtkBooleanMacro(TimeAsVector, int);
+  //@}
 
-  // Description:
-  // Get the time dimension that was stored in the NIFTI header.
+  //@{
+  //! Get the time dimension that was stored in the NIFTI header.
   int GetTimeDimension() { return this->Dim[4]; }
   double GetTimeSpacing() { return this->PixDim[4]; }
-
-  // Description:
-  // Get the slope and intercept for rescaling the scalar values.
-  // These values allow calibration of the data to real values.
-  // Use the equation v = u*RescaleSlope + RescaleIntercept.
-  // This directly returns the values stored in the scl_slope and
-  // scl_inter fields in the NIFTI header.
+  //@}
+
+  //@{
+  //! Get the slope and intercept for rescaling the scalar values.
+  /*!
+   *  These values allow calibration of the data to real values.
+   *  Use the equation v = u*RescaleSlope + RescaleIntercept.
+   *  This directly returns the values stored in the scl_slope and
+   *  scl_inter fields in the NIFTI header.
+   */
   double GetRescaleSlope() { return this->RescaleSlope; }
   double GetRescaleIntercept() { return this->RescaleIntercept; }
-
-  // Description:
-  // Read planar RGB (separate R, G, and B planes), rather than packed RGB.
-  // The NIFTI format should always use packed RGB.  The Analyze format,
-  // however, was used to store both planar RGB and packed RGB depending
-  // on the software, without any indication in the header about which
-  // convention was being used.  Use this if you have a planar RGB file.
+  //@}
+
+  //@{
+  //! Read planar RGB (separate R, G, and B planes), rather than packed RGB.
+  /*!
+   *  The NIFTI format should always use packed RGB.  The Analyze format,
+   *  however, was used to store both planar RGB and packed RGB depending
+   *  on the software, without any indication in the header about which
+   *  convention was being used.  Use this if you have a planar RGB file.
+   */
   vtkGetMacro(PlanarRGB, bool);
   vtkSetMacro(PlanarRGB, bool);
   vtkBooleanMacro(PlanarRGB, bool);
-
-  // Description:
-  // QFac gives the slice order in the NIFTI file versus the VTK image.
-  // If QFac is -1, then the VTK slice index J is related to the NIFTI
-  // slice index j by the equation J = (num_slices - j - 1).  VTK requires
-  // the slices to be ordered so that the voxel indices (I,J,K) provide a
-  // right-handed coordinate system, whereas NIFTI does not.  Instead,
-  // NIFTI stores a factor called "qfac" in the header to signal when the
-  // (i,j,k) indices form a left-handed coordinate system.  QFac will only
-  // ever have values of +1 or -1.
+  //@}
+
+  //@{
+  //! QFac gives the slice order in the NIFTI file versus the VTK image.
+  /*!
+   *  If QFac is -1, then the VTK slice index J is related to the NIFTI
+   *  slice index j by the equation J = (num_slices - j - 1).  VTK requires
+   *  the slices to be ordered so that the voxel indices (I,J,K) provide a
+   *  right-handed coordinate system, whereas NIFTI does not.  Instead,
+   *  NIFTI stores a factor called "qfac" in the header to signal when the
+   *  (i,j,k) indices form a left-handed coordinate system.  QFac will only
+   *  ever have values of +1 or -1.
+   */
   double GetQFac() { return this->QFac; }
-
-  // Description:
-  // Get a matrix that gives the "qform" orientation and offset for the data.
-  // If no qform matrix was stored in the file, the return value is NULL.
-  // This matrix will transform VTK data coordinates into the NIFTI oriented
-  // data coordinates, where +X points right, +Y points anterior (toward the
-  // front), and +Z points superior (toward the head). The qform matrix will
-  // always have a positive determinant. The offset that is stored in the
-  // matrix gives the position of the first pixel in the first slice of the
-  // VTK image data.  Note that if QFac is -1, then the first slice in the
-  // VTK image data is the last slice in the NIFTI file, and the Z offset
-  // will automatically be adjusted to compensate for this.
+  //@}
+
+  //@{
+  //! Get a matrix that gives the "qform" orientation and offset for the data.
+  /*!
+   *  If no qform matrix was stored in the file, the return value is NULL.
+   *  This matrix will transform VTK data coordinates into the NIFTI oriented
+   *  data coordinates, where +X points right, +Y points anterior (toward the
+   *  front), and +Z points superior (toward the head). The qform matrix will
+   *  always have a positive determinant. The offset that is stored in the
+   *  matrix gives the position of the first pixel in the first slice of the
+   *  VTK image data.  Note that if QFac is -1, then the first slice in the
+   *  VTK image data is the last slice in the NIFTI file, and the Z offset
+   *  will automatically be adjusted to compensate for this.
+   */
   vtkMatrix4x4 *GetQFormMatrix() { return this->QFormMatrix; }
 
-  // Description:
-  // Get a matrix that gives the "sform" orientation and offset for the data.
-  // If no sform matrix was stored in the file, the return value is NULL.
-  // Like the qform matrix, this matrix will transform VTK data coordinates
-  // into a NIFTI coordinate system.  Unlike the qform matrix, the sform
-  // matrix can contain scaling information and can even (rarely) have
-  // a negative determinant, i.e. a flip.  This matrix is modified slightly
-  // as compared to the sform matrix stored in the NIFTI header: the pixdim
-  // pixel spacing is factored out.  Also, if QFac is -1, then the VTK slices
-  // are in reverse order as compared to the NIFTI slices, hence as compared
-  // to the sform matrix stored in the header, the third column of this matrix
-  // is multiplied by -1 and the Z offset is shifted to compensate for the
-  // fact that the last slice has become the first.
+  //! Get a matrix that gives the "sform" orientation and offset for the data.
+  /*!
+   *  If no sform matrix was stored in the file, the return value is NULL.
+   *  Like the qform matrix, this matrix will transform VTK data coordinates
+   *  into a NIFTI coordinate system.  Unlike the qform matrix, the sform
+   *  matrix can contain scaling information and can even (rarely) have
+   *  a negative determinant, i.e. a flip.  This matrix is modified slightly
+   *  as compared to the sform matrix stored in the NIFTI header: the pixdim
+   *  pixel spacing is factored out.  Also, if QFac is -1, then the VTK slices
+   *  are in reverse order as compared to the NIFTI slices, hence as compared
+   *  to the sform matrix stored in the header, the third column of this matrix
+   *  is multiplied by -1 and the Z offset is shifted to compensate for the
+   *  fact that the last slice has become the first.
+   */
   vtkMatrix4x4 *GetSFormMatrix() { return this->SFormMatrix; }
+  //@}
 
-  // Description:
-  // Get the raw header information from the NIfTI file.
+  //@{
+  //! Get the raw header information from the NIfTI file.
   vtkNIFTIHeader *GetNIFTIHeader();
+  //@}
 
 protected:
   vtkNIFTIReader();
   ~vtkNIFTIReader();
 
-  // Description:
-  // Read the header information.
+  //! Read the header information.
   virtual int RequestInformation(
     vtkInformation* request, vtkInformationVector** inputVector,
     vtkInformationVector* outputVector);
 
-  // Description:
-  // Read the voxel data.
+  //! Read the voxel data.
   virtual int RequestData(
     vtkInformation* request, vtkInformationVector** inputVector,
     vtkInformationVector* outputVector);
 
-  // Description:
-  // Doe a case-insensitive check for the given extension.
-  // The check will succeed if the filename ends in ".gz", and if the
-  // extension matches after removing the ".gz".
+  //! Doe a case-insensitive check for the given extension.
+  /*!
+   *  The check will succeed if the filename ends in ".gz", and if the
+   *  extension matches after removing the ".gz".
+   */
   static bool CheckExtension(const char *fname, const char *ext);
 
-  // Description:
-  // Make a new filename by replacing extension "ext1" with "ext2".
-  // The extensions must include a period, must be three characters
-  // long, and must be lower case.  This method also verifies that
-  // the file exists, and adds or subtracts a ".gz" as necessary
-  // If the file exists, a new string is returned that must be
-  // deleted by the caller.  Otherwise, the return value is NULL.
+  //! Make a new filename by replacing extension "ext1" with "ext2".
+  /*!
+   *  The extensions must include a period, must be three characters
+   *  long, and must be lower case.  This method also verifies that
+   *  the file exists, and adds or subtracts a ".gz" as necessary
+   *  If the file exists, a new string is returned that must be
+   *  deleted by the caller.  Otherwise, the return value is NULL.
+   */
   static char *ReplaceExtension(
     const char *fname, const char *ext1, const char *ext2);
 
-  // Description:
-  // Check the version of the header.
+  //! Check the version of the header.
   static int CheckNIFTIVersion(const nifti_1_header *hdr);
 
-  // Description:
-  // Check for Analyze 7.5 header.
+  //! Check for Analyze 7.5 header.
   static bool CheckAnalyzeHeader(const nifti_1_header *hdr);
 
-  // Description:
-  // Read the time dimension as if it was a vector dimension.
+  //! Read the time dimension as if it was a vector dimension.
   int TimeAsVector;
 
-  // Description:
-  // Information for rescaling data to quantitative units.
+  //! Information for rescaling data to quantitative units.
   double RescaleIntercept;
   double RescaleSlope;
 
-  // Description:
-  // Set to -1 when VTK slice order is opposite to NIFTI slice order.
+  //! Set to -1 when VTK slice order is opposite to NIFTI slice order.
   double QFac;
 
-  // Description:
-  // The orientation matrices for the NIFTI file.
+  //! The orientation matrices for the NIFTI file.
   vtkMatrix4x4 *QFormMatrix;
   vtkMatrix4x4 *SFormMatrix;
 
-  // Description:
-  // The dimensions of the NIFTI file.
+  //! The dimensions of the NIFTI file.
   int Dim[8];
 
-  // Description:
-  // The spacings in the NIFTI file.
+  //! The spacings in the NIFTI file.
   double PixDim[8];
 
-  // Description:
-  // A copy of the header from the file that was most recently read.
+  //! A copy of the header from the file that was most recently read.
   vtkNIFTIHeader *NIFTIHeader;
 
-  // Description:
-  // Use planar RGB instead of the default (packed).
+  //! Use planar RGB instead of the default (packed).
   bool PlanarRGB;
 
 private:
-  vtkNIFTIReader(const vtkNIFTIReader&);  // Not implemented.
-  void operator=(const vtkNIFTIReader&);  // Not implemented.
+  vtkNIFTIReader(const vtkNIFTIReader&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkNIFTIReader&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkNIFTIReader_h
diff --git a/Source/vtkNIFTIWriter.cxx b/Source/vtkNIFTIWriter.cxx
index 0ccd9dd..88e5e44 100644
--- a/Source/vtkNIFTIWriter.cxx
+++ b/Source/vtkNIFTIWriter.cxx
@@ -28,7 +28,8 @@
 #include "vtkCommand.h"
 #include "vtkVersion.h"
 
-#include "vtksys/SystemTools.hxx"
+// For removing file if write failed
+#include "vtkDICOMFile.h"
 
 // Header for NIFTI
 #include "vtkNIFTIHeader.h"
@@ -47,6 +48,23 @@
 #include <float.h>
 #include <math.h>
 
+#ifdef _WIN32
+// To allow use of wchar_t paths on Windows
+#include "vtkDICOMFilePath.h"
+#if VTK_MAJOR_VERSION >= 7
+#ifdef gzopen
+#undef gzopen
+#endif
+#define gzopen gzopen_w
+#define fopen _wfopen
+#define NIFTI_FILE_MODE L"wb"
+#else
+#define NIFTI_FILE_MODE "wb"
+#endif
+#else
+#define NIFTI_FILE_MODE "wb"
+#endif
+
 vtkStandardNewMacro(vtkNIFTIWriter);
 vtkCxxSetObjectMacro(vtkNIFTIWriter,QFormMatrix,vtkMatrix4x4);
 vtkCxxSetObjectMacro(vtkNIFTIWriter,SFormMatrix,vtkMatrix4x4);
@@ -68,10 +86,7 @@ vtkNIFTIWriter::vtkNIFTIWriter()
   this->OwnHeader = 0;
   this->NIFTIHeader = 0;
   this->NIFTIVersion = 0;
-  this->Description = new char[80];
-  // Default description is "VTKX.Y.Z"
-  strncpy(this->Description, "VTK", 3);
-  strncpy(&this->Description[3], vtkVersion::GetVTKVersion(), 77);
+  this->Description = 0;
   // Planar RGB (NIFTI doesn't allow this, it's here for Analyze)
   this->PlanarRGB = false;
 }
@@ -80,21 +95,21 @@ vtkNIFTIWriter::vtkNIFTIWriter()
 vtkNIFTIWriter::~vtkNIFTIWriter()
 {
   if (this->QFormMatrix)
-    {
+  {
     this->QFormMatrix->Delete();
-    }
+  }
   if (this->SFormMatrix)
-    {
+  {
     this->SFormMatrix->Delete();
-    }
+  }
   if (this->OwnHeader)
-    {
+  {
     this->OwnHeader->Delete();
-    }
+  }
   if (this->NIFTIHeader)
-    {
+  {
     this->NIFTIHeader->Delete();
-    }
+  }
   delete [] this->Description;
 }
 
@@ -102,9 +117,9 @@ vtkNIFTIWriter::~vtkNIFTIWriter()
 vtkNIFTIHeader *vtkNIFTIWriter::GetNIFTIHeader()
 {
   if (!this->NIFTIHeader)
-    {
+  {
     this->NIFTIHeader = vtkNIFTIHeader::New();
-    }
+  }
   return this->NIFTIHeader;
 }
 
@@ -113,7 +128,8 @@ void vtkNIFTIWriter::PrintSelf(ostream& os, vtkIndent indent)
 {
   this->Superclass::PrintSelf(os, indent);
 
-  os << indent << "Description: " << this->Description << "\n";
+  os << indent << "Description: "
+     << (this->Description ? this->Description : "(NULL)") << "\n";
   os << indent << "TimeDimension: " << this->TimeDimension << "\n";
   os << indent << "TimeSpacing: " << this->TimeSpacing << "\n";
   os << indent << "RescaleSlope: " << this->RescaleSlope << "\n";
@@ -122,35 +138,35 @@ void vtkNIFTIWriter::PrintSelf(ostream& os, vtkIndent indent)
 
   os << indent << "QFormMatrix:";
   if (this->QFormMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->QFormMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "SFormMatrix:";
   if (this->SFormMatrix)
-    {
+  {
     double mat[16];
     vtkMatrix4x4::DeepCopy(mat, this->SFormMatrix);
     for (int i = 0; i < 16; i++)
-      {
+    {
       os << " " << mat[i];
-      }
-    os << "\n";
     }
+    os << "\n";
+  }
   else
-    {
+  {
     os << " (none)\n";
-    }
+  }
 
   os << indent << "NIFTIHeader:" << (this->NIFTIHeader ? "\n" : " (none)\n");
   os << indent << "NIFTIVersion: " << this->NIFTIVersion << "\n";
@@ -169,27 +185,27 @@ char *vtkNIFTIWriter::ReplaceExtension(
   if (n > 2 && filename[n-3] == '.' &&
       tolower(filename[n-2]) == 'g' &&
       tolower(filename[n-1]) == 'z')
-    {
+  {
     m -= 3;
-    }
+  }
   if (m > 3 && filename[m-4] == '.' &&
       tolower(filename[m-3]) == tolower(ext1[1]) &&
       tolower(filename[m-2]) == tolower(ext1[2]) &&
       tolower(filename[m-1]) == tolower(ext1[3]))
-    {
+  {
     if (isupper(filename[m-3]))
-      {
+    {
       newname[m-3] = toupper(ext2[1]);
       newname[m-2] = toupper(ext2[2]);
       newname[m-1] = toupper(ext2[3]);
-      }
+    }
     else
-      {
+    {
       newname[m-3] = tolower(ext2[1]);
       newname[m-2] = tolower(ext2[2]);
       newname[m-1] = tolower(ext2[3]);
-      }
     }
+  }
 
   return newname;
 }
@@ -272,14 +288,14 @@ void vtkNIFTIWriterSetInformation(
   short databits = 0;
 
   for (int i = 0; typeMap[2] != 0; i++)
-    {
+  {
     if (scalarType == typeMap[i][0])
-      {
+    {
       datatype = typeMap[i][1];
       databits = typeMap[i][2];
       break;
-      }
     }
+  }
 
   // number of spatial dimensions
   int spaceDim = (extent[4] == extent[5] ? 2 : 3);
@@ -325,22 +341,22 @@ void vtkNIFTIWriterSetQForm(
   double quat[4];
   vtkMath::Matrix3x3ToQuaternion(rmat, quat);
   if (quat[0] < 0)
-    {
+  {
     quat[0] = -quat[0];
     quat[1] = -quat[1];
     quat[2] = -quat[2];
     quat[3] = -quat[3];
-    }
+  }
 
   if (qfac < 0)
-    {
+  {
     // We will be reversing the order of the slices, so the first VTK
     // slice will be at the position of the last NIfTI slice, and we
     // must adjust the offset to compensate for this.
     mmat[3] += rmat[0][2]*hdr->pixdim[3]*(hdr->dim[3] - 1);
     mmat[7] += rmat[1][2]*hdr->pixdim[3]*(hdr->dim[3] - 1);
     mmat[11] += rmat[2][2]*hdr->pixdim[3]*(hdr->dim[3] - 1);
-    }
+  }
 
   hdr->pixdim[0] = qfac;
   hdr->quatern_b = quat[1];
@@ -356,7 +372,7 @@ void vtkNIFTIWriterSetSForm(
   nifti_2_header *hdr, double mmat[16], double qfac)
 {
   if (qfac < 0)
-    {
+  {
     // If QFac is set to -1 (which only occurs if qform_code was set)
     // then the slices will be reversed, and we must reverse the slice
     // orientation vector (the third column of the matrix) to compensate.
@@ -370,7 +386,7 @@ void vtkNIFTIWriterSetSForm(
     mmat[2] = -mmat[2];
     mmat[6] = -mmat[6];
     mmat[10] = -mmat[10];
-    }
+  }
 
   // first row
   hdr->srow_x[0] = mmat[0] * hdr->pixdim[1];
@@ -402,14 +418,14 @@ void vtkNIFTIWriterMatrix(
   offset[3] = 1.0;
 
   if (matrix)
-    {
+  {
     matrix->MultiplyPoint(offset, offset);
     vtkMatrix4x4::DeepCopy(mmat, matrix);
-    }
+  }
   else
-    {
+  {
     vtkMatrix4x4::Identity(mmat);
-    }
+  }
 
   mmat[3] = offset[0];
   mmat[7] = offset[1];
@@ -425,50 +441,50 @@ int vtkNIFTIWriter::GenerateHeader(vtkInformation *info, bool singleFile)
   nifti_2_header hdr;
   int version = 0;
   if (this->OwnHeader == 0)
-    {
+  {
     this->OwnHeader = vtkNIFTIHeader::New();
-    }
+  }
   else
-    {
+  {
     this->OwnHeader->Initialize();
-    }
+  }
   if (this->NIFTIHeader)
-    {
+  {
     // use the header supplied by SetNIFTIHeader()
     this->NIFTIHeader->GetHeader(&hdr);
     version = hdr.magic[2] - '0';
     if (version > 2)
-      {
+    {
       version = 2;
-      }
     }
+  }
   else
-    {
+  {
     // start with a blank header
     this->OwnHeader->GetHeader(&hdr);
     hdr.scl_slope = 1.0;
-    }
+  }
 
   // copy the image information into the header
   vtkNIFTIWriterSetInformation(&hdr, info);
   if (hdr.datatype == 0)
-    {
+  {
     vtkErrorMacro("Illegal data type for NIFTI file.");
     return 0;
-    }
+  }
 
   // override the version if set via SetNIFTIVersion
   if (this->NIFTIVersion != 0)
-    {
+  {
     version = this->NIFTIVersion;
-    }
+  }
 
   // set the rescale slope/intercept if not (0.0,0.0)
   if (this->RescaleSlope != 0.0 || this->RescaleIntercept != 0.0)
-    {
+  {
     hdr.scl_slope = this->RescaleSlope;
     hdr.scl_inter = this->RescaleIntercept;
-    }
+  }
 
   // set the header size
   hdr.sizeof_hdr = (version == 2 ?
@@ -477,26 +493,27 @@ int vtkNIFTIWriter::GenerateHeader(vtkInformation *info, bool singleFile)
 
   // modify magic number and voxel offset for .img files
   if (!singleFile)
-    {
+  {
     strncpy(hdr.magic, (version == 2 ? "ni2" : "ni1"), 4);
     hdr.vox_offset = 0;
-    }
+  }
   else
-    {
+  {
     strncpy(hdr.magic, (version == 2 ? "n+2" : "n+1"), 4);
     hdr.vox_offset = (version == 2 ? 544 : 352);
-    }
+  }
   if (version == 2)
-    {
+  {
     // version 2 has four bytes for newline transfer checks
     strncpy(&hdr.magic[4], "\r\n\032\n", 4);
-    }
+  }
 
   // set the description
   if (this->Description)
-    {
-    strncpy(hdr.descrip, this->Description, 80);
-    }
+  {
+    strncpy(hdr.descrip, this->Description, sizeof(hdr.descrip) - 1);
+    hdr.descrip[sizeof(hdr.descrip) - 1] = '\0';
+  }
 
   // qfac dictates the slice ordering in the file
   double qfac = (this->QFac < 0 ? -1.0 : 1.0);
@@ -507,72 +524,72 @@ int vtkNIFTIWriter::GenerateHeader(vtkInformation *info, bool singleFile)
 
   if (this->QFormMatrix ||
       (origin[0] != 0 || origin[1] != 0 || origin[2] != 0))
-    {
+  {
     hdr.qform_code = 1; // SCANNER_ANAT
     double mat16[16];
     vtkNIFTIWriterMatrix(mat16, this->QFormMatrix, origin);
     vtkNIFTIWriterSetQForm(&hdr, mat16, qfac);
-    }
+  }
 
   if (this->SFormMatrix)
-    {
+  {
     hdr.sform_code = 2; // ALIGNED_ANAT
     double mat16[16];
     vtkNIFTIWriterMatrix(mat16, this->SFormMatrix, origin);
     vtkNIFTIWriterSetSForm(&hdr, mat16, qfac);
-    }
+  }
 
   // base dimension not counting vector dimension
   int basedim = (hdr.dim[3] == 1 ? 2 : 3);
 
   if (this->TimeDimension)
-    {
+  {
     int tdim = this->TimeDimension;
     if (hdr.dim[5] % tdim != 0)
-      {
+    {
       vtkErrorMacro("Number of components in the image data must be "
                     "divisible by the TimeDimension");
       return 0;
-      }
+    }
     hdr.pixdim[4] = this->TimeSpacing;
     hdr.dim[4] = tdim;
     hdr.dim[5] /= tdim;
     hdr.dim[0] = (hdr.dim[5] > 1 ? 5 : 4);
     basedim = 4;
-    }
+  }
 
   if (hdr.dim[5] == 2 && hdr.datatype == NIFTI_TYPE_FLOAT32)
-    {
+  {
     // float with 2 components becomes COMPLEX64
     hdr.datatype = NIFTI_TYPE_COMPLEX64;
     hdr.bitpix = 64;
     hdr.dim[0] = basedim;
     hdr.dim[5] = 1;
-    }
+  }
   else if (hdr.dim[5] == 2 && hdr.datatype == NIFTI_TYPE_FLOAT64)
-    {
+  {
     // double with 2 components becomes COMPLEX128
     hdr.datatype = NIFTI_TYPE_COMPLEX128;
     hdr.bitpix = 32;
     hdr.dim[0] = basedim;
     hdr.dim[5] = 1;
-    }
+  }
   else if (hdr.dim[5] == 3 && hdr.datatype == NIFTI_TYPE_UINT8)
-    {
+  {
     // unsigned char with 3 components becomes RGB24
     hdr.datatype = NIFTI_TYPE_RGB24;
     hdr.bitpix = 24;
     hdr.dim[0] = basedim;
     hdr.dim[5] = 1;
-    }
+  }
   else if (hdr.dim[5] == 4 && hdr.datatype == NIFTI_TYPE_UINT8)
-    {
+  {
     // unsigned char with 4 components becomes RGBA32
     hdr.datatype = NIFTI_TYPE_RGBA32;
     hdr.bitpix = 32;
     hdr.dim[0] = basedim;
     hdr.dim[5] = 1;
-    }
+  }
 
   this->OwnHeader->SetHeader(&hdr);
   return 1;
@@ -591,18 +608,18 @@ int vtkNIFTIWriter::RequestData(
     vtkImageData::SafeDownCast(info->Get(vtkDataObject::DATA_OBJECT()));
 
   if (data == NULL)
-    {
+  {
     vtkErrorMacro("No input provided!");
     return 0;
-    }
+  }
 
   const char *filename = this->GetFileName();
   if (filename == NULL)
-    {
+  {
     vtkErrorMacro("A FileName must be provided");
     this->SetErrorCode(vtkErrorCode::NoFileNameError);
     return 0;
-    }
+  }
 
   int extent[6];
   info->Get(vtkStreamingDemandDrivenPipeline::WHOLE_EXTENT(), extent);
@@ -614,10 +631,10 @@ int vtkNIFTIWriter::RequestData(
   if (n > 2 && filename[n-3] == '.' &&
       tolower(filename[n-2]) == 'g' &&
       tolower(filename[n-1]) == 'z')
-    {
+  {
     m = n - 3;
     isCompressed = true;
-    }
+  }
 
   // after the optional ".gz" is removed, is it a ".img/.hdr" file?
   bool singleFile = true;
@@ -628,15 +645,15 @@ int vtkNIFTIWriter::RequestData(
        (tolower(filename[m-3]) == 'i' &&
         tolower(filename[m-2]) == 'm' &&
         tolower(filename[m-1]) == 'g')))
-    {
+  {
     singleFile = false;
-    }
+  }
 
   // generate the header information
   if (this->GenerateHeader(info, singleFile) == 0)
-    {
+  {
     return 0;
-    }
+  }
 
   // if file is not .nii, then get .hdr and .img filenames
   char *hdrname = vtkNIFTIWriter::ReplaceExtension(
@@ -653,45 +670,64 @@ int vtkNIFTIWriter::RequestData(
   size_t hdrsize = 0;
   int version = this->OwnHeader->GetMagic()[2] - '0';
   if (version == 2)
-    {
+  {
     this->OwnHeader->GetHeader(&hdr2);
     hdrptr = &hdr2;
     hdrsize = hdr2.sizeof_hdr;
-    }
+  }
   else
-    {
+  {
     this->OwnHeader->GetHeader(&hdr1);
     hdrptr = &hdr1;
     hdrsize = hdr1.sizeof_hdr;
     if (extent[1] - extent[0] + 1 > VTK_SHORT_MAX ||
         extent[3] - extent[2] + 1 > VTK_SHORT_MAX ||
         extent[5] - extent[4] + 1 > VTK_SHORT_MAX)
-      {
+    {
       vtkErrorMacro("Image too large to store in NIFTI-1 format");
       return 0;
-      }
     }
+  }
+
+#if _WIN32
+  vtkDICOMFilePath fph(hdrname);
+  vtkDICOMFilePath fpi(imgname);
+#if VTK_MAJOR_VERSION < 7
+  // convert to the local character set
+  const char *uhdrname = fph.Local();
+  const char *uimgname = fpi.Local();
+#else
+  // use wide character
+  const wchar_t *uhdrname = fph.Wide();
+  const wchar_t *uimgname = fpi.Wide();
+#endif
+#else
+  const char *uhdrname = hdrname;
+  const char *uimgname = imgname;
+#endif
 
   // try opening file
   gzFile file = 0;
   FILE *ufile = 0;
-  if (isCompressed)
+  if (uhdrname && uimgname)
+  {
+    if (isCompressed)
     {
-    file = gzopen(hdrname, "wb");
+      file = gzopen(uhdrname, "wb");
     }
-  else
+    else
     {
-    ufile = fopen(hdrname, "wb");
+      ufile = fopen(uhdrname, NIFTI_FILE_MODE);
     }
+  }
 
   if (!file && !ufile)
-    {
-    vtkErrorMacro("Cannot open file " << hdrname);
+  {
     delete [] hdrname;
     delete [] imgname;
     this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
     return 0;
-    }
+  }
 
   this->InvokeEvent(vtkCommand::StartEvent);
   this->UpdateProgress(0.0);
@@ -699,62 +735,62 @@ int vtkNIFTIWriter::RequestData(
   // write the header
   size_t bytesWritten = 0;
   if (isCompressed)
-    {
+  {
     unsigned int hsize = static_cast<unsigned int>(hdrsize);
     int code = gzwrite(file, hdrptr, hsize);
     bytesWritten = (code < 0 ? 0 : code);
-    }
+  }
   else
-    {
+  {
     bytesWritten = fwrite(hdrptr, 1, hdrsize, ufile);
-    }
+  }
   if (bytesWritten < hdrsize)
-    {
+  {
     this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError);
-    }
+  }
 
   if (singleFile && !this->ErrorCode)
-    {
+  {
     // write the padding between the header and the image to the .nii file
     size_t padsize = (static_cast<size_t>(this->OwnHeader->GetVoxOffset()) -
                       hdrsize);
     char *padding = new char[padsize];
     memset(padding, '\0', padsize);
     if (isCompressed)
-      {
+    {
       int code = gzwrite(file, padding, static_cast<unsigned int>(padsize));
       bytesWritten = (code < 0 ? 0 : code);
-      }
+    }
     else
-      {
+    {
       bytesWritten = fwrite(padding, 1, padsize, ufile);
-      }
+    }
     delete [] padding;
     if (bytesWritten < padsize)
-      {
+    {
       this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError);
-      }
     }
+  }
   else if (!this->ErrorCode)
-    {
+  {
     // close the .hdr file and open the .img file
     if (isCompressed)
-      {
+    {
       gzclose(file);
-      file = gzopen(imgname, "wb");
-      }
+      file = gzopen(uimgname, "wb");
+    }
     else
-      {
+    {
       fclose(ufile);
-      ufile = fopen(imgname, "wb");
-      }
+      ufile = fopen(uimgname, NIFTI_FILE_MODE);
     }
+  }
 
   if (!file && !ufile)
-    {
+  {
     vtkErrorMacro("Cannot open file " << imgname);
     this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
-    }
+  }
 
   // write the image
   unsigned char *dataPtr =
@@ -780,41 +816,41 @@ int vtkNIFTIWriter::RequestData(
   z_off_t fileVoxelIncr = scalarSize*numComponents/vectorDim;
   int planarSize = 1;
   if (planarRGB)
-    {
+  {
     planarSize = numComponents/vectorDim;
     fileVoxelIncr = scalarSize;
-    }
+  }
 
   // add a buffer for planar-vector to packed-vector conversion
   unsigned char *rowBuffer = 0;
   if (vectorDim > 1 || planarRGB || swapBytes)
-    {
+  {
     rowBuffer = new unsigned char[outSizeX*fileVoxelIncr];
-    }
+  }
 
   // special increment to reverse the slices if needed
   vtkIdType sliceOffset = 0;
 
   if (this->QFac < 0)
-    {
+  {
     // put slices in reverse order
     sliceOffset = scalarSize*numComponents;
     sliceOffset *= outSizeX;
     sliceOffset *= outSizeY;
     dataPtr += sliceOffset*(outSizeZ - 1);
-    }
+  }
 
   // special increment to handle planar RGB
   vtkIdType planarOffset = 0;
   vtkIdType planarEndOffset = 0;
   if (planarRGB)
-    {
+  {
     planarOffset = scalarSize*numComponents;
     planarOffset *= outSizeX;
     planarOffset *= outSizeY;
     planarOffset -= scalarSize;
     planarEndOffset = planarOffset - scalarSize*(planarSize - 1);
-    }
+  }
 
   // report progress every 2% of the way to completion
   vtkIdType target =
@@ -833,115 +869,115 @@ int vtkNIFTIWriter::RequestData(
   unsigned char *ptr = dataPtr;
 
   while (!this->AbortExecute && !this->ErrorCode)
-    {
+  {
     if (vectorDim == 1 && !planarRGB && !swapBytes)
-      {
+    {
       // write directly from input, instead of using a buffer
       rowBuffer = ptr;
       ptr += outSizeX*numComponents*scalarSize;
-      }
+    }
     else
-      {
+    {
       // create a vector plane from packed vector components
       unsigned char *tmpPtr = rowBuffer;
       z_off_t skipOther = scalarSize*numComponents - fileVoxelIncr;
       for (int i = 0; i < outSizeX; i++)
-        {
+      {
         // write one vector component of one voxel
         z_off_t nn = fileVoxelIncr;
         do { *tmpPtr++ = *ptr++; } while (--nn);
         // skip past the other components
         ptr += skipOther;
-        }
       }
+    }
 
     if (swapBytes != 0 && scalarSize > 1)
-      {
+    {
       vtkByteSwap::SwapVoidRange(rowBuffer, rowSize, scalarSize);
-      }
+    }
 
     if (isCompressed)
-      {
+    {
       int code = gzwrite(file, rowBuffer, rowSize*scalarSize);
       bytesWritten = (code < 0 ? 0 : code);
-      }
+    }
     else
-      {
+    {
       bytesWritten = fwrite(rowBuffer, scalarSize, rowSize, ufile)*scalarSize;
-      }
+    }
     if (bytesWritten < static_cast<size_t>(rowSize*scalarSize))
-      {
+    {
       this->SetErrorCode(vtkErrorCode::OutOfDiskSpaceError);
       break;
-      }
+    }
 
     if (++count % target == 0)
-      {
+    {
       this->UpdateProgress(0.02*count/target);
-      }
+    }
 
     if (++j == outSizeY)
-      {
+    {
       j = 0;
       // back up for next plane (R, G, or B) if planar mode
       ptr -= planarOffset;
       if (++p == planarSize)
-        {
+      {
         p = 0;
         ptr += planarEndOffset; // advance to start of next slice
         ptr -= 2*sliceOffset; // for reverse slice order
         if (++k == outSizeZ)
-          {
+        {
           k = 0;
           if (++t == timeDim)
-            {
+          {
             t = 0;
-            }
+          }
           if (++c == vectorDim)
-            {
+          {
             break;
-            }
+          }
           // back up the ptr to the beginning of the image,
           // then increment to the next vector component
           ptr = dataPtr + c*fileVoxelIncr*planarSize;
 
           if (timeDim > 1)
-            {
+          {
             // if timeDim is included in the vectorDim (and hence in the
             // VTK scalar components) then we have to make sure that
             // the vector components are packed before the time steps
             ptr = dataPtr + (c + t*(vectorDim - 1))/timeDim*
                              fileVoxelIncr*planarSize;
-            }
           }
         }
       }
     }
+  }
 
   if (vectorDim > 1 || swapBytes || planarRGB)
-    {
+  {
     delete [] rowBuffer;
-    }
+  }
 
   if (isCompressed)
-    {
+  {
     gzclose(file);
-    }
+  }
   else
-    {
+  {
     fclose(ufile);
-    }
+  }
 
   if (this->ErrorCode == vtkErrorCode::OutOfDiskSpaceError)
-    {
+  {
     // erase the file, rather than leave a corrupt file on disk
     vtkErrorMacro("Out of disk space, removing incomplete file " << imgname);
-    vtksys::SystemTools::RemoveFile(imgname);
+    vtkDICOMFile::Remove(imgname);
     if (!singleFile)
-      {
-      vtksys::SystemTools::RemoveFile(hdrname);
-      }
+    {
+      vtkDICOMFile::Remove(hdrname);
     }
+  }
 
   this->UpdateProgress(1.0);
   this->InvokeEvent(vtkCommand::EndEvent);
diff --git a/Source/vtkNIFTIWriter.h b/Source/vtkNIFTIWriter.h
index 3589c43..2322512 100644
--- a/Source/vtkNIFTIWriter.h
+++ b/Source/vtkNIFTIWriter.h
@@ -12,20 +12,22 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkNIFTIWriter - Write NIfTI-1 and NIfTI-2 medical image files
-// .SECTION Description
-// This class writes NIFTI files, either in .nii format or as separate
-// .img and .hdr files.  If told to write a file that ends in ".gz",
-// then the writer will automatically compress the file with zlib.
-// Images of type unsigned char that have 3 or 4 scalar components
-// will automatically be written as RGB or RGBA respectively.  Images
-// of type float or double that have 2 components will automatically be
-// written as complex values.
-// .SECTION Thanks
-// This class was contributed to VTK by the Calgary Image Processing and
-// Analysis Centre (CIPAC).
-// .SECTION See Also
-// vtkNIFTIReader
+/*! \class vtkNIFTIWriter
+ *  \brief Write NIfTI-1 and NIfTI-2 medical image files
+ *
+ *  This class writes NIFTI files, either in .nii format or as separate
+ *  .img and .hdr files.  If told to write a file that ends in ".gz",
+ *  then the writer will automatically compress the file with zlib.
+ *  Images of type unsigned char that have 3 or 4 scalar components
+ *  will automatically be written as RGB or RGBA respectively.  Images
+ *  of type float or double that have 2 components will automatically be
+ *  written as complex values.
+ *
+ *  This class was contributed to VTK by the Calgary Image Processing and
+ *  Analysis Centre (CIPAC).
+ *
+ *  \sa vtkNIFTIReader
+ */
 
 #ifndef vtkNIFTIWriter_h
 #define vtkNIFTIWriter_h
@@ -39,153 +41,167 @@ class vtkNIFTIHeader;
 class VTKDICOM_EXPORT vtkNIFTIWriter : public vtkImageWriter
 {
 public:
-  // Description:
-  // Static method for construction.
+  //! Static method for construction.
   static vtkNIFTIWriter *New();
   vtkTypeMacro(vtkNIFTIWriter, vtkImageWriter);
 
-  // Description:
-  // Print information about this object.
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Set the version number for the NIfTI file format to use.
-  // This can be 1, 2, or 0 (the default).  If set to zero, then it
-  // will save as NIfTI version 1 unless SetNIFTIHeader() provided
-  // header information from a NIfTI version 2 file.
+  //@{
+  //! Set the version number for the NIfTI file format to use.
+  /*!
+   *  This can be 1, 2, or 0 (the default).  If set to zero, then it
+   *  will save as NIfTI version 1 unless SetNIFTIHeader() provided
+   *  header information from a NIfTI version 2 file.
+   */
   vtkSetMacro(NIFTIVersion, int);
   vtkGetMacro(NIFTIVersion, int);
+  //@}
 
-  // Description:
-  // Set a short description (max 80 chars) of how the file was produced.
-  // The default description is "VTKX.Y" where X.Y is the VTK version.
+  //@{
+  //! Set a short description (max 80 chars) of how the file was produced.
   vtkSetStringMacro(Description);
   vtkGetStringMacro(Description);
-
-  // Description:
-  // Set the time dimension to use in the NIFTI file (or zero if none).
-  // The number of components of the input data must be divisible by the time
-  // dimension if the time dimension is not set to zero.  The vector dimension
-  // will be set to the number of components divided by the time dimension.
+  //@}
+
+  //@{
+  //! Set the time dimension to use in the NIFTI file (or zero if none).
+  /*!
+   *  The number of components of the input data must be divisible by the time
+   *  dimension if the time dimension is not set to zero.  The vector dimension
+   *  will be set to the number of components divided by the time dimension.
+   */
   vtkGetMacro(TimeDimension, int);
   vtkSetMacro(TimeDimension, int);
   vtkGetMacro(TimeSpacing, double);
   vtkSetMacro(TimeSpacing, double);
-
-   // Description:
-   // Set the slope and intercept for calibrating the scalar values.
-   // Other programs that read the NIFTI file can use the equation
-   // v = u*RescaleSlope + RescaleIntercept to rescale the data to
-   // real values.  If both the slope and the intercept are zero,
-   // then the SclSlope and SclIntercept in the header info provided
-   // via SetNIFTIHeader() are used instead.
-   vtkSetMacro(RescaleSlope, double);
-   vtkGetMacro(RescaleSlope, double);
-   vtkSetMacro(RescaleIntercept, double);
-   vtkGetMacro(RescaleIntercept, double);
-
-  // Description:
-  // Write planar RGB (separate R, G, and B planes), rather than packed RGB.
-  // Use this option with extreme caution: the NIFTI standard requires RGB
-  // pixels to be packed.  The Analyze format, however, was used to store
-  // both planar RGB and packed RGB depending on the software, without any
-  // indication in the header about which convention was being used.
+  //@}
+
+  //@{
+  //! Set the slope and intercept for calibrating the scalar values.
+  /*!
+   *  Other programs that read the NIFTI file can use the equation
+   *  v = u*RescaleSlope + RescaleIntercept to rescale the data to
+   *  real values.  If both the slope and the intercept are zero,
+   *  then the SclSlope and SclIntercept in the header info provided
+   *  via SetNIFTIHeader() are used instead.
+   */
+  vtkSetMacro(RescaleSlope, double);
+  vtkGetMacro(RescaleSlope, double);
+  vtkSetMacro(RescaleIntercept, double);
+  vtkGetMacro(RescaleIntercept, double);
+  //@}
+
+  //@{
+  //! Write planar RGB (separate R, G, and B planes), rather than packed RGB.
+  /*!
+   *  Use this option with extreme caution: the NIFTI standard requires RGB
+   *  pixels to be packed.  The Analyze format, however, was used to store
+   *  both planar RGB and packed RGB depending on the software, without any
+   *  indication in the header about which convention was being used.
+   */
   vtkGetMacro(PlanarRGB, bool);
   vtkSetMacro(PlanarRGB, bool);
   vtkBooleanMacro(PlanarRGB, bool);
-
-  // Description:
-  // The QFac sets the ordering of the slices in the NIFTI file.
-  // If QFac is -1, then the slice ordering in the file will be reversed
-  // as compared to VTK. Use with caution.
+  //@}
+
+  //@{
+  //! The QFac sets the ordering of the slices in the NIFTI file.
+  /*!
+   *  If QFac is -1, then the slice ordering in the file will be reversed
+   *  as compared to VTK. Use with caution.
+   */
   vtkSetMacro(QFac, double);
   vtkGetMacro(QFac, double);
-
-  // Description:
-  // Set the "qform" orientation and offset for the image data.
-  // The 3x3 portion of the matrix must be orthonormal and have a
-  // positive determinant, it will be used to compute the quaternion.
-  // The last column of the matrix will be used for the offset.
-  // In the NIFTI header, the qform_code will be set to 1.
+  //@}
+
+  //@{
+  //! Set the "qform" orientation and offset for the image data.
+  /*!
+   *  The 3x3 portion of the matrix must be orthonormal and have a
+   *  positive determinant, it will be used to compute the quaternion.
+   *  The last column of the matrix will be used for the offset.
+   *  In the NIFTI header, the qform_code will be set to 1.
+   */
   void SetQFormMatrix(vtkMatrix4x4 *);
   vtkMatrix4x4 *GetQFormMatrix() { return this->QFormMatrix; }
-
-  // Description:
-  // Set a matrix for the "sform" transformation stored in the file.
-  // Unlike the qform matrix, the sform matrix can contain scaling
-  // information.  Before being stored in the NIFTI header, the
-  // first three columns of the matrix will be multipled by the voxel
-  // spacing. In the NIFTI header, the sform_code will be set to 2.
+  //@}
+
+  //@{
+  //! Set a matrix for the "sform" transformation stored in the file.
+  /*!
+   *  Unlike the qform matrix, the sform matrix can contain scaling
+   *  information.  Before being stored in the NIFTI header, the
+   *  first three columns of the matrix will be multipled by the voxel
+   *  spacing. In the NIFTI header, the sform_code will be set to 2.
+   */
   void SetSFormMatrix(vtkMatrix4x4 *);
   vtkMatrix4x4 *GetSFormMatrix() { return this->SFormMatrix; }
-
-  // Description:
-  // Set the NIFTI header information to use when writing the file.
-  // The data dimensions and pixdim from the supplied header will be
-  // ignored.  Likewise, the QForm and SForm information in the supplied
-  // header will be ignored if you have called SetQFormMatrix() or
-  // SetSFormMatrix() to provide the orientation information for the file.
+  //@}
+
+  //@{
+  //! Set the NIFTI header information to use when writing the file.
+  /*!
+   *  The data dimensions and pixdim from the supplied header will be
+   *  ignored.  Likewise, the QForm and SForm information in the supplied
+   *  header will be ignored if you have called SetQFormMatrix() or
+   *  SetSFormMatrix() to provide the orientation information for the file.
+   */
   void SetNIFTIHeader(vtkNIFTIHeader *hdr);
   vtkNIFTIHeader *GetNIFTIHeader();
+  //@}
 
 protected:
   vtkNIFTIWriter();
   ~vtkNIFTIWriter();
 
-  // Description:
-  // Generate the header information for the file.
+  //! Generate the header information for the file.
   int GenerateHeader(vtkInformation *info, bool singleFile);
 
-  // Description:
-  // The main execution method, which writes the file.
+  //! The main execution method, which writes the file.
   virtual int RequestData(vtkInformation *request,
                           vtkInformationVector** inputVector,
                           vtkInformationVector* outputVector);
 
-  // Description:
-  // Make a new filename by replacing extension "ext1" with "ext2".
-  // The extensions must include a period, must be three characters
-  // long, and must be lower case.  A new string is returned that must
-  // be deleted by the caller.
+  //! Make a new filename by replacing extension "ext1" with "ext2".
+  /*!
+   *  The extensions must include a period, must be three characters
+   *  long, and must be lower case.  A new string is returned that must
+   *  be deleted by the caller.
+   */
   static char *ReplaceExtension(
     const char *fname, const char *ext1, const char *ext2);
 
-  // Description:
-  // Time dimension to use in the file.
+  //! Time dimension to use in the file.
   int TimeDimension;
   double TimeSpacing;
 
-  // Description:
-  // Information for rescaling data to quantitative units.
+  //! Information for rescaling data to quantitative units.
   double RescaleIntercept;
   double RescaleSlope;
 
-  // Description:
-  // Set to -1 when VTK slice order is opposite to NIFTI slice order.
+  //! Set to -1 when VTK slice order is opposite to NIFTI slice order.
   double QFac;
 
-  // Description:
-  // The orientation matrices for the NIFTI file.
+  //! The orientation matrices for the NIFTI file.
   vtkMatrix4x4 *QFormMatrix;
   vtkMatrix4x4 *SFormMatrix;
 
-  // Description
-  // A description of how the file was produced.
+  //! A description of how the file was produced.
   char *Description;
 
-  // Description:
-  // The header information.
+  //! The header information.
   vtkNIFTIHeader *NIFTIHeader;
   vtkNIFTIHeader *OwnHeader;
   int NIFTIVersion;
 
-  // Description:
-  // Use planar RGB instead of the default (packed).
+  //! Use planar RGB instead of the default (packed).
   bool PlanarRGB;
 
 private:
-  vtkNIFTIWriter(const vtkNIFTIWriter&);  // Not implemented.
-  void operator=(const vtkNIFTIWriter&);  // Not implemented.
+  vtkNIFTIWriter(const vtkNIFTIWriter&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkNIFTIWriter&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkNIFTIWriter_h
diff --git a/Source/vtkScancoCTReader.cxx b/Source/vtkScancoCTReader.cxx
index 7fc9e37..9b379dd 100644
--- a/Source/vtkScancoCTReader.cxx
+++ b/Source/vtkScancoCTReader.cxx
@@ -25,6 +25,11 @@
 #include "vtkStreamingDemandDrivenPipeline.h"
 #include "vtkVersion.h"
 
+#ifdef _WIN32
+// To allow use of wchar_t paths on Windows
+#include "vtkDICOMFilePath.h"
+#endif
+
 #include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
@@ -146,22 +151,22 @@ int vtkScancoCTReader::CheckVersion(const char header[16])
   int fileType = 0;
 
   if (strncmp(header, "CTDATA-HEADER_V1", 16) == 0)
-    {
+  {
     fileType = 1;
-    }
+  }
   else if (strcmp(header, "AIMDATA_V030   ") == 0)
-    {
+  {
     fileType = 3;
-    }
+  }
   else
-    {
+  {
     int preHeaderSize = vtkScancoCTReader::DecodeInt(header);
     int imageHeaderSize = vtkScancoCTReader::DecodeInt(header + 4);
     if (preHeaderSize == 20 && imageHeaderSize == 140)
-      {
+    {
       fileType = 2;
-      }
     }
+  }
 
   return fileType;
 }
@@ -173,16 +178,16 @@ int vtkScancoCTReader::CanReadFile(const char *filename)
 
   bool canRead = false;
   if (infile.good())
-    {
+  {
     // header is a 512 byte block
     char buffer[512];
     infile.read(buffer, 512);
     if (!infile.bad())
-      {
+    {
       int fileType = vtkScancoCTReader::CheckVersion(buffer);
       canRead = (fileType > 0);
-      }
     }
+  }
 
   infile.close();
 
@@ -275,13 +280,13 @@ void vtkScancoCTReader::StripString(char *dest, const char *cp, size_t l)
 {
   char *dp = dest;
   for (size_t i = 0; i < l && *cp != '\0'; i++)
-    {
+  {
     *dp++ = *cp++;
-    }
+  }
   while (dp != dest && dp[-1] == ' ')
-    {
+  {
     dp--;
-    }
+  }
   *dp = '\0';
 }
 
@@ -289,9 +294,9 @@ void vtkScancoCTReader::StripString(char *dest, const char *cp, size_t l)
 int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
 {
   if (bytesRead < 512)
-    {
+  {
     return 0;
-    }
+  }
 
   char *h = this->RawHeader;
   vtkScancoCTReader::StripString(this->Version, h, 16); h += 16;
@@ -314,7 +319,7 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
   bool isRAD = (dataType == 9 || physdim[2] == 0);
 
   if (isRAD) // RAD file
-    {
+  {
     this->MeasurementIndex = vtkScancoCTReader::DecodeInt(h); h += 4;
     this->DataRange[0] = vtkScancoCTReader::DecodeInt(h); h += 4;
     this->DataRange[1] = vtkScancoCTReader::DecodeInt(h); h += 4;
@@ -329,9 +334,9 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
     this->StartPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
     this->EndPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
     h += 88*4;
-    }
+  }
   else // ISQ file or RSQ file
-    {
+  {
     this->SliceThickness = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
     this->SliceIncrement = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
     this->StartPosition = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
@@ -353,23 +358,23 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
     this->Energy = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
     this->Intensity = vtkScancoCTReader::DecodeInt(h)*1e-3; h += 4;
     h += 83*4;
-    }
+  }
 
   int dataOffset = vtkScancoCTReader::DecodeInt(h);
 
   // fix SliceThickness and SliceIncrement if they were truncated
   if (physdim[2] != 0)
-    {
+  {
     double computedSpacing = physdim[2]*1e-3/pixdim[2];
     if (fabs(computedSpacing - this->SliceThickness) < 1.1e-3)
-      {
+    {
       this->SliceThickness = computedSpacing;
-      }
+    }
     if (fabs(computedSpacing - this->SliceIncrement) < 1.1e-3)
-      {
+    {
       this->SliceIncrement = computedSpacing;
-      }
     }
+  }
 
   // Convert date information into a string
   month = ((month > 12 || month < 1) ? 0 : month);
@@ -387,19 +392,19 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
 
   // Perform a sanity check on the dimensions
   for (int i = 0; i < 3; i++)
-    {
+  {
     this->ScanDimensionsPixels[i] = pixdim[i];
     if (pixdim[i] < 1)
-      {
+    {
       pixdim[i] = 1;
-      }
+    }
     this->ScanDimensionsPhysical[i] =
       (isRAD ? physdim[i]*1e-6 : physdim[i]*1e-3);
     if (physdim[i] == 0)
-      {
+    {
       physdim[i] = 1.0;
-      }
     }
+  }
 
   this->SetDataExtent(0, pixdim[0]-1,
                       0, pixdim[1]-1,
@@ -408,17 +413,17 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
   this->SetDataOrigin(0.0, 0.0, 0.0);
 
   if (isRAD) // RAD file
-    {
+  {
     this->SetDataSpacing(physdim[0]*1e-6/pixdim[0],
                          physdim[1]*1e-6/pixdim[1],
                          1.0);
-    }
+  }
   else
-    {
+  {
     this->SetDataSpacing(physdim[0]*1e-3/pixdim[0],
                          physdim[1]*1e-3/pixdim[1],
                          physdim[2]*1e-3/pixdim[2]);
-    }
+  }
 
   this->SetDataScalarType(VTK_SHORT);
   this->SetNumberOfScalarComponents(1);
@@ -429,50 +434,50 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
 
   // read the rest of the header
   if (headerSize > bytesRead)
-    {
+  {
     h = new char[headerSize];
     memcpy(h, this->RawHeader, bytesRead);
     delete [] this->RawHeader;
     this->RawHeader = h;
     file->read(h + bytesRead, headerSize - bytesRead);
     if (static_cast<unsigned long>(file->gcount()) < headerSize - bytesRead)
-      {
+    {
       return 0;
-      }
     }
+  }
 
   // decode the extended header (lots of guesswork)
   if (headerSize >= 2048)
-    {
+  {
     char *calHeader = 0;
     int calHeaderSize = 0;
     h = this->RawHeader + 512;
     unsigned long hskip = 1;
     char *headerName = h + 8;
     if (strncmp(headerName, "MultiHeader     ", 16) == 0)
-      {
+    {
       h += 512;
       hskip += 1;
-      }
+    }
     unsigned long hsize = 0;
     for (int i = 0; i < 4; i++)
-      {
+    {
       hsize = vtkScancoCTReader::DecodeInt(h + i*128 + 24);
       if ((1 + hskip + hsize)*512 > headerSize)
-        {
+      {
         break;
-        }
+      }
       headerName = h + i*128 + 8;
       if (strncmp(headerName, "Calibration     ", 16) == 0)
-        {
+      {
         calHeader = this->RawHeader + (1 + hskip)*512;
         calHeaderSize = hsize*512;
-        }
-      hskip += hsize;
       }
+      hskip += hsize;
+    }
 
     if (calHeader && calHeaderSize >= 1024)
-      {
+    {
       h = calHeader;
       vtkScancoCTReader::StripString(this->CalibrationData, h + 28, 64);
       // std::string calFile(h + 112, 256);
@@ -484,14 +489,14 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
       this->RescaleSlope = vtkScancoCTReader::DecodeDouble(h + 664);
       this->RescaleIntercept = vtkScancoCTReader::DecodeDouble(h + 672);
       this->MuWater = vtkScancoCTReader::DecodeDouble(h + 688);
-      }
     }
+  }
 
   // Include conversion to linear att coeff in the rescaling
   if (this->MuScaling != 0)
-    {
+  {
     this->RescaleSlope /= this->MuScaling;
-    }
+  }
 
   return 1;
 }
@@ -500,27 +505,27 @@ int vtkScancoCTReader::ReadISQHeader(ifstream *file, unsigned long bytesRead)
 int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
 {
   if (bytesRead < 160)
-    {
+  {
     return 0;
-    }
+  }
 
   char *h = this->RawHeader;
   int intSize = 0;
   unsigned long headerSize = 0;
   if (strcmp(h, "AIMDATA_V030   ") == 0)
-    {
+  {
     // header uses 64-bit ints (8 bytes)
     intSize = 8;
     strcpy(this->Version, h);
     headerSize = 16;
     h += headerSize;
-    }
+  }
   else
-    {
+  {
     // header uses 32-bit ints (4 bytes)
     intSize = 4;
     strcpy(this->Version, "AIMDATA_V020   ");
-    }
+  }
 
   // read the pre-header
   char *preheader = h;
@@ -532,7 +537,7 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
   headerSize += preheaderSize + structSize + logSize;
   this->SetHeaderSize(headerSize);
   if (headerSize > bytesRead)
-    {
+  {
     h = new char[headerSize];
     memcpy(h, this->RawHeader, bytesRead);
     preheader = h + (preheader - this->RawHeader);
@@ -540,10 +545,10 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
     this->RawHeader = h;
     file->read(h + bytesRead, headerSize - bytesRead);
     if (static_cast<unsigned long>(file->gcount()) < headerSize - bytesRead)
-      {
+    {
       return 0;
-      }
     }
+  }
 
   // decode the struct header
   h = preheader + preheaderSize;
@@ -551,19 +556,19 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
   int dataType = vtkScancoCTReader::DecodeInt(h); h += 4;
   int structValues[21];
   for (int i = 0; i < 21; i++)
-    {
+  {
     structValues[i] = vtkScancoCTReader::DecodeInt(h); h += intSize;
-    }
+  }
   float elementSize[3];
   for (int i = 0; i < 3; i++)
-    {
+  {
     elementSize[i] = vtkScancoCTReader::DecodeFloat(h);
     if (elementSize[i] == 0)
-      {
+    {
       elementSize[i] = 1.0;
-      }
-    h += 4;
     }
+    h += 4;
+  }
 
   // number of components per pixel is 1 by default
   int scalarType = VTK_UNSIGNED_CHAR;
@@ -573,7 +578,7 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
   // a limited selection of data types are supported
   // (only 0x00010001 (char) and 0x00020002 (short) are fully tested)
   switch (dataType)
-    {
+  {
     case 0x00160001:
       scalarType = VTK_UNSIGNED_CHAR;
       break;
@@ -618,7 +623,7 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
     default:
       vtkErrorMacro("Unrecognized data type in AIM file: " << dataType);
       return 0;
-    }
+  }
 
   this->SetDataScalarType(scalarType);
   this->SetNumberOfScalarComponents(scalarComponents);
@@ -643,190 +648,190 @@ int vtkScancoCTReader::ReadAIMHeader(ifstream *file, unsigned long bytesRead)
   char *logEnd = h + logSize;
 
   while (h != logEnd && *h != '\0')
-    {
+  {
     // skip newline and go to next line
     if (*h == '\n')
-      {
+    {
       h++;
-      }
+    }
 
     // search for the end of this line
     char *lineEnd = h;
     while (lineEnd != logEnd && *lineEnd != '\n' && *lineEnd != '\0')
-      {
+    {
       lineEnd++;
-      }
+    }
 
     // if not a comment, search for keys
     if (h != lineEnd && *h != '!' && (*lineEnd == '\n' || *lineEnd == '\0'))
-      {
+    {
       // key and value are separated by multiple spaces
       char *key = h;
       while (h+1 != lineEnd && (h[0] != ' ' || h[1] != ' '))
-        {
+      {
         h++;
-        }
+      }
       // this gives the length of the key
       size_t keylen = h - key;
       // skip to the end of the spaces
       while (h != lineEnd && *h == ' ')
-        {
+      {
         h++;
-        }
+      }
       // this is where the value starts
       char *value = h;
       size_t valuelen = lineEnd - value;
       // look for trailing spaces
       while (valuelen > 0 &&
              (h[valuelen-1] == ' ' || h[valuelen-1] == '\r'))
-        {
+      {
         valuelen--;
-        }
+      }
 
       // convert into a std::string for convenience
       std::string skey(key, keylen);
 
       // check for known keys
       if (skey == "Time")
-        {
+      {
         valuelen = (valuelen > 31 ? 31 : valuelen);
         strncpy(this->ModificationDate, value, valuelen);
         this->ModificationDate[valuelen] = '\0';
-        }
+      }
       else if (skey == "Original Creation-Date")
-        {
+      {
         valuelen = (valuelen > 31 ? 31 : valuelen);
         strncpy(this->CreationDate, value, valuelen);
         this->CreationDate[valuelen] = '\0';
-        }
+      }
       else if (skey == "Orig-ISQ-Dim-p")
-        {
+      {
         for (int i = 0; i < 3; i++)
-          {
+        {
           this->ScanDimensionsPixels[i] = strtol(value, &value, 10);
-          }
         }
+      }
       else if (skey == "Orig-ISQ-Dim-um")
-        {
+      {
         for (int i = 0; i < 3; i++)
-          {
+        {
           this->ScanDimensionsPhysical[i] = strtod(value, &value)*1e-3;
-          }
         }
+      }
       else if (skey == "Patient Name")
-        {
+      {
         valuelen = (valuelen > 41 ? 41 : valuelen);
         strncpy(this->PatientName, value, valuelen);
         this->PatientName[valuelen] = '\0';
-        }
+      }
       else if (skey == "Index Patient")
-        {
+      {
         this->PatientIndex = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "Index Measurement")
-        {
+      {
         this->MeasurementIndex = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "Site")
-        {
+      {
         this->Site = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "Scanner ID")
-        {
+      {
         this->ScannerID = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "Scanner type")
-        {
+      {
         this->ScannerType = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "Position Slice 1 [um]")
-        {
+      {
         this->StartPosition = strtod(value, 0)*1e-3;
         this->EndPosition =
           this->StartPosition + elementSize[2]*(structValues[5] - 1);
-        }
+      }
       else if (skey == "No. samples")
-        {
+      {
         this->NumberOfSamples = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "No. projections per 180")
-        {
+      {
         this->NumberOfProjections = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "Scan Distance [um]")
-        {
+      {
         this->ScanDistance = strtod(value, 0)*1e-3;
-        }
+      }
       else if (skey == "Integration time [us]")
-        {
+      {
         this->SampleTime = strtod(value, 0)*1e-3;
-        }
+      }
       else if (skey == "Reference line [um]")
-        {
+      {
         this->ReferenceLine = strtod(value, 0)*1e-3;
-        }
+      }
       else if (skey == "Reconstruction-Alg.")
-        {
+      {
         this->ReconstructionAlg = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "Energy [V]")
-        {
+      {
         this->Energy = strtod(value, 0)*1e-3;
-        }
+      }
       else if (skey == "Intensity [uA]")
-        {
+      {
         this->Intensity = strtod(value, 0)*1e-3;
-        }
+      }
       else if (skey == "Mu_Scaling")
-        {
+      {
         this->MuScaling = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "Minimum data value")
-        {
+      {
         this->DataRange[0] = strtod(value, 0);
-        }
+      }
       else if (skey == "Maximum data value")
-        {
+      {
         this->DataRange[1] = strtod(value, 0);
-        }
+      }
       else if (skey == "Calib. default unit type")
-        {
+      {
         this->RescaleType = strtol(value, 0, 10);
-        }
+      }
       else if (skey == "Calibration Data")
-        {
+      {
         valuelen = (valuelen > 64 ? 64 : valuelen);
         strncpy(this->CalibrationData, value, valuelen);
         this->CalibrationData[valuelen] = '\0';
-        }
+      }
       else if (skey == "Density: unit")
-        {
+      {
         valuelen = (valuelen > 16 ? 16 : valuelen);
         strncpy(this->RescaleUnits, value, valuelen);
         this->RescaleUnits[valuelen] = '\0';
-        }
+      }
       else if (skey == "Density: slope")
-        {
+      {
         this->RescaleSlope = strtod(value, 0);
-        }
+      }
       else if (skey == "Density: intercept")
-        {
+      {
         this->RescaleIntercept = strtod(value, 0);
-        }
+      }
       else if (skey == "HU: mu water")
-        {
+      {
         this->MuWater = strtod(value, 0);
-        }
       }
+    }
     // skip to the end of the line
     h = lineEnd;
-    }
+  }
 
   // Include conversion to linear att coeff in the rescaling
   if (this->MuScaling != 0)
-    {
+  {
     this->RescaleSlope /= this->MuScaling;
-    }
+  }
 
   // these items are not in the processing log
   this->SliceThickness = elementSize[2];
@@ -848,20 +853,27 @@ int vtkScancoCTReader::RequestInformation(
 
   const char *filename = this->FileName;
   if (filename == 0)
-    {
+  {
     vtkErrorMacro("A filename must be specified");
     return 0;
-    }
+  }
 
   vtkDebugMacro("Opening ISQ/AIM file " << filename);
 
-  ifstream infile(filename, ios::in | ios::binary);
+#ifdef _WIN32
+  vtkDICOMFilePath fp(filename);
+  const wchar_t *ufilename = fp.Wide();
+#else
+  const char *ufilename = filename;
+#endif
+
+  ifstream infile(ufilename, ios::in | ios::binary);
   if (!infile.good())
-    {
+  {
     vtkErrorMacro("Cannot open file " << filename);
     this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
     return 0;
-    }
+  }
 
   // header is a 512 byte block
   delete [] this->RawHeader;
@@ -870,28 +882,28 @@ int vtkScancoCTReader::RequestInformation(
   int fileType = 0;
   unsigned long bytesRead = 0;
   if (!infile.bad())
-    {
+  {
     bytesRead = static_cast<unsigned long>(infile.gcount());
     fileType = vtkScancoCTReader::CheckVersion(this->RawHeader);
-    }
+  }
 
   if (fileType == 0)
-    {
+  {
     vtkErrorMacro(<< "Unrecognized header in " << filename);
     this->SetErrorCode(vtkErrorCode::UnrecognizedFileTypeError);
     infile.close();
     return 0;
-    }
+  }
 
   int returnValue = 0;
   if (fileType == 1)
-    {
+  {
     returnValue = this->ReadISQHeader(&infile, bytesRead);
-    }
+  }
   else
-    {
+  {
     returnValue = this->ReadAIMHeader(&infile, bytesRead);
-    }
+  }
 
   infile.close();
 
@@ -926,15 +938,15 @@ int vtkScancoCTReader::RequestData(
   vtkInformationVector* outputVector)
 {
   if (this->Compression == 0)
-    {
+  {
     return this->Superclass::RequestData(request, inputVector, outputVector);
-    }
+  }
 
   // check whether the reader is in an error state
   if (this->GetErrorCode() != vtkErrorCode::NoError)
-    {
+  {
     return 0;
-    }
+  }
 
   // which output port did the request come from
   int outputPort =
@@ -942,9 +954,9 @@ int vtkScancoCTReader::RequestData(
 
   // for now, this reader has only one output
   if (outputPort > 0)
-    {
+  {
     return 1;
-    }
+  }
 
   vtkInformation* outInfo = outputVector->GetInformationObject(0);
 
@@ -964,19 +976,19 @@ int vtkScancoCTReader::RequestData(
 
   const char *filename = 0;
   if (this->FileNames && this->FileNames->GetNumberOfValues() == 1)
-    {
+  {
     filename = this->FileNames->GetValue(0);
-    }
+  }
   else
-    {
+  {
     filename = this->GetFileName();
-    }
+  }
 
   if (filename == 0)
-    {
+  {
     vtkErrorMacro("A FileName must be provided");
     return 0;
-    }
+  }
 
   // get the pointer to the output
   unsigned char *dataPtr =
@@ -985,11 +997,11 @@ int vtkScancoCTReader::RequestData(
   // open the file
   ifstream infile(filename, ios::in | ios::binary);
   if (!infile.good())
-    {
+  {
     vtkErrorMacro("Cannot open file " << filename);
     this->SetErrorCode(vtkErrorCode::CannotOpenFileError);
     return 0;
-    }
+  }
 
   // seek to the data
   infile.seekg(this->HeaderSize);
@@ -997,10 +1009,10 @@ int vtkScancoCTReader::RequestData(
   // get the size of the compressed data
   int intSize = 4;
   if (strcmp(this->Version, "AIMDATA_V030   ") == 0)
-    {
+  {
     // header uses 64-bit ints (8 bytes)
     intSize = 8;
-    }
+  }
 
   // Dimensions of the data
   int xsize = (extent[1] - extent[0] + 1);
@@ -1015,7 +1027,7 @@ int vtkScancoCTReader::RequestData(
   size_t size = 0;
 
   if (this->Compression == 0x00b1)
-    {
+  {
     // Compute the size of the binary packed data
     size_t xinc = (xsize+1)/2;
     size_t yinc = (ysize+1)/2;
@@ -1023,38 +1035,38 @@ int vtkScancoCTReader::RequestData(
     size = xinc*yinc*zinc + 1;
     input = new char[size];
     infile.read(input, size);
-    }
+  }
   else if (this->Compression == 0x00b2 ||
            this->Compression == 0x00c2)
-    {
+  {
     // Get the size of the compressed data
     char head[8];
     infile.read(head, intSize);
     size = static_cast<unsigned int>(vtkScancoCTReader::DecodeInt(head));
     if (intSize == 8)
-      {
+    {
       // Read the high word of a 64-bit int
       unsigned int high = vtkScancoCTReader::DecodeInt(head + 4);
       size += (static_cast<vtkTypeUInt64>(high) << 32);
-      }
+    }
     input = new char[size - intSize];
     size -= intSize;
     infile.read(input, size);
-    }
+  }
 
   // confirm that enough data was read
   size_t shortread = size - infile.gcount();
   if (shortread != 0)
-    {
+  {
     this->SetErrorCode(vtkErrorCode::PrematureEndOfFileError);
     vtkErrorMacro("File is truncated, " << shortread << " bytes are missing");
-    }
+  }
 
   // Close the file
   infile.close();
 
   if (this->Compression == 0x00b1)
-    {
+  {
     // Unpack binary data, each byte becomes a 2x2x2 block of voxels
     size_t xinc = (xsize+1)/2;
     size_t yinc = (ysize+1)/2;
@@ -1062,89 +1074,89 @@ int vtkScancoCTReader::RequestData(
     v = (v == 0 ? 0x7f : v);
     unsigned char bit = 0;
     for (int i = 0; i < zsize; i++)
-      {
+    {
       bit ^= (bit & 2);
       for (int j = 0; j < ysize; j++)
-        {
+      {
         char *inPtr = input + (i*yinc + j)*xinc;
         bit ^= (bit & 1);
         for (int k = 0; k < xsize; k++)
-          {
+        {
           unsigned char c = *inPtr;
           *dataPtr++ = ((c >> bit) & 1)*v;
           inPtr += (bit & 1);
           bit ^= 1;
-          }
-        bit ^= 2;
         }
-      bit ^= 4;
+        bit ^= 2;
       }
+      bit ^= 4;
     }
+  }
   else if (this->Compression == 0x00b2)
-    {
+  {
     // Decompress binary run-lengths
     bool flip = 0;
     unsigned char v = input[flip];
     char *inPtr = input + 2;
     size -= 2;
     if (size > 0)
-      {
+    {
       do
-        {
+      {
         unsigned char l = *inPtr++;
         if (l == 255)
-          {
+        {
           l = 254;
           flip = !flip;
-          }
+        }
         if (l > outSize)
-          {
-          l = outSize;
-          }
+        {
+          l = static_cast<unsigned char>(outSize);
+        }
         outSize -= l;
         if (l > 0)
-          {
+        {
           do
-            {
+          {
             *dataPtr++ = v;
-            }
-          while (--l);
           }
+          while (--l);
+        }
         flip = !flip;
         v = input[flip];
-        }
-      while (--size != 0 && outSize != 0);
       }
+      while (--size != 0 && outSize != 0);
     }
+  }
   else if (this->Compression == 0x00c2)
-    {
+  {
     // Decompress 8-bit run-lengths
     char *inPtr = input;
     size /= 2;
     if (size > 0)
-      {
+    {
       do
-        {
+      {
         unsigned char l = inPtr[0];
         unsigned char v = inPtr[1];
         inPtr += 2;
         if (l > outSize)
-          {
-          l = outSize;
-          }
+        {
+          l = static_cast<unsigned char>(outSize);
+        }
         outSize -= l;
         if (l > 0)
-          {
+        {
           do
-            {
+          {
             *dataPtr++ = v;
-            }
-          while (--l);
           }
+          while (--l);
         }
-      while (--size != 0 && outSize != 0);
       }
+      while (--size != 0 && outSize != 0);
     }
+  }
 
   delete [] input;
 
diff --git a/Source/vtkScancoCTReader.h b/Source/vtkScancoCTReader.h
index b6780b5..1e39691 100644
--- a/Source/vtkScancoCTReader.h
+++ b/Source/vtkScancoCTReader.h
@@ -2,7 +2,7 @@
 
   Program: DICOM for VTK
 
-  Copyright (c) 2015 David Gobbi
+  Copyright (c) 2015-2016 David Gobbi
   All rights reserved.
   See Copyright.txt or http://dgobbi.github.io/bsd3.txt for details.
 
@@ -11,22 +11,24 @@
      PURPOSE.  See the above copyright notice for more information.
 
 =========================================================================*/
-// .NAME vtkScancoCTReader - Read SCANCO ISQ and AIM medical image files
-// .SECTION Description
-// This class reads ISQ and AIM files, which are used for high-resolution
-// computed tomography.  The information that it provides uses different
-// units as compared to the original files: all distances are given in
-// millimeters (instead of micrometers), times are given in milliseconds
-// (instead of microseconds), voltage and current given in kV and mA
-// (instead of volts and microamps).  If the scanner was calibrated, then
-// the data values can be converted to calibrated units.  To convert
-// to linear attenuation coefficients [cm^-1], simply divide the data
-// values by the MuScaling.  To convert to density values, multiply
-// the data values by the RescaleSlope and add the RescaleIntercept.
-// To convert to Hounsfield units, multiply by 1000/(MuScaling*MuWater)
-// and subtract 1000.
-// .SECTION Thanks
-// Created at the Calgary Image Processing and Analysis Centre (CIPAC).
+/*! \class vtkScancoCTReader
+ *  \brief Read SCANCO ISQ and AIM medical image files
+ *
+ *  This class reads ISQ and AIM files, which are used for high-resolution
+ *  computed tomography.  The information that it provides uses different
+ *  units as compared to the original files: all distances are given in
+ *  millimeters (instead of micrometers), times are given in milliseconds
+ *  (instead of microseconds), voltage and current given in kV and mA
+ *  (instead of volts and microamps).  If the scanner was calibrated, then
+ *  the data values can be converted to calibrated units.  To convert
+ *  to linear attenuation coefficients [cm^-1], simply divide the data
+ *  values by the MuScaling.  To convert to density values, multiply
+ *  the data values by the RescaleSlope and add the RescaleIntercept.
+ *  To convert to Hounsfield units, multiply by 1000/(MuScaling*MuWater)
+ *  and subtract 1000.
+ *
+ *  Created at the Calgary Image Processing and Analysis Centre (CIPAC).
+ */
 
 #ifndef vtkScancoCTReader_h
 #define vtkScancoCTReader_h
@@ -38,215 +40,179 @@
 class VTKDICOM_EXPORT vtkScancoCTReader : public vtkImageReader2
 {
 public:
-  // Description:
-  // Static method for construction.
+  //! Static method for construction.
   static vtkScancoCTReader *New();
   vtkTypeMacro(vtkScancoCTReader, vtkImageReader2);
 
-  // Description:
-  // Print information about this object.
+  //! Print information about this object.
   virtual void PrintSelf(ostream& os, vtkIndent indent);
 
-  // Description:
-  // Valid extensions for this file type.
+  //@{
+  //! Valid extensions for this file type.
   virtual const char* GetFileExtensions() {
     return ".isq .rsq .rad .aim" ; }
 
-  // Description:
-  // Return a descriptive name that might be useful in a GUI.
+  //! Return a descriptive name that might be useful in a GUI.
   virtual const char* GetDescriptiveName() {
     return "SCANCO MicroCT"; }
+  //@}
 
-  // Description:
-  // Return true if this reader can read the given file.
+  //@{
+  //! Return true if this reader can read the given file.
   int CanReadFile(const char* filename);
+  //@}
 
-  // Description:
-  // Get a string that states the version of the file header.
+  //@{
+  //! Get a string that states the version of the file header.
   const char *GetVersion() { return this->Version; }
 
-  // Description:
-  // Get the patient index from the header.
+  //! Get the patient index from the header.
   int GetPatientIndex() { return this->PatientIndex; }
 
-  // Description:
-  // Get the scanner ID from the header.
+  //! Get the scanner ID from the header.
   int GetScannerID() { return this->ScannerID; }
 
-  // Description:
-  // Get the creation date as a string.
+  //! Get the creation date as a string.
   const char *GetCreationDate() { return this->CreationDate; }
 
-  // Description:
-  // Get the date when the data was last modified.
+  //! Get the date when the data was last modified.
   const char *GetModificationDate() { return this->ModificationDate; }
 
-  // Description:
-  // Get the slice thickness in millimeters.
+  //! Get the slice thickness in millimeters.
   double GetSliceThickness() { return this->SliceThickness; }
 
-  // Description:
-  // Get the slice increment in millimeters.
+  //! Get the slice increment in millimeters.
   double GetSliceIncrement() { return this->SliceIncrement; }
 
-  // Description:
-  // Get the position of the first slice in millimeters.
+  //! Get the position of the first slice in millimeters.
   double GetStartPosition() { return this->StartPosition; }
 
-  // Description:
-  // Get the position of the final slice in millimeters.
+  //! Get the position of the final slice in millimeters.
   double GetEndPosition() { return this->EndPosition; }
 
-  // Description:
-  // Get the location of the edge of a locator scan.
+  //! Get the location of the edge of a locator scan.
   double GetZPosition() { return this->ZPosition; }
 
-  // Description:
-  // Get the data range, as stored in the file header.
+  //! Get the data range, as stored in the file header.
   vtkGetVector2Macro(DataRange, double);
 
-  // Description:
-  // Get the scaling factor from linear attenuation [1/cm] to data values.
+  //! Get the scaling factor from linear attenuation [1/cm] to data values.
   double GetMuScaling() { return this->MuScaling; }
 
-  // Description:
-  // Get the number of samples.
+  //! Get the number of samples.
   int GetNumberOfSamples() { return this->NumberOfSamples; }
 
-  // Description:
-  // Get the nubmer of projections.
+  //! Get the nubmer of projections.
   int GetNumberOfProjections() { return this->NumberOfProjections; }
 
-  // Description:
-  // Get the scan distance (in millimeters).
+  //! Get the scan distance (in millimeters).
   double GetScanDistance() { return this->ScanDistance; }
 
-  // Description:
-  // Get the scanner type, as an integer code.
+  //! Get the scanner type, as an integer code.
   int GetScannerType() { return this->ScannerType; }
 
-  // Description:
-  // Get the sample time (in milliseconds).
+  //! Get the sample time (in milliseconds).
   double GetSampleTime() { return this->SampleTime; }
 
-  // Description:
-  // Get the index measurement.
+  //! Get the index measurement.
   int GetMeasurementIndex() { return this->MeasurementIndex; }
 
-  // Description:
-  // Get an integer value that identifies the site on the body.
+  //! Get an integer value that identifies the site on the body.
   int GetSite() { return this->Site; }
 
-  // Description:
-  // Get the reference line (in millimeters).
+  //! Get the reference line (in millimeters).
   double GetReferenceLine() { return this->ReferenceLine; }
 
-  // Description:
-  // Get an integer value that identifies the reconstruction algorithm.
+  //! Get an integer value that identifies the reconstruction algorithm.
   int GetReconstructionAlg() { return this->ReconstructionAlg; }
 
-  // Description:
-  // Get a descriptive name for this scan.
+  //! Get a descriptive name for this scan.
   const char *GetPatientName() { return this->PatientName; }
 
-  // Description:
-  // Get the X-ray energy (in kVp).
+  //! Get the X-ray energy (in kVp).
   double GetEnergy() { return this->Energy; }
 
-  // Description:
-  // Get the X-ray intensity (in mA).
+  //! Get the X-ray intensity (in mA).
   double GetIntensity() { return this->Intensity; }
 
-  // Description:
-  // Get the slope and intercept for rescaling the scalar values.
-  // These values allow calibration of the data to real values.
-  // Use the equation v = u*RescaleSlope + RescaleIntercept.
+  //! Get the slope and intercept for rescaling the scalar values.
+  /*!
+   *  These values allow calibration of the data to real values.
+   *  Use the equation v = u*RescaleSlope + RescaleIntercept.
+   */
   double GetRescaleSlope() { return this->RescaleSlope; }
   double GetRescaleIntercept() { return this->RescaleIntercept; }
 
-  // Description:
-  // Get the rescale type as an integer code.
+  //! Get the rescale type as an integer code.
   int GetRescaleType() { return this->RescaleType; }
 
-  // Description:
-  // Get the units of the data after rescaling with slope and intercept.
+  //! Get the units of the data after rescaling with slope and intercept.
   const char *GetRescaleUnits() { return this->RescaleUnits; }
 
-  // Description:
-  // Get the linear attenuation of water, in units of [1/cm].
+  //! Get the linear attenuation of water, in units of [1/cm].
   double GetMuWater() { return this->MuWater; }
 
-  // Description:
-  // Get the calibration data (energy, filtration, etc.)
+  //! Get the calibration data (energy, filtration, etc.)
   const char *GetCalibrationData() { return this->CalibrationData; }
 
-  // Description:
-  // Get the full scan dimensions in pixels.
+  //! Get the full scan dimensions in pixels.
   vtkGetVector3Macro(ScanDimensionsPixels, int);
 
-  // Description:
-  // Get the full scan dimensions in millimeters.
+  //! Get the full scan dimensions in millimeters.
   vtkGetVector3Macro(ScanDimensionsPhysical, double);
 
-  // Description:
-  // Get the raw header information (512 bytes) from the file.
+  //! Get the raw header information (512 bytes) from the file.
   void *GetRawHeader() { return this->RawHeader; }
+  //@}
 
 protected:
   vtkScancoCTReader();
   ~vtkScancoCTReader();
 
-  // Description:
-  // Read the header information.
+  //! Read the header information.
   virtual int RequestInformation(
     vtkInformation* request, vtkInformationVector** inputVector,
     vtkInformationVector* outputVector);
 
-  // Description:
-  // Read the voxel data.
+  //! Read the voxel data.
   virtual int RequestData(
     vtkInformation* request, vtkInformationVector** inputVector,
     vtkInformationVector* outputVector);
 
-  // Description:
-  // Initialize the header information
+  //! Initialize the header information
   void InitializeHeader();
 
-  // Description:
-  // Read an ISQ header.
+  //! Read an ISQ header.
   int ReadISQHeader(ifstream *file, unsigned long bytesRead);
 
-  // Description:
-  // Read AIM header.
+  //! Read AIM header.
   int ReadAIMHeader(ifstream *file, unsigned long bytesRead);
 
-  // Description:
-  // Check the file header to see what type of file it is.
-  // Return values are: 0 if unrecognized, 1 if ISQ/RAD,
-  // 2 if AIM 020, 3 if AIM 030.
+  //! Check the file header to see what type of file it is.
+  /*!
+   *  Return values are: 0 if unrecognized, 1 if ISQ/RAD,
+   *  2 if AIM 020, 3 if AIM 030.
+   */
   static int CheckVersion(const char header[16]);
 
-  // Description:
-  // Convert a VMS timestamp to a calendar date.
+  //! Convert a VMS timestamp to a calendar date.
   void DecodeDate(const void *data,
     int& year, int& month, int& day,
     int& hour, int& minute, int& second, int& millis);
 
-  // Description:
-  // Convert char data to 32-bit int (little-endian).
+  //! Convert char data to 32-bit int (little-endian).
   static int DecodeInt(const void *data);
 
-  // Description:
-  // Convert char data to float (single precision).
+  //! Convert char data to float (single precision).
   static float DecodeFloat(const void *data);
 
-  // Description:
-  // Convert char data to float (double precision).
+  //! Convert char data to float (double precision).
   static double DecodeDouble(const void *data);
 
-  // Description:
-  // Strip a string by removing trailing whitespace.
-  // The dest must have a size of at least l+1.
+  //! Strip a string by removing trailing whitespace.
+  /*!
+   *  The dest must have a size of at least l+1.
+   */
   static void StripString(char *dest, const char *source, size_t l);
 
   // Header information
@@ -288,8 +254,8 @@ protected:
   int Compression;
 
 private:
-  vtkScancoCTReader(const vtkScancoCTReader&);  // Not implemented.
-  void operator=(const vtkScancoCTReader&);  // Not implemented.
+  vtkScancoCTReader(const vtkScancoCTReader&) VTK_DELETE_FUNCTION;
+  void operator=(const vtkScancoCTReader&) VTK_DELETE_FUNCTION;
 };
 
 #endif // vtkScancoCTReader_h
diff --git a/Testing/CMakeLists.txt b/Testing/CMakeLists.txt
index 240e7c6..7f08796 100644
--- a/Testing/CMakeLists.txt
+++ b/Testing/CMakeLists.txt
@@ -1,9 +1,6 @@
 include_directories(${DICOM_INCLUDE_DIRS})
 
 set(BASE_LIBS vtkDICOM ${VTK_LIBS})
-if(USE_DCMTK AND DCMTK_charls_LIBRARY)
- set(BASE_LIBS ${BASE_LIBS} ${DCMTK_charls_LIBRARY})
-endif()
 
 add_executable(TestDICOMDictionary TestDICOMDictionary.cxx)
 target_link_libraries(TestDICOMDictionary ${BASE_LIBS})
@@ -50,6 +47,11 @@ target_link_libraries(TestDICOMUtilities ${BASE_LIBS})
 get_target_property(pth TestDICOMUtilities RUNTIME_OUTPUT_DIRECTORY)
 add_test(TestDICOMUtilities ${pth}/TestDICOMUtilities)
 
+add_executable(TestDICOMFilePath TestDICOMFilePath.cxx)
+target_link_libraries(TestDICOMFilePath ${BASE_LIBS})
+get_target_property(pth TestDICOMFilePath RUNTIME_OUTPUT_DIRECTORY)
+add_test(TestDICOMFilePath ${pth}/TestDICOMFilePath)
+
 if(BUILD_PYTHON_WRAPPERS)
   if(NOT VTK_PYTHON_EXE)
     get_target_property(WRAP_PYTHON_PATH vtkWrapPython LOCATION_<CONFIG>)
@@ -70,6 +72,27 @@ if(BUILD_PYTHON_WRAPPERS)
   endif()
 endif()
 
+if(BUILD_TCL_WRAPPERS)
+  if(CMAKE_CONFIGURATION_TYPES)
+    if(NOT VTK_TCL_EXE)
+      get_target_property(WRAP_TCL_PATH vtkWrapTcl LOCATION_<CONFIG>)
+      get_filename_component(VTK_EXE_DIR ${WRAP_TCL_PATH} PATH)
+      find_program(VTK_TCL_EXE vtk "${VTK_EXE_DIR}")
+    endif()
+    if(NOT VTK_TCL_EXE)
+      # fall back to using tclsh
+      set(VTK_TCL_EXE ${TCL_TCLSH})
+    endif()
+    add_test(TestDICOMTcl "${VTK_TCL_EXE}"
+      "${CMAKE_CURRENT_SOURCE_DIR}/TestDICOMTcl.tcl")
+  else()
+    add_test(TestDICOMTcl "${TCL_TCLSH}"
+      "${CMAKE_CURRENT_SOURCE_DIR}/TestDICOMTcl.tcl")
+    set_tests_properties(TestDICOMTcl PROPERTIES ENVIRONMENT
+      "TCLLIBPATH={${VTK_DIR}/Wrapping/Tcl} {${CMAKE_LIBRARY_OUTPUT_DIRECTORY}}")
+  endif()
+endif()
+
 if(BUILD_JAVA_WRAPPERS)
   set(_sep ":")
   if(WIN32)
diff --git a/Testing/TestDICOMCharacterSet.cxx b/Testing/TestDICOMCharacterSet.cxx
index 5fa319a..80ad172 100644
--- a/Testing/TestDICOMCharacterSet.cxx
+++ b/Testing/TestDICOMCharacterSet.cxx
@@ -75,19 +75,19 @@ int main(int argc, char *argv[])
 
   { // test the listed encodings
   for (int i = 0; ClunieText[i][0] != 0; i++)
-    {
+  {
     std::string name = ClunieText[i][0];
     std::string utf = ClunieText[i][1];
     std::string raw = ClunieText[i][2];
     vtkDICOMCharacterSet cs(name);
     std::string s = cs.ConvertToUTF8(raw.c_str(), raw.length());
     TestAssert(s == utf);
-    }
+  }
   }
 
   { // test storing values in their native encoding in an item
   for (int i = 0; ClunieText[i][0] != 0; i++)
-    {
+  {
     std::string name = ClunieText[i][0];
     std::string utf = ClunieText[i][1];
     std::string raw = ClunieText[i][2];
@@ -98,12 +98,12 @@ int main(int argc, char *argv[])
     TestAssert(s == utf);
     std::string t = item.GetAttributeValue(DC::PatientName).GetUTF8String(0);
     TestAssert(t == utf);
-    }
+  }
   }
 
   { // test storing values in their native encoding in metadata
   for (int i = 0; ClunieText[i][0] != 0; i++)
-    {
+  {
     std::string name = ClunieText[i][0];
     std::string utf = ClunieText[i][1];
     std::string raw = ClunieText[i][2];
@@ -115,12 +115,12 @@ int main(int argc, char *argv[])
     TestAssert(s == utf);
     std::string t = meta->GetAttributeValue(DC::PatientName).GetUTF8String(0);
     TestAssert(t == utf);
-    }
+  }
   }
 
   { // test storing multiple values in their native encoding in metadata
   for (int i = 0; ClunieText[i][0] != 0; i++)
-    {
+  {
     std::string name = ClunieText[i][0];
     std::string utf = ClunieText[i][1];
     std::string raw = ClunieText[i][2];
@@ -132,7 +132,7 @@ int main(int argc, char *argv[])
     meta->SetAttributeValue(1, DC::PatientName, raw);
     std::string s = meta->GetAttributeValue(1, DC::PatientName).AsUTF8String();
     TestAssert(s == utf);
-    }
+  }
   }
 
   { // test for proper escaping of backslashes in GB18030
@@ -169,5 +169,14 @@ int main(int argc, char *argv[])
   TestAssert(v.GetString(2) == "\x1b$B$d$^$@\x1b(J^\x1b$B$\x3f$m$&\x1b(J");
   }
 
+  { // test for handling of utf-16 surrogates encoded in utf-8
+  vtkDICOMCharacterSet cs = vtkDICOMCharacterSet::ISO_IR_192;
+  // the following string has a matched surrogate pair
+  std::string raw = "\xed\xa1\x80\xed\xb3\x8c"; // D840 DCCC
+  // case folding causes decoding + encoding
+  std::string cooked = cs.CaseFoldedUTF8(raw.data(), raw.length());
+  TestAssert(cooked == "\xf0\xa0\x83\x8c"); // 0200CC
+  }
+
   return rval;
 }
diff --git a/Testing/TestDICOMFilePath.cxx b/Testing/TestDICOMFilePath.cxx
new file mode 100644
index 0000000..dcd720b
--- /dev/null
+++ b/Testing/TestDICOMFilePath.cxx
@@ -0,0 +1,205 @@
+#include "vtkDICOMFilePath.h"
+
+#include <string>
+
+#include <string.h>
+#include <stdlib.h>
+
+// macro for performing tests
+#define TestAssert(t) \
+if (!(t)) \
+{ \
+  cout << exename << ": Assertion Failed: " << #t << "\n"; \
+  cout << __FILE__ << ":" << __LINE__ << "\n"; \
+  cout.flush(); \
+  rval |= 1; \
+}
+
+int main(int argc, char *argv[])
+{
+  int rval = 0;
+  const char *exename = (argc > 0 ? argv[0] : "TestDICOMFilePath");
+
+  // remove path portion of exename
+  const char *cp = exename + strlen(exename);
+  while (cp != exename && cp[-1] != '\\' && cp[-1] != '/') { --cp; }
+  exename = cp;
+
+  // Test common to all platforms
+
+  { // test the constructor
+  vtkDICOMFilePath path1("/hello/");
+  TestAssert(path1.AsString() == "/hello");
+  vtkDICOMFilePath path2("/");
+  TestAssert(path2.AsString() == "/");
+  vtkDICOMFilePath path3("");
+  TestAssert(path3.AsString() == "");
+  }
+
+  { // test push and pop for absolute paths
+  vtkDICOMFilePath path("/hello");
+  path.PushBack("world");
+  TestAssert(path.AsString() == "/hello/world");
+  TestAssert(path.GetBack() == "world");
+  path.PopBack();
+  path.PushBack("world/");
+  TestAssert(path.AsString() == "/hello/world");
+  TestAssert(path.GetBack() == "world");
+  path.PopBack();
+  TestAssert(path.AsString() == "/hello");
+  path.PushBack("/world");
+  TestAssert(path.AsString() == "/hello");
+  path.PushBack("world/");
+  TestAssert(path.AsString() == "/hello/world");
+  path.PushBack("/");
+  TestAssert(path.AsString() == "/hello/world");
+  path.PopBack();
+  path.PopBack();
+  TestAssert(path.AsString() == "/");
+  path.PopBack();
+  TestAssert(path.AsString() == "/");
+  TestAssert(path.IsRoot());
+  TestAssert(!path.IsEmpty());
+  }
+
+  { // test push and pop for relative paths
+  vtkDICOMFilePath path("hello");
+  path.PushBack("world");
+  TestAssert(path.AsString() == "hello/world");
+  TestAssert(path.GetBack() == "world");
+  path.PopBack();
+  TestAssert(path.AsString() == "hello");
+  path.PopBack();
+  TestAssert(path.AsString() == "");
+  path.PopBack();
+  TestAssert(path.AsString() == "");
+  TestAssert(path.IsEmpty());
+  TestAssert(!path.IsRoot());
+  }
+
+  { // test join
+  vtkDICOMFilePath path("/hello");
+  TestAssert(path.Join("world") == "/hello/world");
+  TestAssert(path.Join("/world") == "/world");
+  TestAssert(path.Join("/") == "/");
+  }
+
+  { // test extension
+  vtkDICOMFilePath path("/hello");
+  TestAssert(path.GetExtension() == "");
+  path.PushBack("world.wld");
+  TestAssert(path.GetExtension() == ".wld");
+  path.PushBack("space.tar.gz");
+  TestAssert(path.GetExtension() == ".gz");
+  path.PopExtension();
+  TestAssert(path.GetExtension() == ".tar");
+  path.PopExtension();
+  TestAssert(path.GetExtension() == "");
+  TestAssert(path.AsString() == "/hello/world.wld/space");
+  path.PushExtension("");
+  TestAssert(path.AsString() == "/hello/world.wld/space");
+  path.PushExtension(".");
+  TestAssert(path.AsString() == "/hello/world.wld/space");
+  path.PushExtension("/");
+  TestAssert(path.AsString() == "/hello/world.wld/space");
+  path.PushExtension("./");
+  TestAssert(path.AsString() == "/hello/world.wld/space");
+  path.PushExtension(".com");
+  TestAssert(path.AsString() == "/hello/world.wld/space.com");
+  }
+
+#ifdef _WIN32
+  { // test the various roots
+  TestAssert(vtkDICOMFilePath("\\").IsRoot());
+  TestAssert(vtkDICOMFilePath("/").IsRoot());
+  TestAssert(vtkDICOMFilePath("f:").IsRoot());
+  TestAssert(vtkDICOMFilePath("E:\\").IsRoot());
+  TestAssert(vtkDICOMFilePath("E:/").IsRoot());
+  TestAssert(vtkDICOMFilePath("\\\\server\\share").IsRoot());
+  TestAssert(vtkDICOMFilePath("//server/share").IsRoot());
+  }
+
+  { // test stripping of trailing slash from root
+  vtkDICOMFilePath path1("C:");
+  TestAssert(path1.AsString() == "C:");
+  vtkDICOMFilePath path2("C:\\");
+  TestAssert(path2.AsString() == "C:\\");
+  vtkDICOMFilePath path3("\\\\server\\share\\");
+  TestAssert(path3.AsString() == "\\\\server\\share");
+  }
+
+  { // test separator
+  vtkDICOMFilePath path1("");
+  path1.PushBack("hello");
+  path1.PushBack("there");
+  TestAssert(path1.AsString() == "hello/there");
+  vtkDICOMFilePath path2("\\");
+  path2.PushBack("hello");
+  path2.PushBack("there");
+  TestAssert(path2.AsString() == "\\hello\\there");
+  }
+
+  { // test special rules for device paths
+  vtkDICOMFilePath path1("E:\\hello");
+  TestAssert(path1.Join("\\") == "E:\\");
+  TestAssert(path1.Join("E:world") == "E:\\hello\\world");
+  TestAssert(path1.Join("D:world") == "D:world");
+  TestAssert(path1.Join("E:\\world") == "E:\\world");
+  vtkDICOMFilePath path2("E:");
+  TestAssert(path2.Join("\\world") == "E:\\world");
+  TestAssert(path2.Join("\\") == "E:\\");
+  path2.PushBack("D:");
+  TestAssert(path2.AsString() == "E:");
+  path2.PushBack("D:\\");
+  TestAssert(path2.AsString() == "E:");
+  path2.PushBack("D:\\hello");
+  TestAssert(path2.AsString() == "E:");
+  path2.PushBack("\\\\server\\share");
+  TestAssert(path2.AsString() == "E:");
+  path2.PushBack("\\hello");
+  TestAssert(path2.AsString() == "E:\\hello");
+  path2.PushBack("world");
+  TestAssert(path2.AsString() == "E:\\hello\\world");
+  }
+
+  { // test UNC path names
+  vtkDICOMFilePath path1("\\\\server\\share");
+  TestAssert(path1.Join("\\") == "\\");
+  TestAssert(path1.Join("\\dir") == "\\dir");
+  TestAssert(path1.Join("dir") == "\\\\server\\share\\dir");
+  vtkDICOMFilePath path2("//server/share");
+  TestAssert(path2.Join("/") == "/");
+  TestAssert(path2.Join("/dir") == "/dir");
+  TestAssert(path2.Join("dir") == "//server/share/dir");
+  vtkDICOMFilePath path3("//server/share/dir");
+  path3.PopBack();
+  TestAssert(path3.AsString() == "//server/share");
+  path3.PopBack();
+  TestAssert(path3.AsString() == "//server/share");
+  }
+
+  { // test the extended prefix
+  TestAssert(vtkDICOMFilePath("\\\\\?\\").IsRoot());
+  TestAssert(vtkDICOMFilePath("\\\\.\\").IsRoot());
+  TestAssert(vtkDICOMFilePath("\\\\\?\\D:").IsRoot());
+  TestAssert(vtkDICOMFilePath("\\\\\?\\D:\\").IsRoot());
+  TestAssert(vtkDICOMFilePath("\\\\\?\\UNC\\server\\share").IsRoot());
+  vtkDICOMFilePath path1("\\\\\?\\");
+  path1.PushBack("D:/");
+  TestAssert(path1.AsString() == "\\\\\?\\D:\\");
+  path1.PushBack(".");
+  TestAssert(path1.AsString() == "\\\\\?\\D:\\");
+  path1.PushBack("..");
+  TestAssert(path1.AsString() == "\\\\\?\\D:\\");
+  path1.PushBack("hello");
+  TestAssert(path1.AsString() == "\\\\\?\\D:\\hello");
+  path1.PushBack("..");
+  TestAssert(path1.AsString() == "\\\\\?\\D:\\");
+  path1.PushBack("hello/../world/./");
+  TestAssert(path1.AsString() == "\\\\\?\\D:\\world");
+  }
+
+#endif
+
+  return rval;
+}
diff --git a/Testing/TestDICOMMetaData.cxx b/Testing/TestDICOMMetaData.cxx
index 13a16ae..81303a2 100644
--- a/Testing/TestDICOMMetaData.cxx
+++ b/Testing/TestDICOMMetaData.cxx
@@ -106,23 +106,23 @@ int main(int argc, char *argv[])
   int n = metaData->GetNumberOfDataElements();
   TestAssert(n == 2);
   for (int i = 0; i < n; i++)
-    {
+  {
     if (i == 0)
-      {
+    {
       TestAssert(iter->GetTag() == DC::AcquisitionDateTime);
       TestAssert(iter->GetVR() == vtkDICOMVR::DT);
       TestAssert(iter->GetValue().GetVL() == 26);
       TestAssert(iter->GetValue().AsString() == acquisitionTime);
-      }
+    }
     else
-      {
+    {
       TestAssert(iter->GetTag() == DC::Modality);
       TestAssert(iter->GetVR() == vtkDICOMVR::CS);
       TestAssert(iter->GetValue().GetVL() == 2);
       TestAssert(iter->GetValue().AsString() == "CT");
-      }
-    ++iter;
     }
+    ++iter;
+  }
   TestAssert(iter == iterEnd);
   metaData->Clear();
 
@@ -136,14 +136,14 @@ int main(int argc, char *argv[])
   n = metaData->GetNumberOfDataElements();
   TestAssert(n == 2);
   for (int i = 0; i < n; i++)
-    {
+  {
     if (i == 0)
-      {
+    {
       TestAssert(iter->GetTag() == DC::AcquisitionDateTime);
       TestAssert(iter->GetValue().AsString() == acquisitionTime);
-      }
+    }
     else
-      {
+    {
       // two values multiplexed together in one value
       TestAssert(iter->GetTag() == DC::Modality);
       vtkDICOMValue v = iter->GetValue();
@@ -151,9 +151,9 @@ int main(int argc, char *argv[])
       const vtkDICOMValue *vp = v.GetMultiplexData();
       TestAssert(vp[0].AsString() == "CT");
       TestAssert(vp[1].AsString() == "MR");
-      }
-    ++iter;
     }
+    ++iter;
+  }
   TestAssert(iter == iterEnd);
   metaData->Clear();
 
@@ -166,12 +166,12 @@ int main(int argc, char *argv[])
   TestAssert(iter->GetValue().AsString() == acquisitionTime);
   iter = metaData->Find(DC::Modality);
   if (iter != metaData->End())
-    {
+  {
     vtkDICOMValue v = iter->GetValue();
     const vtkDICOMValue *vp = v.GetMultiplexData();
     TestAssert(vp[0].AsString() == "CT");
     TestAssert(vp[1].AsString() == "MR");
-    }
+  }
   iter = metaData->Find(DC::StudyDate);
   TestAssert(iter == metaData->End());
   metaData->Clear();
@@ -188,7 +188,7 @@ int main(int argc, char *argv[])
 
   // only add one item to the outer sequence
   for (int i = 0; i < 1; i++)
-    {
+  {
     // add the first data element to the item
     vtkDICOMItem item(metaData);
     item.SetAttributeValue(DC::SeriesInstanceUID,
@@ -200,7 +200,7 @@ int main(int argc, char *argv[])
 
     // add ten items to this sequence
     for (int j = 0; j < 10; j++)
-      {
+    {
       // create a unique InstanceUID
       sprintf(instanceUID, instanceUIDFormat, 255+j);
       vtkDICOMItem item2(metaData);
@@ -209,14 +209,14 @@ int main(int argc, char *argv[])
       item2.SetAttributeValue(DC::ReferencedSOPInstanceUID,
         vtkDICOMValue(vtkDICOMVR::UI, instanceUID));
       seq2.AddItem(item2);
-      }
+    }
 
     // create the ReferencedInstanceSequence from the items
     item.SetAttributeValue(DC::ReferencedInstanceSequence, seq2);
 
     // add this sequence-containing item to the original sequence
     seq.SetItem(i, item);
-    }
+  }
 
   // test nested access with tag path
   metaData->SetAttributeValue(DC::ReferencedSeriesSequence, seq);
@@ -225,11 +225,11 @@ int main(int argc, char *argv[])
                     DC::SeriesInstanceUID));
   TestAssert(v2.GetCharData() != 0);
   if (v2.GetCharData())
-    {
+  {
     TestAssert(
       strcmp(v2.GetCharData(),
              "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239") == 0);
-    }
+  }
 
   // test access two levels deep
   v2 = metaData->GetAttributeValue(
@@ -238,9 +238,9 @@ int main(int argc, char *argv[])
                     DC::ReferencedSOPClassUID));
   TestAssert(v2.GetCharData() != 0);
   if (v2.GetCharData())
-    {
+  {
     TestAssert(strcmp(v2.GetCharData(), "1.2.840.10008.5.1.4.1.1.4") == 0);
-    }
+  }
 
   metaData->Clear();
 
@@ -253,7 +253,7 @@ int main(int argc, char *argv[])
                   "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239"));
 
   for (int j = 0; j < 10; j++)
-    {
+  {
     // create a unique InstanceUID
     sprintf(instanceUID, instanceUIDFormat, 255+j);
     metaData->SetAttributeValue(
@@ -266,7 +266,7 @@ int main(int argc, char *argv[])
                       DC::ReferencedInstanceSequence, j,
                       DC::ReferencedSOPInstanceUID),
       instanceUID);
-    }
+  }
 
   // test nested access with tag path
   v2 = metaData->GetAttributeValue(
@@ -274,11 +274,11 @@ int main(int argc, char *argv[])
                     DC::SeriesInstanceUID));
   TestAssert(v2.GetCharData() != 0);
   if (v2.GetCharData())
-    {
+  {
     TestAssert(
       strcmp(v2.GetCharData(),
              "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239") == 0);
-    }
+  }
 
   // test access two levels deep
   v2 = metaData->GetAttributeValue(
@@ -287,20 +287,20 @@ int main(int argc, char *argv[])
                     DC::ReferencedSOPClassUID));
   TestAssert(v2.GetCharData() != 0);
   if (v2.GetCharData())
-    {
+  {
     TestAssert(strcmp(v2.GetCharData(), "1.2.840.10008.5.1.4.1.1.4") == 0);
-    }
+  }
   v2 = metaData->GetAttributeValue(
     vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0,
                     DC::ReferencedInstanceSequence, 8,
                     DC::ReferencedSOPInstanceUID));
   TestAssert(v2.GetCharData() != 0);
   if (v2.GetCharData())
-    {
+  {
     TestAssert(0 == strcmp(
       v2.GetCharData(),
       "1.2.840.113619.2.176.2025.4110284.7408.1276101323.263"));
-    }
+  }
 
   metaData->Clear();
 
@@ -410,11 +410,11 @@ int main(int argc, char *argv[])
   TestAssert(!v2.IsValid());
   v2 = metaData->GetAttributeValue(vtkDICOMTagPath(DC::SeriesInstanceUID));
   if (v2.GetCharData())
-    {
+  {
     TestAssert(
       strcmp(v2.GetCharData(),
              "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239") == 0);
-    }
+  }
 
   // test using a tag path with a private sequence
   metaData->SetAttributeValue(
@@ -465,12 +465,12 @@ int main(int argc, char *argv[])
                     DC::SeriesInstanceUID),
     "1.2.840.113619.2.176.2025.4110284.747");
   for (int i = 0; i < 3; i++)
-    {
+  {
     v2 = metaData->GetAttributeValue(i,
       vtkDICOMTagPath(DC::ReferencedSeriesSequence, 0,
                       DC::SeriesInstanceUID));
     TestAssert(v2.AsString() == "1.2.840.113619.2.176.2025.4110284.747");
-    }
+  }
 
   metaData->Clear();
 
diff --git a/Testing/TestDICOMSequence.cxx b/Testing/TestDICOMSequence.cxx
index 19bf0c3..741615a 100644
--- a/Testing/TestDICOMSequence.cxx
+++ b/Testing/TestDICOMSequence.cxx
@@ -24,13 +24,13 @@ bool StringsEqual(const char *s1, const char *s2)
 {
   bool result = true;
   if (s1 != s2)
-    {
+  {
     result = false;
     if (s1 != 0 && s2 != 0)
-      {
+    {
       result = (strcmp(s1, s2) == 0);
-      }
     }
+  }
   return result;
 }
 
@@ -57,7 +57,7 @@ int main(int argc, char *argv[])
 
   // only add one item to the sequence
   for (int i = 0; i < 1; i++)
-    {
+  {
     // add the first data element to the item
     vtkDICOMItem item;
     item.SetAttributeValue(DC::SeriesInstanceUID,
@@ -69,7 +69,7 @@ int main(int argc, char *argv[])
 
     // add ten items to this sequence
     for (int j = 0; j < 10; j++)
-      {
+    {
       // create a unique InstanceUID
       sprintf(instanceUID, instanceUIDFormat, 255+j);
       vtkDICOMItem item2;
@@ -78,17 +78,17 @@ int main(int argc, char *argv[])
       item2.SetAttributeValue(DC::ReferencedSOPInstanceUID,
         vtkDICOMValue(vtkDICOMVR::UI, instanceUID));
       seq2.AddItem(item2);
-      }
+    }
 
     // create the ReferencedInstanceSequence from the items
     item.SetAttributeValue(DC::ReferencedInstanceSequence, seq2);
 
     // add this sequence-containing item to the original sequence
     seq.SetItem(i, item);
-    }
+  }
 
   // do the tests
-  unsigned int n = seq.GetNumberOfItems();
+  size_t n = seq.GetNumberOfItems();
   TestAssert(n == 1);
 
   // use iterator to go through the elements in each item
@@ -104,28 +104,28 @@ int main(int argc, char *argv[])
 
   // go through the item in ReferencedSeriesSequence
   for (iter = ip1->Begin(); iter != ip1->End(); ++iter)
-    {
+  {
     // make sure SeriesInstanceUID was found
     if (iter->GetTag() == DC::SeriesInstanceUID)
-      {
+    {
       found1 = true;
       TestAssert(StringsEqual(iter->GetValue().GetCharData(),
         "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239"));
-      }
+    }
     // make sure ReferencedInstanceSequence was found
     if (iter->GetTag() == DC::ReferencedInstanceSequence)
-      {
+    {
       found2 = true;
       vtkDICOMDataElementIterator iter2;
 
       // get the nested sequence
       vtkDICOMSequence v2 = iter->GetValue();
-      unsigned int m = v2.GetNumberOfItems();
+      size_t m = v2.GetNumberOfItems();
       TestAssert(m == 10);
 
       // go through the 10 items in the sequence
-      for (unsigned int j = 0; j < m; j++)
-        {
+      for (size_t j = 0; j < m; j++)
+      {
         // check the two elements in each item
         const vtkDICOMItem &item = v2.GetItem(j);
         TestAssert(item.GetNumberOfDataElements() == 2);
@@ -135,10 +135,10 @@ int main(int argc, char *argv[])
         v3 = item.GetAttributeValue(DC::ReferencedSOPInstanceUID);
         sprintf(instanceUID, instanceUIDFormat, 255+j);
         TestAssert(StringsEqual(v3.GetCharData(), instanceUID));
-        }
       }
-    fullcount++;
     }
+    fullcount++;
+  }
 
   // check that there were two elements in the ReferencedSeriesSequence item
   TestAssert(fullcount == 2);
@@ -170,13 +170,13 @@ int main(int argc, char *argv[])
   TestAssert(val3.GetNumberOfValues() == 0);
 
   for (int i = 0; i < 1; i++)
-    {
+  {
     vtkDICOMItem item;
     item.SetAttributeValue(DC::SeriesInstanceUID,
       vtkDICOMValue(vtkDICOMVR::UI,
         "1.2.840.113619.2.176.2025.4110284.7478.1276100777.239"));
     seq3.AddItem(item);
-    }
+  }
 
   TestAssert(seq3.GetNumberOfItems() == 1);
 
diff --git a/Testing/TestDICOMTcl.tcl b/Testing/TestDICOMTcl.tcl
new file mode 100644
index 0000000..33c01a8
--- /dev/null
+++ b/Testing/TestDICOMTcl.tcl
@@ -0,0 +1,13 @@
+package require vtk
+package require vtkdicom
+
+vtkDICOMMetaData meta
+vtkDICOMReader reader
+vtkDICOMWriter writer
+writer SetInputConnection [reader GetOutputPort]
+
+meta Delete
+reader Delete
+writer Delete
+
+exit 0
diff --git a/Testing/TestDICOMUtilities.cxx b/Testing/TestDICOMUtilities.cxx
index e2194f2..d4b65ba 100644
--- a/Testing/TestDICOMUtilities.cxx
+++ b/Testing/TestDICOMUtilities.cxx
@@ -54,9 +54,9 @@ int main(int argc, char *argv[])
   a->SetNumberOfValues(10);
   DU::GenerateUIDs(DC::SeriesInstanceUID, a);
   for (int i = 0; i < 9; i++)
-    {
+  {
     TestAssert(DU::CompareUIDs(a->GetValue(i), a->GetValue(i+1)) < 0);
-    }
+  }
   }
 
   { // Test UID generation with given prefix
@@ -67,9 +67,9 @@ int main(int argc, char *argv[])
   a->SetNumberOfValues(10);
   DU::GenerateUIDs(DC::SeriesInstanceUID, a);
   for (int i = 0; i < 9; i++)
-    {
+  {
     TestAssert(DU::CompareUIDs(a->GetValue(i), a->GetValue(i+1)) < 0);
-    }
+  }
   }
 
   { // Test DateTime generation
diff --git a/Testing/TestDICOMVR.cxx b/Testing/TestDICOMVR.cxx
index 75706dc..4bd180d 100644
--- a/Testing/TestDICOMVR.cxx
+++ b/Testing/TestDICOMVR.cxx
@@ -221,13 +221,13 @@ int main(int argc, char *argv[])
   };
 
   for (int i = 0; i < 34; i++)
-    {
+  {
     TestAssert(hasLongVL[i] == vrs[i].HasLongVL());
     TestAssert(hasSpecificCharacterSet[i] == vrs[i].HasSpecificCharacterSet());
     TestAssert(hasTextValue[i] == vrs[i].HasTextValue());
     TestAssert(hasNumericValue[i] == vrs[i].HasNumericValue());
     TestAssert(hasSingleValue[i] == vrs[i].HasSingleValue());
-    }
+  }
   }
 
   return rval;
diff --git a/Testing/TestDICOMValue.cxx b/Testing/TestDICOMValue.cxx
index f38589f..9a1af4e 100644
--- a/Testing/TestDICOMValue.cxx
+++ b/Testing/TestDICOMValue.cxx
@@ -112,7 +112,7 @@ int main(int argc, char *argv[])
   TestAssert(v.GetVL() == 10);
   TestAssert(memcmp(v.GetShortData(), data, 10) == 0);
   TestAssert(memcmp(v.GetUnsignedShortData(), data, 10) == 0);
-  static const float fdata[5] = { 1.0, 3.5, -2.0, 6.0, 0.13 };
+  static const float fdata[5] = { 1.0f, 3.5f, -2.0f, 6.0f, 0.13f };
   v = vtkDICOMValue(vtkDICOMVR::OF, fdata, 5);
   TestAssert(v.GetNumberOfValues() == 5);
   TestAssert(v.GetVL() == 20);
diff --git a/Utilities/makedict.py b/Utilities/makedict.py
index fdfa359..9f0ea04 100644
--- a/Utilities/makedict.py
+++ b/Utilities/makedict.py
@@ -303,13 +303,13 @@ def printbody(entry_dict, classname):
       ds = "%03d" % (dn,)
       print "// ----- %s -----" % (name,)
       print
-    print "DictEntry Dict%sContents[] = {" % (ds,)
+    print "const DictEntry Dict%sContents[] = {" % (ds,)
     for l in entry_list:
       print l
     print "};"
     for table,tagorkey in [(tag_table,"Tag"),(key_table,"Key")]:
       print
-      print "unsigned short Dict%s%sHashTable[] = {" % (ds,tagorkey)
+      print "const unsigned short Dict%s%sHashTable[] = {" % (ds,tagorkey)
       i = 0
       j = len(table) + 1
       for l in table:
@@ -418,6 +418,7 @@ else:
 
   if printheader:
     printhead({"DICOM" : enum_list}, classname)
+    print "// VTK-HeaderTest-Exclude: %s.h" % (classname,)
   else:
     printbody({"DICOM" : (entry_list, tag_table, key_table)}, classname)
 
diff --git a/Utilities/nemadict.txt b/Utilities/nemadict.txt
index 92d6b3b..851bcaa 100644
--- a/Utilities/nemadict.txt
+++ b/Utilities/nemadict.txt
@@ -388,6 +388,12 @@ RetrieveAETitle
 AE
 1-n
 
+(0008,0055)
+Station AE Title
+StationAETitle
+AE
+1
+
 (0008,0056)
 Instance Availability
 InstanceAvailability
@@ -628,6 +634,24 @@ EquivalentCodeSequence
 SQ
 1
 
+(0008,0122)
+Mapping Resource Name
+MappingResourceName
+LO
+1
+
+(0008,0123)
+Context Group Identification Sequence
+ContextGroupIdentificationSequence
+SQ
+1
+
+(0008,0124)
+Mapping Resource Identification Sequence
+MappingResourceIdentificationSequence
+SQ
+1
+
 (0008,0201)
 Timezone Offset From UTC
 TimezoneOffsetFromUTC
@@ -958,6 +982,12 @@ ReferencedSOPSequence
 SQ
 1
 
+(0008,119A)
+Other Failures Sequence
+OtherFailuresSequence
+SQ
+1
+
 (0008,1200)
 Studies Containing Other Referenced Instances Sequence
 StudiesContainingOtherReferencedInstancesSequence
@@ -1366,6 +1396,24 @@ IssuerOfPatientIDQualifiersSequence
 SQ
 1
 
+(0010,0026)
+Source Patient Group Identification Sequence
+SourcePatientGroupIdentificationSequence
+SQ
+1
+
+(0010,0027)
+Group of Patients Identification Sequence
+GroupOfPatientsIdentificationSequence
+SQ
+1
+
+(0010,0028)
+Subject Relative Position in Image
+SubjectRelativePositionInImage
+US
+3
+
 (0010,0030)
 Patient's Birth Date
 PatientBirthDate
@@ -1378,6 +1426,24 @@ PatientBirthTime
 TM
 1
 
+(0010,0033)
+Patient's Birth Date in Alternative Calendar
+PatientBirthDateInAlternativeCalendar
+LO
+1
+
+(0010,0034)
+Patient's Death Date in Alternative Calendar
+PatientDeathDateInAlternativeCalendar
+LO
+1
+
+(0010,0035)
+Patient's Alternative Calendar
+PatientAlternativeCalendar
+CS
+1
+
 (0010,0040)
 Patient's Sex
 PatientSex
@@ -1414,6 +1480,54 @@ QualityControlSubjectTypeCodeSequence
 SQ
 1
 
+(0010,0212)
+Strain Description
+StrainDescription
+UC
+1
+
+(0010,0213)
+Strain Nomenclature
+StrainNomenclature
+LO
+1
+
+(0010,0214)
+Strain Stock Number
+StrainStockNumber
+LO
+1
+
+(0010,0215)
+Strain Source Registry Code Sequence
+StrainSourceRegistryCodeSequence
+SQ
+1
+
+(0010,0216)
+Strain Stock Sequence
+StrainStockSequence
+SQ
+1
+
+(0010,0217)
+Strain Source
+StrainSource
+LO
+1
+
+(0010,0218)
+Strain Additional Information
+StrainAdditionalInformation
+UT
+1
+
+(0010,0219)
+Strain Code Sequence
+StrainCodeSequence
+SQ
+1
+
 (0010,1000)
 Other Patient IDs
 OtherPatientIDs
@@ -1790,25 +1904,25 @@ CS
 CAD File Format
 CADFileFormat
 ST
-1-n
+1
 RET
 (0014,0024)
 Component Reference System
 ComponentReferenceSystem
 ST
-1-n
+1
 RET
 (0014,0025)
 Component Manufacturing Procedure
 ComponentManufacturingProcedure
 ST
-1-n
+1
 DICONDE
 (0014,0028)
 Component Manufacturer
 ComponentManufacturer
 ST
-1-n
+1
 DICONDE
 (0014,0030)
 Material Thickness
@@ -1832,19 +1946,19 @@ DICONDE
 Material Grade
 MaterialGrade
 ST
-1-n
+1
 DICONDE
 (0014,0044)
 Material Properties Description
 MaterialPropertiesDescription
 ST
-1-n
+1
 DICONDE
 (0014,0045)
 Material Properties File Format (Retired)
 MaterialPropertiesFileFormatRetired
 ST
-1-n
+1
 RET
 (0014,0046)
 Material Notes
@@ -1876,6 +1990,60 @@ InnerDiameter
 DS
 1
 DICONDE
+(0014,0100)
+Component Welder IDs
+ComponentWelderIDs
+LO
+1-n
+DICONDE
+(0014,0101)
+Secondary Approval Status
+SecondaryApprovalStatus
+CS
+1
+DICONDE
+(0014,0102)
+Secondary Review Date
+SecondaryReviewDate
+DA
+1
+DICONDE
+(0014,0103)
+Secondary Review Time
+SecondaryReviewTime
+TM
+1
+DICONDE
+(0014,0104)
+Secondary Reviewer Name
+SecondaryReviewerName
+PN
+1
+DICONDE
+(0014,0105)
+Repair ID
+RepairID
+ST
+1
+DICONDE
+(0014,0106)
+Multiple Component Approval Sequence
+MultipleComponentApprovalSequence
+SQ
+1
+DICONDE
+(0014,0107)
+Other Approval Status
+OtherApprovalStatus
+CS
+1-n
+DICONDE
+(0014,0108)
+Other Secondary Approval Status
+OtherSecondaryApprovalStatus
+CS
+1-n
+DICONDE
 (0014,1010)
 Actual Environmental Conditions
 ActualEnvironmentalConditions
@@ -3070,6 +3238,12 @@ KVP
 DS
 1
 
+(0018,0061)
+
+
+DS
+1
+RET
 (0018,0070)
 Counts Accumulated
 CountsAccumulated
@@ -3952,6 +4126,18 @@ PhosphorType
 LO
 1
 
+(0018,1271)
+Water Equivalent Diameter
+WaterEquivalentDiameter
+FD
+1
+
+(0018,1272)
+Water Equivalent Diameter Calculation Method Code Sequence
+WaterEquivalentDiameterCalculationMethodCodeSequence
+SQ
+1
+
 (0018,1300)
 Scan Velocity
 ScanVelocity
@@ -6946,6 +7132,30 @@ DiffusionBValueZZ
 FD
 1
 
+(0018,9621)
+Functional MR Sequence
+FunctionalMRSequence
+SQ
+1
+
+(0018,9622)
+Functional Settling Phase Frames Present
+FunctionalSettlingPhaseFramesPresent
+CS
+1
+
+(0018,9623)
+Functional Sync Pulse
+FunctionalSyncPulse
+DT
+1
+
+(0018,9624)
+Settling Phase Frame
+SettlingPhaseFrame
+CS
+1
+
 (0018,9701)
 Decay Correction DateTime
 DecayCorrectionDateTime
@@ -8867,7 +9077,7 @@ SQ
 1
 
 (0022,1527)
-Wide Field Ophthalmic Photography  Threshold Quality Rating
+Wide Field Ophthalmic Photography Threshold Quality Rating
 WideFieldOphthalmicPhotographyThresholdQualityRating
 FL
 1
@@ -12538,6 +12748,36 @@ ProcedureStepCancellationDateTime
 DT
 1
 
+(0040,4070)
+Output Destination Sequence
+OutputDestinationSequence
+SQ
+1
+
+(0040,4071)
+DICOM Storage Sequence
+DICOMStorageSequence
+SQ
+1
+
+(0040,4072)
+STOW-RS Storage Sequence
+STOWRSStorageSequence
+SQ
+1
+
+(0040,4073)
+Storage URL
+StorageURL
+UR
+1
+
+(0040,4074)
+XDS Storage Sequence
+XDSStorageSequence
+SQ
+1
+
 (0040,8302)
 Entrance Dose in mGy
 EntranceDoseInmGy
@@ -12586,6 +12826,18 @@ RealWorldValueLUTData
 FD
 1-n
 
+(0040,9213)
+Double Float Real World Value Last Value Mapped
+DoubleFloatRealWorldValueLastValueMapped
+FD
+1
+
+(0040,9214)
+Double Float Real World Value First Value Mapped
+DoubleFloatRealWorldValueFirstValueMapped
+FD
+1
+
 (0040,9216)
 Real World Value First Value Mapped
 RealWorldValueFirstValueMapped
@@ -15046,6 +15298,18 @@ UsedSegmentsSequence
 SQ
 1
 
+(0062,0020)
+Tracking ID
+TrackingID
+UT
+1
+
+(0062,0021)
+Tracking UID
+TrackingUID
+UI
+1
+
 (0064,0002)
 Deformable Registration Sequence
 DeformableRegistrationSequence
@@ -15255,19 +15519,19 @@ Triangle Point Index List
 TrianglePointIndexList
 OW
 1
-
+RET
 (0066,0024)
 Edge Point Index List
 EdgePointIndexList
 OW
 1
-
+RET
 (0066,0025)
 Vertex Point Index List
 VertexPointIndexList
 OW
 1
-
+RET
 (0066,0026)
 Triangle Strip Sequence
 TriangleStripSequence
@@ -15291,7 +15555,7 @@ Primitive Point Index List
 PrimitivePointIndexList
 OW
 1
-
+RET
 (0066,002A)
 Surface Count
 SurfaceCount
@@ -15379,26 +15643,26 @@ FL
 (0066,0040)
 Long Primitive Point Index List
 LongPrimitivePointIndexList
-UL
-1-n
+OL
+1
 
 (0066,0041)
 Long Triangle Point Index List
 LongTrianglePointIndexList
-UL
-3-3n
+OL
+1
 
 (0066,0042)
 Long Edge Point Index List
 LongEdgePointIndexList
-UL
-2-2n
+OL
+1
 
 (0066,0043)
 Long Vertex Point Index List
 LongVertexPointIndexList
-UL
-1-n
+OL
+1
 
 (0066,0101)
 Track Set Sequence
@@ -16456,6 +16720,12 @@ MatrixSequence
 SQ
 1
 
+(0070,030B)
+Frame of Reference to Displayed Coordinate System Transformation Matrix
+FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix
+FD
+16
+
 (0070,030C)
 Frame of Reference Transformation Matrix Type
 FrameOfReferenceTransformationMatrixType
@@ -16649,14 +16919,14 @@ SQ
 1
 
 (0070,1305)
-Oblique Cropping Plane
-ObliqueCroppingPlane
+Plane
+Plane
 FD
 4
 
 (0070,1306)
-Oblique Cropping Plane Normal
-ObliqueCroppingPlaneNormal
+Plane Normal
+PlaneNormal
 FD
 3
 
@@ -16990,72 +17260,150 @@ SelectorAttributePrivateCreator
 LO
 1
 
+(0072,005E)
+Selector AE Value
+SelectorAEValue
+AE
+1-n
+
+(0072,005F)
+Selector AS Value
+SelectorASValue
+AS
+1-n
+
 (0072,0060)
 Selector AT Value
 SelectorATValue
 AT
 1-n
 
+(0072,0061)
+Selector DA Value
+SelectorDAValue
+DA
+1-n
+
 (0072,0062)
 Selector CS Value
 SelectorCSValue
 CS
 1-n
 
+(0072,0063)
+Selector DT Value
+SelectorDTValue
+DT
+1-n
+
 (0072,0064)
 Selector IS Value
 SelectorISValue
 IS
 1-n
 
+(0072,0065)
+Selector OB Value
+SelectorOBValue
+OB
+1
+
 (0072,0066)
 Selector LO Value
 SelectorLOValue
 LO
 1-n
 
+(0072,0067)
+Selector OF Value
+SelectorOFValue
+OF
+1
+
 (0072,0068)
 Selector LT Value
 SelectorLTValue
 LT
 1
 
+(0072,0069)
+Selector OW Value
+SelectorOWValue
+OW
+1
+
 (0072,006A)
 Selector PN Value
 SelectorPNValue
 PN
 1-n
 
+(0072,006B)
+Selector TM Value
+SelectorTMValue
+TM
+1-n
+
 (0072,006C)
 Selector SH Value
 SelectorSHValue
 SH
 1-n
 
+(0072,006D)
+Selector UN Value
+SelectorUNValue
+UN
+1
+
 (0072,006E)
 Selector ST Value
 SelectorSTValue
 ST
 1
 
+(0072,006F)
+Selector UC Value
+SelectorUCValue
+UC
+1-n
+
 (0072,0070)
 Selector UT Value
 SelectorUTValue
 UT
 1
 
+(0072,0071)
+Selector UR Value
+SelectorURValue
+UR
+1
+
 (0072,0072)
 Selector DS Value
 SelectorDSValue
 DS
 1-n
 
+(0072,0073)
+Selector OD Value
+SelectorODValue
+OD
+1
+
 (0072,0074)
 Selector FD Value
 SelectorFDValue
 FD
 1-n
 
+(0072,0075)
+Selector OL Value
+SelectorOLValue
+OL
+1
+
 (0072,0076)
 Selector FL Value
 SelectorFLValue
@@ -17830,6 +18178,90 @@ DoubleExposureFieldDelta
 FD
 4
 
+(0074,1401)
+Brachy Task Sequence
+BrachyTaskSequence
+SQ
+1
+
+(0074,1402)
+Continuation Start Total Reference Air Kerma
+ContinuationStartTotalReferenceAirKerma
+DS
+1
+
+(0074,1403)
+Continuation End Total Reference Air Kerma
+ContinuationEndTotalReferenceAirKerma
+DS
+1
+
+(0074,1404)
+Continuation Pulse Number
+ContinuationPulseNumber
+IS
+1
+
+(0074,1405)
+Channel Delivery Order Sequence
+ChannelDeliveryOrderSequence
+SQ
+1
+
+(0074,1406)
+Referenced Channel Number
+ReferencedChannelNumber
+IS
+1
+
+(0074,1407)
+Start Cumulative Time Weight
+StartCumulativeTimeWeight
+DS
+1
+
+(0074,1408)
+End Cumulative Time Weight
+EndCumulativeTimeWeight
+DS
+1
+
+(0074,1409)
+Omitted Channel Sequence
+OmittedChannelSequence
+SQ
+1
+
+(0074,140A)
+Reason for Channel Omission
+ReasonForChannelOmission
+CS
+1
+
+(0074,140B)
+Reason for Channel Omission Description
+ReasonForChannelOmissionDescription
+LO
+1
+
+(0074,140C)
+Channel Delivery Order Index
+ChannelDeliveryOrderIndex
+IS
+1
+
+(0074,140D)
+Channel Delivery Continuation Sequence
+ChannelDeliveryContinuationSequence
+SQ
+1
+
+(0074,140E)
+Omitted Application Setup Sequence
+OmittedApplicationSetupSequence
+SQ
+1
+
 (0076,0001)
 Implant Assembly Template Name
 ImplantAssemblyTemplateName
@@ -18154,6 +18586,144 @@ ReferencedSurfaceDataSequence
 SQ
 1
 
+(0082,0001)
+Assessment Summary
+AssessmentSummary
+CS
+1
+
+(0082,0003)
+Assessment Summary Description
+AssessmentSummaryDescription
+UT
+1
+
+(0082,0004)
+Assessed SOP Instance Sequence
+AssessedSOPInstanceSequence
+SQ
+1
+
+(0082,0005)
+Referenced Comparison SOP Instance Sequence
+ReferencedComparisonSOPInstanceSequence
+SQ
+1
+
+(0082,0006)
+Number of Assessment Observations
+NumberOfAssessmentObservations
+UL
+1
+
+(0082,0007)
+Assessment Observations Sequence
+AssessmentObservationsSequence
+SQ
+1
+
+(0082,0008)
+Observation Significance
+ObservationSignificance
+CS
+1
+
+(0082,000A)
+Observation Description
+ObservationDescription
+UT
+1
+
+(0082,000C)
+Structured Constraint Observation Sequence
+StructuredContraintObservationSequence
+SQ
+1
+
+(0082,0010)
+Assessed Attribute Value Sequence
+AssessedAttributeValueSequence
+SQ
+1
+
+(0082,0016)
+Assessment Set ID
+AssessmentSetID
+LO
+1
+
+(0082,0017)
+Assessment Requester Sequence
+AssessmentRequesterSequence
+SQ
+1
+
+(0082,0018)
+Selector Attribute Name
+SelectorAttributeName
+LO
+1
+
+(0082,0019)
+Selector Attribute Keyword
+SelectorAttributeKeyword
+LO
+1
+
+(0082,0021)
+Assessment Type Code Sequence
+AssessmentTypeCodeSequence
+SQ
+1
+
+(0082,0022)
+Observation Basis Code Sequence
+ObservationBasisCodeSequence
+SQ
+1
+
+(0082,0023)
+Assessment Label
+AssessmentLabel
+LO
+1
+
+(0082,0032)
+Constraint Type
+ConstraintType
+CS
+1
+
+(0082,0033)
+Specification Selection Guidance
+SpecificationSelectionGuidance
+UT
+1
+
+(0082,0034)
+Constraint Value Sequence
+ConstraintValueSequence
+SQ
+1
+
+(0082,0035)
+Recommended Default Value Sequence
+RecommendedDefaultValueSequence
+SQ
+1
+
+(0082,0036)
+Constraint Violation Significance
+ConstraintViolationSignificance
+CS
+1
+
+(0082,0037)
+Constraint Violation Condition
+ConstraintViolationCondition
+UT
+1
+
 (0088,0130)
 Storage Media File-set ID
 StorageMediaFileSetID
@@ -18286,6 +18856,12 @@ CertifiedTimestamp
 OB
 1
 
+(0400,0315)
+
+
+FL
+1
+RET
 (0400,0401)
 Digital Signature Purpose Code Sequence
 DigitalSignaturePurposeCodeSequence
@@ -18897,7 +19473,7 @@ Destination AE
 DestinationAE
 AE
 1
-RET
+
 (2100,0160)
 Owner ID
 OwnerID
@@ -20662,6 +21238,24 @@ AverageBeamDosePointSSD
 FL
 1
 
+(300A,0090)
+Beam Dose Type
+BeamDoseType
+CS
+1
+
+(300A,0091)
+Alternate Beam Dose
+AlternateBeamDose
+DS
+1
+
+(300A,0092)
+Alternate Beam Dose Type
+AlternateBeamDoseType
+CS
+1
+
 (300A,00A0)
 Number of Brachy Application Setups
 NumberOfBrachyApplicationSetups
@@ -21275,8 +21869,8 @@ DS
 1
 
 (300A,0131)
-Average Beam Dose Point Source to External Contour Surface Distance
-AverageBeamDosePointSourceToExternalContourSurfaceDistance
+Average Beam Dose Point Source to External Contour Distance
+AverageBeamDosePointSourceToExternalContourDistance
 FL
 1
 
@@ -21346,6 +21940,42 @@ GantryPitchAngleTolerance
 FL
 1
 
+(300A,0150)
+Fixation Eye
+FixationEye
+CS
+1
+
+(300A,0151)
+Chair Head Frame Position
+ChairHeadFramePosition
+DS
+1
+
+(300A,0152)
+Head Fixation Angle Tolerance
+HeadFixationAngleTolerance
+DS
+1
+
+(300A,0153)
+Chair Head Frame Position Tolerance
+ChairHeadFramePositionTolerance
+DS
+1
+
+(300A,0154)
+Fixation Light Azimuthal Angle Tolerance
+FixationLightAzimuthalAngleTolerance
+DS
+1
+
+(300A,0155)
+Fixation Light Polar Angle Tolerance
+FixationLightPolarAngleTolerance
+DS
+1
+
 (300A,0180)
 Patient Setup Sequence
 PatientSetupSequence
@@ -21988,6 +22618,12 @@ ScanMode
 CS
 1
 
+(300A,0309)
+Modulated Scan Mode Type
+ModulatedScanModeType
+CS
+1
+
 (300A,030A)
 Virtual Source-Axis Distances
 VirtualSourceAxisDistances
@@ -22150,6 +22786,12 @@ PatientSupportAccessoryCode
 LO
 1
 
+(300A,0355)
+Tray Accessory Code
+TrayAccessoryCode
+LO
+1
+
 (300A,0356)
 Fixation Light Azimuthal Angle
 FixationLightAzimuthalAngle
@@ -22252,18 +22894,36 @@ ScanSpotTuneID
 SH
 1
 
+(300A,0391)
+Scan Spot Prescribed Indices
+ScanSpotPrescribedIndices
+IS
+1-n
+
 (300A,0392)
 Number of Scan Spot Positions
 NumberOfScanSpotPositions
 IS
 1
 
+(300A,0393)
+Scan Spot Reordered
+ScanSpotReordered
+CS
+1
+
 (300A,0394)
 Scan Spot Position Map
 ScanSpotPositionMap
 FL
 1-n
 
+(300A,0395)
+Scan Spot Reordering Allowed
+ScanSpotReorderingAllowed
+CS
+1
+
 (300A,0396)
 Scan Spot Meterset Weights
 ScanSpotMetersetWeights
@@ -22468,6 +23128,78 @@ DeviceMotionParameterCodeSequence
 SQ
 1
 
+(300A,0501)
+Distal Depth Fraction
+DistalDepthFraction
+FL
+1
+
+(300A,0502)
+Distal Depth
+DistalDepth
+FL
+1
+
+(300A,0503)
+Nominal Range Modulation Fractions
+NominalRangeModulationFractions
+FL
+2
+
+(300A,0504)
+Nominal Range Modulated Region Depths
+NominalRangeModulatedRegionDepths
+FL
+2
+
+(300A,0505)
+Depth Dose Parameters Sequence
+DepthDoseParametersSequence
+SQ
+1
+
+(300A,0506)
+Delivered Depth Dose Parameters Sequence
+DeliveredDepthDoseParametersSequence
+SQ
+1
+
+(300A,0507)
+Delivered Distal Depth Fraction
+DeliveredDistalDepthFraction
+FL
+1
+
+(300A,0508)
+Delivered Distal Depth
+DeliveredDistalDepth
+FL
+1
+
+(300A,0509)
+Delivered Nominal Range Modulation Fractions
+DeliveredNominalRangeModulationFractions
+FL
+2
+
+(300A,0510)
+Delivered Nominal Range Modulated Region Depths
+DeliveredNominalRangeModulatedRegionDepths
+FL
+2
+
+(300A,0511)
+Delivered Reference Dose Definition
+DeliveredReferenceDoseDefinition
+CS
+1
+
+(300A,0512)
+Reference Dose Definition
+ReferenceDoseDefinition
+CS
+1
+
 (300C,0002)
 Referenced RT Plan Sequence
 ReferencedRTPlanSequence
diff --git a/Utilities/nemauids.txt b/Utilities/nemauids.txt
index 7f3d670..af2ea9f 100644
--- a/Utilities/nemauids.txt
+++ b/Utilities/nemauids.txt
@@ -267,6 +267,9 @@ PS 3.6
 Basic Study Content Notification SOP Class (Retired)
 SOP Class
 PS3.4
+1.2.840.10008.1.20
+Papyrus 3 Implicit VR Little Endian (Retired)
+Transfer Syntax
 1.2.840.10008.1.20.1
 Storage Commitment Push Model SOP Class
 SOP Class
@@ -307,6 +310,26 @@ PS 3.6
 DICOM Controlled Terminology
 Coding Scheme
 PS3.16
+1.2.840.10008.2.16.5
+Adult Mouse Anatomy Ontology
+Coding Scheme
+PS3.16
+1.2.840.10008.2.16.6
+Uberon Ontology
+Coding Scheme
+PS3.16
+1.2.840.10008.2.16.7
+Integrated Taxonomic Information System (ITIS) Taxonomic Serial Number (TSN)
+Coding Scheme
+PS3.16
+1.2.840.10008.2.16.8
+Mouse Genome Initiative (MGI)
+Coding Scheme
+PS3.16
+1.2.840.10008.2.16.9
+PubChem Compound CID
+Coding Scheme
+PS3.16
 1.2.840.10008.3.1.1.1
 DICOM Application Context Name
 Application Context Name
@@ -687,6 +710,10 @@ PS3.4
 X-Ray Angiographic Bi-Plane Image Storage (Retired)
 SOP Class
 PS3.4
+1.2.840.10008.5.1.4.1.1.12.77
+1.2.840.10008.5.1.4.1.1.12.77 (Retired)
+SOP Class
+PS3.4
 1.2.840.10008.5.1.4.1.1.13.1.1
 X-Ray 3D Angiographic Image Storage
 SOP Class
@@ -723,6 +750,10 @@ PS3.4
 Parametric Map Storage
 SOP Class
 PS3.4
+1.2.840.10008.5.1.4.1.1.40
+1.2.840.10008.5.1.4.1.1.40 (Retired)
+PS3.4
+SOP Class
 1.2.840.10008.5.1.4.1.1.66
 Raw Data Storage
 SOP Class
@@ -748,7 +779,7 @@ Surface Segmentation Storage
 SOP Class
 PS3.4
 1.2.840.10008.5.1.4.1.1.66.6
-Tractography Results
+Tractography Results Storage
 SOP Class
 PS3.4
 1.2.840.10008.5.1.4.1.1.67
@@ -943,6 +974,14 @@ PS3.4
 Implantation Plan SR Storage
 SOP Class
 PS3.4
+1.2.840.10008.5.1.4.1.1.88.71
+Acquisition Context SR Storage
+SOP Class
+PS3.4
+1.2.840.10008.5.1.4.1.1.90.1
+Content Assessment Results Storage
+SOP Class
+PS3.4
 1.2.840.10008.5.1.4.1.1.104.1
 Encapsulated PDF Storage
 SOP Class
@@ -1187,6 +1226,10 @@ PS3.4
 RT Ion Machine Verification
 SOP Class
 PS3.4
+1.2.840.10008.5.1.4.34.10
+RT Brachy Application Setup Delivery Instruction Storage
+SOP Class
+PS3.4
 1.2.840.10008.5.1.4.37.1
 General Relevant Patient Information Query
 SOP Class
@@ -2192,7 +2235,7 @@ CID 3677
 Summary Codes ECG
 1.2.840.10008.6.1.192
 CID 3678
-Qt Correction Algorithms
+QT Correction Algorithms
 1.2.840.10008.6.1.193
 CID 3679
 ECG Morphology Descriptions (Retired)
@@ -2336,7 +2379,7 @@ CID 3742
 Medication Administration, PCI
 1.2.840.10008.6.1.240
 CID 3743
-Clopidogrel/ticlopidine Administration
+Clopidogrel/Ticlopidine Administration
 1.2.840.10008.6.1.241
 CID 3744
 EF Testing Method
@@ -2447,7 +2490,7 @@ CID 3820
 Non-invasive Vascular Procedures
 1.2.840.10008.6.1.277
 CID 3821
-Papillary Muscle Included/excluded
+Papillary Muscle Included/Excluded
 1.2.840.10008.6.1.278
 CID 3823
 Respiratory Status
@@ -2522,7 +2565,7 @@ CID 4017
 Anatomic Region Modifier for Intra-oral Radiography
 1.2.840.10008.6.1.302
 CID 4018
-Primary Anatomic Structure for Intra-oral Radiography (permanent Dentition - Designation of Teeth)
+Primary Anatomic Structure for Intra-oral Radiography (Permanent Dentition - Designation of Teeth)
 1.2.840.10008.6.1.303
 CID 4019
 Primary Anatomic Structure for Intra-oral Radiography (Deciduous Dentition - Designation of Teeth)
@@ -2555,7 +2598,7 @@ CID 4042
 XA/XRF Anatomy Imaged
 1.2.840.10008.6.1.313
 CID 4050
-Drug Or Contrast Agent Characteristics
+Drug or Contrast Agent Characteristics
 1.2.840.10008.6.1.314
 CID 4051
 General Devices
@@ -2609,103 +2652,103 @@ CID 6000
 Overall Breast Composition
 1.2.840.10008.6.1.331
 CID 6001
-Overall Breast Composition From BI-RADS(R)
+Overall Breast Composition from BI-RADS(R)
 1.2.840.10008.6.1.332
 CID 6002
-Change Since Last Mammogram Or Prior Surgery
+Change Since Last Mammogram or Prior Surgery
 1.2.840.10008.6.1.333
 CID 6003
-Change Since Last Mammogram Or Prior Surgery From BI-RADS(R)
+Change Since Last Mammogram or Prior Surgery from BI-RADS(R)
 1.2.840.10008.6.1.334
 CID 6004
 Mammography Characteristics of Shape
 1.2.840.10008.6.1.335
 CID 6005
-Characteristics of Shape From BI-RADS(R)
+Characteristics of Shape from BI-RADS(R)
 1.2.840.10008.6.1.336
 CID 6006
 Mammography Characteristics of Margin
 1.2.840.10008.6.1.337
 CID 6007
-Characteristics of Margin From BI-RADS(R)
+Characteristics of Margin from BI-RADS(R)
 1.2.840.10008.6.1.338
 CID 6008
 Density Modifier
 1.2.840.10008.6.1.339
 CID 6009
-Density Modifier From BI-RADS(R)
+Density Modifier from BI-RADS(R)
 1.2.840.10008.6.1.340
 CID 6010
 Mammography Calcification Types
 1.2.840.10008.6.1.341
 CID 6011
-Calcification Types From BI-RADS(R)
+Calcification Types from BI-RADS(R)
 1.2.840.10008.6.1.342
 CID 6012
 Calcification Distribution Modifier
 1.2.840.10008.6.1.343
 CID 6013
-Calcification Distribution Modifier From BI-RADS(R)
+Calcification Distribution Modifier from BI-RADS(R)
 1.2.840.10008.6.1.344
 CID 6014
 Mammography Single Image Finding
 1.2.840.10008.6.1.345
 CID 6015
-Single Image Finding From BI-RADS(R)
+Single Image Finding from BI-RADS(R)
 1.2.840.10008.6.1.346
 CID 6016
 Mammography Composite Feature
 1.2.840.10008.6.1.347
 CID 6017
-Composite Feature From BI-RADS(R)
+Composite Feature from BI-RADS(R)
 1.2.840.10008.6.1.348
 CID 6018
 Clockface Location or Region
 1.2.840.10008.6.1.349
 CID 6019
-Clockface Location Or Region From BI-RADS(R)
+Clockface Location or Region from BI-RADS(R)
 1.2.840.10008.6.1.350
 CID 6020
 Quadrant Location
 1.2.840.10008.6.1.351
 CID 6021
-Quadrant Location From BI-RADS(R)
+Quadrant Location from BI-RADS(R)
 1.2.840.10008.6.1.352
 CID 6022
 Side
 1.2.840.10008.6.1.353
 CID 6023
-Side From BI-RADS(R)
+Side from BI-RADS(R)
 1.2.840.10008.6.1.354
 CID 6024
 Depth
 1.2.840.10008.6.1.355
 CID 6025
-Depth From BI-RADS(R)
+Depth from BI-RADS(R)
 1.2.840.10008.6.1.356
 CID 6026
 Mammography Assessment
 1.2.840.10008.6.1.357
 CID 6027
-Assessment From BI-RADS(R)
+Assessment from BI-RADS(R)
 1.2.840.10008.6.1.358
 CID 6028
 Mammography Recommended Follow-up
 1.2.840.10008.6.1.359
 CID 6029
-Recommended Follow-up From BI-RADS(R)
+Recommended Follow-up from BI-RADS(R)
 1.2.840.10008.6.1.360
 CID 6030
 Mammography Pathology Codes
 1.2.840.10008.6.1.361
 CID 6031
-Benign Pathology Codes From BI-RADS(R)
+Benign Pathology Codes from BI-RADS(R)
 1.2.840.10008.6.1.362
 CID 6032
-High Risk Lesions Pathology Codes From BI-RADS(R)
+High Risk Lesions Pathology Codes from BI-RADS(R)
 1.2.840.10008.6.1.363
 CID 6033
-Malignant Pathology Codes From BI-RADS(R)
+Malignant Pathology Codes from BI-RADS(R)
 1.2.840.10008.6.1.364
 CID 6034
 Intended Use of CAD Output
@@ -2768,7 +2811,7 @@ CID 6054
 Breast Imaging Findings
 1.2.840.10008.6.1.384
 CID 6055
-Breast Clinical Finding Or Indicated Problem
+Breast Clinical Finding or Indicated Problem
 1.2.840.10008.6.1.385
 CID 6056
 Associated Findings for Breast
@@ -2879,22 +2922,22 @@ CID 6100
 Chest Component Categories
 1.2.840.10008.6.1.421
 CID 6101
-Chest Finding Or Feature
+Chest Finding or Feature
 1.2.840.10008.6.1.422
 CID 6102
-Chest Finding Or Feature Modifier
+Chest Finding or Feature Modifier
 1.2.840.10008.6.1.423
 CID 6103
-Abnormal Lines Finding Or Feature
+Abnormal Lines Finding or Feature
 1.2.840.10008.6.1.424
 CID 6104
-Abnormal Opacity Finding Or Feature
+Abnormal Opacity Finding or Feature
 1.2.840.10008.6.1.425
 CID 6105
-Abnormal Lucency Finding Or Feature
+Abnormal Lucency Finding or Feature
 1.2.840.10008.6.1.426
 CID 6106
-Abnormal Texture Finding Or Feature
+Abnormal Texture Finding or Feature
 1.2.840.10008.6.1.427
 CID 6107
 Width Descriptor
@@ -2903,22 +2946,22 @@ CID 6108
 Chest Anatomic Structure Abnormal Distribution
 1.2.840.10008.6.1.429
 CID 6109
-Radiographic Anatomy Finding Or Feature
+Radiographic Anatomy Finding or Feature
 1.2.840.10008.6.1.430
 CID 6110
-Lung Anatomy Finding Or Feature
+Lung Anatomy Finding or Feature
 1.2.840.10008.6.1.431
 CID 6111
-Bronchovascular Anatomy Finding Or Feature
+Bronchovascular Anatomy Finding or Feature
 1.2.840.10008.6.1.432
 CID 6112
-Pleura Anatomy Finding Or Feature
+Pleura Anatomy Finding or Feature
 1.2.840.10008.6.1.433
 CID 6113
-Mediastinum Anatomy Finding Or Feature
+Mediastinum Anatomy Finding or Feature
 1.2.840.10008.6.1.434
 CID 6114
-Osseous Anatomy Finding Or Feature
+Osseous Anatomy Finding or Feature
 1.2.840.10008.6.1.435
 CID 6115
 Osseous Anatomy Modifiers
@@ -3170,7 +3213,7 @@ CID 7453
 Performing Roles
 1.2.840.10008.6.1.518
 CID 7454
-Species
+Animal Taxonomic Rank Values
 1.2.840.10008.6.1.519
 CID 7455
 Sex
@@ -3242,7 +3285,7 @@ CID 10008
 Dose Related Distance Measurements
 1.2.840.10008.6.1.542
 CID 10009
-Measured/calculated
+Measured/Calculated
 1.2.840.10008.6.1.543
 CID 10010
 Dose Measurement Devices
@@ -3335,7 +3378,7 @@ CID 12105
 Intracranial Cerebral Vessels
 1.2.840.10008.6.1.573
 CID 12106
-Intracranial Cerebral Vessels (unilateral)
+Intracranial Cerebral Vessels (Unilateral)
 1.2.840.10008.6.1.574
 CID 12107
 Upper Extremity Arteries
@@ -3350,16 +3393,16 @@ CID 12110
 Lower Extremity Veins
 1.2.840.10008.6.1.578
 CID 12111
-Abdominal Arteries (lateral)
+Abdominal Arteries (Lateral)
 1.2.840.10008.6.1.579
 CID 12112
-Abdominal Arteries (unilateral)
+Abdominal Arteries (Unilateral)
 1.2.840.10008.6.1.580
 CID 12113
-Abdominal Veins (lateral)
+Abdominal Veins (Lateral)
 1.2.840.10008.6.1.581
 CID 12114
-Abdominal Veins (unilateral)
+Abdominal Veins (Unilateral)
 1.2.840.10008.6.1.582
 CID 12115
 Renal Vessels
@@ -3689,10 +3732,10 @@ CID 6200
 Colon Overall Assessment
 1.2.840.10008.6.1.788
 CID 6201
-Colon Finding Or Feature
+Colon Finding or Feature
 1.2.840.10008.6.1.789
 CID 6202
-Colon Finding Or Feature Modifier
+Colon Finding or Feature Modifier
 1.2.840.10008.6.1.790
 CID 6203
 Colon Non-lesion Object Type
@@ -3930,7 +3973,7 @@ CID 12288
 Cardiac Ultrasound Outflow Tracts Finding Sites
 1.2.840.10008.6.1.869
 CID 12289
-Cardiac Ultrasound Semilunar Valves, Annulate and Sinuses Finding Sites
+Cardiac Ultrasound Semilunar Valves, Annulus and Sinuses Finding Sites
 1.2.840.10008.6.1.870
 CID 12290
 Cardiac Ultrasound Pulmonary Arteries Finding Sites
@@ -3978,7 +4021,7 @@ CID 4239
 Anterior Chamber Depth Definition
 1.2.840.10008.6.1.886
 CID 4240
-Ophthalmic Measurement Or Calculation Data Source
+Ophthalmic Measurement or Calculation Data Source
 1.2.840.10008.6.1.887
 CID 4241
 Ophthalmic Axial Length Selection Method
@@ -3987,7 +4030,7 @@ Ophthalmic Axial Length Selection Method
 
 1.2.840.10008.6.1.889
 CID 4243
-Ophthalmic Axial Length Quality Metric Type
+Ophthalmic Quality Metric Type
 1.2.840.10008.6.1.890
 CID 4244
 Ophthalmic Agent Concentration Units
@@ -4329,7 +4372,7 @@ CID 12021
 Fetal Long Bone Anatomic Sites
 1.2.840.10008.6.1.1007
 CID 12022
-Fetal Cranium Bone Anatomic Sites
+Fetal Cranium Anatomic Sites
 1.2.840.10008.6.1.1008
 CID 12023
 Pelvis and Uterus Anatomic Sites
@@ -4377,13 +4420,13 @@ CID 4026
 Primary Anatomic Structure for Intra-oral and Craniofacial Radiography
 1.2.840.10008.6.1.1023
 CID 9401
-IEC6127 Device Position Parameters
+IEC61217 Device Position Parameters
 1.2.840.10008.6.1.1024
 CID 9402
-IEC6127 Gantry Position Parameters
+IEC61217 Gantry Position Parameters
 1.2.840.10008.6.1.1025
 CID 9403
-IEC6127 Patient Support Position Parameters
+IEC61217 Patient Support Position Parameters
 1.2.840.10008.6.1.1026
 CID 7035
 Actionable Finding Classification
@@ -4495,3 +4538,177 @@ Diffusion Tractography Algorithm Families
 1.2.840.10008.6.1.1062
 CID 7263
 Diffusion Tractography Measurement Types
+1.2.840.10008.6.1.1063
+CID 7490
+Research Animal Source Registries
+1.2.840.10008.6.1.1064
+CID 231
+Yes-No Only
+1.2.840.10008.6.1.1065
+CID 601
+Biosafety Levels
+1.2.840.10008.6.1.1066
+CID 602
+Biosafety Control Reasons
+1.2.840.10008.6.1.1067
+CID 7457
+Sex - Male Female or Both
+1.2.840.10008.6.1.1068
+CID 603
+Animal Room Types
+1.2.840.10008.6.1.1069
+CID 604
+Device Reuse
+1.2.840.10008.6.1.1070
+CID 605
+Animal Bedding Material
+1.2.840.10008.6.1.1071
+CID 606
+Animal Shelter Types
+1.2.840.10008.6.1.1072
+CID 607
+Animal Feed Types
+1.2.840.10008.6.1.1073
+CID 608
+Animal Feed Sources
+1.2.840.10008.6.1.1074
+CID 609
+Animal Feeding Methods
+1.2.840.10008.6.1.1075
+CID 610
+Water Types
+1.2.840.10008.6.1.1076
+CID 611
+Anesthesia Category Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1077
+CID 612
+Anesthesia Category Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1078
+CID 613
+Anesthesia Induction Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1079
+CID 614
+Anesthesia Induction Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1080
+CID 615
+Anesthesia Maintenance Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1081
+CID 616
+Anesthesia Maintenance Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1082
+CID 617
+Airway Management Method Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1083
+CID 618
+Airway Management Method Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1084
+CID 619
+Airway Management Sub-Method Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1085
+CID 620
+Airway Management Sub-Method Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1086
+CID 621
+Medication Type Code Type for Small Animal Anesthesia
+1.2.840.10008.6.1.1087
+CID 622
+Medication Type Code Type from Anesthesia Quality Initiative (AQI)
+1.2.840.10008.6.1.1088
+CID 623
+Medication for Small Animal Anesthesia
+1.2.840.10008.6.1.1089
+CID 624
+Inhalational Anesthesia Agents for Small Animal Anesthesia
+1.2.840.10008.6.1.1090
+CID 625
+Injectable Anesthesia Agents for Small Animal Anesthesia
+1.2.840.10008.6.1.1091
+CID 626
+Premedication Agents for Small Animal Anesthesia
+1.2.840.10008.6.1.1092
+CID 627
+Neuromuscular Blocking Agents for Small Animal Anesthesia
+1.2.840.10008.6.1.1093
+CID 628
+Ancillary Medications for Small Animal Anesthesia
+1.2.840.10008.6.1.1094
+CID 629
+Carrier Gases for Small Animal Anesthesia
+1.2.840.10008.6.1.1095
+CID 630
+Local Anesthetics for Small Animal Anesthesia
+1.2.840.10008.6.1.1096
+CID 631
+Phase of Procedure Requiring Anesthesia
+1.2.840.10008.6.1.1097
+CID 632
+Phase of Surgical Procedure Requiring Anesthesia
+1.2.840.10008.6.1.1098
+CID 633
+Phase of Imaging Procedure Requiring Anesthesia
+1.2.840.10008.6.1.1099
+CID 634
+Phase of Animal Handling
+1.2.840.10008.6.1.1100
+CID 635
+Heating Method
+1.2.840.10008.6.1.1101
+CID 636
+Temperature Sensor Device Component Type for Small Animal Procedures
+1.2.840.10008.6.1.1102
+CID 637
+Exogenous Substance Types
+1.2.840.10008.6.1.1103
+CID 638
+Exogenous Substance
+1.2.840.10008.6.1.1104
+CID 639
+Tumor Graft Histologic Type
+1.2.840.10008.6.1.1105
+CID 640
+Fibrils
+1.2.840.10008.6.1.1106
+CID 641
+Viruses
+1.2.840.10008.6.1.1107
+CID 642
+Cytokines
+1.2.840.10008.6.1.1108
+CID 643
+Toxins
+1.2.840.10008.6.1.1109
+CID 644
+Exogenous Substance Administration Sites
+1.2.840.10008.6.1.1110
+CID 645
+Exogenous Substance Tissue of Origin
+1.2.840.10008.6.1.1111
+CID 646
+Preclinical Small Animal Imaging Procedures
+1.2.840.10008.6.1.1112
+CID 647
+Position Reference Indicator for Frame of Reference
+1.2.840.10008.6.1.1113
+CID 241
+Present-Absent Only
+1.2.840.10008.6.1.1114
+CID 10024
+Water Equivalent Diameter Method
+1.2.840.10008.6.1.1115
+CID 7022
+Radiotherapy Purposes of Reference
+1.2.840.10008.6.1.1116
+CID 701
+Content Assessment Types
+1.2.840.10008.6.1.1117
+CID 702
+RT Content Assessment Types
+1.2.840.10008.6.1.1118
+CID 703
+Basis of Assessment
+1.2.840.10008.6.1.1119
+CID 7449
+Reader Specialty
+1.2.840.10008.6.1.1120
+CID 9233
+Requested Report Types
diff --git a/Utilities/parseuid.py b/Utilities/parseuid.py
index 9d7ea8e..c26b32c 100644
--- a/Utilities/parseuid.py
+++ b/Utilities/parseuid.py
@@ -86,7 +86,7 @@ print "/*=======================================================================
 print "This is an automatically generated file.  Include errata for any changes."
 print "=========================================================================*/"
 
-print "\n#include \"vtkDICOMUtilities.h\""
+print "\n#include \"vtkDICOMUtilitiesUIDTable.h\""
 
 print "\nnamespace {\n"
 
@@ -123,7 +123,7 @@ def recursetrie(node, counter):
         for child in node[0]:
             recursetrie(child, counter)
 
-print "\nUIDTableEntry UIDTable[] = {"
+print "\nconst UIDTableEntry UIDTable[] = {"
 recursetrie(root, [0])
 printnode(root)
 recursetrie(root, None)
@@ -131,7 +131,7 @@ print "};"
 
 getterfunc = \
 """
-UIDTableEntry *GetUIDTableEntry(const char *uid)
+const UIDTableEntry *GetUIDTableEntry(const char *uid)
 {
   if (uid == 0)
     {
@@ -150,7 +150,7 @@ UIDTableEntry *GetUIDTableEntry(const char *uid)
     return 0;
     }
 
-  UIDTableEntry *table = UIDTable;
+  const UIDTableEntry *table = UIDTable;
   while (*uid != '\\0')
     {
     int i = -1;
@@ -202,7 +202,7 @@ exportedcode = \
 const char *vtkDICOMUtilities::GetUIDName(const char *uid)
 {
   const char *result = "";
-  UIDTableEntry *table = GetUIDTableEntry(uid);
+  const UIDTableEntry *table = GetUIDTableEntry(uid);
   if (table)
     {
     if (table->Name)
@@ -216,7 +216,7 @@ const char *vtkDICOMUtilities::GetUIDName(const char *uid)
 unsigned short vtkDICOMUtilities::GetCIDFromUID(const char *uid)
 {
   unsigned short result = 0;
-  UIDTableEntry *table = GetUIDTableEntry(uid);
+  const UIDTableEntry *table = GetUIDTableEntry(uid);
   if (table)
     {
     result = table->CID;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/vtk-dicom.git



More information about the debian-med-commit mailing list