[med-svn] [odil] 01/05: Imported Upstream version 0.6.0

Julien Lamy lamy-guest at moszumanska.debian.org
Fri May 13 13:47:42 UTC 2016


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

lamy-guest pushed a commit to branch master
in repository odil.

commit f7fac8fb1432cddb80f7c8307e35cf6536f0c044
Author: Julien Lamy <lamy at unistra.fr>
Date:   Thu May 12 16:56:38 2016 +0200

    Imported Upstream version 0.6.0
---
 .travis.yml                                     |    6 +-
 CMakeLists.txt                                  |   30 +
 Doxyfile                                        | 2789 +++++++++------
 FindDCMTK.cmake                                 |   13 +-
 README.md                                       |    5 +-
 applications/CMakeLists.txt                     |    1 +
 applications/dicomdir.py                        |   59 +
 applications/echo.py                            |    4 +-
 applications/find.py                            |   15 +-
 applications/get.py                             |  117 +
 applications/odil                               |    5 +-
 applications/print_.py                          |   14 +-
 applications/transcode.py                       |    4 +-
 cmake/functions.cmake                           |   32 +
 examples/CMakeLists.txt                         |    7 +
 examples/move.cpp                               |   20 +-
 registry.cpp.tmpl                               |   29 +-
 registry.h.tmpl                                 |    4 +
 src/CMakeLists.txt                              |   18 +-
 src/odil/Association.h                          |   16 +-
 src/odil/AssociationAcceptor.h                  |   11 +
 src/odil/AssociationParameters.h                |   18 +
 src/odil/BasicDirectoryCreator.cpp              |   17 +-
 src/odil/BasicDirectoryCreator.h                |    2 +
 src/odil/DataSet.cpp                            |  151 +
 src/odil/DataSet.h                              |  114 +-
 src/odil/Element.h                              |    1 +
 src/odil/ElementsDictionary.cpp                 |   16 +
 src/odil/ElementsDictionary.h                   |   11 +
 src/odil/Exception.h                            |    1 +
 src/odil/FindSCU.h                              |    1 +
 src/odil/GetSCP.h                               |    3 +-
 src/odil/GetSCU.cpp                             |   23 +-
 src/odil/GetSCU.h                               |   24 +-
 src/odil/MoveSCP.h                              |    5 +-
 src/odil/MoveSCU.cpp                            |  116 +-
 src/odil/MoveSCU.h                              |   43 +-
 src/odil/Reader.cpp                             |   10 +-
 src/odil/Reader.h                               |    1 +
 src/odil/SCP.h                                  |    7 +
 src/odil/SCPDispatcher.h                        |    5 +
 src/odil/SCU.h                                  |    2 +
 src/odil/Tag.cpp                                |  110 +-
 src/odil/Tag.h                                  |    5 +-
 src/odil/UIDsDictionary.h                       |    6 +
 src/odil/VR.cpp                                 |    4 +-
 src/odil/VR.h                                   |    4 +-
 src/odil/VRFinder.cpp                           |  119 +-
 src/odil/VRFinder.h                             |    5 +
 src/odil/Value.h                                |    3 +
 src/odil/Writer.cpp                             |   20 +-
 src/odil/json_converter.cpp                     |    1 +
 src/odil/odil.h                                 |   15 +
 src/odil/registry.cpp                           | 4159 ++++++++++++++++++++++-
 src/odil/registry.h                             |   57 +-
 src/odil/xml_converter.cpp                      |    1 +
 tests/CMakeLists.txt                            |    2 +-
 tests/code/EchoSCP.cpp                          |    2 +-
 tests/code/GetSCP.cpp                           |    1 +
 tests/code/GetSCU.cpp                           |   36 +-
 tests/code/MoveSCP.cpp                          |    1 +
 tests/code/MoveSCU.cpp                          |   50 +-
 tests/code/SCPDispatcher.cpp                    |    2 +-
 tests/run                                       |    6 +-
 tests/wrappers/test_data_set.py                 |  140 +-
 tests/wrappers/test_echo_scp.py                 |   72 +
 tests/wrappers/test_element.py                  |   25 +-
 tests/wrappers/test_exception.py                |   25 +
 tests/wrappers/test_find_scp.py                 |  109 +
 tests/wrappers/test_find_scu.py                 |   16 +-
 tests/wrappers/test_get_scp.py                  |  133 +
 tests/wrappers/test_get_scu.py                  |   54 +-
 tests/wrappers/test_move_scp.py                 |  157 +
 tests/wrappers/test_move_scu.py                 |   66 +-
 tests/wrappers/test_store_scu.py                |   23 +-
 tests/wrappers/test_value.py                    |   46 +-
 tests/wrappers/test_vr_finder.py                |   16 +
 wrappers/Assocation.cpp                         |   58 +-
 wrappers/BasicDirectoryCreator.cpp              |  130 +
 wrappers/CEchoRequest.cpp                       |   30 +
 wrappers/CFindRequest.cpp                       |   38 +
 wrappers/CGetRequest.cpp                        |   38 +
 wrappers/CGetResponse.cpp                       |   79 +
 wrappers/CMakeLists.txt                         |    2 +-
 wrappers/CMoveRequest.cpp                       |   42 +
 wrappers/CMoveResponse.cpp                      |   79 +
 wrappers/CStoreRequest.cpp                      |   65 +
 wrappers/DataSet.cpp                            |  118 +-
 wrappers/DataSetGeneratorWrapper.h              |   52 +
 wrappers/{Exception.cpp => EchoSCP.cpp}         |   25 +-
 wrappers/Element.cpp                            |   27 +-
 wrappers/Exception.cpp                          |   18 +-
 wrappers/FindSCP.cpp                            |   48 +
 wrappers/GetSCP.cpp                             |   63 +
 wrappers/GetSCU.cpp                             |   36 +-
 wrappers/Message.cpp                            |   35 +
 wrappers/MoveSCP.cpp                            |   70 +
 wrappers/MoveSCU.cpp                            |   51 +-
 wrappers/{Exception.cpp => Request.cpp}         |   19 +-
 wrappers/Response.cpp                           |   43 +
 wrappers/{Exception.cpp => StoreSCP.cpp}        |   25 +-
 wrappers/Tag.cpp                                |    1 +
 wrappers/{Exception.cpp => VRFinder.cpp}        |   16 +-
 wrappers/Value.cpp                              |   25 +-
 wrappers/exception_factory.cpp                  |   26 +
 wrappers/{Exception.cpp => exception_factory.h} |   22 +-
 wrappers/json_converter.cpp                     |   11 +-
 wrappers/odil.cpp                               |   39 +-
 wrappers/value_constructor.cpp                  |   81 +
 wrappers/{Exception.cpp => value_constructor.h} |   17 +-
 wrappers/xml_converter.cpp                      |    1 +
 111 files changed, 9065 insertions(+), 1626 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index c11ff2a..9b19003 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,8 +5,8 @@ matrix:
       sudo: required
       dist: trusty
       compiler: gcc
-    - os: osx
-      compiler: clang
+#    - os: osx
+#      compiler: clang
 addons:
   apt:
     packages:
@@ -44,6 +44,6 @@ before_script:
   - cmake -G Ninja -D CMAKE_CXX_FLAGS:STRING="${CMAKE_CXX_FLAGS}" -D CMAKE_BUILD_TYPE:STRING=Debug ../
 script:
   - ninja
-  - ../tests/run --no-network
+  - ../tests/run
 after_success:
   - if [ "${CC}" = "gcc" ]; then coveralls --exclude examples --exclude tests --exclude-pattern '.*CMake[^/]+\.c(?:pp)?' --exclude-pattern "/usr/.*" --root=${SRC_DIR} --build-root ${BIN_DIR} > /dev/null; fi
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 05d609f..a8f8a62 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,8 +10,35 @@ set(odil_VERSION
 option(BUILD_EXAMPLES "Build the examples directory." ON)
 option(BUILD_WRAPPERS "Build the Python Wrappers." ON)
 
+option(BUILD_SHARED_LIBS "Build Odil with shared libraries." ON)
+
 set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}" ${CMAKE_MODULE_PATH})
 include(CTest)
+include(cmake/functions.cmake)
+
+set_property(GLOBAL PROPERTY USE_FOLDERS ON)
+
+if(WIN32)
+    # Trying the automatic creation of .def files by CMake
+    if(${BUILD_SHARED_LIBS})
+        set(WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
+    endif()
+
+    # We have to set _WIN32_WINNT for Asio
+    if(${CMAKE_SYSTEM_VERSION} EQUAL 10) # Windows 10
+        add_definitions(-D _WIN32_WINNT=0x0A00)
+    elseif(${CMAKE_SYSTEM_VERSION} EQUAL 6.3) # Windows 8.1
+        add_definitions(-D _WIN32_WINNT=0x0603)
+    elseif(${CMAKE_SYSTEM_VERSION} EQUAL 6.2) # Windows 8
+        add_definitions(-D _WIN32_WINNT=0x0602)
+    elseif(${CMAKE_SYSTEM_VERSION} EQUAL 6.1) # Windows 7
+        add_definitions(-D _WIN32_WINNT=0x0601)
+    elseif(${CMAKE_SYSTEM_VERSION} EQUAL 6.0) # Windows Vista
+        add_definitions(-D _WIN32_WINNT=0x0600)
+    else() # Windows XP (5.1)
+        add_definitions(-D _WIN32_WINNT=0x0501)
+    endif()
+endif()
 
 add_subdirectory("src")
 add_subdirectory("applications")
@@ -31,11 +58,14 @@ endif()
 add_custom_target(
     CIIntegration ${CMAKE_COMMAND} -E echo "CI Integration"
     SOURCES appveyor.yml .travis.yml)
+set_target_properties(CIIntegration PROPERTIES FOLDER "Utils")
 
 add_custom_target(
     Documentation ${CMAKE_COMMAND} -E echo "Documentation"
     SOURCES Doxyfile LICENSE.txt README.md)
+set_target_properties(Documentation PROPERTIES FOLDER "Utils")
 
 add_custom_target(
     Registry ${CMAKE_COMMAND} -E echo "Registry"
     SOURCES generate_registry registry.cpp.tmpl registry.h.tmpl)
+set_target_properties(Registry PROPERTIES FOLDER "Utils")
diff --git a/Doxyfile b/Doxyfile
index 9c3bd0a..86b1b5a 100644
--- a/Doxyfile
+++ b/Doxyfile
@@ -1,104 +1,122 @@
-# Doxyfile 1.7.6.1
+# Doxyfile 1.8.11
 
 # This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
+# doxygen (www.doxygen.org) for a project.
 #
-# All text after a hash (#) is considered a comment and will be ignored
+# All text after a double hash (##) is considered a comment and is placed in
+# front of the TAG it is preceding.
+#
+# All text after a single hash (#) is considered a comment and will be ignored.
 # The format is:
-#       TAG = value [value, ...]
-# For lists items can also be appended using:
-#       TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
+# TAG = value [value, ...]
+# For lists, items can also be appended using:
+# TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (\" \").
 
 #---------------------------------------------------------------------------
 # Project related configuration options
 #---------------------------------------------------------------------------
 
-# This tag specifies the encoding used for all characters in the config file 
-# that follow. The default is UTF-8 which is also the encoding used for all 
-# text before the first occurrence of this tag. Doxygen uses libiconv (or the 
-# iconv built into libc) for the transcoding. See 
-# http://www.gnu.org/software/libiconv for the list of possible encodings.
+# This tag specifies the encoding used for all characters in the config file
+# that follow. The default is UTF-8 which is also the encoding used for all text
+# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv
+# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv
+# for the list of possible encodings.
+# The default value is: UTF-8.
 
 DOXYFILE_ENCODING      = UTF-8
 
-# The PROJECT_NAME tag is a single word (or sequence of words) that should 
-# identify the project. Note that if you do not use Doxywizard you need 
-# to put quotes around the project name if it contains spaces.
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
+# double-quotes, unless you are using Doxywizard) that should identify the
+# project for which the documentation is generated. This name is used in the
+# title of most generated pages and in a few other places.
+# The default value is: My Project.
 
 PROJECT_NAME           = "odil"
 
-# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
-# This could be handy for archiving the generated documentation or 
-# if some version control system is used.
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
+# could be handy for archiving the generated documentation or if some version
+# control system is used.
 
-PROJECT_NUMBER         = 
+PROJECT_NUMBER         =
 
-# Using the PROJECT_BRIEF tag one can provide an optional one line description 
-# for a project that appears at the top of each page and should give viewer 
-# a quick idea about the purpose of the project. Keep the description short.
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
+# for a project that appears at the top of each page and should give viewer a
+# quick idea about the purpose of the project. Keep the description short.
 
-PROJECT_BRIEF          = 
+PROJECT_BRIEF          = C++11 library for the DICOM standard
 
-# With the PROJECT_LOGO tag one can specify an logo or icon that is 
-# included in the documentation. The maximum height of the logo should not 
-# exceed 55 pixels and the maximum width should not exceed 200 pixels. 
-# Doxygen will copy the logo to the output directory.
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
+# in the documentation. The maximum height of the logo should not exceed 55
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
+# the logo to the output directory.
 
-PROJECT_LOGO           = 
+PROJECT_LOGO           =
 
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
-# base path where the generated documentation will be put. 
-# If a relative path is entered, it will be relative to the location 
-# where doxygen was started. If left blank the current directory will be used.
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
+# into which the generated documentation will be written. If a relative path is
+# entered, it will be relative to the location where doxygen was started. If
+# left blank the current directory will be used.
 
 OUTPUT_DIRECTORY       = ./doc
 
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
-# 4096 sub-directories (in 2 levels) under the output directory of each output 
-# format and will distribute the generated files over these directories. 
-# Enabling this option can be useful when feeding doxygen a huge amount of 
-# source files, where putting all generated files in the same directory would 
-# otherwise cause performance problems for the file system.
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub-
+# directories (in 2 levels) under the output directory of each output format and
+# will distribute the generated files over these directories. Enabling this
+# option can be useful when feeding doxygen a huge amount of source files, where
+# putting all generated files in the same directory would otherwise causes
+# performance problems for the file system.
+# The default value is: NO.
 
 CREATE_SUBDIRS         = NO
 
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
-# documentation generated by doxygen is written. Doxygen will use this 
-# information to generate all constant output in the proper language. 
-# The default language is English, other supported languages are: 
-# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
-# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, 
-# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English 
-# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, 
-# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, 
-# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese.
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
+# characters to appear in the names of generated files. If set to NO, non-ASCII
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
+# U+3044.
+# The default value is: NO.
+
+ALLOW_UNICODE_NAMES    = NO
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
+# documentation generated by doxygen is written. Doxygen will use this
+# information to generate all constant output in the proper language.
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese,
+# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States),
+# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian,
+# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages),
+# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian,
+# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian,
+# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish,
+# Ukrainian and Vietnamese.
+# The default value is: English.
 
 OUTPUT_LANGUAGE        = English
 
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
-# include brief member descriptions after the members that are listed in 
-# the file and class documentation (similar to JavaDoc). 
-# Set to NO to disable this.
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
+# descriptions after the members that are listed in the file and class
+# documentation (similar to Javadoc). Set to NO to disable this.
+# The default value is: YES.
 
 BRIEF_MEMBER_DESC      = YES
 
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
-# the brief description of a member or function before the detailed description. 
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
+# description of a member or function before the detailed description
+#
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
 # brief descriptions will be completely suppressed.
+# The default value is: YES.
 
 REPEAT_BRIEF           = YES
 
-# This tag implements a quasi-intelligent brief description abbreviator 
-# that is used to form the text in various listings. Each string 
-# in this list, if found as the leading text of the brief description, will be 
-# stripped from the text and the result after processing the whole list, is 
-# used as the annotated text. Otherwise, the brief description is used as-is. 
-# If left blank, the following values are used ("$name" is automatically 
-# replaced with the name of the entity): "The $name class" "The $name widget" 
-# "The $name file" "is" "provides" "specifies" "contains" 
-# "represents" "a" "an" "the"
+# This tag implements a quasi-intelligent brief description abbreviator that is
+# used to form the text in various listings. Each string in this list, if found
+# as the leading text of the brief description, will be stripped from the text
+# and the result, after processing the whole list, is used as the annotated
+# text. Otherwise, the brief description is used as-is. If left blank, the
+# following values are used ($name is automatically replaced with the name of
+# the entity):The $name class, The $name widget, The $name file, is, provides,
+# specifies, contains, represents, a, an and the.
 
 ABBREVIATE_BRIEF       = "The $name class" \
                          "The $name widget" \
@@ -112,238 +130,287 @@ ABBREVIATE_BRIEF       = "The $name class" \
                          an \
                          the
 
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
-# Doxygen will generate a detailed section even if there is only a brief 
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
+# doxygen will generate a detailed section even if there is only a brief
 # description.
+# The default value is: NO.
 
 ALWAYS_DETAILED_SEC    = NO
 
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
-# inherited members of a class in the documentation of that class as if those 
-# members were ordinary class members. Constructors, destructors and assignment 
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
+# inherited members of a class in the documentation of that class as if those
+# members were ordinary class members. Constructors, destructors and assignment
 # operators of the base classes will not be shown.
+# The default value is: NO.
 
 INLINE_INHERITED_MEMB  = NO
 
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
-# path before files name in the file list and in the header files. If set 
-# to NO the shortest path that makes the file name unique will be used.
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
+# before files name in the file list and in the header files. If set to NO the
+# shortest path that makes the file name unique will be used
+# The default value is: YES.
 
 FULL_PATH_NAMES        = YES
 
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
-# can be used to strip a user-defined part of the path. Stripping is 
-# only done if one of the specified strings matches the left-hand part of 
-# the path. The tag can be used to show relative paths in the file list. 
-# If left blank the directory from which doxygen is run is used as the 
-# path to strip.
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
+# Stripping is only done if one of the specified strings matches the left-hand
+# part of the path. The tag can be used to show relative paths in the file list.
+# If left blank the directory from which doxygen is run is used as the path to
+# strip.
+#
+# Note that you can specify absolute paths here, but also relative paths, which
+# will be relative from the directory where doxygen is started.
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
 
-STRIP_FROM_PATH        = 
+STRIP_FROM_PATH        =
 
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
-# the path mentioned in the documentation of a class, which tells 
-# the reader which header file to include in order to use a class. 
-# If left blank only the name of the header file containing the class 
-# definition is used. Otherwise one should specify the include paths that 
-# are normally passed to the compiler using the -I flag.
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
+# path mentioned in the documentation of a class, which tells the reader which
+# header file to include in order to use a class. If left blank only the name of
+# the header file containing the class definition is used. Otherwise one should
+# specify the list of include paths that are normally passed to the compiler
+# using the -I flag.
 
-STRIP_FROM_INC_PATH    = 
+STRIP_FROM_INC_PATH    =
 
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
-# (but less readable) file names. This can be useful if your file system 
-# doesn't support long names like on DOS, Mac, or CD-ROM.
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
+# less readable) file names. This can be useful is your file systems doesn't
+# support long names like on DOS, Mac, or CD-ROM.
+# The default value is: NO.
 
 SHORT_NAMES            = NO
 
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
-# will interpret the first line (until the first dot) of a JavaDoc-style 
-# comment as the brief description. If set to NO, the JavaDoc 
-# comments will behave just like regular Qt-style comments 
-# (thus requiring an explicit @brief command for a brief description.)
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
+# first line (until the first dot) of a Javadoc-style comment as the brief
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
+# style comments (thus requiring an explicit @brief command for a brief
+# description.)
+# The default value is: NO.
 
 JAVADOC_AUTOBRIEF      = NO
 
-# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
-# interpret the first line (until the first dot) of a Qt-style 
-# comment as the brief description. If set to NO, the comments 
-# will behave just like regular Qt-style comments (thus requiring 
-# an explicit \brief command for a brief description.)
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
+# line (until the first dot) of a Qt-style comment as the brief description. If
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
+# requiring an explicit \brief command for a brief description.)
+# The default value is: NO.
 
 QT_AUTOBRIEF           = NO
 
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
-# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
-# comments) as a brief description. This used to be the default behaviour. 
-# The new default is to treat a multi-line C++ comment block as a detailed 
-# description. Set this tag to YES if you prefer the old behaviour instead.
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
+# a brief description. This used to be the default behavior. The new default is
+# to treat a multi-line C++ comment block as a detailed description. Set this
+# tag to YES if you prefer the old behavior instead.
+#
+# Note that setting this tag to YES also means that rational rose comments are
+# not recognized any more.
+# The default value is: NO.
 
 MULTILINE_CPP_IS_BRIEF = NO
 
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
-# member inherits the documentation from any documented member that it 
-# re-implements.
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
+# documentation from any documented member that it re-implements.
+# The default value is: YES.
 
 INHERIT_DOCS           = YES
 
-# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
-# a new page for each member. If set to NO, the documentation of a member will 
-# be part of the file/class/namespace that contains it.
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
+# page for each member. If set to NO, the documentation of a member will be part
+# of the file/class/namespace that contains it.
+# The default value is: NO.
 
 SEPARATE_MEMBER_PAGES  = NO
 
-# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
-# Doxygen uses this value to replace tabs by spaces in code fragments.
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
+# uses this value to replace tabs by spaces in code fragments.
+# Minimum value: 1, maximum value: 16, default value: 4.
 
 TAB_SIZE               = 8
 
-# This tag can be used to specify a number of aliases that acts 
-# as commands in the documentation. An alias has the form "name=value". 
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
-# put the command \sideeffect (or @sideeffect) in the documentation, which 
-# will result in a user-defined paragraph with heading "Side Effects:". 
-# You can put \n's in the value part of an alias to insert newlines.
+# This tag can be used to specify a number of aliases that act as commands in
+# the documentation. An alias has the form:
+# name=value
+# For example adding
+# "sideeffect=@par Side Effects:\n"
+# will allow you to put the command \sideeffect (or @sideeffect) in the
+# documentation, which will result in a user-defined paragraph with heading
+# "Side Effects:". You can put \n's in the value part of an alias to insert
+# newlines.
 
-ALIASES                = 
+ALIASES                =
 
-# This tag can be used to specify a number of word-keyword mappings (TCL only). 
-# A mapping has the form "name=value". For example adding 
-# "class=itcl::class" will allow you to use the command class in the 
-# itcl::class meaning.
+# This tag can be used to specify a number of word-keyword mappings (TCL only).
+# A mapping has the form "name=value". For example adding "class=itcl::class"
+# will allow you to use the command class in the itcl::class meaning.
 
-TCL_SUBST              = 
+TCL_SUBST              =
 
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
-# sources only. Doxygen will then generate output that is more tailored for C. 
-# For instance, some of the names that are used will be different. The list 
-# of all members will be omitted, etc.
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
+# only. Doxygen will then generate output that is more tailored for C. For
+# instance, some of the names that are used will be different. The list of all
+# members will be omitted, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_FOR_C  = NO
 
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Java. For instance, namespaces will be presented as packages, qualified 
-# scopes will look different, etc.
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
+# Python sources only. Doxygen will then generate output that is more tailored
+# for that language. For instance, namespaces will be presented as packages,
+# qualified scopes will look different, etc.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_JAVA   = NO
 
-# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran 
-# sources only. Doxygen will then generate output that is more tailored for 
-# Fortran.
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
+# sources. Doxygen will then generate output that is tailored for Fortran.
+# The default value is: NO.
 
 OPTIMIZE_FOR_FORTRAN   = NO
 
-# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL 
-# sources. Doxygen will then generate output that is tailored for 
-# VHDL.
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
+# sources. Doxygen will then generate output that is tailored for VHDL.
+# The default value is: NO.
 
 OPTIMIZE_OUTPUT_VHDL   = NO
 
-# Doxygen selects the parser to use depending on the extension of the files it 
-# parses. With this tag you can assign which parser to use for a given extension. 
-# Doxygen has a built-in mapping, but you can override or extend it using this 
-# tag. The format is ext=language, where ext is a file extension, and language 
-# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, 
-# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make 
-# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C 
-# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions 
-# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen.
-
-EXTENSION_MAPPING      = 
-
-# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want 
-# to include (a tag file for) the STL sources as input, then you should 
-# set this tag to YES in order to let doxygen match functions declarations and 
-# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
-# func(std::string) {}). This also makes the inheritance and collaboration 
+# Doxygen selects the parser to use depending on the extension of the files it
+# parses. With this tag you can assign which parser to use for a given
+# extension. Doxygen has a built-in mapping, but you can override or extend it
+# using this tag. The format is ext=language, where ext is a file extension, and
+# language is one of the parsers supported by doxygen: IDL, Java, Javascript,
+# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran:
+# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran:
+# Fortran. In the later case the parser tries to guess whether the code is fixed
+# or free formatted code, this is the default for Fortran type files), VHDL. For
+# instance to make doxygen treat .inc files as Fortran files (default is PHP),
+# and .f files as C (default is Fortran), use: inc=Fortran f=C.
+#
+# Note: For files without extension you can use no_extension as a placeholder.
+#
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
+# the files are not read by doxygen.
+
+EXTENSION_MAPPING      =
+
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
+# according to the Markdown format, which allows for more readable
+# documentation. See http://daringfireball.net/projects/markdown/ for details.
+# The output of markdown processing is further processed by doxygen, so you can
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
+# case of backward compatibilities issues.
+# The default value is: YES.
+
+MARKDOWN_SUPPORT       = YES
+
+# When enabled doxygen tries to link words that correspond to documented
+# classes, or namespaces to their corresponding documentation. Such a link can
+# be prevented in individual cases by putting a % sign in front of the word or
+# globally by setting AUTOLINK_SUPPORT to NO.
+# The default value is: YES.
+
+AUTOLINK_SUPPORT       = YES
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
+# to include (a tag file for) the STL sources as input, then you should set this
+# tag to YES in order to let doxygen match functions declarations and
+# definitions whose arguments contain STL classes (e.g. func(std::string);
+# versus func(std::string) {}). This also make the inheritance and collaboration
 # diagrams that involve STL classes more complete and accurate.
+# The default value is: NO.
 
 BUILTIN_STL_SUPPORT    = NO
 
-# If you use Microsoft's C++/CLI language, you should set this option to YES to 
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
 # enable parsing support.
+# The default value is: NO.
 
 CPP_CLI_SUPPORT        = NO
 
-# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. 
-# Doxygen will parse them like normal C++ but will assume all classes use public 
-# instead of private inheritance when no explicit protection keyword is present.
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
+# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen
+# will parse them like normal C++ but will assume all classes use public instead
+# of private inheritance when no explicit protection keyword is present.
+# The default value is: NO.
 
 SIP_SUPPORT            = NO
 
-# For Microsoft's IDL there are propget and propput attributes to indicate getter 
-# and setter methods for a property. Setting this option to YES (the default) 
-# will make doxygen replace the get and set methods by a property in the 
-# documentation. This will only work if the methods are indeed getting or 
-# setting a simple type. If this is not the case, or you want to show the 
-# methods anyway, you should set this option to NO.
+# For Microsoft's IDL there are propget and propput attributes to indicate
+# getter and setter methods for a property. Setting this option to YES will make
+# doxygen to replace the get and set methods by a property in the documentation.
+# This will only work if the methods are indeed getting or setting a simple
+# type. If this is not the case, or you want to show the methods anyway, you
+# should set this option to NO.
+# The default value is: YES.
 
 IDL_PROPERTY_SUPPORT   = YES
 
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
-# tag is set to YES, then doxygen will reuse the documentation of the first 
-# member in the group (if any) for the other members of the group. By default 
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
+# tag is set to YES then doxygen will reuse the documentation of the first
+# member in the group (if any) for the other members of the group. By default
 # all members of a group must be documented explicitly.
+# The default value is: NO.
 
 DISTRIBUTE_GROUP_DOC   = NO
 
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
-# the same type (for instance a group of public functions) to be put as a 
-# subgroup of that type (e.g. under the Public Functions section). Set it to 
-# NO to prevent subgrouping. Alternatively, this can be done per class using 
-# the \nosubgrouping command.
+# If one adds a struct or class to a group and this option is enabled, then also
+# any nested class or struct is added to the same group. By default this option
+# is disabled and one has to add nested compounds explicitly via \ingroup.
+# The default value is: NO.
+
+GROUP_NESTED_COMPOUNDS = NO
+
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
+# (for instance a group of public functions) to be put as a subgroup of that
+# type (e.g. under the Public Functions section). Set it to NO to prevent
+# subgrouping. Alternatively, this can be done per class using the
+# \nosubgrouping command.
+# The default value is: YES.
 
 SUBGROUPING            = YES
 
-# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and 
-# unions are shown inside the group in which they are included (e.g. using 
-# @ingroup) instead of on a separate page (for HTML and Man pages) or 
-# section (for LaTeX and RTF).
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
+# are shown inside the group in which they are included (e.g. using \ingroup)
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
+# and RTF).
+#
+# Note that this feature does not work in combination with
+# SEPARATE_MEMBER_PAGES.
+# The default value is: NO.
 
 INLINE_GROUPED_CLASSES = NO
 
-# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and 
-# unions with only public data fields will be shown inline in the documentation 
-# of the scope in which they are defined (i.e. file, namespace, or group 
-# documentation), provided this scope is documented. If set to NO (the default), 
-# structs, classes, and unions are shown on a separate page (for HTML and Man 
-# pages) or section (for LaTeX and RTF).
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
+# with only public data fields or simple typedef fields will be shown inline in
+# the documentation of the scope in which they are defined (i.e. file,
+# namespace, or group documentation), provided this scope is documented. If set
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
+# Man pages) or section (for LaTeX and RTF).
+# The default value is: NO.
 
 INLINE_SIMPLE_STRUCTS  = NO
 
-# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum 
-# is documented as struct, union, or enum with the name of the typedef. So 
-# typedef struct TypeS {} TypeT, will appear in the documentation as a struct 
-# with name TypeT. When disabled the typedef will appear as a member of a file, 
-# namespace, or class. And the struct will be named TypeS. This can typically 
-# be useful for C code in case the coding convention dictates that all compound 
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
+# enum is documented as struct, union, or enum with the name of the typedef. So
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
+# with name TypeT. When disabled the typedef will appear as a member of a file,
+# namespace, or class. And the struct will be named TypeS. This can typically be
+# useful for C code in case the coding convention dictates that all compound
 # types are typedef'ed and only the typedef is referenced, never the tag name.
+# The default value is: NO.
 
 TYPEDEF_HIDES_STRUCT   = NO
 
-# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to 
-# determine which symbols to keep in memory and which to flush to disk. 
-# When the cache is full, less often used symbols will be written to disk. 
-# For small to medium size projects (<1000 input files) the default value is 
-# probably good enough. For larger projects a too small cache size can cause 
-# doxygen to be busy swapping symbols to and from disk most of the time 
-# causing a significant performance penalty. 
-# If the system has enough physical memory increasing the cache will improve the 
-# performance by keeping more symbols in memory. Note that the value works on 
-# a logarithmic scale so increasing the size by one will roughly double the 
-# memory usage. The cache size is given by this formula: 
-# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-# corresponding to a cache size of 2^16 = 65536 symbols.
-
-SYMBOL_CACHE_SIZE      = 0
-
-# Similar to the SYMBOL_CACHE_SIZE the size of the symbol lookup cache can be 
-# set using LOOKUP_CACHE_SIZE. This cache is used to resolve symbols given 
-# their name and scope. Since this can be an expensive process and often the 
-# same symbol appear multiple times in the code, doxygen keeps a cache of 
-# pre-resolved symbols. If the cache is too small doxygen will become slower. 
-# If the cache is too large, memory is wasted. The cache size is given by this 
-# formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range is 0..9, the default is 0, 
-# corresponding to a cache size of 2^16 = 65536 symbols.
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
+# cache is used to resolve symbols given their name and scope. Since this can be
+# an expensive process and often the same symbol appears multiple times in the
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
+# doxygen will become slower. If the cache is too large, memory is wasted. The
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
+# symbols. At the end of a run doxygen will report the cache usage and suggest
+# the optimal cache size from a speed point of view.
+# Minimum value: 0, maximum value: 9, default value: 0.
 
 LOOKUP_CACHE_SIZE      = 0
 
@@ -351,329 +418,393 @@ LOOKUP_CACHE_SIZE      = 0
 # Build related configuration options
 #---------------------------------------------------------------------------
 
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
-# documentation are documented, even if no documentation was available. 
-# Private class members and static file members will be hidden unless 
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
+# documentation are documented, even if no documentation was available. Private
+# class members and static file members will be hidden unless the
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
+# Note: This will also disable the warnings about undocumented members that are
+# normally produced when WARNINGS is set to YES.
+# The default value is: NO.
 
 EXTRACT_ALL            = NO
 
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
-# will be included in the documentation.
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
+# be included in the documentation.
+# The default value is: NO.
 
 EXTRACT_PRIVATE        = NO
 
-# If the EXTRACT_STATIC tag is set to YES all static members of a file 
-# will be included in the documentation.
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
+# scope will be included in the documentation.
+# The default value is: NO.
+
+EXTRACT_PACKAGE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
+# included in the documentation.
+# The default value is: NO.
 
 EXTRACT_STATIC         = NO
 
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
-# defined locally in source files will be included in the documentation. 
-# If set to NO only classes defined in header files are included.
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
+# locally in source files will be included in the documentation. If set to NO,
+# only classes defined in header files are included. Does not have any effect
+# for Java sources.
+# The default value is: YES.
 
 EXTRACT_LOCAL_CLASSES  = YES
 
-# This flag is only useful for Objective-C code. When set to YES local 
-# methods, which are defined in the implementation section but not in 
-# the interface are included in the documentation. 
-# If set to NO (the default) only methods in the interface are included.
+# This flag is only useful for Objective-C code. If set to YES, local methods,
+# which are defined in the implementation section but not in the interface are
+# included in the documentation. If set to NO, only methods in the interface are
+# included.
+# The default value is: NO.
 
 EXTRACT_LOCAL_METHODS  = NO
 
-# If this flag is set to YES, the members of anonymous namespaces will be 
-# extracted and appear in the documentation as a namespace called 
-# 'anonymous_namespace{file}', where file will be replaced with the base 
-# name of the file that contains the anonymous namespace. By default 
-# anonymous namespaces are hidden.
+# If this flag is set to YES, the members of anonymous namespaces will be
+# extracted and appear in the documentation as a namespace called
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
+# the file that contains the anonymous namespace. By default anonymous namespace
+# are hidden.
+# The default value is: NO.
 
 EXTRACT_ANON_NSPACES   = NO
 
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
-# undocumented members of documented classes, files or namespaces. 
-# If set to NO (the default) these members will be included in the 
-# various overviews, but no documentation section is generated. 
-# This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
+# undocumented members inside documented classes or files. If set to NO these
+# members will be included in the various overviews, but no documentation
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_MEMBERS     = NO
 
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
-# undocumented classes that are normally visible in the class hierarchy. 
-# If set to NO (the default) these classes will be included in the various 
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
+# undocumented classes that are normally visible in the class hierarchy. If set
+# to NO, these classes will be included in the various overviews. This option
+# has no effect if EXTRACT_ALL is enabled.
+# The default value is: NO.
 
 HIDE_UNDOC_CLASSES     = NO
 
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
-# friend (class|struct|union) declarations. 
-# If set to NO (the default) these declarations will be included in the 
-# documentation.
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
+# (class|struct|union) declarations. If set to NO, these declarations will be
+# included in the documentation.
+# The default value is: NO.
 
 HIDE_FRIEND_COMPOUNDS  = NO
 
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
-# documentation blocks found inside the body of a function. 
-# If set to NO (the default) these blocks will be appended to the 
-# function's detailed documentation block.
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
+# documentation blocks found inside the body of a function. If set to NO, these
+# blocks will be appended to the function's detailed documentation block.
+# The default value is: NO.
 
 HIDE_IN_BODY_DOCS      = NO
 
-# The INTERNAL_DOCS tag determines if documentation 
-# that is typed after a \internal command is included. If the tag is set 
-# to NO (the default) then the documentation will be excluded. 
-# Set it to YES to include the internal documentation.
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
+# \internal command is included. If the tag is set to NO then the documentation
+# will be excluded. Set it to YES to include the internal documentation.
+# The default value is: NO.
 
 INTERNAL_DOCS          = NO
 
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
-# file names in lower-case letters. If set to YES upper-case letters are also 
-# allowed. This is useful if you have classes or files whose names only differ 
-# in case and if your file system supports case sensitive file names. Windows 
+# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file
+# names in lower-case letters. If set to YES, upper-case letters are also
+# allowed. This is useful if you have classes or files whose names only differ
+# in case and if your file system supports case sensitive file names. Windows
 # and Mac users are advised to set this option to NO.
+# The default value is: system dependent.
 
 CASE_SENSE_NAMES       = NO
 
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
-# will show members with their full class and namespace scopes in the 
-# documentation. If set to YES the scope will be hidden.
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
+# their full class and namespace scopes in the documentation. If set to YES, the
+# scope will be hidden.
+# The default value is: NO.
 
 HIDE_SCOPE_NAMES       = NO
 
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
-# will put a list of the files that are included by a file in the documentation 
-# of that file.
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
+# append additional text to a page's title, such as Class Reference. If set to
+# YES the compound reference will be hidden.
+# The default value is: NO.
+
+HIDE_COMPOUND_REFERENCE= NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
+# the files that are included by a file in the documentation of that file.
+# The default value is: YES.
 
 SHOW_INCLUDE_FILES     = YES
 
-# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen 
-# will list include files with double quotes in the documentation 
-# rather than with sharp brackets.
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
+# grouped member an include statement to the documentation, telling the reader
+# which file to include in order to use the member.
+# The default value is: NO.
+
+SHOW_GROUPED_MEMB_INC  = NO
+
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
+# files with double quotes in the documentation rather than with sharp brackets.
+# The default value is: NO.
 
 FORCE_LOCAL_INCLUDES   = NO
 
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
-# is inserted in the documentation for inline members.
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
+# documentation for inline members.
+# The default value is: YES.
 
 INLINE_INFO            = YES
 
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
-# will sort the (detailed) documentation of file and class members 
-# alphabetically by member name. If set to NO the members will appear in 
-# declaration order.
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
+# (detailed) documentation of file and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order.
+# The default value is: YES.
 
 SORT_MEMBER_DOCS       = YES
 
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
-# brief documentation of file, namespace and class members alphabetically 
-# by member name. If set to NO (the default) the members will appear in 
-# declaration order.
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
+# descriptions of file, namespace and class members alphabetically by member
+# name. If set to NO, the members will appear in declaration order. Note that
+# this will also influence the order of the classes in the class list.
+# The default value is: NO.
 
 SORT_BRIEF_DOCS        = NO
 
-# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen 
-# will sort the (brief and detailed) documentation of class members so that 
-# constructors and destructors are listed first. If set to NO (the default) 
-# the constructors will appear in the respective orders defined by 
-# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. 
-# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO 
-# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO.
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
+# (brief and detailed) documentation of class members so that constructors and
+# destructors are listed first. If set to NO the constructors will appear in the
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
+# member documentation.
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
+# detailed member documentation.
+# The default value is: NO.
 
 SORT_MEMBERS_CTORS_1ST = NO
 
-# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the 
-# hierarchy of group names into alphabetical order. If set to NO (the default) 
-# the group names will appear in their defined order.
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
+# of group names into alphabetical order. If set to NO the group names will
+# appear in their defined order.
+# The default value is: NO.
 
 SORT_GROUP_NAMES       = NO
 
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
-# sorted by fully-qualified names, including namespaces. If set to 
-# NO (the default), the class list will be sorted only by class name, 
-# not including the namespace part. 
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. 
-# Note: This option applies only to the class list, not to the 
-# alphabetical list.
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
+# fully-qualified names, including namespaces. If set to NO, the class list will
+# be sorted only by class name, not including the namespace part.
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the alphabetical
+# list.
+# The default value is: NO.
 
 SORT_BY_SCOPE_NAME     = NO
 
-# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to 
-# do proper type resolution of all parameters of a function it will reject a 
-# match between the prototype and the implementation of a member function even 
-# if there is only one candidate or it is obvious which candidate to choose 
-# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen 
-# will still accept a match between prototype and implementation in such cases.
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
+# type resolution of all parameters of a function it will reject a match between
+# the prototype and the implementation of a member function even if there is
+# only one candidate or it is obvious which candidate to choose by doing a
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
+# accept a match between prototype and implementation in such cases.
+# The default value is: NO.
 
 STRICT_PROTO_MATCHING  = NO
 
-# The GENERATE_TODOLIST tag can be used to enable (YES) or 
-# disable (NO) the todo list. This list is created by putting \todo 
-# commands in the documentation.
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
+# list. This list is created by putting \todo commands in the documentation.
+# The default value is: YES.
 
 GENERATE_TODOLIST      = YES
 
-# The GENERATE_TESTLIST tag can be used to enable (YES) or 
-# disable (NO) the test list. This list is created by putting \test 
-# commands in the documentation.
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
+# list. This list is created by putting \test commands in the documentation.
+# The default value is: YES.
 
 GENERATE_TESTLIST      = YES
 
-# The GENERATE_BUGLIST tag can be used to enable (YES) or 
-# disable (NO) the bug list. This list is created by putting \bug 
-# commands in the documentation.
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
+# list. This list is created by putting \bug commands in the documentation.
+# The default value is: YES.
 
 GENERATE_BUGLIST       = YES
 
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
-# disable (NO) the deprecated list. This list is created by putting 
-# \deprecated commands in the documentation.
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
+# the deprecated list. This list is created by putting \deprecated commands in
+# the documentation.
+# The default value is: YES.
 
 GENERATE_DEPRECATEDLIST= YES
 
-# The ENABLED_SECTIONS tag can be used to enable conditional 
-# documentation sections, marked by \if sectionname ... \endif.
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
+# ... \endcond blocks.
 
-ENABLED_SECTIONS       = 
+ENABLED_SECTIONS       =
 
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
-# the initial value of a variable or macro consists of for it to appear in 
-# the documentation. If the initializer consists of more lines than specified 
-# here it will be hidden. Use a value of 0 to hide initializers completely. 
-# The appearance of the initializer of individual variables and macros in the 
-# documentation can be controlled using \showinitializer or \hideinitializer 
-# command in the documentation regardless of this setting.
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
+# initial value of a variable or macro / define can have for it to appear in the
+# documentation. If the initializer consists of more lines than specified here
+# it will be hidden. Use a value of 0 to hide initializers completely. The
+# appearance of the value of individual variables and macros / defines can be
+# controlled using \showinitializer or \hideinitializer command in the
+# documentation regardless of this setting.
+# Minimum value: 0, maximum value: 10000, default value: 30.
 
 MAX_INITIALIZER_LINES  = 30
 
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
-# at the bottom of the documentation of classes and structs. If set to YES the 
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
+# the bottom of the documentation of classes and structs. If set to YES, the
 # list will mention the files that were used to generate the documentation.
+# The default value is: YES.
 
 SHOW_USED_FILES        = YES
 
-# If the sources in your project are distributed over multiple directories 
-# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
-# in the documentation. The default is NO.
-
-SHOW_DIRECTORIES       = NO
-
-# Set the SHOW_FILES tag to NO to disable the generation of the Files page. 
-# This will remove the Files entry from the Quick Index and from the 
-# Folder Tree View (if specified). The default is YES.
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
+# will remove the Files entry from the Quick Index and from the Folder Tree View
+# (if specified).
+# The default value is: YES.
 
 SHOW_FILES             = YES
 
-# Set the SHOW_NAMESPACES tag to NO to disable the generation of the 
-# Namespaces page.  This will remove the Namespaces entry from the Quick Index 
-# and from the Folder Tree View (if specified). The default is YES.
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
+# page. This will remove the Namespaces entry from the Quick Index and from the
+# Folder Tree View (if specified).
+# The default value is: YES.
 
 SHOW_NAMESPACES        = YES
 
-# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
-# doxygen should invoke to get the current version for each file (typically from 
-# the version control system). Doxygen will invoke the program by executing (via 
-# popen()) the command <command> <input-file>, where <command> is the value of 
-# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
-# provided by doxygen. Whatever the program writes to standard output 
-# is used as the file version. See the manual for examples.
-
-FILE_VERSION_FILTER    = 
-
-# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed 
-# by doxygen. The layout file controls the global structure of the generated 
-# output files in an output format independent way. The create the layout file 
-# that represents doxygen's defaults, run doxygen with the -l option. 
-# You can optionally specify a file name after the option, if omitted 
-# DoxygenLayout.xml will be used as the name of the layout file.
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
+# doxygen should invoke to get the current version for each file (typically from
+# the version control system). Doxygen will invoke the program by executing (via
+# popen()) the command command input-file, where command is the value of the
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
+# by doxygen. Whatever the program writes to standard output is used as the file
+# version. For an example see the documentation.
+
+FILE_VERSION_FILTER    =
+
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
+# by doxygen. The layout file controls the global structure of the generated
+# output files in an output format independent way. To create the layout file
+# that represents doxygen's defaults, run doxygen with the -l option. You can
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
+# will be used as the name of the layout file.
+#
+# Note that if you run doxygen from a directory containing a file called
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
+# tag is left empty.
 
-LAYOUT_FILE            = 
+LAYOUT_FILE            =
 
-# The CITE_BIB_FILES tag can be used to specify one or more bib files 
-# containing the references data. This must be a list of .bib files. The 
-# .bib extension is automatically appended if omitted. Using this command 
-# requires the bibtex tool to be installed. See also 
-# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style 
-# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this 
-# feature you need bibtex and perl available in the search path.
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
+# the reference definitions. This must be a list of .bib files. The .bib
+# extension is automatically appended if omitted. This requires the bibtex tool
+# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info.
+# For LaTeX the style of the bibliography can be controlled using
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
+# search path. See also \cite for info how to create references.
 
-CITE_BIB_FILES         = 
+CITE_BIB_FILES         =
 
 #---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
+# Configuration options related to warning and progress messages
 #---------------------------------------------------------------------------
 
-# The QUIET tag can be used to turn on/off the messages that are generated 
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
+# The QUIET tag can be used to turn on/off the messages that are generated to
+# standard output by doxygen. If QUIET is set to YES this implies that the
+# messages are off.
+# The default value is: NO.
 
-QUIET                  = NO
+QUIET                  = YES
 
-# The WARNINGS tag can be used to turn on/off the warning messages that are 
-# generated by doxygen. Possible values are YES and NO. If left blank 
-# NO is used.
+# The WARNINGS tag can be used to turn on/off the warning messages that are
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
+# this implies that the warnings are on.
+#
+# Tip: Turn warnings on while writing the documentation.
+# The default value is: YES.
 
 WARNINGS               = YES
 
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
-# automatically be disabled.
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
+# will automatically be disabled.
+# The default value is: YES.
 
 WARN_IF_UNDOCUMENTED   = YES
 
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
-# potential errors in the documentation, such as not documenting some 
-# parameters in a documented function, or documenting parameters that 
-# don't exist or using markup commands wrongly.
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
+# potential errors in the documentation, such as not documenting some parameters
+# in a documented function, or documenting parameters that don't exist or using
+# markup commands wrongly.
+# The default value is: YES.
 
 WARN_IF_DOC_ERROR      = YES
 
-# The WARN_NO_PARAMDOC option can be enabled to get warnings for 
-# functions that are documented, but have no documentation for their parameters 
-# or return value. If set to NO (the default) doxygen will only warn about 
-# wrong or incomplete parameter documentation, but not about the absence of 
-# documentation.
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
+# are documented, but have no documentation for their parameters or return
+# value. If set to NO, doxygen will only warn about wrong or incomplete
+# parameter documentation, but not about the absence of documentation.
+# The default value is: NO.
 
 WARN_NO_PARAMDOC       = NO
 
-# The WARN_FORMAT tag determines the format of the warning messages that 
-# doxygen can produce. The string should contain the $file, $line, and $text 
-# tags, which will be replaced by the file and line number from which the 
-# warning originated and the warning text. Optionally the format may contain 
-# $version, which will be replaced by the version of the file (if it could 
-# be obtained via FILE_VERSION_FILTER)
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
+# a warning is encountered.
+# The default value is: NO.
+
+WARN_AS_ERROR          = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
+# can produce. The string should contain the $file, $line, and $text tags, which
+# will be replaced by the file and line number from which the warning originated
+# and the warning text. Optionally the format may contain $version, which will
+# be replaced by the version of the file (if it could be obtained via
+# FILE_VERSION_FILTER)
+# The default value is: $file:$line: $text.
 
 WARN_FORMAT            = "$file:$line: $text"
 
-# The WARN_LOGFILE tag can be used to specify a file to which warning 
-# and error messages should be written. If left blank the output is written 
-# to stderr.
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
+# messages should be written. If left blank the output is written to standard
+# error (stderr).
 
-WARN_LOGFILE           = 
+WARN_LOGFILE           =
 
 #---------------------------------------------------------------------------
-# configuration options related to the input files
+# Configuration options related to the input files
 #---------------------------------------------------------------------------
 
-# The INPUT tag can be used to specify the files and/or directories that contain 
-# documented source files. You may enter file names like "myfile.cpp" or 
-# directories like "/usr/src/myproject". Separate the files or directories 
-# with spaces.
+# The INPUT tag is used to specify the files and/or directories that contain
+# documented source files. You may enter file names like myfile.cpp or
+# directories like /usr/src/myproject. Separate the files or directories with
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
+# Note: If this tag is empty the current directory is searched.
 
 INPUT                  = ./src/odil
 
-# This tag can be used to specify the character encoding of the source files 
-# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is 
-# also the default input encoding. Doxygen uses libiconv (or the iconv built 
-# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for 
-# the list of possible encodings.
+# This tag can be used to specify the character encoding of the source files
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
+# documentation (see: http://www.gnu.org/software/libiconv) for the list of
+# possible encodings.
+# The default value is: UTF-8.
 
 INPUT_ENCODING         = UTF-8
 
-# If the value of the INPUT tag contains directories, you can use the 
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank the following patterns are tested: 
-# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh 
-# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py 
-# *.f90 *.f *.for *.vhd *.vhdl
+# If the value of the INPUT tag contains directories, you can use the
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
+# *.h) to filter out the source-files in the directories.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# read by doxygen.
+#
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
+# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
+# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f, *.for, *.tcl,
+# *.vhd, *.vhdl, *.ucf, *.qsf, *.as and *.js.
 
 FILE_PATTERNS          = *.c \
                          *.cc \
@@ -708,892 +839,1315 @@ FILE_PATTERNS          = *.c \
                          *.vhd \
                          *.vhdl
 
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
-# should be searched for input files as well. Possible values are YES and NO. 
-# If left blank NO is used.
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
+# be searched for input files as well.
+# The default value is: NO.
 
 RECURSIVE              = NO
 
-# The EXCLUDE tag can be used to specify files and/or directories that should be 
-# excluded from the INPUT source files. This way you can easily exclude a 
-# subdirectory from a directory tree whose root is specified with the INPUT tag. 
-# Note that relative paths are relative to the directory from which doxygen is 
+# The EXCLUDE tag can be used to specify files and/or directories that should be
+# excluded from the INPUT source files. This way you can easily exclude a
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+#
+# Note that relative paths are relative to the directory from which doxygen is
 # run.
 
-EXCLUDE                = 
+EXCLUDE                =
 
-# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or 
-# directories that are symbolic links (a Unix file system feature) are excluded 
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
+# directories that are symbolic links (a Unix file system feature) are excluded
 # from the input.
+# The default value is: NO.
 
 EXCLUDE_SYMLINKS       = NO
 
-# If the value of the INPUT tag contains directories, you can use the 
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
-# certain files from those directories. Note that the wildcards are matched 
-# against the file with absolute path, so to exclude all test directories 
-# for example use the pattern */test/*
+# If the value of the INPUT tag contains directories, you can use the
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
+# certain files from those directories.
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories for example use the pattern */test/*
 
-EXCLUDE_PATTERNS       = 
+EXCLUDE_PATTERNS       =
 
-# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
-# (namespaces, classes, functions, etc.) that should be excluded from the 
-# output. The symbol name can be a fully qualified name, a word, or if the 
-# wildcard * is used, a substring. Examples: ANamespace, AClass, 
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
+# (namespaces, classes, functions, etc.) that should be excluded from the
+# output. The symbol name can be a fully qualified name, a word, or if the
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
 # AClass::ANamespace, ANamespace::*Test
+#
+# Note that the wildcards are matched against the file with absolute path, so to
+# exclude all test directories use the pattern */test/*
 
-EXCLUDE_SYMBOLS        = 
+EXCLUDE_SYMBOLS        =
 
-# The EXAMPLE_PATH tag can be used to specify one or more files or 
-# directories that contain example code fragments that are included (see 
-# the \include command).
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
+# that contain example code fragments that are included (see the \include
+# command).
 
-EXAMPLE_PATH           = 
+EXAMPLE_PATH           =
 
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
-# and *.h) to filter out the source-files in the directories. If left 
-# blank all files are included.
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
+# *.h) to filter out the source-files in the directories. If left blank all
+# files are included.
 
 EXAMPLE_PATTERNS       = *
 
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
-# searched for input files to be used with the \include or \dontinclude 
-# commands irrespective of the value of the RECURSIVE tag. 
-# Possible values are YES and NO. If left blank NO is used.
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
+# searched for input files to be used with the \include or \dontinclude commands
+# irrespective of the value of the RECURSIVE tag.
+# The default value is: NO.
 
 EXAMPLE_RECURSIVE      = NO
 
-# The IMAGE_PATH tag can be used to specify one or more files or 
-# directories that contain image that are included in the documentation (see 
-# the \image command).
+# The IMAGE_PATH tag can be used to specify one or more files or directories
+# that contain images that are to be included in the documentation (see the
+# \image command).
 
-IMAGE_PATH             = 
+IMAGE_PATH             =
 
-# The INPUT_FILTER tag can be used to specify a program that doxygen should 
-# invoke to filter for each input file. Doxygen will invoke the filter program 
-# by executing (via popen()) the command <filter> <input-file>, where <filter> 
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
-# input file. Doxygen will then use the output that the filter program writes 
-# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
-# ignored.
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
+# invoke to filter for each input file. Doxygen will invoke the filter program
+# by executing (via popen()) the command:
+#
+# <filter> <input-file>
+#
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
+# name of an input file. Doxygen will then use the output that the filter
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
+# will be ignored.
+#
+# Note that the filter must not add or remove lines; it is applied before the
+# code is scanned, but not when the output code is generated. If lines are added
+# or removed, the anchors will not be placed correctly.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
+
+INPUT_FILTER           =
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
+# basis. Doxygen will compare the file name with each pattern and apply the
+# filter if there is a match. The filters are a list of the form: pattern=filter
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
+# patterns match the file name, INPUT_FILTER is applied.
+#
+# Note that for custom extensions or not directly supported extensions you also
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
+# properly processed by doxygen.
 
-INPUT_FILTER           = 
+FILTER_PATTERNS        =
 
-# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
-# basis.  Doxygen will compare the file name with each pattern and apply the 
-# filter if there is a match.  The filters are a list of the form: 
-# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
-# info on how filters are used. If FILTER_PATTERNS is empty or if 
-# non of the patterns match the file name, INPUT_FILTER is applied.
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
+# INPUT_FILTER) will also be used to filter the input files that are used for
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The default value is: NO.
 
-FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = NO
 
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
-# INPUT_FILTER) will be used to filter the input files when producing source 
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
+# it is also possible to disable source filtering for a specific pattern using
+# *.ext= (so without naming a filter).
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
 
-FILTER_SOURCE_FILES    = NO
+FILTER_SOURCE_PATTERNS =
 
-# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file 
-# pattern. A pattern will override the setting for FILTER_PATTERN (if any) 
-# and it is also possible to disable source filtering for a specific pattern 
-# using *.ext= (so without naming a filter). This option only has effect when 
-# FILTER_SOURCE_FILES is enabled.
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
+# is part of the input, its contents will be placed on the main page
+# (index.html). This can be useful if you have a project on for instance GitHub
+# and want to reuse the introduction page also for the doxygen output.
 
-FILTER_SOURCE_PATTERNS = 
+USE_MDFILE_AS_MAINPAGE =
 
 #---------------------------------------------------------------------------
-# configuration options related to source browsing
+# Configuration options related to source browsing
 #---------------------------------------------------------------------------
 
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
-# be generated. Documented entities will be cross-referenced with these sources. 
-# Note: To get rid of all source code in the generated output, make sure also 
-# VERBATIM_HEADERS is set to NO.
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
+# generated. Documented entities will be cross-referenced with these sources.
+#
+# Note: To get rid of all source code in the generated output, make sure that
+# also VERBATIM_HEADERS is set to NO.
+# The default value is: NO.
 
 SOURCE_BROWSER         = NO
 
-# Setting the INLINE_SOURCES tag to YES will include the body 
-# of functions and classes directly in the documentation.
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
+# classes and enums directly into the documentation.
+# The default value is: NO.
 
 INLINE_SOURCES         = NO
 
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
-# doxygen to hide any special comment blocks from generated source code 
-# fragments. Normal C and C++ comments will always remain visible.
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
+# special comment blocks from generated source code fragments. Normal C, C++ and
+# Fortran comments will always remain visible.
+# The default value is: YES.
 
 STRIP_CODE_COMMENTS    = YES
 
-# If the REFERENCED_BY_RELATION tag is set to YES 
-# then for each documented function all documented 
-# functions referencing it will be listed.
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
+# function all documented functions referencing it will be listed.
+# The default value is: NO.
 
 REFERENCED_BY_RELATION = NO
 
-# If the REFERENCES_RELATION tag is set to YES 
-# then for each documented function all documented entities 
-# called/used by that function will be listed.
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
+# all documented entities called/used by that function will be listed.
+# The default value is: NO.
 
 REFERENCES_RELATION    = NO
 
-# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) 
-# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from 
-# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will 
-# link to the source code.  Otherwise they will link to the documentation.
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
+# link to the documentation.
+# The default value is: YES.
 
 REFERENCES_LINK_SOURCE = YES
 
-# If the USE_HTAGS tag is set to YES then the references to source code 
-# will point to the HTML generated by the htags(1) tool instead of doxygen 
-# built-in source browser. The htags tool is part of GNU's global source 
-# tagging system (see http://www.gnu.org/software/global/global.html). You 
-# will need version 4.8.6 or higher.
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
+# source code will show a tooltip with additional information such as prototype,
+# brief description and links to the definition and documentation. Since this
+# will make the HTML file larger and loading of large files a bit slower, you
+# can opt to disable this feature.
+# The default value is: YES.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
+
+SOURCE_TOOLTIPS        = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code will
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
+# source browser. The htags tool is part of GNU's global source tagging system
+# (see http://www.gnu.org/software/global/global.html). You will need version
+# 4.8.6 or higher.
+#
+# To use it do the following:
+# - Install the latest version of global
+# - Enable SOURCE_BROWSER and USE_HTAGS in the config file
+# - Make sure the INPUT points to the root of the source tree
+# - Run doxygen as normal
+#
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
+# tools must be available from the command line (i.e. in the search path).
+#
+# The result: instead of the source browser generated by doxygen, the links to
+# source code will now point to the output of htags.
+# The default value is: NO.
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
 
 USE_HTAGS              = NO
 
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
-# will generate a verbatim copy of the header file for each class for 
-# which an include is specified. Set to NO to disable this.
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
+# verbatim copy of the header file for each class for which an include is
+# specified. Set to NO to disable this.
+# See also: Section \class.
+# The default value is: YES.
 
 VERBATIM_HEADERS       = YES
 
+# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
+# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the
+# cost of reduced performance. This can be particularly helpful with template
+# rich C++ code for which doxygen's built-in parser lacks the necessary type
+# information.
+# Note: The availability of this option depends on whether or not doxygen was
+# generated with the -Duse-libclang=ON option for CMake.
+# The default value is: NO.
+
+CLANG_ASSISTED_PARSING = NO
+
+# If clang assisted parsing is enabled you can provide the compiler with command
+# line options that you would normally use when invoking the compiler. Note that
+# the include paths will already be set by doxygen for the files and directories
+# specified with INPUT and INCLUDE_PATH.
+# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES.
+
+CLANG_OPTIONS          =
+
 #---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
+# Configuration options related to the alphabetical class index
 #---------------------------------------------------------------------------
 
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
-# of all compounds will be generated. Enable this if the project 
-# contains a lot of classes, structs, unions or interfaces.
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
+# compounds will be generated. Enable this if the project contains a lot of
+# classes, structs, unions or interfaces.
+# The default value is: YES.
 
 ALPHABETICAL_INDEX     = YES
 
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
-# in which this list will be split (can be a number in the range [1..20])
+# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
+# which the alphabetical index list will be split.
+# Minimum value: 1, maximum value: 20, default value: 5.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
 COLS_IN_ALPHA_INDEX    = 5
 
-# In case all classes in a project start with a common prefix, all 
-# classes will be put under the same header in the alphabetical index. 
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
-# should be ignored while generating the index headers.
+# In case all classes in a project start with a common prefix, all classes will
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
+# while generating the index headers.
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
 
-IGNORE_PREFIX          = 
+IGNORE_PREFIX          =
 
 #---------------------------------------------------------------------------
-# configuration options related to the HTML output
+# Configuration options related to the HTML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
-# generate HTML output.
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
+# The default value is: YES.
 
 GENERATE_HTML          = YES
 
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `html' will be used as the default path.
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_OUTPUT            = html
 
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
-# doxygen will generate files with .html extension.
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
+# generated HTML page (for example: .htm, .php, .asp).
+# The default value is: .html.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_FILE_EXTENSION    = .html
 
-# The HTML_HEADER tag can be used to specify a personal HTML header for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard header. Note that when using a custom header you are responsible  
-# for the proper inclusion of any scripts and style sheets that doxygen 
-# needs, which is dependent on the configuration options used. 
-# It is advised to generate a default header using "doxygen -w html 
-# header.html footer.html stylesheet.css YourConfigFile" and then modify 
-# that header. Note that the header is subject to change so you typically 
-# have to redo this when upgrading to a newer version of doxygen or when 
-# changing the value of configuration settings such as GENERATE_TREEVIEW!
-
-HTML_HEADER            = 
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
-# each generated HTML page. If it is left blank doxygen will generate a 
-# standard footer.
-
-HTML_FOOTER            = 
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
-# style sheet that is used by each HTML page. It can be used to 
-# fine-tune the look of the HTML output. If the tag is left blank doxygen 
-# will generate a default style sheet. Note that doxygen will try to copy 
-# the style sheet file to the HTML output directory, so don't put your own 
-# style sheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET        = 
-
-# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or 
-# other source files which should be copied to the HTML output directory. Note 
-# that these files will be copied to the base HTML output directory. Use the 
-# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these 
-# files. In the HTML_STYLESHEET file, use the file name only. Also note that 
-# the files will be copied as-is; there are no commands or markers available.
-
-HTML_EXTRA_FILES       = 
-
-# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. 
-# Doxygen will adjust the colors in the style sheet and background images 
-# according to this color. Hue is specified as an angle on a colorwheel, 
-# see http://en.wikipedia.org/wiki/Hue for more information. 
-# For instance the value 0 represents red, 60 is yellow, 120 is green, 
-# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. 
-# The allowed range is 0 to 359.
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
+# each generated HTML page. If the tag is left blank doxygen will generate a
+# standard header.
+#
+# To get valid HTML the header file that includes any scripts and style sheets
+# that doxygen needs, which is dependent on the configuration options used (e.g.
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
+# default header using
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
+# YourConfigFile
+# and then modify the file new_header.html. See also section "Doxygen usage"
+# for information on how to generate the default header that doxygen normally
+# uses.
+# Note: The header is subject to change so you typically have to regenerate the
+# default header when upgrading to a newer version of doxygen. For a description
+# of the possible markers and block names see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_HEADER            =
+
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
+# generated HTML page. If the tag is left blank doxygen will generate a standard
+# footer. See HTML_HEADER for more information on how to generate a default
+# footer and what special commands can be used inside the footer. See also
+# section "Doxygen usage" for information on how to generate the default footer
+# that doxygen normally uses.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_FOOTER            =
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
+# the HTML output. If left blank doxygen will generate a default style sheet.
+# See also section "Doxygen usage" for information on how to generate the style
+# sheet that doxygen normally uses.
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
+# obsolete.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_STYLESHEET        =
+
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# cascading style sheets that are included after the standard style sheets
+# created by doxygen. Using this option one can overrule certain style aspects.
+# This is preferred over using HTML_STYLESHEET since it does not replace the
+# standard style sheet and is therefore more robust against future updates.
+# Doxygen will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list). For an example see the documentation.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_STYLESHEET  =
+
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the HTML output directory. Note
+# that these files will be copied to the base HTML output directory. Use the
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
+# files will be copied as-is; there are no commands or markers available.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_EXTRA_FILES       =
+
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
+# will adjust the colors in the style sheet and background images according to
+# this color. Hue is specified as an angle on a colorwheel, see
+# http://en.wikipedia.org/wiki/Hue for more information. For instance the value
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
+# purple, and 360 is red again.
+# Minimum value: 0, maximum value: 359, default value: 220.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_COLORSTYLE_HUE    = 220
 
-# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of 
-# the colors in the HTML output. For a value of 0 the output will use 
-# grayscales only. A value of 255 will produce the most vivid colors.
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
+# in the HTML output. For a value of 0 the output will use grayscales only. A
+# value of 255 will produce the most vivid colors.
+# Minimum value: 0, maximum value: 255, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_COLORSTYLE_SAT    = 100
 
-# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to 
-# the luminance component of the colors in the HTML output. Values below 
-# 100 gradually make the output lighter, whereas values above 100 make 
-# the output darker. The value divided by 100 is the actual gamma applied, 
-# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, 
-# and 100 does not change the gamma.
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
+# luminance component of the colors in the HTML output. Values below 100
+# gradually make the output lighter, whereas values above 100 make the output
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
+# change the gamma.
+# Minimum value: 40, maximum value: 240, default value: 80.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_COLORSTYLE_GAMMA  = 80
 
-# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML 
-# page will contain the date and time when the page was generated. Setting 
-# this to NO can help when comparing the output of multiple runs.
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
+# page will contain the date and time when the page was generated. Setting this
+# to YES can help to show when doxygen was last run and thus if the
+# documentation is up to date.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_TIMESTAMP         = NO
 
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
-# files or namespaces will be aligned in HTML using tables. If set to 
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS     = YES
-
-# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
-# documentation will contain sections that can be hidden and shown after the 
-# page has loaded. For this to work a browser that supports 
-# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
-# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
+# documentation will contain sections that can be hidden and shown after the
+# page has loaded.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 HTML_DYNAMIC_SECTIONS  = NO
 
-# If the GENERATE_DOCSET tag is set to YES, additional index files 
-# will be generated that can be used as input for Apple's Xcode 3 
-# integrated development environment, introduced with OSX 10.5 (Leopard). 
-# To create a documentation set, doxygen will generate a Makefile in the 
-# HTML output directory. Running make will produce the docset in that 
-# directory and running "make install" will install the docset in 
-# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find 
-# it at startup. 
-# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html 
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
+# shown in the various tree structured indices initially; the user can expand
+# and collapse entries dynamically later on. Doxygen will expand the tree to
+# such a level that at most the specified number of entries are visible (unless
+# a fully collapsed tree already exceeds this amount). So setting the number of
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
+# representing an infinite number of entries and will result in a full expanded
+# tree by default.
+# Minimum value: 0, maximum value: 9999, default value: 100.
+# This tag requires that the tag GENERATE_HTML is set to YES.
+
+HTML_INDEX_NUM_ENTRIES = 100
+
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
+# generated that can be used as input for Apple's Xcode 3 integrated development
+# environment (see: http://developer.apple.com/tools/xcode/), introduced with
+# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a
+# Makefile in the HTML output directory. Running make will produce the docset in
+# that directory and running make install will install the docset in
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
+# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html
 # for more information.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_DOCSET        = NO
 
-# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the 
-# feed. A documentation feed provides an umbrella under which multiple 
-# documentation sets from a single provider (such as a company or product suite) 
-# can be grouped.
+# This tag determines the name of the docset feed. A documentation feed provides
+# an umbrella under which multiple documentation sets from a single provider
+# (such as a company or product suite) can be grouped.
+# The default value is: Doxygen generated docs.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_FEEDNAME        = "Doxygen generated docs"
 
-# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that 
-# should uniquely identify the documentation set bundle. This should be a 
-# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen 
-# will append .docset to the name.
+# This tag specifies a string that should uniquely identify the documentation
+# set bundle. This should be a reverse domain-name style string, e.g.
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_BUNDLE_ID       = org.doxygen.Project
 
-# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify 
-# the documentation publisher. This should be a reverse domain-name style 
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
+# the documentation publisher. This should be a reverse domain-name style
 # string, e.g. com.mycompany.MyDocSet.documentation.
+# The default value is: org.doxygen.Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
 
-# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher.
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
+# The default value is: Publisher.
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
 
 DOCSET_PUBLISHER_NAME  = Publisher
 
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
-# will be generated that can be used as input for tools like the 
-# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) 
-# of the generated HTML documentation.
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
+# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on
+# Windows.
+#
+# The HTML Help Workshop contains a compiler that can convert all HTML output
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
+# files are now used as the Windows 98 help format, and will replace the old
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
+# HTML files also contain an index, a table of contents, and you can search for
+# words in the documentation. The HTML workshop also contains a viewer for
+# compressed HTML files.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_HTMLHELP      = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
-# be used to specify the file name of the resulting .chm file. You 
-# can add a path in front of the file if the result should not be 
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
+# file. You can add a path in front of the file if the result should not be
 # written to the html output directory.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-CHM_FILE               = 
+CHM_FILE               =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
-# be used to specify the location (absolute path including file name) of 
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
-# the HTML help compiler on the generated index.hhp.
+# The HHC_LOCATION tag can be used to specify the location (absolute path
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
+# The file has to be specified with full path.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-HHC_LOCATION           = 
+HHC_LOCATION           =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
-# controls if a separate .chi index file is generated (YES) or that 
-# it should be included in the master .chm file (NO).
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
+# (YES) or that it should be included in the master .chm file (NO).
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 GENERATE_CHI           = NO
 
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING 
-# is used to encode HtmlHelp index (hhk), content (hhc) and project file 
-# content.
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
+# and project file content.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
-CHM_INDEX_ENCODING     = 
+CHM_INDEX_ENCODING     =
 
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
-# controls whether a binary table of contents is generated (YES) or a 
-# normal table of contents (NO) in the .chm file.
+# The BINARY_TOC flag controls whether a binary table of contents is generated
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
+# enables the Previous and Next buttons.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 BINARY_TOC             = NO
 
-# The TOC_EXPAND flag can be set to YES to add extra items for group members 
-# to the contents of the HTML help documentation and to the tree view.
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
+# the table of contents of the HTML help documentation and to the tree view.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
 
 TOC_EXPAND             = NO
 
-# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and 
-# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated 
-# that can be used as input for Qt's qhelpgenerator to generate a 
-# Qt Compressed Help (.qch) of the generated HTML documentation.
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
+# (.qch) of the generated HTML documentation.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_QHP           = NO
 
-# If the QHG_LOCATION tag is specified, the QCH_FILE tag can 
-# be used to specify the file name of the resulting .qch file. 
-# The path specified is relative to the HTML output folder.
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
+# the file name of the resulting .qch file. The path specified is relative to
+# the HTML output folder.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
-QCH_FILE               = 
+QCH_FILE               =
 
-# The QHP_NAMESPACE tag specifies the namespace to use when generating 
-# Qt Help Project output. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#namespace
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
+# Project output. For more information please see Qt Help Project / Namespace
+# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace).
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_NAMESPACE          = org.doxygen.Project
 
-# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating 
-# Qt Help Project output. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#virtual-folders
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
+# Help Project output. For more information please see Qt Help Project / Virtual
+# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual-
+# folders).
+# The default value is: doc.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
 QHP_VIRTUAL_FOLDER     = doc
 
-# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to 
-# add. For more information please see 
-# http://doc.trolltech.com/qthelpproject.html#custom-filters
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
+# filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
-QHP_CUST_FILTER_NAME   = 
+QHP_CUST_FILTER_NAME   =
 
-# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the 
-# custom filter to add. For more information please see 
-# <a href="http://doc.trolltech.com/qthelpproject.html#custom-filters"> 
-# Qt Help Project / Custom Filters</a>.
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
+# custom filter to add. For more information please see Qt Help Project / Custom
+# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom-
+# filters).
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
-QHP_CUST_FILTER_ATTRS  = 
+QHP_CUST_FILTER_ATTRS  =
 
-# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this 
-# project's 
-# filter section matches. 
-# <a href="http://doc.trolltech.com/qthelpproject.html#filter-attributes"> 
-# Qt Help Project / Filter Attributes</a>.
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
+# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes).
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
-QHP_SECT_FILTER_ATTRS  = 
+QHP_SECT_FILTER_ATTRS  =
 
-# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can 
-# be used to specify the location of Qt's qhelpgenerator. 
-# If non-empty doxygen will try to run qhelpgenerator on the generated 
-# .qhp file.
+# The QHG_LOCATION tag can be used to specify the location of Qt's
+# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the
+# generated .qhp file.
+# This tag requires that the tag GENERATE_QHP is set to YES.
 
-QHG_LOCATION           = 
+QHG_LOCATION           =
 
-# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files  
-# will be generated, which together with the HTML files, form an Eclipse help 
-# plugin. To install this plugin and make it available under the help contents 
-# menu in Eclipse, the contents of the directory containing the HTML and XML 
-# files needs to be copied into the plugins directory of eclipse. The name of 
-# the directory within the plugins directory should be the same as 
-# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before 
-# the help appears.
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
+# generated, together with the HTML files, they form an Eclipse help plugin. To
+# install this plugin and make it available under the help contents menu in
+# Eclipse, the contents of the directory containing the HTML and XML files needs
+# to be copied into the plugins directory of eclipse. The name of the directory
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
+# After copying Eclipse needs to be restarted before the help appears.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_ECLIPSEHELP   = NO
 
-# A unique identifier for the eclipse help plugin. When installing the plugin 
-# the directory name containing the HTML and XML files should also have 
-# this name.
+# A unique identifier for the Eclipse help plugin. When installing the plugin
+# the directory name containing the HTML and XML files should also have this
+# name. Each documentation set should have its own identifier.
+# The default value is: org.doxygen.Project.
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
 
 ECLIPSE_DOC_ID         = org.doxygen.Project
 
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) 
-# at top of each HTML page. The value NO (the default) enables the index and 
-# the value YES disables it. Since the tabs have the same information as the 
-# navigation tree you can set this option to NO if you already set 
-# GENERATE_TREEVIEW to YES.
+# If you want full control over the layout of the generated HTML pages it might
+# be necessary to disable the index and replace it with your own. The
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
+# of each HTML page. A value of NO enables the index and the value YES disables
+# it. Since the tabs in the index contain the same information as the navigation
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 DISABLE_INDEX          = NO
 
-# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index 
-# structure should be generated to display hierarchical information. 
-# If the tag value is set to YES, a side panel will be generated 
-# containing a tree-like index structure (just like the one that 
-# is generated for HTML Help). For this to work a browser that supports 
-# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). 
-# Windows users are probably better off using the HTML help feature. 
-# Since the tree basically has the same information as the tab index you 
-# could consider to set DISABLE_INDEX to NO when enabling this option.
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
+# structure should be generated to display hierarchical information. If the tag
+# value is set to YES, a side panel will be generated containing a tree-like
+# index structure (just like the one that is generated for HTML Help). For this
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
+# (i.e. any modern browser). Windows users are probably better off using the
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
+# further fine-tune the look of the index. As an example, the default style
+# sheet generated by doxygen has an example that shows how to put an image at
+# the root of the tree instead of the PROJECT_NAME. Since the tree basically has
+# the same information as the tab index, you could consider setting
+# DISABLE_INDEX to YES when enabling this option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 GENERATE_TREEVIEW      = NO
 
-# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values 
-# (range [0,1..20]) that doxygen will group on one line in the generated HTML 
-# documentation. Note that a value of 0 will completely suppress the enum 
-# values from appearing in the overview section.
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
+# doxygen will group on one line in the generated HTML documentation.
+#
+# Note that a value of 0 will completely suppress the enum values from appearing
+# in the overview section.
+# Minimum value: 0, maximum value: 20, default value: 4.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 ENUM_VALUES_PER_LINE   = 4
 
-# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, 
-# and Class Hierarchy pages using a tree view instead of an ordered list.
-
-USE_INLINE_TREES       = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
-# used to set the initial width (in pixels) of the frame in which the tree 
-# is shown.
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
+# to set the initial width (in pixels) of the frame in which the tree is shown.
+# Minimum value: 0, maximum value: 1500, default value: 250.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 TREEVIEW_WIDTH         = 250
 
-# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open 
-# links to external symbols imported via tag files in a separate window.
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
+# external symbols imported via tag files in a separate window.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 EXT_LINKS_IN_WINDOW    = NO
 
-# Use this tag to change the font size of Latex formulas included 
-# as images in the HTML documentation. The default is 10. Note that 
-# when you change the font size after a successful doxygen run you need 
-# to manually remove any form_*.png images from the HTML output directory 
-# to force them to be regenerated.
+# Use this tag to change the font size of LaTeX formulas included as images in
+# the HTML documentation. When you change the font size after a successful
+# doxygen run you need to manually remove any form_*.png images from the HTML
+# output directory to force them to be regenerated.
+# Minimum value: 8, maximum value: 50, default value: 10.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 FORMULA_FONTSIZE       = 10
 
-# Use the FORMULA_TRANPARENT tag to determine whether or not the images 
-# generated for formulas are transparent PNGs. Transparent PNGs are 
-# not supported properly for IE 6.0, but are supported on all modern browsers. 
-# Note that when changing this option you need to delete any form_*.png files 
-# in the HTML output before the changes have effect.
+# Use the FORMULA_TRANPARENT tag to determine whether or not the images
+# generated for formulas are transparent PNGs. Transparent PNGs are not
+# supported properly for IE 6.0, but are supported on all modern browsers.
+#
+# Note that when changing this option you need to delete any form_*.png files in
+# the HTML output directory before the changes have effect.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 FORMULA_TRANSPARENT    = YES
 
-# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax 
-# (see http://www.mathjax.org) which uses client side Javascript for the 
-# rendering instead of using prerendered bitmaps. Use this if you do not 
-# have LaTeX installed or if you want to formulas look prettier in the HTML 
-# output. When enabled you also need to install MathJax separately and 
-# configure the path to it using the MATHJAX_RELPATH option.
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
+# http://www.mathjax.org) which uses client side Javascript for the rendering
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
+# installed or if you want to formulas look prettier in the HTML output. When
+# enabled you may also need to install MathJax separately and configure the path
+# to it using the MATHJAX_RELPATH option.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 USE_MATHJAX            = NO
 
-# When MathJax is enabled you need to specify the location relative to the 
-# HTML output directory using the MATHJAX_RELPATH option. The destination 
-# directory should contain the MathJax.js script. For instance, if the mathjax 
-# directory is located at the same level as the HTML output directory, then 
-# MATHJAX_RELPATH should be ../mathjax. The default value points to the 
-# mathjax.org site, so you can quickly see the result without installing 
-# MathJax, but it is strongly recommended to install a local copy of MathJax 
-# before deployment.
+# When MathJax is enabled you can set the default output format to be used for
+# the MathJax output. See the MathJax site (see:
+# http://docs.mathjax.org/en/latest/output.html) for more details.
+# Possible values are: HTML-CSS (which is slower, but has the best
+# compatibility), NativeMML (i.e. MathML) and SVG.
+# The default value is: HTML-CSS.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_FORMAT         = HTML-CSS
+
+# When MathJax is enabled you need to specify the location relative to the HTML
+# output directory using the MATHJAX_RELPATH option. The destination directory
+# should contain the MathJax.js script. For instance, if the mathjax directory
+# is located at the same level as the HTML output directory, then
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
+# Content Delivery Network so you can quickly see the result without installing
+# MathJax. However, it is strongly recommended to install a local copy of
+# MathJax from http://www.mathjax.org before deployment.
+# The default value is: http://cdn.mathjax.org/mathjax/latest.
+# This tag requires that the tag USE_MATHJAX is set to YES.
 
 MATHJAX_RELPATH        = http://www.mathjax.org/mathjax
 
-# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension 
-# names that should be enabled during MathJax rendering.
-
-MATHJAX_EXTENSIONS     = 
-
-# When the SEARCHENGINE tag is enabled doxygen will generate a search box 
-# for the HTML output. The underlying search engine uses javascript 
-# and DHTML and should work on any modern browser. Note that when using 
-# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets 
-# (GENERATE_DOCSET) there is already a search function so this one should 
-# typically be disabled. For large projects the javascript based search engine 
-# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution.
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
+# extension names that should be enabled during MathJax rendering. For example
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_EXTENSIONS     =
+
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
+# of code that will be used on startup of the MathJax code. See the MathJax site
+# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an
+# example see the documentation.
+# This tag requires that the tag USE_MATHJAX is set to YES.
+
+MATHJAX_CODEFILE       =
+
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
+# the HTML output. The underlying search engine uses javascript and DHTML and
+# should work on any modern browser. Note that when using HTML help
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
+# there is already a search function so this one should typically be disabled.
+# For large projects the javascript based search engine can be slow, then
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
+# search using the keyboard; to jump to the search box use <access key> + S
+# (what the <access key> is depends on the OS and browser, but it is typically
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
+# key> to jump into the search results window, the results can be navigated
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
+# the search. The filter options can be selected when the cursor is inside the
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
+# option.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_HTML is set to YES.
 
 SEARCHENGINE           = YES
 
-# When the SERVER_BASED_SEARCH tag is enabled the search engine will be 
-# implemented using a PHP enabled web server instead of at the web client 
-# using Javascript. Doxygen will generate the search PHP script and index 
-# file to put on the web server. The advantage of the server 
-# based approach is that it scales better to large projects and allows 
-# full text search. The disadvantages are that it is more difficult to setup 
-# and does not have live searching capabilities.
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
+# implemented using a web server instead of a web client using Javascript. There
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
+# setting. When disabled, doxygen will generate a PHP script for searching and
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
+# and searching needs to be provided by external tools. See the section
+# "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
 
 SERVER_BASED_SEARCH    = NO
 
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
+# script for searching. Instead the search results are written to an XML file
+# which needs to be processed by an external indexer. Doxygen will invoke an
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
+# search results.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/).
+#
+# See the section "External Indexing and Searching" for details.
+# The default value is: NO.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH        = NO
+
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
+# which will return the search results when EXTERNAL_SEARCH is enabled.
+#
+# Doxygen ships with an example indexer (doxyindexer) and search engine
+# (doxysearch.cgi) which are based on the open source search engine library
+# Xapian (see: http://xapian.org/). See the section "External Indexing and
+# Searching" for details.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHENGINE_URL       =
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
+# search data is written to a file for indexing by an external tool. With the
+# SEARCHDATA_FILE tag the name of this file can be specified.
+# The default file is: searchdata.xml.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+SEARCHDATA_FILE        = searchdata.xml
+
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
+# projects and redirect the results back to the right project.
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTERNAL_SEARCH_ID     =
+
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
+# projects other than the one defined by this configuration file, but that are
+# all added to the same external search index. Each project needs to have a
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
+# to a relative location where the documentation can be found. The format is:
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
+# This tag requires that the tag SEARCHENGINE is set to YES.
+
+EXTRA_SEARCH_MAPPINGS  =
+
 #---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
+# Configuration options related to the LaTeX output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
-# generate Latex output.
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
+# The default value is: YES.
 
 GENERATE_LATEX         = NO
 
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `latex' will be used as the default path.
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_OUTPUT           = latex
 
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
-# invoked. If left blank `latex' will be used as the default command name. 
-# Note that when enabling USE_PDFLATEX this option is only used for 
-# generating bitmaps for formulas in the HTML output, but not in the 
-# Makefile that is written to the output directory.
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
+# invoked.
+#
+# Note that when enabling USE_PDFLATEX this option is only used for generating
+# bitmaps for formulas in the HTML output, but not in the Makefile that is
+# written to the output directory.
+# The default file is: latex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_CMD_NAME         = latex
 
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
-# generate index for LaTeX. If left blank `makeindex' will be used as the 
-# default command name.
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
+# index for LaTeX.
+# The default file is: makeindex.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 MAKEINDEX_CMD_NAME     = makeindex
 
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
-# LaTeX documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 COMPACT_LATEX          = NO
 
-# The PAPER_TYPE tag can be used to set the paper type that is used 
-# by the printer. Possible values are: a4, letter, legal and 
-# executive. If left blank a4wide will be used.
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
+# printer.
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
+# 14 inches) and executive (7.25 x 10.5 inches).
+# The default value is: a4.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PAPER_TYPE             = a4
 
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
-# packages that should be included in the LaTeX output.
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
+# that should be included in the LaTeX output. The package can be specified just
+# by its name or with the correct syntax as to be used with the LaTeX
+# \usepackage command. To get the times font for instance you can specify :
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
+# To use the option intlimits with the amsmath package you can specify:
+# EXTRA_PACKAGES=[intlimits]{amsmath}
+# If left blank no extra packages will be included.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+EXTRA_PACKAGES         =
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the
+# generated LaTeX document. The header should contain everything until the first
+# chapter. If it is left blank doxygen will generate a standard header. See
+# section "Doxygen usage" for information on how to let doxygen write the
+# default header to a separate file.
+#
+# Note: Only use a user-defined header if you know what you are doing! The
+# following commands have a special meaning inside the header: $title,
+# $datetime, $date, $doxygenversion, $projectname, $projectnumber,
+# $projectbrief, $projectlogo. Doxygen will replace $title with the empty
+# string, for the replacement values of the other commands the user is referred
+# to HTML_HEADER.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_HEADER           =
+
+# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the
+# generated LaTeX document. The footer should contain everything after the last
+# chapter. If it is left blank doxygen will generate a standard footer. See
+# LATEX_HEADER for more information on how to generate a default footer and what
+# special commands can be used inside the footer.
+#
+# Note: Only use a user-defined footer if you know what you are doing!
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-EXTRA_PACKAGES         = 
+LATEX_FOOTER           =
 
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
-# the generated latex document. The header should contain everything until 
-# the first chapter. If it is left blank doxygen will generate a 
-# standard header. Notice: only use this tag if you know what you are doing!
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
+# LaTeX style sheets that are included after the standard style sheets created
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
+# will copy the style sheet files to the output directory.
+# Note: The order of the extra style sheet files is of importance (e.g. the last
+# style sheet in the list overrules the setting of the previous ones in the
+# list).
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_HEADER           = 
+LATEX_EXTRA_STYLESHEET =
 
-# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for 
-# the generated latex document. The footer should contain everything after 
-# the last chapter. If it is left blank doxygen will generate a 
-# standard footer. Notice: only use this tag if you know what you are doing!
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
+# other source files which should be copied to the LATEX_OUTPUT output
+# directory. Note that the files will be copied as-is; there are no commands or
+# markers available.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
-LATEX_FOOTER           = 
+LATEX_EXTRA_FILES      =
 
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
-# contain links (just like the HTML output) instead of page references 
-# This makes the output suitable for online browsing using a pdf viewer.
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
+# contain links (just like the HTML output) instead of page references. This
+# makes the output suitable for online browsing using a PDF viewer.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 PDF_HYPERLINKS         = YES
 
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
-# plain latex in the generated Makefile. Set this option to YES to get a 
+# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate
+# the PDF file directly from the LaTeX files. Set this option to YES, to get a
 # higher quality PDF documentation.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 USE_PDFLATEX           = YES
 
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
-# command to the generated LaTeX files. This will instruct LaTeX to keep 
-# running if errors occur, instead of asking the user for help. 
-# This option is also used when generating formulas in HTML.
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
+# if errors occur, instead of asking the user for help. This option is also used
+# when generating formulas in HTML.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BATCHMODE        = NO
 
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
-# include the index chapters (such as File Index, Compound Index, etc.) 
-# in the output.
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
+# index chapters (such as File Index, Compound Index, etc.) in the output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_HIDE_INDICES     = NO
 
-# If LATEX_SOURCE_CODE is set to YES then doxygen will include 
-# source code with syntax highlighting in the LaTeX output. 
-# Note that which sources are shown also depends on other settings 
-# such as SOURCE_BROWSER.
+# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source
+# code with syntax highlighting in the LaTeX output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_SOURCE_CODE      = NO
 
-# The LATEX_BIB_STYLE tag can be used to specify the style to use for the 
-# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See 
-# http://en.wikipedia.org/wiki/BibTeX for more info.
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
+# bibliography, e.g. plainnat, or ieeetr. See
+# http://en.wikipedia.org/wiki/BibTeX and \cite for more info.
+# The default value is: plain.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
 
 LATEX_BIB_STYLE        = plain
 
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
+# page will contain the date and time when the page was generated. Setting this
+# to NO can help when comparing the output of multiple runs.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_LATEX is set to YES.
+
+LATEX_TIMESTAMP        = NO
+
 #---------------------------------------------------------------------------
-# configuration options related to the RTF output
+# Configuration options related to the RTF output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
-# The RTF output is optimized for Word 97 and may not look very pretty with 
-# other RTF readers or editors.
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
+# readers/editors.
+# The default value is: NO.
 
 GENERATE_RTF           = NO
 
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `rtf' will be used as the default path.
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: rtf.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_OUTPUT             = rtf
 
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
-# RTF documents. This may be useful for small projects and may help to 
-# save some trees in general.
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
+# documents. This may be useful for small projects and may help to save some
+# trees in general.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 COMPACT_RTF            = NO
 
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
-# will contain hyperlink fields. The RTF file will 
-# contain links (just like the HTML output) instead of page references. 
-# This makes the output suitable for online browsing using WORD or other 
-# programs which support those fields. 
-# Note: wordpad (write) and others do not support links.
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
+# output) instead of page references. This makes the output suitable for online
+# browsing using Word or some other Word compatible readers that support those
+# fields.
+#
+# Note: WordPad (write) and others do not support links.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
 RTF_HYPERLINKS         = NO
 
-# Load style sheet definitions from file. Syntax is similar to doxygen's 
-# config file, i.e. a series of assignments. You only have to provide 
-# replacements, missing definitions are set to their default value.
+# Load stylesheet definitions from file. Syntax is similar to doxygen's config
+# file, i.e. a series of assignments. You only have to provide replacements,
+# missing definitions are set to their default value.
+#
+# See also section "Doxygen usage" for information on how to generate the
+# default style sheet that doxygen normally uses.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_STYLESHEET_FILE    = 
+RTF_STYLESHEET_FILE    =
 
-# Set optional variables used in the generation of an rtf document. 
-# Syntax is similar to doxygen's config file.
+# Set optional variables used in the generation of an RTF document. Syntax is
+# similar to doxygen's config file. A template extensions file can be generated
+# using doxygen -e rtf extensionFile.
+# This tag requires that the tag GENERATE_RTF is set to YES.
 
-RTF_EXTENSIONS_FILE    = 
+RTF_EXTENSIONS_FILE    =
+
+# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code
+# with syntax highlighting in the RTF output.
+#
+# Note that which sources are shown also depends on other settings such as
+# SOURCE_BROWSER.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_RTF is set to YES.
+
+RTF_SOURCE_CODE        = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the man page output
+# Configuration options related to the man page output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
-# generate man pages
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
+# classes and files.
+# The default value is: NO.
 
 GENERATE_MAN           = NO
 
-# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `man' will be used as the default path.
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it. A directory man3 will be created inside the directory specified by
+# MAN_OUTPUT.
+# The default directory is: man.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_OUTPUT             = man
 
-# The MAN_EXTENSION tag determines the extension that is added to 
-# the generated man pages (default is the subroutine's section .3)
+# The MAN_EXTENSION tag determines the extension that is added to the generated
+# man pages. In case the manual section does not start with a number, the number
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
+# optional.
+# The default value is: .3.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_EXTENSION          = .3
 
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
-# then it will generate one additional man file for each entity 
-# documented in the real man page(s). These additional files 
-# only source the real man page, but without them the man command 
-# would be unable to find the correct page. The default is NO.
+# The MAN_SUBDIR tag determines the name of the directory created within
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
+# MAN_EXTENSION with the initial . removed.
+# This tag requires that the tag GENERATE_MAN is set to YES.
+
+MAN_SUBDIR             =
+
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
+# will generate one additional man file for each entity documented in the real
+# man page(s). These additional files only source the real man page, but without
+# them the man command would be unable to find the correct page.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_MAN is set to YES.
 
 MAN_LINKS              = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the XML output
+# Configuration options related to the XML output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_XML tag is set to YES Doxygen will 
-# generate an XML file that captures the structure of 
-# the code including all documentation.
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
+# captures the structure of the code including all documentation.
+# The default value is: NO.
 
 GENERATE_XML           = NO
 
-# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
-# put in front of it. If left blank `xml' will be used as the default path.
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
+# it.
+# The default directory is: xml.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
 XML_OUTPUT             = xml
 
-# The XML_SCHEMA tag can be used to specify an XML schema, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
+# listings (including syntax highlighting and cross-referencing information) to
+# the XML output. Note that enabling this will significantly increase the size
+# of the XML output.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_XML is set to YES.
 
-XML_SCHEMA             = 
+XML_PROGRAMLISTING     = YES
 
-# The XML_DTD tag can be used to specify an XML DTD, 
-# which can be used by a validating XML parser to check the 
-# syntax of the XML files.
+#---------------------------------------------------------------------------
+# Configuration options related to the DOCBOOK output
+#---------------------------------------------------------------------------
 
-XML_DTD                = 
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
+# that can be used to generate PDF.
+# The default value is: NO.
 
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
-# dump the program listings (including syntax highlighting 
-# and cross-referencing information) to the XML output. Note that 
-# enabling this will significantly increase the size of the XML output.
+GENERATE_DOCBOOK       = NO
 
-XML_PROGRAMLISTING     = YES
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
+# front of it.
+# The default directory is: docbook.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_OUTPUT         = docbook
+
+# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the
+# program listings (including syntax highlighting and cross-referencing
+# information) to the DOCBOOK output. Note that enabling this will significantly
+# increase the size of the DOCBOOK output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
+
+DOCBOOK_PROGRAMLISTING = NO
 
 #---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
+# Configuration options for the AutoGen Definitions output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
-# generate an AutoGen Definitions (see autogen.sf.net) file 
-# that captures the structure of the code including all 
-# documentation. Note that this feature is still experimental 
-# and incomplete at the moment.
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
+# AutoGen Definitions (see http://autogen.sf.net) file that captures the
+# structure of the code including all documentation. Note that this feature is
+# still experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_AUTOGEN_DEF   = NO
 
 #---------------------------------------------------------------------------
-# configuration options related to the Perl module output
+# Configuration options related to the Perl module output
 #---------------------------------------------------------------------------
 
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
-# generate a Perl module file that captures the structure of 
-# the code including all documentation. Note that this 
-# feature is still experimental and incomplete at the 
-# moment.
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
+# file that captures the structure of the code including all documentation.
+#
+# Note that this feature is still experimental and incomplete at the moment.
+# The default value is: NO.
 
 GENERATE_PERLMOD       = NO
 
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
-# to generate PDF and DVI output from the Perl module output.
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
+# output from the Perl module output.
+# The default value is: NO.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_LATEX          = NO
 
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
-# nicely formatted so it can be parsed by a human reader.  This is useful 
-# if you want to understand what is going on.  On the other hand, if this 
-# tag is set to NO the size of the Perl module output will be much smaller 
-# and Perl will parse it just the same.
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
+# formatted so it can be parsed by a human reader. This is useful if you want to
+# understand what is going on. On the other hand, if this tag is set to NO, the
+# size of the Perl module output will be much smaller and Perl will parse it
+# just the same.
+# The default value is: YES.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
 PERLMOD_PRETTY         = YES
 
-# The names of the make variables in the generated doxyrules.make file 
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
-# This is useful so different doxyrules.make files included by the same 
-# Makefile don't overwrite each other's variables.
+# The names of the make variables in the generated doxyrules.make file are
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
+# so different doxyrules.make files included by the same Makefile don't
+# overwrite each other's variables.
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
 
-PERLMOD_MAKEVAR_PREFIX = 
+PERLMOD_MAKEVAR_PREFIX =
 
 #---------------------------------------------------------------------------
 # Configuration options related to the preprocessor
 #---------------------------------------------------------------------------
 
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
-# evaluate all C-preprocessor directives found in the sources and include 
-# files.
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
+# C-preprocessor directives found in the sources and include files.
+# The default value is: YES.
 
 ENABLE_PREPROCESSING   = YES
 
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
-# names in the source code. If set to NO (the default) only conditional 
-# compilation will be performed. Macro expansion can be done in a controlled 
-# way by setting EXPAND_ONLY_PREDEF to YES.
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
+# in the source code. If set to NO, only conditional compilation will be
+# performed. Macro expansion can be done in a controlled way by setting
+# EXPAND_ONLY_PREDEF to YES.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 MACRO_EXPANSION        = YES
 
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
-# then the macro expansion is limited to the macros specified with the 
-# PREDEFINED and EXPAND_AS_DEFINED tags.
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
+# the macro expansion is limited to the macros specified with the PREDEFINED and
+# EXPAND_AS_DEFINED tags.
+# The default value is: NO.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 EXPAND_ONLY_PREDEF     = NO
 
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
-# pointed to by INCLUDE_PATH will be searched when a #include is found.
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
+# INCLUDE_PATH will be searched if a #include is found.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SEARCH_INCLUDES        = YES
 
-# The INCLUDE_PATH tag can be used to specify one or more directories that 
-# contain include files that are not input files but should be processed by 
-# the preprocessor.
+# The INCLUDE_PATH tag can be used to specify one or more directories that
+# contain include files that are not input files but should be processed by the
+# preprocessor.
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
 
-INCLUDE_PATH           = 
+INCLUDE_PATH           =
 
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
-# patterns (like *.h and *.hpp) to filter out the header-files in the 
-# directories. If left blank, the patterns specified with FILE_PATTERNS will 
-# be used.
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
+# patterns (like *.h and *.hpp) to filter out the header-files in the
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
+# used.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-INCLUDE_FILE_PATTERNS  = 
+INCLUDE_FILE_PATTERNS  =
 
-# The PREDEFINED tag can be used to specify one or more macro names that 
-# are defined before the preprocessor is started (similar to the -D option of 
-# gcc). The argument of the tag is a list of macros of the form: name 
-# or name=definition (no spaces). If the definition and the = are 
-# omitted =1 is assumed. To prevent a macro definition from being 
-# undefined via #undef or recursively expanded use the := operator 
-# instead of the = operator.
+# The PREDEFINED tag can be used to specify one or more macro names that are
+# defined before the preprocessor is started (similar to the -D option of e.g.
+# gcc). The argument of the tag is a list of macros of the form: name or
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
+# is assumed. To prevent a macro definition from being undefined via #undef or
+# recursively expanded use the := operator instead of the = operator.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-PREDEFINED             = 
+PREDEFINED             =
 
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
-# this tag can be used to specify a list of macro names that should be expanded. 
-# The macro definition that is found in the sources will be used. 
-# Use the PREDEFINED tag if you want to use a different macro definition that 
-# overrules the definition found in the source code.
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
+# tag can be used to specify a list of macro names that should be expanded. The
+# macro definition that is found in the sources will be used. Use the PREDEFINED
+# tag if you want to use a different macro definition that overrules the
+# definition found in the source code.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
-EXPAND_AS_DEFINED      = 
+EXPAND_AS_DEFINED      =
 
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
-# doxygen's preprocessor will remove all references to function-like macros 
-# that are alone on a line, have an all uppercase name, and do not end with a 
-# semicolon, because these will confuse the parser if not removed.
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
+# remove all references to function-like macros that are alone on a line, have
+# an all uppercase name, and do not end with a semicolon. Such function macros
+# are typically used for boiler-plate code, and will confuse the parser if not
+# removed.
+# The default value is: YES.
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
 
 SKIP_FUNCTION_MACROS   = YES
 
 #---------------------------------------------------------------------------
-# Configuration::additions related to external references
+# Configuration options related to external references
 #---------------------------------------------------------------------------
 
-# The TAGFILES option can be used to specify one or more tagfiles. 
-# Optionally an initial location of the external documentation 
-# can be added for each tagfile. The format of a tag file without 
-# this location is as follows: 
-#   TAGFILES = file1 file2 ... 
-# Adding location for the tag files is done as follows: 
-#   TAGFILES = file1=loc1 "file2 = loc2" ... 
-# where "loc1" and "loc2" can be relative or absolute paths or 
-# URLs. If a location is present for each tag, the installdox tool 
-# does not have to be run to correct the links. 
-# Note that each tag file must have a unique name 
-# (where the name does NOT include the path) 
-# If a tag file is not located in the directory in which doxygen 
-# is run, you must also specify the path to the tagfile here.
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
+# file the location of the external documentation should be added. The format of
+# a tag file without this location is as follows:
+# TAGFILES = file1 file2 ...
+# Adding location for the tag files is done as follows:
+# TAGFILES = file1=loc1 "file2 = loc2" ...
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
+# section "Linking to external documentation" for more information about the use
+# of tag files.
+# Note: Each tag file must have a unique name (where the name does NOT include
+# the path). If a tag file is not located in the directory in which doxygen is
+# run, you must also specify the path to the tagfile here.
 
-TAGFILES               = 
+TAGFILES               =
 
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
-# a tag file that is based on the input files it reads.
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
+# tag file that is based on the input files it reads. See section "Linking to
+# external documentation" for more information about the usage of tag files.
 
-GENERATE_TAGFILE       = 
+GENERATE_TAGFILE       =
 
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
-# in the class index. If set to NO only the inherited external classes 
-# will be listed.
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
+# the class index. If set to NO, only the inherited external classes will be
+# listed.
+# The default value is: NO.
 
 ALLEXTERNALS           = NO
 
-# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
-# in the modules index. If set to NO, only the current project's groups will 
-# be listed.
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
+# in the modules index. If set to NO, only the current project's groups will be
+# listed.
+# The default value is: YES.
 
 EXTERNAL_GROUPS        = YES
 
-# The PERL_PATH should be the absolute path and name of the perl script 
-# interpreter (i.e. the result of `which perl').
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
+# the related pages index. If set to NO, only the current project's pages will
+# be listed.
+# The default value is: YES.
+
+EXTERNAL_PAGES         = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script
+# interpreter (i.e. the result of 'which perl').
+# The default file (with absolute path) is: /usr/bin/perl.
 
 PERL_PATH              = /usr/bin/perl
 
@@ -1601,213 +2155,312 @@ PERL_PATH              = /usr/bin/perl
 # Configuration options related to the dot tool
 #---------------------------------------------------------------------------
 
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
-# or super classes. Setting the tag to NO turns the diagrams off. Note that 
-# this option also works with HAVE_DOT disabled, but it is recommended to 
-# install and use dot, since it yields more powerful graphs.
+# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram
+# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to
+# NO turns the diagrams off. Note that this option also works with HAVE_DOT
+# disabled, but it is recommended to install and use dot, since it yields more
+# powerful graphs.
+# The default value is: YES.
 
 CLASS_DIAGRAMS         = YES
 
-# You can define message sequence charts within doxygen comments using the \msc 
-# command. Doxygen will then run the mscgen tool (see 
-# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the 
-# documentation. The MSCGEN_PATH tag allows you to specify the directory where 
-# the mscgen tool resides. If left empty the tool is assumed to be found in the 
+# You can define message sequence charts within doxygen comments using the \msc
+# command. Doxygen will then run the mscgen tool (see:
+# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
+# documentation. The MSCGEN_PATH tag allows you to specify the directory where
+# the mscgen tool resides. If left empty the tool is assumed to be found in the
 # default search path.
 
-MSCGEN_PATH            = 
+MSCGEN_PATH            =
+
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
+# then run dia to produce the diagram and insert it in the documentation. The
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
+# If left empty dia is assumed to be found in the default search path.
 
-# If set to YES, the inheritance and collaboration graphs will hide 
-# inheritance and usage relations if the target is undocumented 
-# or is not a class.
+DIA_PATH               =
+
+# If set to YES the inheritance and collaboration graphs will hide inheritance
+# and usage relations if the target is undocumented or is not a class.
+# The default value is: YES.
 
 HIDE_UNDOC_RELATIONS   = YES
 
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
-# available from the path. This tool is part of Graphviz, a graph visualization 
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
-# have no effect if this option is set to NO (the default)
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
+# available from the path. This tool is part of Graphviz (see:
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
+# Bell Labs. The other options in this section have no effect if this option is
+# set to NO
+# The default value is: NO.
 
 HAVE_DOT               = NO
 
-# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is 
-# allowed to run in parallel. When set to 0 (the default) doxygen will 
-# base this on the number of processors available in the system. You can set it 
-# explicitly to a value larger than 0 to get control over the balance 
-# between CPU load and processing speed.
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
+# to run in parallel. When set to 0 doxygen will base this on the number of
+# processors available in the system. You can set it explicitly to a value
+# larger than 0 to get control over the balance between CPU load and processing
+# speed.
+# Minimum value: 0, maximum value: 32, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_NUM_THREADS        = 0
 
-# By default doxygen will use the Helvetica font for all dot files that 
-# doxygen generates. When you want a differently looking font you can specify 
-# the font name using DOT_FONTNAME. You need to make sure dot is able to find 
-# the font, which can be done by putting it in a standard location or by setting 
-# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the 
-# directory containing the font.
+# When you want a differently looking font in the dot files that doxygen
+# generates you can specify the font name using DOT_FONTNAME. You need to make
+# sure dot is able to find the font, which can be done by putting it in a
+# standard location or by setting the DOTFONTPATH environment variable or by
+# setting DOT_FONTPATH to the directory containing the font.
+# The default value is: Helvetica.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_FONTNAME           = Helvetica
 
-# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. 
-# The default size is 10pt.
+# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of
+# dot graphs.
+# Minimum value: 4, maximum value: 24, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_FONTSIZE           = 10
 
-# By default doxygen will tell dot to use the Helvetica font. 
-# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to 
-# set the path where dot can find it.
+# By default doxygen will tell dot to use the default font as specified with
+# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set
+# the path where dot can find it using this tag.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-DOT_FONTPATH           = 
+DOT_FONTPATH           =
 
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect inheritance relations. Setting this tag to YES will force the 
-# CLASS_DIAGRAMS tag to NO.
+# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for
+# each documented class showing the direct and indirect inheritance relations.
+# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CLASS_GRAPH            = YES
 
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for each documented class showing the direct and 
-# indirect implementation dependencies (inheritance, containment, and 
-# class references variables) of the class with other documented classes.
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
+# graph for each documented class showing the direct and indirect implementation
+# dependencies (inheritance, containment, and class references variables) of the
+# class with other documented classes.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 COLLABORATION_GRAPH    = YES
 
-# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graph for groups, showing the direct groups dependencies
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
+# groups, showing the direct groups dependencies.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GROUP_GRAPHS           = YES
 
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
-# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
 # Language.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 UML_LOOK               = NO
 
-# If set to YES, the inheritance and collaboration graphs will show the 
-# relations between templates and their instances.
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
+# class node. If there are many fields or methods and many nodes the graph may
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
+# number of items for each type to make the size more manageable. Set this to 0
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
+# but if the number exceeds 15, the total amount of fields shown is limited to
+# 10.
+# Minimum value: 0, maximum value: 100, default value: 10.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+UML_LIMIT_NUM_FIELDS   = 10
+
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
+# collaboration graphs will show the relations between templates and their
+# instances.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 TEMPLATE_RELATIONS     = NO
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
-# tags are set to YES then doxygen will generate a graph for each documented 
-# file showing the direct and indirect include dependencies of the file with 
-# other documented files.
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
+# YES then doxygen will generate a graph for each documented file showing the
+# direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDE_GRAPH          = YES
 
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
-# documented header file showing the documented files that directly or 
-# indirectly include this file.
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
+# set to YES then doxygen will generate a graph for each documented file showing
+# the direct and indirect include dependencies of the file with other documented
+# files.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INCLUDED_BY_GRAPH      = YES
 
-# If the CALL_GRAPH and HAVE_DOT options are set to YES then 
-# doxygen will generate a call dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable call graphs 
-# for selected functions only using the \callgraph command.
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable call graphs for selected
+# functions only using the \callgraph command. Disabling a call graph can be
+# accomplished by means of the command \hidecallgraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CALL_GRAPH             = NO
 
-# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then 
-# doxygen will generate a caller dependency graph for every global function 
-# or class method. Note that enabling this option will significantly increase 
-# the time of a run. So in most cases it will be better to enable caller 
-# graphs for selected functions only using the \callergraph command.
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
+# dependency graph for every global function or class method.
+#
+# Note that enabling this option will significantly increase the time of a run.
+# So in most cases it will be better to enable caller graphs for selected
+# functions only using the \callergraph command. Disabling a caller graph can be
+# accomplished by means of the command \hidecallergraph.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 CALLER_GRAPH           = NO
 
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
-# will generate a graphical hierarchy of all classes instead of a textual one.
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
+# hierarchy of all classes instead of a textual one.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GRAPHICAL_HIERARCHY    = YES
 
-# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
-# then doxygen will show the dependencies a directory has on other directories 
-# in a graphical way. The dependency relations are determined by the #include 
-# relations between the files in the directories.
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
+# dependencies a directory has on other directories in a graphical way. The
+# dependency relations are determined by the #include relations between the
+# files in the directories.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DIRECTORY_GRAPH        = YES
 
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
-# generated by dot. Possible values are svg, png, jpg, or gif. 
-# If left blank png will be used. If you choose svg you need to set 
-# HTML_FILE_EXTENSION to xhtml in order to make the SVG files 
-# visible in IE 9+ (other browsers do not have this requirement).
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
+# generated by dot. For an explanation of the image formats see the section
+# output formats in the documentation of the dot tool (Graphviz (see:
+# http://www.graphviz.org/)).
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
+# to make the SVG files visible in IE 9+ (other browsers do not have this
+# requirement).
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
+# png:gdiplus:gdiplus.
+# The default value is: png.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_IMAGE_FORMAT       = png
 
-# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to 
-# enable generation of interactive SVG images that allow zooming and panning. 
-# Note that this requires a modern browser other than Internet Explorer. 
-# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you 
-# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files 
-# visible. Older versions of IE do not have SVG support.
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
+# enable generation of interactive SVG images that allow zooming and panning.
+#
+# Note that this requires a modern browser other than Internet Explorer. Tested
+# and working are Firefox, Chrome, Safari, and Opera.
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
+# the SVG files visible. Older versions of IE do not have SVG support.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 INTERACTIVE_SVG        = NO
 
-# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
 # found. If left blank, it is assumed the dot tool can be found in the path.
+# This tag requires that the tag HAVE_DOT is set to YES.
+
+DOT_PATH               =
 
-DOT_PATH               = 
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
+# contain dot files that are included in the documentation (see the \dotfile
+# command).
+# This tag requires that the tag HAVE_DOT is set to YES.
 
-# The DOTFILE_DIRS tag can be used to specify one or more directories that 
-# contain dot files that are included in the documentation (see the 
-# \dotfile command).
+DOTFILE_DIRS           =
 
-DOTFILE_DIRS           = 
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
+# contain msc files that are included in the documentation (see the \mscfile
+# command).
 
-# The MSCFILE_DIRS tag can be used to specify one or more directories that 
-# contain msc files that are included in the documentation (see the 
-# \mscfile command).
+MSCFILE_DIRS           =
 
-MSCFILE_DIRS           = 
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
+# contain dia files that are included in the documentation (see the \diafile
+# command).
 
-# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
-# nodes that will be shown in the graph. If the number of nodes in a graph 
-# becomes larger than this value, doxygen will truncate the graph, which is 
-# visualized by representing a node as a red box. Note that doxygen if the 
-# number of direct children of the root node in a graph is already larger than 
-# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note 
-# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+DIAFILE_DIRS           =
+
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
+# path where java can find the plantuml.jar file. If left blank, it is assumed
+# PlantUML is not used or called during a preprocessing step. Doxygen will
+# generate a warning when it encounters a \startuml command in this case and
+# will not generate output for the diagram.
+
+PLANTUML_JAR_PATH      =
+
+# When using plantuml, the specified paths are searched for files specified by
+# the !include statement in a plantuml block.
+
+PLANTUML_INCLUDE_PATH  =
+
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
+# that will be shown in the graph. If the number of nodes in a graph becomes
+# larger than this value, doxygen will truncate the graph, which is visualized
+# by representing a node as a red box. Note that doxygen if the number of direct
+# children of the root node in a graph is already larger than
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+# Minimum value: 0, maximum value: 10000, default value: 50.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_GRAPH_MAX_NODES    = 50
 
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
-# graphs generated by dot. A depth value of 3 means that only nodes reachable 
-# from the root by following a path via at most 3 edges will be shown. Nodes 
-# that lay further from the root node will be omitted. Note that setting this 
-# option to 1 or 2 may greatly reduce the computation time needed for large 
-# code bases. Also note that the size of a graph can be further restricted by 
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
+# generated by dot. A depth value of 3 means that only nodes reachable from the
+# root by following a path via at most 3 edges will be shown. Nodes that lay
+# further from the root node will be omitted. Note that setting this option to 1
+# or 2 may greatly reduce the computation time needed for large code bases. Also
+# note that the size of a graph can be further restricted by
 # DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+# Minimum value: 0, maximum value: 1000, default value: 0.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 MAX_DOT_GRAPH_DEPTH    = 0
 
-# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
-# background. This is disabled by default, because dot on Windows does not 
-# seem to support this out of the box. Warning: Depending on the platform used, 
-# enabling this option may lead to badly anti-aliased labels on the edges of 
-# a graph (i.e. they become hard to read).
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent
+# background. This is disabled by default, because dot on Windows does not seem
+# to support this out of the box.
+#
+# Warning: Depending on the platform used, enabling this option may lead to
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to
+# read).
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_TRANSPARENT        = NO
 
-# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
-# files in one run (i.e. multiple -o and -T options on the command line). This 
-# makes dot run faster, but since only newer versions of dot (>1.8.10) 
-# support this, this feature is disabled by default.
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
+# files in one run (i.e. multiple -o and -T options on the command line). This
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
+# this, this feature is disabled by default.
+# The default value is: NO.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_MULTI_TARGETS      = NO
 
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
-# generate a legend page explaining the meaning of the various boxes and 
-# arrows in the dot generated graphs.
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
+# explaining the meaning of the various boxes and arrows in the dot generated
+# graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 GENERATE_LEGEND        = YES
 
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
-# remove the intermediate dot files that are used to generate 
-# the various graphs.
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot
+# files that are used to generate the various graphs.
+# The default value is: YES.
+# This tag requires that the tag HAVE_DOT is set to YES.
 
 DOT_CLEANUP            = YES
diff --git a/FindDCMTK.cmake b/FindDCMTK.cmake
index 22f205d..8415cb4 100644
--- a/FindDCMTK.cmake
+++ b/FindDCMTK.cmake
@@ -9,11 +9,14 @@
 set(DCMTK_DEFINITIONS "-D HAVE_CONFIG_H")
 
 find_path(DCMTK_INCLUDE_DIR "dcmtk/dcmdata/dctk.h")
-find_library(DCMTK_LIBRARY dcmdata)
+find_library(DCMNET_LIBRARY dcmnet)
+find_library(DCMDATA_LIBRARY dcmdata)
+find_library(OFLOG_LIBRARY oflog)
+find_library(OFSTD_LIBRARY ofstd)
 
 set(DCMTK_INCLUDE_DIRS ${DCMTK_INCLUDE_DIR})
+set(DCMTK_LIBRARIES ${DCMNET_LIBRARY} ${DCMDATA_LIBRARY} ${OFLOG_LIBRARY} ${OFSTD_LIBRARY})
 
-set(DCMTK_LIBRARIES ${DCMTK_LIBRARY} dcmnet dcmdata oflog ofstd)
 foreach(library iconv pthread wrap z)
     find_library(${library}_LIBRARY ${library})
     if(${library}_LIBRARY)
@@ -26,7 +29,7 @@ get_filename_component(DCMTK_LIBRARY_DIRS "${DCMTK_LIBRARY}" PATH)
 include(FindPackageHandleStandardArgs)
 # handle the QUIETLY and REQUIRED arguments and set DCMTK_FOUND to TRUE
 # if all listed variables are TRUE
-find_package_handle_standard_args(
-    DCMTK DEFAULT_MSG DCMTK_INCLUDE_DIR DCMTK_LIBRARY)
+find_package_handle_standard_args(DCMTK DEFAULT_MSG 
+	DCMTK_INCLUDE_DIR DCMNET_LIBRARY DCMDATA_LIBRARY OFLOG_LIBRARY OFSTD_LIBRARY)
 
-mark_as_advanced(DCMTK_INCLUDE_DIR DCMTK_LIBRARY)
+mark_as_advanced(DCMTK_INCLUDE_DIR DCMNET_LIBRARY DCMDATA_LIBRARY OFLOG_LIBRARY OFSTD_LIBRARY)
diff --git a/README.md b/README.md
index dc3dc37..7de4d0a 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,10 @@ Odil also provides conversion to and from
 [DCMTK](http://dicom.offis.de/dcmtk.php.en) data structures.
 
 Odil builds and run on:
-* Linux (Debian 7, Debian 8, Ubuntu 12.04, Ubuntu 14.04, both 32 and 64 bits)
+* Linux (Debian 7 and 8, Ubuntu 12.04, 14.04, and 16.04, all 32 and 64 bits).
+  Official packages are available ([Debian](https://packages.debian.org/search?keywords=odil&searchon=sourcenames&suite=all&section=all), [Ubuntu](http://packages.ubuntu.com/search?keywords=odil&searchon=sourcenames&suite=all&section=all)),
+  as well as [unofficial backports](https://github.com/lamyj/packages).
+    
 * OS X
 
 [![Build Status](https://travis-ci.org/lamyj/odil.svg?branch=master)](https://travis-ci.org/lamyj/odil)
diff --git a/applications/CMakeLists.txt b/applications/CMakeLists.txt
index 2bf5a75..da2ac12 100644
--- a/applications/CMakeLists.txt
+++ b/applications/CMakeLists.txt
@@ -2,3 +2,4 @@ file(GLOB_RECURSE python_files *.py)
 set(python_files ${python_files} odil)
 add_custom_target(
     PythonFiles ${CMAKE_COMMAND} -E echo "Python files" SOURCES ${python_files})
+set_target_properties(PythonFiles PROPERTIES FOLDER "Examples")
diff --git a/applications/dicomdir.py b/applications/dicomdir.py
new file mode 100644
index 0000000..e93c3e2
--- /dev/null
+++ b/applications/dicomdir.py
@@ -0,0 +1,59 @@
+import logging
+import os
+
+import odil
+
+def add_subparser(subparsers):
+    parser = subparsers.add_parser(
+        "dicomdir",
+        help="Create a DICOMDIR")
+    parser.add_argument(
+        "names", nargs="+", metavar="name", help="DICOM files or directories")
+    parser.add_argument(
+        "directory", help="Output directory for the DICOMDIR file")
+    parser.add_argument(
+        "--patient-key", "-p", default=[], action="append",
+        help="User-defined keys for PATIENT-level records, "
+            "expressed as KEYWORD[:TYPE]. TYPE defaults to 3.")
+    parser.add_argument(
+        "--study-key", "-S", default=[], action="append",
+        help="User-defined keys for STUDY-level records")
+    parser.add_argument(
+        "--series-key", "-s", default=[], action="append", 
+        help="User-defined keys for SERIES-level records")
+    parser.add_argument(
+        "--image-key", "-i", default=[], action="append",
+        help="User-defined keys for IMAGE-level records")
+    parser.set_defaults(function=create_dicomdir)
+    return parser
+
+def create_dicomdir(
+        names, directory, patient_key, study_key, series_key, image_key):
+    files = []
+    for name in names:
+        if os.path.isfile(name):
+            files.append(os.path.abspath(name))
+        elif os.path.isdir(name):
+            for dirpath, _, filenames in os.walk(name):
+                dirpath = os.path.abspath(dirpath)
+                files.extend(os.path.join(dirpath, x) for x in filenames)
+    
+    directory = os.path.abspath(directory)
+    if not all(x.startswith(directory) for x in files):
+        raise Exception("All files must be under {}".format(directory))
+    
+    files = [x[len(directory)+1:] for x in files]
+    
+    keys = {}
+    for level in ["patient", "study", "series", "image"]:
+        for entry in locals()["{}_key".format(level)]:
+            if ":" in entry:
+                tag, type_ = entry.split(":")
+            else:
+                tag, type_ = entry, "3"
+            tag = getattr(odil.registry, tag)
+            type_ = int(type_)
+            keys.setdefault(level.upper(), []).append((tag, type_))
+    
+    creator = odil.BasicDirectoryCreator(directory, files, keys)
+    creator()
diff --git a/applications/echo.py b/applications/echo.py
index 0ed6190..783d46f 100644
--- a/applications/echo.py
+++ b/applications/echo.py
@@ -1,10 +1,12 @@
+import argparse
 import logging
 
 import odil
 
 def add_subparser(subparsers):
     parser = subparsers.add_parser(
-        "echo", help="Ping a remote DICOM server (C-ECHO)")
+        "echo", help="Ping a remote DICOM server (C-ECHO)",
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
     parser.add_argument("host", help="Remote host address")
     parser.add_argument("port", type=int, help="Remote host port")
     parser.add_argument(
diff --git a/applications/find.py b/applications/find.py
index 48710f5..e522386 100644
--- a/applications/find.py
+++ b/applications/find.py
@@ -1,3 +1,5 @@
+from __future__ import print_function
+import argparse
 import logging
 
 import odil
@@ -6,7 +8,8 @@ from print_ import find_max_name_length, print_data_set
 
 def add_subparser(subparsers):
     parser = subparsers.add_parser(
-        "find", help="DICOM query (C-FIND)")
+        "find", help="DICOM query (C-FIND)",
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
     parser.add_argument("host", help="Remote host address")
     parser.add_argument("port", type=int, help="Remote host port")
     parser.add_argument(
@@ -36,12 +39,10 @@ def find(host, port, calling_ae_title, called_ae_title, level, keys, decode_uids
         if value is not None:
             vr = odil.registry.public_dictionary[tag].vr
             if vr in ["DS", "FL", "FD"]:
-                value = odil.Value.Reals([float(x) for x in value])
+                value = [float(x) for x in value]
             elif vr in ["IS", "SL", "SS", "UL", "US"]:
-                value = odil.Value.Integers([int(x) for x in value])
-            else:
-                value = odil.Value.Strings(value)
-                
+                value = [int(x) for x in value]
+            
             query.add(tag, value)
         else:
             query.add(tag)
@@ -71,7 +72,7 @@ def find(host, port, calling_ae_title, called_ae_title, level, keys, decode_uids
     find = odil.FindSCU(association)
     find.set_affected_sop_class(sop_class)
     data_sets = find.find(query)
-    print "{} answer{}".format(len(data_sets), "s" if len(data_sets)>1 else "")
+    print("{} answer{}".format(len(data_sets), "s" if len(data_sets)>1 else ""))
 
     max_length = 0
     for data_set in data_sets:
diff --git a/applications/get.py b/applications/get.py
new file mode 100644
index 0000000..30fb046
--- /dev/null
+++ b/applications/get.py
@@ -0,0 +1,117 @@
+from __future__ import print_function
+import argparse
+import logging
+import os
+
+import odil
+
+from print_ import find_max_name_length, print_data_set
+
+def add_subparser(subparsers):
+    parser = subparsers.add_parser(
+        "get", help="DICOM retrieve (C-GET)",
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+    parser.add_argument("host", help="Remote host address")
+    parser.add_argument("port", type=int, help="Remote host port")
+    parser.add_argument(
+        "calling_ae_title", help="AE title of the calling application")
+    parser.add_argument(
+        "called_ae_title", help="AE title of the called application")
+    parser.add_argument(
+        "level", choices=["patient", "study"], 
+        help="Root object of the retrieval")
+    parser.add_argument("keys", nargs="+", help="Retrieve keys")
+    parser.add_argument(
+        "--directory", "-d", default=os.getcwd(),
+        help="Directory where the output files will be stored")
+    parser.set_defaults(function=get)
+    return parser
+
+def get(host, port, calling_ae_title, called_ae_title, level, keys, directory):
+    query = odil.DataSet()
+    for key in keys:
+        key, value = key.split("=", 1)
+        value = value.split("\\")
+        
+        tag = getattr(odil.registry, key)
+        
+        vr = odil.registry.public_dictionary[tag].vr
+        if vr in ["DS", "FL", "FD"]:
+            value = [float(x) for x in value]
+        elif vr in ["IS", "SL", "SS", "UL", "US"]:
+            value = [int(x) for x in value]
+        
+        query.add(tag, value)
+    
+    get_syntax = getattr(
+        odil.registry,
+        "{}RootQueryRetrieveInformationModelGET".format(level.capitalize()))
+    
+    transfer_syntaxes = [
+        odil.registry.ImplicitVRLittleEndian,
+        odil.registry.ExplicitVRLittleEndian
+    ]
+    
+    get_pc = odil.AssociationParameters.PresentationContext(
+        1, get_syntax, transfer_syntaxes, True, False)
+    
+    # Negotiate ALL storage syntaxes. Is there a better way to do this?
+    storage_uids = [
+        entry.key() for entry in odil.registry.uids_dictionary
+        if entry.data().name.endswith("Storage")
+    ]
+    if len(storage_uids) > 126:
+        raise Exception("Too many storage syntaxes")
+    storage_pcs = [
+        odil.AssociationParameters.PresentationContext(
+            2*(i+1)+1, uid, transfer_syntaxes, False, True)
+        for i, uid in enumerate(storage_uids)
+    ]
+    
+    association = odil.Association()
+    association.set_peer_host(host)
+    association.set_peer_port(port)
+    association.update_parameters()\
+        .set_calling_ae_title(calling_ae_title)\
+        .set_called_ae_title(called_ae_title) \
+        .set_presentation_contexts([get_pc]+storage_pcs)
+    association.associate()
+    logging.info("Association established")
+    
+    get = odil.GetSCU(association)
+    get.set_affected_sop_class(get_syntax)
+    
+    class Callback(object):
+        def __init__(self, directory):
+            self.directory = directory
+            self.completed = 0
+            self.remaining = 0
+            self.failed = 0
+            self.warning = 0
+        
+        def store(self, data_set):
+            uid = data_set.as_string("SOPInstanceUID")[0]
+            odil.write(data_set, os.path.join(self.directory, uid))
+        
+        def get(self, message):
+            for type_ in ["completed", "remaining", "failed", "warning"]:
+                base = "number_of_{}_sub_operations".format(type_)
+                if getattr(message, "has_{}".format(base))():
+                    setattr(
+                        self, type_, getattr(message, "get_{}".format(base))())
+            logging.info(
+                "Remaining: {}, completed: {}, failed: {}, warning: {}".format(
+                    self.remaining, self.completed, self.failed, self.warning))
+        
+    if not os.path.isdir(directory):
+        os.makedirs(directory)
+        
+    callback = Callback(directory)
+    get.get(query, callback.store, callback.get)
+    print(
+        "Completed: {}, remaining: {}, failed: {}, warning: {}".format(
+            callback.completed, callback.remaining, callback.failed, 
+            callback.warning))
+    
+    association.release()
+    logging.info("Association released")
diff --git a/applications/odil b/applications/odil
index a4ad30d..97e4d6f 100755
--- a/applications/odil
+++ b/applications/odil
@@ -4,8 +4,10 @@ import argparse
 import logging
 import sys
 
+import dicomdir
 import echo
 import find
+import get
 import print_
 import transcode
 
@@ -15,7 +17,8 @@ def main():
     subparsers = parser.add_subparsers(help="Sub-commands help")
 
     modules = [
-        print_, transcode, echo, find
+        print_, transcode, dicomdir, 
+        echo, find, get
     ]
     for module in modules:
         sub_parser = module.add_subparser(subparsers)
diff --git a/applications/print_.py b/applications/print_.py
index d612cbc..ce15da1 100644
--- a/applications/print_.py
+++ b/applications/print_.py
@@ -1,10 +1,13 @@
+from __future__ import print_function
+import argparse
 import logging
 
 import odil
 
 def add_subparser(subparsers):
     parser = subparsers.add_parser(
-        "print", help="Print the contents of data sets")
+        "print", help="Print the contents of data sets",
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
     parser.add_argument("inputs", nargs="+", metavar="FILE", help="Input files")
     parser.add_argument(
         "--print-header", "-H", action="store_true",
@@ -37,7 +40,8 @@ def print_data_set(data_set, decode_uids, padding, max_length):
             name = entry.name
 
         if element.is_data_set():
-            value = ""
+            value = "(sequence, {} item{})".format(
+                len(element), "s" if len(element)>1 else "")
         elif element.is_binary():
             lengths = [len(x) for x in element.as_binary()]
             value = "(binary, {} item{}, {} byte{})".format(
@@ -61,18 +65,18 @@ def print_data_set(data_set, decode_uids, padding, max_length):
                     for uid in value
                 ]
 
-        print "{}{}{} {:04x},{:04x} {} {}".format(
+        print("{}{}{} {:04x},{:04x} {} {}".format(
             padding,
             name, (max_length-len(name)-len(padding))*" ",
             tag.group, tag.element, element.vr,
-            value)
+            value))
 
         if element.is_data_set():
             sequence = element.as_data_set()
             if sequence:
                 for item in sequence[:-1]:
                     print_data_set(item, decode_uids, padding+"  ", max_length)
-                    print
+                    print()
                 print_data_set(sequence[-1], decode_uids, padding+"  ", max_length)
 
 def find_max_name_length(data_set, max_length=0, padding_length=0):
diff --git a/applications/transcode.py b/applications/transcode.py
index 572459e..2365f6b 100644
--- a/applications/transcode.py
+++ b/applications/transcode.py
@@ -1,3 +1,4 @@
+import argparse
 import logging
 
 import odil
@@ -5,7 +6,8 @@ import odil
 def add_subparser(subparsers):
     parser = subparsers.add_parser(
         "transcode",
-        help="Change the transfer syntax or the format")
+        help="Change the transfer syntax or the format",
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
     parser.add_argument("input", help="Input file name")
     parser.add_argument("output", help="Output file name")
     parser.add_argument(
diff --git a/cmake/functions.cmake b/cmake/functions.cmake
new file mode 100644
index 0000000..48697f0
--- /dev/null
+++ b/cmake/functions.cmake
@@ -0,0 +1,32 @@
+# Group files by their folder
+macro(GroupFiles fileGroup)
+    # Beautify fileGroup (HEADER_FILES -> Header Files)
+    string(REPLACE "_" " " fileGroupName ${fileGroup})	# Replace underscores with spaces
+    string(TOLOWER ${fileGroupName} fileGroupName)		# To lower
+    set(finalFileGroupName)
+    string(REGEX MATCHALL "([^ ]+)" fileGroupNameSplit ${fileGroupName}) # Split each word
+    foreach(fileGroupNameWord ${fileGroupNameSplit})	# Set to upper the first letter of each word
+        string(SUBSTRING ${fileGroupNameWord} 0 1 firstLetter)
+        string(SUBSTRING ${fileGroupNameWord} 1 -1 otherLetters)
+        string(TOUPPER ${firstLetter} firstLetter)
+        if(finalFileGroupName)
+            set(finalFileGroupName "${finalFileGroupName} ")
+        endif()
+        set(finalFileGroupName "${finalFileGroupName}${firstLetter}${otherLetters}")
+    endforeach()
+
+    # Put each file in the correct group
+    foreach(currentFile ${${fileGroup}})
+        set(folder ${currentFile})
+        get_filename_component(filename ${folder} NAME) # Get the file name
+        string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}" "" folder ${folder})	# Get the folder relative to the current one
+        string(REPLACE "${filename}" "" folder ${folder})					# Remove the file name
+        set(groupName "${finalFileGroupName}")
+        if(NOT folder STREQUAL "") # Parse the remaining directories hierarchy
+            string(REGEX REPLACE "/+$" "" baseFolder ${folder}) # Remove trailing slash
+            string(REPLACE "/" "\\" baseFolder ${baseFolder})	# Forward to backward slashes
+            set(groupName "${groupName}\\${baseFolder}")		# Put together the entire group name
+        endif()
+        source_group("${groupName}" FILES ${currentFile})		# Put the file in this group
+    endforeach()
+endmacro()
\ No newline at end of file
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 91d181a..491a8f7 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -14,10 +14,16 @@ link_directories(${Boost_LIBRARY_DIRS} ${DCMTK_LIBRARY_DIRS})
 
 file(GLOB_RECURSE examples *.cpp)
 
+option(INSTALL_EXAMPLES "Install the examples" OFF)
+
 foreach(example_file ${examples})
     get_filename_component(example ${example_file} NAME_WE)
     add_executable(${example} ${example_file})
     target_link_libraries(${example} libodil)
+    if(INSTALL_EXAMPLES)
+        install(TARGETS ${example} RUNTIME DESTINATION bin)
+    endif()
+    set_target_properties(${example} PROPERTIES FOLDER "Examples")
 endforeach()
 
 file(GLOB_RECURSE python_examples *.py)
@@ -25,3 +31,4 @@ add_custom_target(
     PythonExamples
     ${CMAKE_COMMAND} -E echo "Python examples"
     SOURCES ${python_examples})
+set_target_properties(PythonExamples PROPERTIES FOLDER "Examples")
diff --git a/examples/move.cpp b/examples/move.cpp
index b96e2c7..1d67b0f 100644
--- a/examples/move.cpp
+++ b/examples/move.cpp
@@ -46,7 +46,7 @@ int main()
                 { odil::registry::ImplicitVRLittleEndian }, true, false
             }
         });
-    
+
     association.associate();
 
     odil::FindSCU find_scu(association);
@@ -81,35 +81,35 @@ int main()
             break;
         }
     }
-    
+
     odil::MoveSCU move_scu(association);
     move_scu.set_affected_sop_class(
         odil::registry::StudyRootQueryRetrieveInformationModelMOVE);
     move_scu.set_move_destination(
         association.get_parameters().get_calling_ae_title());
-    
+
     query = odil::DataSet();
     query.add("QueryRetrieveLevel", { "SERIES" });
     query.add("StudyInstanceUID", series["StudyInstanceUID"]);
     query.add("SeriesInstanceUID", series["SeriesInstanceUID"]);
-    
+
     std::cout << "--------\n";
     std::cout << "Callback\n";
     std::cout << "--------\n\n";
-    
-    move_scu.move(query, print_informations);
-    
+
+    move_scu.move(query, print_informations, odil::MoveSCU::MoveCallback());
+
     std::cout << "\n";
-    
+
     std::cout << "------\n";
     std::cout << "vector\n";
     std::cout << "------\n\n";
-    
+
     std::vector<odil::DataSet> result = move_scu.move(query);
     for(auto dataset: result)
     {
         print_informations(dataset);
     }
-    
+
     association.release();
 }
diff --git a/registry.cpp.tmpl b/registry.cpp.tmpl
index 30186f5..b4f62ec 100644
--- a/registry.cpp.tmpl
+++ b/registry.cpp.tmpl
@@ -6,7 +6,9 @@
  * for details.
  ************************************************************************/
 
-#include <stdint.h>
+#include <cstdint>
+#include <map>
+#include <string>
 
 #include "odil/registry.h"
 
@@ -60,6 +62,30 @@ ElementsDictionary create_public_dictionary()
     return public_dictionary;
 }
 
+std::map<std::string, odil::Tag> create_public_tags()
+{
+
+    RawElementsDictionaryEntry raw_entries[] = {
+{% for entry in elements_dictionary %}
+    {% if not entry[0] is string -%}
+        { Tag({{ "0x%04x, 0x%04x"|format(*entry[0]) }}),
+          "{{ entry[1] }}", "{{ entry[2] }}",  "{{ entry[3] }}", "{{ entry[4] }}" },
+    {%- endif %}
+{% endfor %}
+    };
+
+    std::map<std::string, odil::Tag> public_tags;
+
+    unsigned long const count = sizeof(raw_entries)/sizeof(RawElementsDictionaryEntry);
+    for(unsigned long i=0; i<count; ++i)
+    {
+        RawElementsDictionaryEntry const & raw_entry = raw_entries[i];
+        public_tags.insert(std::make_pair(raw_entry.keyword, raw_entry.key.get_tag()));
+    }
+
+    return public_tags;
+}
+
 struct RawUIDsDictionaryEntry
 {
     char const * uid;
@@ -96,4 +122,5 @@ UIDsDictionary create_uids_dictionary()
 }
 
 odil::ElementsDictionary odil::registry::public_dictionary=odil::registry::create_public_dictionary();
+std::map<std::string, odil::Tag> odil::registry::public_tags=odil::registry::create_public_tags();
 odil::UIDsDictionary odil::registry::uids_dictionary=odil::registry::create_uids_dictionary();
diff --git a/registry.h.tmpl b/registry.h.tmpl
index f91dde3..dc82d5c 100644
--- a/registry.h.tmpl
+++ b/registry.h.tmpl
@@ -9,6 +9,9 @@
 #ifndef _afc7b2d7_0869_4fea_9a9b_7fe6228baca9
 #define _afc7b2d7_0869_4fea_9a9b_7fe6228baca9
 
+#include <map>
+#include <string>
+
 #include "odil/ElementsDictionary.h"
 #include "odil/Tag.h"
 #include "odil/UIDsDictionary.h"
@@ -31,6 +34,7 @@ std::string const {{ entry[2] }}("{{ entry[0] }}");
 {% endfor %}
 
 extern ElementsDictionary public_dictionary;
+extern std::map<std::string, Tag> public_tags;
 extern UIDsDictionary uids_dictionary;
 }
 
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 5218b46..47bea79 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,11 +1,15 @@
-find_package(Boost REQUIRED COMPONENTS filesystem regex system)
+find_package(Boost REQUIRED COMPONENTS filesystem system)
 find_package(DCMTK REQUIRED)
 find_package(ICU REQUIRED)
 find_package(JsonCpp REQUIRED)
 
-file(GLOB_RECURSE headers "*.h")
+file(GLOB_RECURSE Header_Files "*.h")
+file(GLOB_RECURSE Source_Files "*.cpp")
 file(GLOB_RECURSE templates "*.txx")
-file(GLOB_RECURSE files "*.cpp")
+
+# Regroup files by folder
+GroupFiles(Header_Files)
+GroupFiles(Source_Files)
 
 include_directories(
     ${CMAKE_CURRENT_SOURCE_DIR} ${Boost_INCLUDE_DIRS} ${DCMTK_INCLUDE_DIRS}
@@ -17,11 +21,17 @@ add_definitions(
 )
 link_directories(${Boost_LIBRARY_DIRS} ${DCMTK_LIBRARY_DIRS})
 
-add_library(libodil SHARED ${files} ${headers} ${templates})
+add_library(libodil ${Source_Files} ${Header_Files} ${templates})
 set_target_properties(libodil PROPERTIES OUTPUT_NAME odil)
 
 target_link_libraries(libodil
     ${Boost_LIBRARIES} ${DCMTK_LIBRARIES} ${ICU_LIBRARIES} ${JsonCpp_LIBRARIES})
+
+if(WIN32)
+    add_definitions(-DBUILDING_ODIL)
+    target_link_libraries(libodil netapi32)
+endif()
+
 set_target_properties(libodil PROPERTIES
     VERSION ${odil_VERSION}
     SOVERSION ${odil_MAJOR_VERSION})
diff --git a/src/odil/Association.h b/src/odil/Association.h
index 6210f36..b49ca25 100644
--- a/src/odil/Association.h
+++ b/src/odil/Association.h
@@ -74,6 +74,7 @@ public:
         NoPresentationServiceAccessPointAvailable=7,
     };
 
+    /// @brief Duration of the timeout.
     typedef dul::StateMachine::duration_type duration_type;
 
     /// @brief Create a default, un-associated, association.
@@ -85,6 +86,7 @@ public:
     /// @brief Destroy the association, release it if necessary.
     ~Association();
 
+    /// @brief Return the TCP transport.
     dul::Transport & get_transport();
 
     /// @brief Assing an un-associated association; it remains un-associated.
@@ -194,6 +196,10 @@ private:
     uint16_t _next_message_id;
 };
 
+/** 
+ * @brief Exception reported when receiving a message after the association was
+ * released.
+ */
 class AssociationReleased: public Exception
 {
 public:
@@ -204,12 +210,20 @@ public:
     }
 };
 
+/** 
+ * @brief Exception reported when receiving a message after the association was
+ * aborted.
+ */
 class AssociationAborted: public Exception
 {
 public:
+    /// @brief Source of the error.
     uint8_t source;
+    
+    /// @brief Reason of the error.
     uint8_t reason;
-
+    
+    /// @brief Constructor.
     AssociationAborted(unsigned char source, unsigned char reason)
     : Exception("Association aborted"), source(source), reason(reason)
     {
diff --git a/src/odil/AssociationAcceptor.h b/src/odil/AssociationAcceptor.h
index 0603d92..815136c 100644
--- a/src/odil/AssociationAcceptor.h
+++ b/src/odil/AssociationAcceptor.h
@@ -38,20 +38,31 @@ typedef
 AssociationParameters
 default_association_acceptor(AssociationParameters const & input);
 
+/// @brief Exception reported when an incoming association is rejected.
 struct AssociationRejected: public Exception
 {
 public:
+    /// @brief Constructor.
     AssociationRejected(
         unsigned char result, unsigned char source, unsigned char reason,
         std::string const & message="Association rejected");
 
+    /// @brief Return the rejection result.
     unsigned char get_result() const;
+    
+    /// @brief Set the rejection result.
     void set_result(unsigned char value);
 
+    /// @brief Return the rejection source.
     unsigned char get_source() const;
+    
+    /// @brief Set the rejection source.
     void set_source(unsigned char value);
 
+    /// @brief Return the rejection reason.
     unsigned char get_reason() const;
+    
+    /// @brief Set the rejection reason.
     void set_reason(unsigned char value);
 private:
     unsigned char _result;
diff --git a/src/odil/AssociationParameters.h b/src/odil/AssociationParameters.h
index aa9c37b..185868a 100644
--- a/src/odil/AssociationParameters.h
+++ b/src/odil/AssociationParameters.h
@@ -29,6 +29,7 @@ public:
      */
     struct PresentationContext
     {
+        /// @brief Result of the presentation context negotiation.
         enum class Result
         {
             Acceptance = 0,
@@ -38,11 +39,22 @@ public:
             TransferSyntaxesNotSupported = 4,
         };
 
+        /// @brief Identifier of the presentation context, must be odd.
         uint8_t id;
+        
+        /// @brief Proposed abstract syntax.
         std::string abstract_syntax;
+        
+        /// @brief Proposed transfer syntaxes or accepted transfer syntax.
         std::vector<std::string> transfer_syntaxes;
+        
+        /// @brief Support for SCU role.
         bool scu_role_support;
+        
+        /// @brief Support for SCP role.
         bool scp_role_support;
+        
+        /// @brief Result of the negotiation.
         Result result;
 
         /// @brief Member-wise equality.
@@ -52,6 +64,7 @@ public:
     /// @brief User Identity, cf. PS3.8 D.3.3.7
     struct UserIdentity
     {
+        /// @brief User identity type.
         enum class Type
         {
             None = 0,
@@ -61,8 +74,13 @@ public:
             SAML = 4
         };
 
+        /// @brief Identity type.
         Type type;
+        
+        /// @brief Primary identity field.
         std::string primary_field;
+        
+        /// @brief Secondary identity field.
         std::string secondary_field;
 
         /// @brief Member-wise equality.
diff --git a/src/odil/BasicDirectoryCreator.cpp b/src/odil/BasicDirectoryCreator.cpp
index d73aa89..66decf9 100644
--- a/src/odil/BasicDirectoryCreator.cpp
+++ b/src/odil/BasicDirectoryCreator.cpp
@@ -236,16 +236,23 @@ BasicDirectoryCreator
 {
     LinearizedTree linearized_tree;
 
-    // Prime the stack with all top-level records.
+    // Create a depth-first list of records and a sibling map.
+    // Prime the stack and sibling map with all top-level records.
     std::stack<Record::Pointer> stack;
-    for(auto const & record: record_tree)
+    std::map<Record const *, long> location_map;
+    std::map<Record const *, Record const *> sibling_map;
+    for(auto it=record_tree.begin(); it!=record_tree.end(); ++it)
     {
-        stack.push(record.second);
+        stack.push(it->second);
+        auto const sibling_it = std::next(it);
+        if(sibling_it != record_tree.end())
+        {
+            auto const & sibling = sibling_it->second;
+            sibling_map[it->second.get()] = sibling.get();
+        }
     }
 
     // Create a depth-first list of records and a sibling map.
-    std::map<Record const *, long> location_map;
-    std::map<Record const *, Record const *> sibling_map;
     while(!stack.empty())
     {
         auto const & record = stack.top();
diff --git a/src/odil/BasicDirectoryCreator.h b/src/odil/BasicDirectoryCreator.h
index bd745f0..e84354f 100644
--- a/src/odil/BasicDirectoryCreator.h
+++ b/src/odil/BasicDirectoryCreator.h
@@ -56,6 +56,7 @@ public:
     /// @brief Encoding of sequence items, defaults to Writer::ItemEncoding::ExplicitLength.
     Writer::ItemEncoding item_encoding;
 
+    /// @brief Constructor.
     BasicDirectoryCreator(
         std::string const & root="",
         std::vector<std::string> const & files=std::vector<std::string>(),
@@ -63,6 +64,7 @@ public:
         Writer::ItemEncoding item_encoding=Writer::ItemEncoding::ExplicitLength
         );
 
+    /// @brief Create and write the Basic Directory.
     void operator()() const;
 
 private:
diff --git a/src/odil/DataSet.cpp b/src/odil/DataSet.cpp
index 4a3cbd4..cd60507 100644
--- a/src/odil/DataSet.cpp
+++ b/src/odil/DataSet.cpp
@@ -240,6 +240,157 @@ DataSet
     return it->second;
 }
 
+template<typename TContainer>
+typename TContainer::value_type const & at_pos(
+    TContainer const & container, unsigned int position)
+{
+    if(container.size() <= position) 
+    { 
+        throw Exception("No such element"); 
+    } 
+    return container[position]; 
+}
+
+bool
+DataSet
+::is_int(Tag const & tag) const 
+{ 
+    return (*this)[tag].is_int();
+}
+
+Value::Integers const &
+DataSet
+::as_int(Tag const & tag) const 
+{ 
+    return (*this)[tag].as_int();
+}
+
+Value::Integers &
+DataSet
+::as_int(Tag const & tag) 
+{ 
+    return (*this)[tag].as_int();
+}
+
+Value::Integer const &
+DataSet
+::as_int(Tag const & tag, unsigned int position) const 
+{ 
+    return at_pos(as_int(tag), position);
+}
+
+bool
+DataSet
+::is_real(Tag const & tag) const 
+{ 
+    return (*this)[tag].is_real();
+}
+
+Value::Reals const &
+DataSet
+::as_real(Tag const & tag) const 
+{ 
+    return (*this)[tag].as_real();
+}
+
+Value::Reals &
+DataSet
+::as_real(Tag const & tag) 
+{ 
+    return (*this)[tag].as_real();
+}
+
+Value::Real const &
+DataSet
+::as_real(Tag const & tag, unsigned int position) const 
+{ 
+    return at_pos(as_real(tag), position);
+}
+
+bool
+DataSet
+::is_string(Tag const & tag) const 
+{ 
+    return (*this)[tag].is_string();
+}
+
+Value::Strings const &
+DataSet
+::as_string(Tag const & tag) const 
+{ 
+    return (*this)[tag].as_string();
+}
+
+Value::Strings &
+DataSet
+::as_string(Tag const & tag) 
+{ 
+    return (*this)[tag].as_string();
+}
+
+Value::String const &
+DataSet
+::as_string(Tag const & tag, unsigned int position) const 
+{ 
+    return at_pos(as_string(tag), position);
+}
+
+bool
+DataSet
+::is_data_set(Tag const & tag) const 
+{ 
+    return (*this)[tag].is_data_set();
+}
+
+Value::DataSets const &
+DataSet
+::as_data_set(Tag const & tag) const 
+{ 
+    return (*this)[tag].as_data_set();
+}
+
+Value::DataSets &
+DataSet
+::as_data_set(Tag const & tag) 
+{ 
+    return (*this)[tag].as_data_set();
+}
+
+DataSet const &
+DataSet
+::as_data_set(Tag const & tag, unsigned int position) const 
+{ 
+    return at_pos(as_data_set(tag), position);
+}
+
+bool
+DataSet
+::is_binary(Tag const & tag) const 
+{ 
+    return (*this)[tag].is_binary();
+}
+
+Value::Binary const &
+DataSet
+::as_binary(Tag const & tag) const 
+{ 
+    return (*this)[tag].as_binary();
+}
+
+Value::Binary &
+DataSet
+::as_binary(Tag const & tag) 
+{ 
+    return (*this)[tag].as_binary();
+}
+
+Value::Binary::value_type const &
+DataSet
+::as_binary(Tag const & tag, unsigned int position) const 
+{ 
+    return at_pos(as_binary(tag), position);
+}
+
 bool
 DataSet
 ::has(Tag const & tag) const
diff --git a/src/odil/DataSet.h b/src/odil/DataSet.h
index 9924185..e8bf7ed 100644
--- a/src/odil/DataSet.h
+++ b/src/odil/DataSet.h
@@ -22,44 +22,6 @@
 namespace odil
 {
 
-#define odilElementTypeMacro(name, Type) \
-bool is_##name(Tag const & tag) const \
-{ \
-    auto const it = this->_elements.find(tag); \
-    if(it == this->_elements.end()) \
-    { \
-        throw Exception("No such element"); \
-    } \
-    return it->second.is_##name(); \
-} \
-Value::Type const & as_##name(Tag const & tag) const \
-{ \
-    auto const it = this->_elements.find(tag); \
-    if(it == this->_elements.end()) \
-    { \
-        throw Exception("No such element"); \
-    } \
-    return it->second.as_##name(); \
-} \
-Value::Type::value_type const & as_##name(Tag const & tag, unsigned int position) const \
-{ \
-    auto const & data = this->as_##name(tag); \
-    if(data.size() <= position) \
-    { \
-        throw Exception("No such element"); \
-    } \
-    return data[position]; \
-} \
-Value::Type & as_##name(Tag const & tag) \
-{ \
-    auto const it = this->_elements.find(tag); \
-    if(it == this->_elements.end()) \
-    { \
-        throw Exception("No such element"); \
-    } \
-    return it->second.as_##name(); \
-}
-
 /**
  * @brief DICOM Data set.
  */
@@ -171,20 +133,80 @@ public:
      */
     Element & operator[](Tag const & tag);
 
-    odilElementTypeMacro(int, Integers);
-    odilElementTypeMacro(real, Reals);
-    odilElementTypeMacro(string, Strings);
-    odilElementTypeMacro(data_set, DataSets);
-    odilElementTypeMacro(binary, Binary);
-
+    /// @brief Test whether an existing element has integer type.
+    bool is_int(Tag const & tag) const;
+    
+    /// @brief Return the integers contained in an existing element (read-only).
+    Value::Integers const & as_int(Tag const & tag) const;
+    
+    /// @brief Return the integers contained in an existing element (read-write).
+    Value::Integers & as_int(Tag const & tag);
+    
+    /// @brief Return an integer contained in an existing element (read-only).
+    Value::Integer const & as_int(Tag const & tag, unsigned int position) const;
+    
+    /// @brief Test whether an existing element has real type.
+    bool is_real(Tag const & tag) const;
+    
+    /// @brief Return the reals contained in an existing element (read-only).
+    Value::Reals const & as_real(Tag const & tag) const;
+    
+    /// @brief Return the reals contained in an existing element (read-write).
+    Value::Reals & as_real(Tag const & tag);
+    
+    /// @brief Return an real contained in an existing element (read-only).
+    Value::Real const & as_real(Tag const & tag, unsigned int position) const;
+    
+    /// @brief Test whether an existing element has string type.
+    bool is_string(Tag const & tag) const;
+    
+    /// @brief Return the strings contained in an existing element (read-only).
+    Value::Strings const & as_string(Tag const & tag) const;
+    
+    /// @brief Return the strings contained in an existing element (read-write).
+    Value::Strings & as_string(Tag const & tag);
+    
+    /// @brief Return a string contained in an existing element (read-only).
+    Value::String const & as_string(Tag const & tag, unsigned int position) const;
+    
+    /// @brief Test whether an existing element has data set type.
+    bool is_data_set(Tag const & tag) const;
+    
+    /// @brief Return the data sets contained in an existing element (read-only).
+    Value::DataSets const & as_data_set(Tag const & tag) const;
+    
+    /// @brief Return the data sets contained in an existing element (read-write).
+    Value::DataSets & as_data_set(Tag const & tag);
+    
+    /// @brief Return a data set contained in an existing element (read-only).
+    DataSet const & as_data_set(Tag const & tag, unsigned int position) const;
+    
+    /// @brief Test whether an existing element has binary type.
+    bool is_binary(Tag const & tag) const;
+    
+    /// @brief Return the binary items contained in an existing element (read-only).
+    Value::Binary const & as_binary(Tag const & tag) const;
+    
+    /// @brief Return the binary items contained in an existing element (read-write).
+    Value::Binary & as_binary(Tag const & tag);
+    
+    /// @brief Return a binary item contained in an existing element (read-only).
+    Value::Binary::value_type const & 
+    as_binary(Tag const & tag, unsigned int position) const;
+
+    /// @brief Iterator to the elements.
     typedef std::map<Tag, Element>::const_iterator const_iterator;
+    
+    /// @brief Return an iterator to the start of the elements.
     const_iterator begin() const { return this->_elements.begin(); }
+    
+    /// @brief Return an iterator to the end of the elements.
     const_iterator end() const { return this->_elements.end(); }
 
-    /// @brief Equality test
+    /// @brief Equality test.
     bool operator==(DataSet const & other) const;
 
-    /// @brief Difference test
+    /// @brief Difference test.
     bool operator!=(DataSet const & other) const;
 
 private:
diff --git a/src/odil/Element.h b/src/odil/Element.h
index 25774da..917cab2 100644
--- a/src/odil/Element.h
+++ b/src/odil/Element.h
@@ -77,6 +77,7 @@ public:
     /// @brief Return the number of items in the value.
     std::size_t size() const;
 
+    /// @brief Return the raw value.
     Value const & get_value() const;
 
     /// @brief Test whether the value contains integers.
diff --git a/src/odil/ElementsDictionary.cpp b/src/odil/ElementsDictionary.cpp
index 5fc6363..be9af28 100644
--- a/src/odil/ElementsDictionary.cpp
+++ b/src/odil/ElementsDictionary.cpp
@@ -137,4 +137,20 @@ ElementsDictionaryEntry
     // Nothing else
 }
 
+ElementsDictionary::const_iterator
+find(ElementsDictionary const & dictionary, Tag const & tag)
+{
+    auto iterator = dictionary.find(tag);
+    if(iterator == dictionary.end())
+    {
+        std::string tag_string(tag);
+        tag_string[2] = 'x';
+        tag_string[3] = 'x';
+        
+        iterator = dictionary.find(tag_string);
+    }
+    
+    return iterator;
+}
+
 }
diff --git a/src/odil/ElementsDictionary.h b/src/odil/ElementsDictionary.h
index 2443c5e..0179767 100644
--- a/src/odil/ElementsDictionary.h
+++ b/src/odil/ElementsDictionary.h
@@ -70,11 +70,19 @@ namespace odil
  */
 struct ElementsDictionaryEntry
 {
+    /// @brief Full name.
     std::string name;
+    
+    /// @brief Brief name.
     std::string keyword;
+    
+    /// @brief Type.
     std::string vr;
+    
+    /// @brief Multiplicity.
     std::string vm;
 
+    /// @brief Constructor.
     ElementsDictionaryEntry(
         std::string const & name="", std::string const & keyword="",
         std::string const & vr="", std::string const & vm="");
@@ -83,6 +91,9 @@ struct ElementsDictionaryEntry
 typedef
     std::map<ElementsDictionaryKey, ElementsDictionaryEntry> ElementsDictionary;
 
+ElementsDictionary::const_iterator
+find(ElementsDictionary const & dictionary, Tag const & tag);
+
 }
 
 #endif // _f4b88e07_d515_41be_ad1b_37899ec6451e
diff --git a/src/odil/Exception.h b/src/odil/Exception.h
index 8c4b14e..2e01b2c 100644
--- a/src/odil/Exception.h
+++ b/src/odil/Exception.h
@@ -29,6 +29,7 @@ public:
     virtual const char* what() const throw();
 
 protected:
+    /// @brief Message of the exception.
     std::string _message;
 };
 
diff --git a/src/odil/FindSCU.h b/src/odil/FindSCU.h
index 4cd30ea..7bb6bd3 100644
--- a/src/odil/FindSCU.h
+++ b/src/odil/FindSCU.h
@@ -25,6 +25,7 @@ public:
     /// @brief Callback called when a response is received.
     typedef std::function<void(DataSet const &)> Callback;
 
+    /// @brief Constructor.
     FindSCU(Association & association);
     
     /// @brief Destructor.
diff --git a/src/odil/GetSCP.h b/src/odil/GetSCP.h
index 8702338..bdc8eb0 100644
--- a/src/odil/GetSCP.h
+++ b/src/odil/GetSCP.h
@@ -23,9 +23,11 @@ class GetSCP: public SCP
 {
 public:
 
+    /// @brief Generator of C-GET responses.
     class DataSetGenerator: public SCP::DataSetGenerator
     {
     public:
+        /// @brief Return the number of responses.
         virtual unsigned int count() const =0;
     };
 
@@ -56,4 +58,3 @@ private:
 }
 
 #endif // _2f0ad1fd_8779_4ab3_b7e8_6d37fdc0c018
-
diff --git a/src/odil/GetSCU.cpp b/src/odil/GetSCU.cpp
index ca73ffe..750a345 100644
--- a/src/odil/GetSCU.cpp
+++ b/src/odil/GetSCU.cpp
@@ -38,7 +38,9 @@ GetSCU
 
 void
 GetSCU
-::get(DataSet const & query, Callback callback) const
+::get(
+    DataSet const & query, StoreCallback store_callback,
+    GetCallback get_callback) const
 {
     // Send the request
     message::CGetRequest request(
@@ -54,14 +56,15 @@ GetSCU
 
         if(message.get_command_field() == message::Message::Command::C_GET_RSP)
         {
-            done = this->_handle_get_response(message::CGetResponse(message));
+            done = this->_handle_get_response(
+                message::CGetResponse(message), get_callback);
         }
         else if(message.get_command_field() == message::Message::Command::C_STORE_RQ)
         {
             try
             {
                 this->_handle_store_request(
-                    message::CStoreRequest(message), callback);
+                    message::CStoreRequest(message), store_callback);
             }
             catch(...)
             {
@@ -94,18 +97,26 @@ GetSCU
 
 bool
 GetSCU
-::_handle_get_response(message::CGetResponse const & response) const
+::_handle_get_response(
+    message::CGetResponse const & response, GetCallback callback) const
 {
+    if(callback)
+    {
+        callback(response);
+    }
     return !response.is_pending();
 }
 
 void
 GetSCU
 ::_handle_store_request(
-    message::CStoreRequest const & request, Callback callback) const
+    message::CStoreRequest const & request, StoreCallback callback) const
 {
     auto const store_callback = [&callback](message::CStoreRequest const & request) {
-        callback(request.get_data_set());
+        if(callback)
+        {
+            callback(request.get_data_set());
+        }
         return message::Response::Success;
     };
     StoreSCP scp(this->_association, store_callback);
diff --git a/src/odil/GetSCU.h b/src/odil/GetSCU.h
index b44b914..292f974 100644
--- a/src/odil/GetSCU.h
+++ b/src/odil/GetSCU.h
@@ -25,8 +25,17 @@ namespace odil
 class GetSCU: public SCU
 {
 public:
-    /// @brief Callback called when a response is received.
-    typedef std::function<void(DataSet const &)> Callback;
+    /// @brief Callback called when a C-STORE request is received.
+    typedef std::function<void(DataSet const &)> StoreCallback;
+
+    /**
+     * @brief Typedef to keep compatibility with previous versions.
+     * @deprecated The StoreCallback typedef should now be used.
+     */
+    typedef StoreCallback Callback;
+
+    /// @brief Callback called when a C-GET response is received.
+    typedef std::function<void(message::CGetResponse const &)> GetCallback;
 
     /// @brief Constructor.
     GetSCU(Association & association);
@@ -34,8 +43,10 @@ public:
     /// @brief Destructor.
     virtual ~GetSCU();
     
-    /// @brief Perform the C-GET using an optional callback.
-    void get(DataSet const & query, Callback callback) const;
+    /// @brief Perform the C-GET using callbacks.
+    void get(
+        DataSet const & query, StoreCallback store_callback,
+        GetCallback get_callback=GetCallback()) const;
     
     /**
      * @brief Return a list of datasets matching the query.
@@ -43,9 +54,10 @@ public:
     std::vector<DataSet> get(DataSet const & query) const;
 
 private:
-    bool _handle_get_response(message::CGetResponse const & response) const;
+    bool _handle_get_response(
+        message::CGetResponse const & response, GetCallback callback) const;
     void _handle_store_request(
-        message::CStoreRequest const & request, Callback callback) const;
+        message::CStoreRequest const & request, StoreCallback callback) const;
 };
 
 }
diff --git a/src/odil/MoveSCP.h b/src/odil/MoveSCP.h
index 77a3e6f..f47d6af 100644
--- a/src/odil/MoveSCP.h
+++ b/src/odil/MoveSCP.h
@@ -27,10 +27,14 @@ class MoveSCP: public SCP
 {
 public:
 
+    /// @brief Generator of C-MOVE responses.
     class DataSetGenerator: public SCP::DataSetGenerator
     {
     public:
+        /// @brief Return the number of responses.
         virtual unsigned int count() const =0;
+        
+        /// @brief Return the sub-association to send responses on.
         virtual Association get_association(message::CMoveRequest const &) const =0;
     };
 
@@ -62,4 +66,3 @@ private:
 
 
 #endif // _7e899e10_2a21_45b8_a2d6_af1d13cbfd29
-
diff --git a/src/odil/MoveSCU.cpp b/src/odil/MoveSCU.cpp
index ae24730..f39a151 100644
--- a/src/odil/MoveSCU.cpp
+++ b/src/odil/MoveSCU.cpp
@@ -26,7 +26,7 @@ namespace odil
 
 MoveSCU
 ::MoveSCU(Association & association)
-: SCU(association), _move_destination("")
+: SCU(association), _move_destination(""), _incoming_port(0)
 {
     // Nothing else.
 }
@@ -51,9 +51,40 @@ MoveSCU
     this->_move_destination = move_destination;
 }
 
+uint16_t
+MoveSCU
+::get_incoming_port() const
+{
+    return this->_incoming_port;
+}
+
 void
 MoveSCU
-::move(DataSet const & query, Callback callback) const
+::set_incoming_port(uint16_t port)
+{
+    this->_incoming_port = port;
+}
+
+void
+MoveSCU
+::move(DataSet const & query, StoreCallback store_callback) const
+{
+    this->move(query, store_callback, MoveCallback());
+}
+
+void
+MoveSCU
+::move(DataSet const & query, MoveCallback move_callback) const
+{
+    this->move(query, StoreCallback(), move_callback);
+}
+
+
+void
+MoveSCU
+::move(
+    DataSet const & query, StoreCallback store_callback,
+    MoveCallback move_callback) const
 {
     // Send the request
     message::CMoveRequest const request(
@@ -65,36 +96,40 @@ MoveSCU
     // Receive the responses
     Association store_association;
     bool done = false;
-    while(!done)
+    if(this->_incoming_port != 0)
     {
-        // Use a small timeout to avoid blocking for a long time.
-        boost::posix_time::milliseconds const timeout(1000);
-        store_association.set_tcp_timeout(timeout);
-        store_association.set_message_timeout(timeout);
-
-        if(!store_association.is_associated())
+        while(!done)
         {
-            try
-            {
-                store_association.receive_association(boost::asio::ip::tcp::v4(), 11113);
-                store_association.set_tcp_timeout(
-                    this->_association.get_tcp_timeout());
-                store_association.set_message_timeout(
-                    this->_association.get_message_timeout());
-            }
-            catch(Exception const & e)
-            {
-                // Ignore
-            }
+            // Use a small timeout to avoid blocking for a long time.
+            boost::posix_time::milliseconds const timeout(10);
+            store_association.set_tcp_timeout(timeout);
+            store_association.set_message_timeout(timeout);
 
-            if(store_association.is_associated())
+            if(!store_association.is_associated())
             {
-                done = true;
+                try
+                {
+                    store_association.receive_association(
+                        boost::asio::ip::tcp::v4(), this->_incoming_port);
+                    store_association.set_tcp_timeout(
+                        this->_association.get_tcp_timeout());
+                    store_association.set_message_timeout(
+                        this->_association.get_message_timeout());
+                }
+                catch(Exception const & e)
+                {
+                    // Ignore
+                }
+
+                if(store_association.is_associated())
+                {
+                    done = true;
+                }
             }
         }
     }
 
-    this->_dispatch(store_association, callback);
+    this->_dispatch(store_association, store_callback, move_callback);
 }
 
 std::vector<DataSet>
@@ -105,27 +140,30 @@ MoveSCU
     auto callback = [&result](DataSet const & data_set) {
         result.push_back(data_set);
     };
-    this->move(query, callback);
+    this->move(query, callback, MoveCallback());
 
     return result;
 }
 
 void
 MoveSCU
-::_dispatch(Association & store_association, Callback callback) const
+::_dispatch(
+    Association & store_association, StoreCallback store_callback,
+    MoveCallback move_callback) const
 {
-    bool store_done = false;
+    // If no store association has been established, store is considered done
+    bool store_done = !store_association.is_associated();
     bool main_done = false;
     while(!(store_done && main_done))
     {
-        if(store_association.get_transport().get_socket()->available() > 0)
+        if(!store_done && store_association.get_transport().get_socket()->available() > 0)
         {
-            store_done =
-                this->_handle_store_association(store_association, callback);
+            store_done = this->_handle_store_association(
+                store_association, store_callback);
         }
-        if(this->_association.get_transport().get_socket()->available() > 0)
+        if(!main_done && this->_association.get_transport().get_socket()->available() > 0)
         {
-            main_done = this->_handle_main_association();
+            main_done = this->_handle_main_association(move_callback);
         }
 
         std::this_thread::sleep_for(std::chrono::milliseconds(10));
@@ -134,21 +172,29 @@ MoveSCU
 
 bool
 MoveSCU
-::_handle_main_association() const
+::_handle_main_association(MoveCallback callback) const
 {
     message::CMoveResponse const response = this->_association.receive_message();
+    if(callback)
+    {
+        callback(response);
+    }
     return !response.is_pending();
 }
 
 bool
 MoveSCU
-::_handle_store_association(Association & association, Callback callback) const
+::_handle_store_association(
+    Association & association, StoreCallback callback) const
 {
     bool result = false;
     try
     {
         auto const store_callback = [&callback](message::CStoreRequest const & request) {
-            callback(request.get_data_set());
+            if(callback)
+            {
+                callback(request.get_data_set());
+            }
             return message::Response::Success;
         };
         StoreSCP scp(association, store_callback);
diff --git a/src/odil/MoveSCU.h b/src/odil/MoveSCU.h
index 9d62d58..76be7f5 100644
--- a/src/odil/MoveSCU.h
+++ b/src/odil/MoveSCU.h
@@ -15,6 +15,7 @@
 
 #include "odil/Association.h"
 #include "odil/DataSet.h"
+#include "odil/message/CMoveResponse.h"
 #include "odil/SCU.h"
 
 namespace odil
@@ -24,8 +25,17 @@ namespace odil
 class MoveSCU: public SCU
 {
 public:
-    /// @brief Callback called when a response is received.
-    typedef std::function<void(DataSet const &)> Callback;
+    /// @brief Callback called when a C-STORE request is received.
+    typedef std::function<void(DataSet const &)> StoreCallback;
+
+    /**
+     * @brief Typedef to keep compatibility with previous versions.
+     * @deprecated The StoreCallback typedef should now be used.
+     */
+    typedef StoreCallback Callback;
+
+    /// @brief Callback called when a C-MOVE response is received.
+    typedef std::function<void(message::CMoveResponse const &)> MoveCallback;
     
     /// @brief Constructor.
     MoveSCU(Association & association);
@@ -37,9 +47,23 @@ public:
     std::string const & get_move_destination() const;
     /// @brief Set the AE title of the destination.
     void set_move_destination(std::string const & move_destination);
+    
+    /// @brief Return the port for incoming associations, defaults to 0.
+    uint16_t get_incoming_port() const;
+    
+    /// @brief Set the port for incoming associations, use 0 to disable.
+    void set_incoming_port(uint16_t port);
+    
+    /// @brief Perform the C-MOVE using callbacks.
+    void move(DataSet const & query, StoreCallback store_callback) const;
+        
+    /// @brief Perform the C-MOVE using callbacks.
+    void move(DataSet const & query, MoveCallback move_callback) const;
 
-    /// @brief Perform the C-MOVE using a callback.
-    void move(DataSet const & query, Callback callback) const;
+    /// @brief Perform the C-MOVE using callbacks.
+    void move(
+        DataSet const & query, StoreCallback store_callback,
+        MoveCallback move_callback) const;
     
     /**
      * @brief Return a list of datasets matching the query.
@@ -48,14 +72,17 @@ public:
 
 private:
     std::string _move_destination;
+    uint16_t _incoming_port;
     
-    void _dispatch(Association & store_association, Callback callback) const;
+    void _dispatch(
+        Association & store_association, StoreCallback store_callback,
+        MoveCallback move_callback) const;
     
-    bool _handle_main_association() const;
-    bool _handle_store_association(Association & association, Callback callback) const;
+    bool _handle_main_association(MoveCallback callback) const;
+    bool _handle_store_association(
+        Association & association, StoreCallback callback) const;
 };
 
 }
 
 #endif // _5ff4d940_4db7_4d85_9d3a_230b944b31fe
-
diff --git a/src/odil/Reader.cpp b/src/odil/Reader.cpp
index 5964c41..668c9a9 100644
--- a/src/odil/Reader.cpp
+++ b/src/odil/Reader.cpp
@@ -59,6 +59,10 @@ type value; \
 
 std::string read_string(std::istream & stream, unsigned int size)
 {
+    if(size == 0)
+    {
+        return std::string();
+    }
     std::string value(size, '\0');
     stream.read(&value[0], value.size());
     if(!stream)
@@ -469,7 +473,11 @@ Reader::Visitor
 ::operator()(Value::Binary & value) const
 {
     auto const vl = this->read_length();
-    if(vl == 0xffffffff)
+    if(vl == 0)
+    {
+        return;
+    }
+    else if(vl == 0xffffffff)
     {
         value = this->read_encapsulated_pixel_data(this->stream);
     }
diff --git a/src/odil/Reader.h b/src/odil/Reader.h
index 14588a5..4081a31 100644
--- a/src/odil/Reader.h
+++ b/src/odil/Reader.h
@@ -67,6 +67,7 @@ public:
         Tag const & tag=Tag(0xffff,0xffff),
         DataSet const & data_set=DataSet()) const;
 
+    /// @brief Return the meta-data header and data set stored in the stream.
     static std::pair<DataSet, DataSet> read_file(
         std::istream & stream,
         bool keep_group_length=false);
diff --git a/src/odil/SCP.h b/src/odil/SCP.h
index 9f1b2f7..fa0dc09 100644
--- a/src/odil/SCP.h
+++ b/src/odil/SCP.h
@@ -25,13 +25,19 @@ public:
     class DataSetGenerator
     {
     public:
+        /// @brief Destructor.
         virtual ~DataSetGenerator() =0;
 
+        /// @brief Initialize the generator.
         virtual void initialize(message::Request const & request) =0;
 
+        /// @brief Test whether all elements have been generated.
         virtual bool done() const =0;
+        
+        /// @brief Prepare the next element.
         virtual void next() =0;
 
+        /// @brief Return the current element.
         virtual DataSet get() const =0;
     };
 
@@ -47,6 +53,7 @@ public:
     /// @brief Process a message.
     virtual void operator()(message::Message const & message) =0;
 protected:
+    /// @brief Association with peer.
     Association & _association;
 };
 
diff --git a/src/odil/SCPDispatcher.h b/src/odil/SCPDispatcher.h
index bc7e002..511b19f 100644
--- a/src/odil/SCPDispatcher.h
+++ b/src/odil/SCPDispatcher.h
@@ -19,6 +19,7 @@
 namespace odil
 {
 
+/// @brief Dispatch an incoming message to one of the registered SCPs.
 class SCPDispatcher
 {
 public:
@@ -28,12 +29,16 @@ public:
     /// @brief Destructor.
     ~SCPDispatcher();
 
+    /// @brief Test whether command has an SCP registered.
     bool has_scp(Value::Integer command) const;
 
+    /// @brief Return the SCP registered with command.
     std::shared_ptr<SCP> const & get_scp(Value::Integer command) const;
 
+    /// @brief Registered an SCP with command.
     void set_scp(Value::Integer command, std::shared_ptr<SCP> const & scp);
 
+    /// @brief Receive and dispatch an incoming message.
     void dispatch();
 private:
     typedef std::shared_ptr<SCP> SCPPointer;
diff --git a/src/odil/SCU.h b/src/odil/SCU.h
index d6696b8..0f380bd 100644
--- a/src/odil/SCU.h
+++ b/src/odil/SCU.h
@@ -32,7 +32,9 @@ public:
     void set_affected_sop_class(std::string const & sop_class);
     
 protected:
+    /// @brief Association with peer.
     Association & _association;
+    
     /// @brief Affected SOP class.
     std::string _affected_sop_class;
 };
diff --git a/src/odil/Tag.cpp b/src/odil/Tag.cpp
index 8807675..affad6c 100644
--- a/src/odil/Tag.cpp
+++ b/src/odil/Tag.cpp
@@ -11,11 +11,10 @@
 #include <algorithm>
 #include <iomanip>
 #include <ostream>
+#include <stdexcept>
 #include <sstream>
 #include <string>
 
-#include <boost/regex.hpp>
-
 #include "odil/ElementsDictionary.h"
 #include "odil/Exception.h"
 #include "odil/registry.h"
@@ -61,35 +60,16 @@ Tag
 ::get_name() const
 {
     std::string name;
-    std::string const tag_string(*this);
-
-    for(auto const item: registry::public_dictionary)
+    
+    auto const iterator = find(registry::public_dictionary, *this);
+    if(iterator != registry::public_dictionary.end())
     {
-        auto const & key = item.first;
-        auto const & entry = item.second;
-
-        if(key.get_type() == ElementsDictionaryKey::Type::Tag &&
-            key.get_tag() == *this)
-        {
-            name = entry.keyword;
-            break;
-        }
-        else if(key.get_type() == ElementsDictionaryKey::Type::String)
-        {
-            auto regex = key.get_string();
-            std::replace_if(
-                regex.begin(), regex.end(),
-                [](char c) { return c == 'x'; }, '.');
-            if(boost::regex_match(tag_string, boost::regex(regex)))
-            {
-                name = entry.keyword;
-                break;
-            }
-        }
+        name = iterator->second.keyword;
     }
 
     if(name.empty())
     {
+        std::string const tag_string(*this);
         throw Exception("No such element: "+tag_string);
     }
 
@@ -146,66 +126,44 @@ void
 Tag
 ::_from_string(std::string const & string)
 {
-    ElementsDictionary::const_iterator it = registry::public_dictionary.begin();
-    while(it != registry::public_dictionary.end())
-    {
-        if(it->second.keyword == string)
-        {
-            break;
-        }
-        ++it;
-    }
-
-    if(it == registry::public_dictionary.end())
+    bool found = false;
+    uint16_t group;
+    uint16_t element;
+    
+    // Try string form of numeric tag
+    if(string.size() == 8)
     {
-        // Try with string form of numeric tag
-        uint16_t group;
-        uint16_t element;
-        bool parsed = true;
-
-        if(string.size() != 8)
-        {
-            parsed = false;
-        }
-        else
+        try
         {
-            std::string const first = string.substr(0, 4);
-            char * endptr;
-            group = strtol(first.c_str(), &endptr, 16);
-            if(*endptr != '\0')
-            {
-                parsed = false;
-            }
-            else
-            {
-                std::string const second = string.substr(4, 4);
-                element = strtol(second.c_str(), &endptr, 16);
-                if(*endptr != '\0')
-                {
-                    parsed = false;
-                }
-            }
+            group = std::stol(string.substr(0, 4), 0, 16);
+            element = std::stol(string.substr(4, 8), 0, 16);
+            found = true;
         }
-
-        if(!parsed)
+        catch(std::invalid_argument const &)
         {
-            throw Exception("No such element: "+string);
+            found = false;
         }
-        else
+    }
+    
+    if(!found)
+    {
+        auto const it = registry::public_tags.find(string);
+        if(it != registry::public_tags.end())
         {
-            this->group = group;
-            this->element = element;
+            found = true;
+            group = it->second.group;
+            element = it->second.element;
         }
     }
+    
+    if(!found)
+    {
+        throw Exception("No such element: "+string);
+    }
     else
     {
-        if(it->first.get_type() != ElementsDictionaryKey::Type::Tag)
-        {
-            throw Exception("InvalidType");
-        }
-        auto const & tag = it->first.get_tag();
-        this->group = tag.group;
-        this->element = tag.element;
+        this->group = group;
+        this->element = element;
     }
 }
 
diff --git a/src/odil/Tag.h b/src/odil/Tag.h
index 385348a..a3947b3 100644
--- a/src/odil/Tag.h
+++ b/src/odil/Tag.h
@@ -36,7 +36,7 @@ public:
      * string is not the representation of a numeric value, a odil::Exception
      * is raised.
      */
-    Tag(std::string const & name);
+    Tag(std::string const & string);
 
     /**
      * @brief Create a tag based on its name or string representation of its
@@ -46,7 +46,7 @@ public:
      * string is not the representation of a numeric value, a odil::Exception
      * is raised.
      */
-    Tag(char const * name);
+    Tag(char const * string);
 
     /// @brief Group of the tag.
     uint16_t group;
@@ -54,6 +54,7 @@ public:
     /// @brief Element of the tag.
     uint16_t element;
 
+    /// @brief Test whether the tag is private.
     bool is_private() const;
 
     /**
diff --git a/src/odil/UIDsDictionary.h b/src/odil/UIDsDictionary.h
index fa36a14..f2523a9 100644
--- a/src/odil/UIDsDictionary.h
+++ b/src/odil/UIDsDictionary.h
@@ -20,10 +20,16 @@ namespace odil
  */
 struct UIDsDictionaryEntry
 {
+    /// @brief Full name.
     std::string name;
+    
+    /// @brief Brief name.
     std::string keyword;
+    
+    /// @brief Category.
     std::string type;
 
+    /// @brief Constructor.
     UIDsDictionaryEntry(
         std::string const & name="", std::string const & keyword="",
         std::string const & type="");
diff --git a/src/odil/VR.cpp b/src/odil/VR.cpp
index 4590417..6d1e828 100644
--- a/src/odil/VR.cpp
+++ b/src/odil/VR.cpp
@@ -30,10 +30,12 @@ _build_enum_to_name()
     ADD_TO_MAP(result, IS);
     ADD_TO_MAP(result, LO);
     ADD_TO_MAP(result, LT);
-    ADD_TO_MAP(result, PN);
     ADD_TO_MAP(result, OB);
+    ADD_TO_MAP(result, OD);
     ADD_TO_MAP(result, OF);
+    ADD_TO_MAP(result, OL);
     ADD_TO_MAP(result, OW);
+    ADD_TO_MAP(result, PN);
     ADD_TO_MAP(result, SH);
     ADD_TO_MAP(result, SL);
     ADD_TO_MAP(result, SQ);
diff --git a/src/odil/VR.h b/src/odil/VR.h
index 1f945e9..4dda97e 100644
--- a/src/odil/VR.h
+++ b/src/odil/VR.h
@@ -20,8 +20,8 @@ class Tag;
 enum class VR
 {
     UNKNOWN,
-    AE, AS, AT, CS, DA, DS, DT, FL, FD, IS, LO, LT, PN, OB, OF, OW, SH, SL,
-    SQ, SS, ST, TM, UC, UI, UL, UN, UR, US, UT,
+    AE, AS, AT, CS, DA, DS, DT, FL, FD, IS, LO, LT, OB, OD, OF, OL, OW, PN, SH, 
+    SL, SQ, SS, ST, TM, UC, UI, UL, UN, UR, US, UT,
     INVALID
 };
 
diff --git a/src/odil/VRFinder.cpp b/src/odil/VRFinder.cpp
index 685fc93..0277f90 100644
--- a/src/odil/VRFinder.cpp
+++ b/src/odil/VRFinder.cpp
@@ -13,8 +13,6 @@
 #include <string>
 #include <vector>
 
-#include <boost/regex.hpp>
-
 #include "odil/DataSet.h"
 #include "odil/ElementsDictionary.h"
 #include "odil/Exception.h"
@@ -86,31 +84,11 @@ VRFinder
     Tag const & tag, DataSet const &, std::string const &)
 {
     VR vr = VR::INVALID;
-    std::string const tag_string(tag);
-
-    for(auto const item: registry::public_dictionary)
+    
+    auto const iterator = find(registry::public_dictionary, tag);
+    if(iterator != registry::public_dictionary.end())
     {
-        auto const & key = item.first;
-        auto const & entry = item.second;
-
-        if(key.get_type() == ElementsDictionaryKey::Type::Tag &&
-            key.get_tag() == tag)
-        {
-            vr = as_vr(entry.vr);
-            break;
-        }
-        else if(key.get_type() == ElementsDictionaryKey::Type::String)
-        {
-            auto regex = key.get_string();
-            std::replace_if(
-                regex.begin(), regex.end(),
-                [](char c) { return c == 'x'; }, '.');
-            if(boost::regex_match(tag_string, boost::regex(regex)))
-            {
-                vr = as_vr(entry.vr);
-                break;
-            }
-        }
+        vr = as_vr(iterator->second.vr);
     }
 
     if(vr == VR::INVALID)
@@ -206,7 +184,92 @@ VRFinder
             tag == registry::LargestPixelValueInSeries ||
             tag == registry::PixelPaddingValue)
         {
-            return VR::US;
+            if(!data_set.has(odil::registry::PixelRepresentation))
+            {
+                throw Exception("Cannot find VR without PixelRepresentation");
+            }
+            auto const & pixel_representation = 
+                data_set.as_int(odil::registry::PixelRepresentation)[0];
+            return (pixel_representation==0)?(VR::US):(VR::SS);
+        }
+        else
+        {
+            throw Exception("Unknown tag");
+        }
+    }
+    else
+    {
+        throw Exception("Unknown transfer syntax");
+    }
+}
+
+VR
+VRFinder
+::explicit_vr_little_endian(
+    Tag const & tag, DataSet const & data_set,
+    std::string const & transfer_syntax)
+{
+    if(transfer_syntax == registry::ExplicitVRLittleEndian)
+    {
+        // PS3.5, A.1 (c)
+        if(tag == registry::PixelData)
+        {
+            if(!data_set.has(odil::registry::BitsAllocated))
+            {
+                throw Exception("Cannot find VR without BitsAllocated");
+            }
+            auto const & bits_allocated = 
+                data_set.as_int(odil::registry::BitsAllocated)[0];
+            return (bits_allocated<=8)?(VR::OB):(VR::OW);
+        }
+        else if((tag.group>>8) == 0x60 && tag.element == 0x3000)
+        {
+            return VR::OW;
+        }
+        else if(tag == registry::WaveformData)
+        {
+            return VR::OW;
+        }
+        else if(tag == registry::RedPaletteColorLookupTableData ||
+            tag == registry::GreenPaletteColorLookupTableData ||
+            tag == registry::BluePaletteColorLookupTableData ||
+            tag == registry::AlphaPaletteColorLookupTableData)
+        {
+            return VR::OW;
+        }
+        // {Red,Green,Blue,Alpha}PaletteColorLookupTableDescriptor
+        else if(tag == registry::SegmentedRedPaletteColorLookupTableData ||
+            tag == registry::SegmentedGreenPaletteColorLookupTableData ||
+            tag == registry::SegmentedBluePaletteColorLookupTableData)
+        {
+            return VR::OW;
+        }
+        // LUTData
+        // LUTDescriptor
+        else if(tag == registry::BlendingLookupTableData)
+        {
+            return VR::OW;
+        }
+        else if(tag == registry::VertexPointIndexList ||
+            tag == registry::EdgePointIndexList ||
+            tag == registry::TrianglePointIndexList ||
+            tag == registry::PrimitivePointIndexList)
+        {
+            return VR::OW;
+        }
+        else if(tag == registry::SmallestImagePixelValue ||
+            tag == registry::LargestImagePixelValue ||
+            tag == registry::SmallestPixelValueInSeries ||
+            tag == registry::LargestPixelValueInSeries ||
+            tag == registry::PixelPaddingValue)
+        {
+            if(!data_set.has(odil::registry::PixelRepresentation))
+            {
+                throw Exception("Cannot find VR without PixelRepresentation");
+            }
+            auto const & pixel_representation = 
+                data_set.as_int(odil::registry::PixelRepresentation)[0];
+            return (pixel_representation==0)?(VR::US):(VR::SS);
         }
         else
         {
@@ -225,7 +288,7 @@ VRFinder
 {
     return {
         group_length, private_tag, implicit_vr_little_endian,
-        public_dictionary };
+        explicit_vr_little_endian, public_dictionary };
 }
 
 }
diff --git a/src/odil/VRFinder.h b/src/odil/VRFinder.h
index 4ed1ffa..c279609 100644
--- a/src/odil/VRFinder.h
+++ b/src/odil/VRFinder.h
@@ -68,6 +68,11 @@ public:
     static VR implicit_vr_little_endian(
         Tag const & tag, DataSet const & data_set,
         std::string const & transfer_syntax);
+    
+    /// @brief Return the VR of elements defined in PS3.5, A.2 (c).
+    static VR explicit_vr_little_endian(
+        Tag const & tag, DataSet const & data_set,
+        std::string const & transfer_syntax);
 
 private:
     static std::vector<Finder> _get_default_finders();
diff --git a/src/odil/Value.h b/src/odil/Value.h
index 522a577..29b9828 100644
--- a/src/odil/Value.h
+++ b/src/odil/Value.h
@@ -36,10 +36,13 @@ public:
         Binary
     };
 
+    /// @brief Integer type.
     typedef int64_t Integer;
 
+    /// @brief Real type.
     typedef double Real;
 
+    /// @brief String type.
     typedef std::string String;
 
     /// @brief Integer container.
diff --git a/src/odil/Writer.cpp b/src/odil/Writer.cpp
index c229ed1..96b8efd 100644
--- a/src/odil/Writer.cpp
+++ b/src/odil/Writer.cpp
@@ -463,7 +463,11 @@ Writer::Visitor::result_type
 Writer::Visitor
 ::operator()(Value::Binary const & value) const
 {
-    if(value.size() > 1)
+    if(value.empty())
+    {
+        return;
+    }
+    else if(value.size() > 1)
     {
         this->write_encapsulated_pixel_data(value);
     }
@@ -520,6 +524,11 @@ void
 Writer::Visitor
 ::write_strings(T const & sequence, char padding) const
 {
+    if(sequence.empty())
+    {
+        return;
+    }
+
     auto const stream_begin = this->stream.tellp();
 
     auto last_element_it = --sequence.end();
@@ -566,10 +575,13 @@ Writer::Visitor
         length = fragment.size();
         odil_write_binary(
             length, this->stream, this->byte_ordering, 8*sizeof(length));
-        this->stream.write(reinterpret_cast<char const*>(&fragment[0]), length);
-        if(!this->stream)
+        if(length > 0)
         {
-            throw Exception("Could not write to stream");
+            this->stream.write(reinterpret_cast<char const*>(&fragment[0]), length);
+            if(!this->stream)
+            {
+                throw Exception("Could not write to stream");
+            }
         }
     }
     writer.write_tag(registry::SequenceDelimitationItem);
diff --git a/src/odil/json_converter.cpp b/src/odil/json_converter.cpp
index 70ef96a..dfd4f55 100644
--- a/src/odil/json_converter.cpp
+++ b/src/odil/json_converter.cpp
@@ -21,6 +21,7 @@
 namespace odil
 {
 
+/// @brief Element visitor converting to JSON.
 struct ToJSONVisitor
 {
     typedef Json::Value result_type;
diff --git a/src/odil/odil.h b/src/odil/odil.h
new file mode 100644
index 0000000..dcecb68
--- /dev/null
+++ b/src/odil/odil.h
@@ -0,0 +1,15 @@
+#pragma once
+
+#ifdef WIN32
+#  define EXPORT_DYNAMIC_LIBRARY __declspec(dllexport)
+#  define IMPORT_DYNAMIC_LIBRARY __declspec(dllimport)
+#else // WIN32
+#  define EXPORT_DYNAMIC_LIBRARY
+#  define IMPORT_DYNAMIC_LIBRARY
+#endif // WIN32
+
+#ifdef BUILDING_ODIL
+#  define ODIL_API EXPORT_DYNAMIC_LIBRARY
+#else // BUILDING_ODIL
+#  define ODIL_API IMPORT_DYNAMIC_LIBRARY
+#endif // BUILDING_ODIL
\ No newline at end of file
diff --git a/src/odil/registry.cpp b/src/odil/registry.cpp
index 84de2db..2121eeb 100644
--- a/src/odil/registry.cpp
+++ b/src/odil/registry.cpp
@@ -6,7 +6,9 @@
  * for details.
  ************************************************************************/
 
-#include <stdint.h>
+#include <cstdint>
+#include <map>
+#include <string>
 
 #include "odil/registry.h"
 
@@ -552,6 +554,12 @@ ElementsDictionary create_public_dictionary()
           "Patient's Birth Date", "PatientBirthDate",  "DA", "1" },
         { Tag(0x0010, 0x0032),
           "Patient's Birth Time", "PatientBirthTime",  "TM", "1" },
+        { Tag(0x0010, 0x0033),
+          "Patient's Birth Date in Alternative Calendar", "PatientBirthDateInAlternativeCalendar",  "LO", "1" },
+        { Tag(0x0010, 0x0034),
+          "Patient's Death Date in Alternative Calendar", "PatientDeathDateInAlternativeCalendar",  "LO", "1" },
+        { Tag(0x0010, 0x0035),
+          "Patient's Alternative Calendar", "PatientAlternativeCalendar",  "CS", "1" },
         { Tag(0x0010, 0x0040),
           "Patient's Sex", "PatientSex",  "CS", "1" },
         { Tag(0x0010, 0x0050),
@@ -1444,6 +1452,10 @@ ElementsDictionary create_public_dictionary()
           "Plate Type", "PlateType",  "SH", "1" },
         { Tag(0x0018, 0x1261),
           "Phosphor Type", "PhosphorType",  "LO", "1" },
+        { Tag(0x0018, 0x1271),
+          "Water Equivalent Diameter", "WaterEquivalentDiameter",  "FD", "1" },
+        { Tag(0x0018, 0x1272),
+          "Water Equivalent Diameter Calculation Method Code Sequence", "WaterEquivalentDiameterCalculationMethodCodeSequence",  "SQ", "1" },
         { Tag(0x0018, 0x1300),
           "Scan Velocity", "ScanVelocity",  "DS", "1" },
         { Tag(0x0018, 0x1301),
@@ -5824,28 +5836,54 @@ ElementsDictionary create_public_dictionary()
           "Selector Sequence Pointer Private Creator", "SelectorSequencePointerPrivateCreator",  "LO", "1-n" },
         { Tag(0x0072, 0x0056),
           "Selector Attribute Private Creator", "SelectorAttributePrivateCreator",  "LO", "1" },
+        { Tag(0x0072, 0x005e),
+          "Selector AE Value", "SelectorAEValue",  "AE", "1-n" },
+        { Tag(0x0072, 0x005f),
+          "Selector AS Value", "SelectorASValue",  "AS", "1-n" },
         { Tag(0x0072, 0x0060),
           "Selector AT Value", "SelectorATValue",  "AT", "1-n" },
+        { Tag(0x0072, 0x0061),
+          "Selector DA Value", "SelectorDAValue",  "DA", "1-n" },
         { Tag(0x0072, 0x0062),
           "Selector CS Value", "SelectorCSValue",  "CS", "1-n" },
+        { Tag(0x0072, 0x0063),
+          "Selector DT Value", "SelectorDTValue",  "DT", "1-n" },
         { Tag(0x0072, 0x0064),
           "Selector IS Value", "SelectorISValue",  "IS", "1-n" },
+        { Tag(0x0072, 0x0065),
+          "Selector OB Value", "SelectorOBValue",  "OB", "1" },
         { Tag(0x0072, 0x0066),
           "Selector LO Value", "SelectorLOValue",  "LO", "1-n" },
+        { Tag(0x0072, 0x0067),
+          "Selector OF Value", "SelectorOFValue",  "OF", "1" },
         { Tag(0x0072, 0x0068),
           "Selector LT Value", "SelectorLTValue",  "LT", "1" },
+        { Tag(0x0072, 0x0069),
+          "Selector OW Value", "SelectorOWValue",  "OW", "1" },
         { Tag(0x0072, 0x006a),
           "Selector PN Value", "SelectorPNValue",  "PN", "1-n" },
+        { Tag(0x0072, 0x006b),
+          "Selector TM Value", "SelectorTMValue",  "TM", "1-n" },
         { Tag(0x0072, 0x006c),
           "Selector SH Value", "SelectorSHValue",  "SH", "1-n" },
+        { Tag(0x0072, 0x006d),
+          "Selector UN Value", "SelectorUNValue",  "UN", "1" },
         { Tag(0x0072, 0x006e),
           "Selector ST Value", "SelectorSTValue",  "ST", "1" },
+        { Tag(0x0072, 0x006f),
+          "Selector UC Value", "SelectorUCValue",  "UC", "1-n" },
         { Tag(0x0072, 0x0070),
           "Selector UT Value", "SelectorUTValue",  "UT", "1" },
+        { Tag(0x0072, 0x0071),
+          "Selector UR Value", "SelectorURValue",  "UR", "1" },
         { Tag(0x0072, 0x0072),
           "Selector DS Value", "SelectorDSValue",  "DS", "1-n" },
+        { Tag(0x0072, 0x0073),
+          "Selector OD Value", "SelectorODValue",  "OD", "1" },
         { Tag(0x0072, 0x0074),
           "Selector FD Value", "SelectorFDValue",  "FD", "1-n" },
+        { Tag(0x0072, 0x0075),
+          "Selector OL Value", "SelectorOLValue",  "OL", "1" },
         { Tag(0x0072, 0x0076),
           "Selector FL Value", "SelectorFLValue",  "FL", "1-n" },
         { Tag(0x0072, 0x0078),
@@ -6240,6 +6278,52 @@ ElementsDictionary create_public_dictionary()
           "Referenced Texture Sequence", "ReferencedTextureSequence",  "SQ", "1" },
         { Tag(0x0080, 0x0013),
           "Referenced Surface Data Sequence", "ReferencedSurfaceDataSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0001),
+          "Assessment Summary", "AssessmentSummary",  "CS", "1" },
+        { Tag(0x0082, 0x0003),
+          "Assessment Summary Description", "AssessmentSummaryDescription",  "UT", "1" },
+        { Tag(0x0082, 0x0004),
+          "Assessed SOP Instance Sequence", "AssessedSOPInstanceSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0005),
+          "Referenced Comparison SOP Instance Sequence", "ReferencedComparisonSOPInstanceSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0006),
+          "Number of Assessment Observations", "NumberOfAssessmentObservations",  "UL", "1" },
+        { Tag(0x0082, 0x0007),
+          "Assessment Observations Sequence", "AssessmentObservationsSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0008),
+          "Observation Significance", "ObservationSignificance",  "CS", "1" },
+        { Tag(0x0082, 0x000a),
+          "Observation Description", "ObservationDescription",  "UT", "1" },
+        { Tag(0x0082, 0x000c),
+          "Structured Constraint Observation Sequence", "StructuredContraintObservationSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0010),
+          "Assessed Attribute Value Sequence", "AssessedAttributeValueSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0016),
+          "Assessment Set ID", "AssessmentSetID",  "LO", "1" },
+        { Tag(0x0082, 0x0017),
+          "Assessment Requester Sequence", "AssessmentRequesterSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0018),
+          "Selector Attribute Name", "SelectorAttributeName",  "LO", "1" },
+        { Tag(0x0082, 0x0019),
+          "Selector Attribute Keyword", "SelectorAttributeKeyword",  "LO", "1" },
+        { Tag(0x0082, 0x0021),
+          "Assessment Type Code Sequence", "AssessmentTypeCodeSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0022),
+          "Observation Basis Code Sequence", "ObservationBasisCodeSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0023),
+          "Assessment Label", "AssessmentLabel",  "LO", "1" },
+        { Tag(0x0082, 0x0032),
+          "Constraint Type", "ConstraintType",  "CS", "1" },
+        { Tag(0x0082, 0x0033),
+          "Specification Selection Guidance", "SpecificationSelectionGuidance",  "UT", "1" },
+        { Tag(0x0082, 0x0034),
+          "Constraint Value Sequence", "ConstraintValueSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0035),
+          "Recommended Default Value Sequence", "RecommendedDefaultValueSequence",  "SQ", "1" },
+        { Tag(0x0082, 0x0036),
+          "Constraint Violation Significance", "ConstraintViolationSignificance",  "CS", "1" },
+        { Tag(0x0082, 0x0037),
+          "Constraint Violation Condition", "ConstraintViolationCondition",  "UT", "1" },
         { Tag(0x0088, 0x0130),
           "Storage Media File-set ID", "StorageMediaFileSetID",  "SH", "1" },
         { Tag(0x0088, 0x0140),
@@ -7317,6 +7401,18 @@ ElementsDictionary create_public_dictionary()
           "Gantry Pitch Rotation Direction", "GantryPitchRotationDirection",  "CS", "1" },
         { Tag(0x300a, 0x014e),
           "Gantry Pitch Angle Tolerance", "GantryPitchAngleTolerance",  "FL", "1" },
+        { Tag(0x300a, 0x0150),
+          "Fixation Eye", "FixationEye",  "CS", "1" },
+        { Tag(0x300a, 0x0151),
+          "Chair Head Frame Position", "ChairHeadFramePosition",  "DS", "1" },
+        { Tag(0x300a, 0x0152),
+          "Head Fixation Angle Tolerance", "HeadFixationAngleTolerance",  "DS", "1" },
+        { Tag(0x300a, 0x0153),
+          "Chair Head Frame Position Tolerance", "ChairHeadFramePositionTolerance",  "DS", "1" },
+        { Tag(0x300a, 0x0154),
+          "Fixation Light Azimuthal Angle Tolerance", "FixationLightAzimuthalAngleTolerance",  "DS", "1" },
+        { Tag(0x300a, 0x0155),
+          "Fixation Light Polar Angle Tolerance", "FixationLightPolarAngleTolerance",  "DS", "1" },
         { Tag(0x300a, 0x0180),
           "Patient Setup Sequence", "PatientSetupSequence",  "SQ", "1" },
         { Tag(0x300a, 0x0182),
@@ -8304,6 +8400,4065 @@ ElementsDictionary create_public_dictionary()
     return public_dictionary;
 }
 
+std::map<std::string, odil::Tag> create_public_tags()
+{
+
+    RawElementsDictionaryEntry raw_entries[] = {
+    { Tag(0x0000, 0x0000),
+          "Command Group Length", "CommandGroupLength",  "UL", "1" },    { Tag(0x0000, 0x0002),
+          "Affected SOP Class UID", "AffectedSOPClassUID",  "UI", "1" },    { Tag(0x0000, 0x0003),
+          "Requested SOP Class UID", "RequestedSOPClassUID",  "UI", "1" },    { Tag(0x0000, 0x0100),
+          "Command Field", "CommandField",  "US", "1" },    { Tag(0x0000, 0x0110),
+          "Message ID", "MessageID",  "US", "1" },    { Tag(0x0000, 0x0120),
+          "Message ID Being Responded To", "MessageIDBeingRespondedTo",  "US", "1" },    { Tag(0x0000, 0x0600),
+          "Move Destination", "MoveDestination",  "AE", "1" },    { Tag(0x0000, 0x0700),
+          "Priority", "Priority",  "US", "1" },    { Tag(0x0000, 0x0800),
+          "Command Data Set Type", "CommandDataSetType",  "US", "1" },    { Tag(0x0000, 0x0900),
+          "Status", "Status",  "US", "1" },    { Tag(0x0000, 0x0901),
+          "Offending Element", "OffendingElement",  "AT", "1-n" },    { Tag(0x0000, 0x0902),
+          "Error Comment", "ErrorComment",  "LO", "1" },    { Tag(0x0000, 0x0903),
+          "Error ID", "ErrorID",  "US", "1" },    { Tag(0x0000, 0x1000),
+          "Affected SOP Instance UID", "AffectedSOPInstanceUID",  "UI", "1" },    { Tag(0x0000, 0x1001),
+          "Requested SOP Instance UID", "RequestedSOPInstanceUID",  "UI", "1" },    { Tag(0x0000, 0x1002),
+          "Event Type ID", "EventTypeID",  "US", "1" },    { Tag(0x0000, 0x1005),
+          "Attribute Identifier List", "AttributeIdentifierList",  "AT", "1-n" },    { Tag(0x0000, 0x1008),
+          "Action Type ID", "ActionTypeID",  "US", "1" },    { Tag(0x0000, 0x1020),
+          "Number of Remaining Sub-operations", "NumberOfRemainingSuboperations",  "US", "1" },    { Tag(0x0000, 0x1021),
+          "Number of Completed Sub-operations", "NumberOfCompletedSuboperations",  "US", "1" },    { Tag(0x0000, 0x1022),
+          "Number of Failed Sub-operations", "NumberOfFailedSuboperations",  "US", "1" },    { Tag(0x0000, 0x1023),
+          "Number of Warning Sub-operations", "NumberOfWarningSuboperations",  "US", "1" },    { Tag(0x0000, 0x1030),
+          "Move Originator Application Entity Title", "MoveOriginatorApplicationEntityTitle",  "AE", "1" },    { Tag(0x0000, 0x1031),
+          "Move Originator Message ID", "MoveOriginatorMessageID",  "US", "1" },    { Tag(0x0002, 0x0000),
+          "File Meta Information Group Length", "FileMetaInformationGroupLength",  "UL", "1" },    { Tag(0x0002, 0x0001),
+          "File Meta Information Version", "FileMetaInformationVersion",  "OB", "1" },    { Tag(0x0002, 0x0002),
+          "Media Storage SOP Class UID", "MediaStorageSOPClassUID",  "UI", "1" },    { Tag(0x0002, 0x0003),
+          "Media Storage SOP Instance UID", "MediaStorageSOPInstanceUID",  "UI", "1" },    { Tag(0x0002, 0x0010),
+          "Transfer Syntax UID", "TransferSyntaxUID",  "UI", "1" },    { Tag(0x0002, 0x0012),
+          "Implementation Class UID", "ImplementationClassUID",  "UI", "1" },    { Tag(0x0002, 0x0013),
+          "Implementation Version Name", "ImplementationVersionName",  "SH", "1" },    { Tag(0x0002, 0x0016),
+          "Source Application Entity Title", "SourceApplicationEntityTitle",  "AE", "1" },    { Tag(0x0002, 0x0017),
+          "Sending Application Entity Title", "SendingApplicationEntityTitle",  "AE", "1" },    { Tag(0x0002, 0x0018),
+          "Receiving Application Entity Title", "ReceivingApplicationEntityTitle",  "AE", "1" },    { Tag(0x0002, 0x0100),
+          "Private Information Creator UID", "PrivateInformationCreatorUID",  "UI", "1" },    { Tag(0x0002, 0x0102),
+          "Private Information", "PrivateInformation",  "OB", "1" },    { Tag(0x0004, 0x1130),
+          "File-set ID", "FileSetID",  "CS", "1" },    { Tag(0x0004, 0x1141),
+          "File-set Descriptor File ID", "FileSetDescriptorFileID",  "CS", "1-8" },    { Tag(0x0004, 0x1142),
+          "Specific Character Set of File-set Descriptor File", "SpecificCharacterSetOfFileSetDescriptorFile",  "CS", "1" },    { Tag(0x0004, 0x1200),
+          "Offset of the First Directory Record of the Root Directory Entity", "OffsetOfTheFirstDirectoryRecordOfTheRootDirectoryEntity",  "UL", "1" },    { Tag(0x0004, 0x1202),
+          "Offset of the Last Directory Record of the Root Directory Entity", "OffsetOfTheLastDirectoryRecordOfTheRootDirectoryEntity",  "UL", "1" },    { Tag(0x0004, 0x1212),
+          "File-set Consistency Flag", "FileSetConsistencyFlag",  "US", "1" },    { Tag(0x0004, 0x1220),
+          "Directory Record Sequence", "DirectoryRecordSequence",  "SQ", "1" },    { Tag(0x0004, 0x1400),
+          "Offset of the Next Directory Record", "OffsetOfTheNextDirectoryRecord",  "UL", "1" },    { Tag(0x0004, 0x1410),
+          "Record In-use Flag", "RecordInUseFlag",  "US", "1" },    { Tag(0x0004, 0x1420),
+          "Offset of Referenced Lower-Level Directory Entity", "OffsetOfReferencedLowerLevelDirectoryEntity",  "UL", "1" },    { Tag(0x0004, 0x1430),
+          "Directory Record Type", "DirectoryRecordType",  "CS", "1" },    { Tag(0x0004, 0x1432),
+          "Private Record UID", "PrivateRecordUID",  "UI", "1" },    { Tag(0x0004, 0x1500),
+          "Referenced File ID", "ReferencedFileID",  "CS", "1-8" },    { Tag(0x0004, 0x1504),
+          "MRDR Directory Record Offset", "MRDRDirectoryRecordOffset",  "UL", "1" },    { Tag(0x0004, 0x1510),
+          "Referenced SOP Class UID in File", "ReferencedSOPClassUIDInFile",  "UI", "1" },    { Tag(0x0004, 0x1511),
+          "Referenced SOP Instance UID in File", "ReferencedSOPInstanceUIDInFile",  "UI", "1" },    { Tag(0x0004, 0x1512),
+          "Referenced Transfer Syntax UID in File", "ReferencedTransferSyntaxUIDInFile",  "UI", "1" },    { Tag(0x0004, 0x151a),
+          "Referenced Related General SOP Class UID in File", "ReferencedRelatedGeneralSOPClassUIDInFile",  "UI", "1-n" },    { Tag(0x0004, 0x1600),
+          "Number of References", "NumberOfReferences",  "UL", "1" },    { Tag(0x0008, 0x0001),
+          "Length to End", "LengthToEnd",  "UL", "1" },    { Tag(0x0008, 0x0005),
+          "Specific Character Set", "SpecificCharacterSet",  "CS", "1-n" },    { Tag(0x0008, 0x0006),
+          "Language Code Sequence", "LanguageCodeSequence",  "SQ", "1" },    { Tag(0x0008, 0x0008),
+          "Image Type", "ImageType",  "CS", "2-n" },    { Tag(0x0008, 0x0010),
+          "Recognition Code", "RecognitionCode",  "SH", "1" },    { Tag(0x0008, 0x0012),
+          "Instance Creation Date", "InstanceCreationDate",  "DA", "1" },    { Tag(0x0008, 0x0013),
+          "Instance Creation Time", "InstanceCreationTime",  "TM", "1" },    { Tag(0x0008, 0x0014),
+          "Instance Creator UID", "InstanceCreatorUID",  "UI", "1" },    { Tag(0x0008, 0x0015),
+          "Instance Coercion DateTime", "InstanceCoercionDateTime",  "DT", "1" },    { Tag(0x0008, 0x0016),
+          "SOP Class UID", "SOPClassUID",  "UI", "1" },    { Tag(0x0008, 0x0018),
+          "SOP Instance UID", "SOPInstanceUID",  "UI", "1" },    { Tag(0x0008, 0x001a),
+          "Related General SOP Class UID", "RelatedGeneralSOPClassUID",  "UI", "1-n" },    { Tag(0x0008, 0x001b),
+          "Original Specialized SOP Class UID", "OriginalSpecializedSOPClassUID",  "UI", "1" },    { Tag(0x0008, 0x0020),
+          "Study Date", "StudyDate",  "DA", "1" },    { Tag(0x0008, 0x0021),
+          "Series Date", "SeriesDate",  "DA", "1" },    { Tag(0x0008, 0x0022),
+          "Acquisition Date", "AcquisitionDate",  "DA", "1" },    { Tag(0x0008, 0x0023),
+          "Content Date", "ContentDate",  "DA", "1" },    { Tag(0x0008, 0x0024),
+          "Overlay Date", "OverlayDate",  "DA", "1" },    { Tag(0x0008, 0x0025),
+          "Curve Date", "CurveDate",  "DA", "1" },    { Tag(0x0008, 0x002a),
+          "Acquisition DateTime", "AcquisitionDateTime",  "DT", "1" },    { Tag(0x0008, 0x0030),
+          "Study Time", "StudyTime",  "TM", "1" },    { Tag(0x0008, 0x0031),
+          "Series Time", "SeriesTime",  "TM", "1" },    { Tag(0x0008, 0x0032),
+          "Acquisition Time", "AcquisitionTime",  "TM", "1" },    { Tag(0x0008, 0x0033),
+          "Content Time", "ContentTime",  "TM", "1" },    { Tag(0x0008, 0x0034),
+          "Overlay Time", "OverlayTime",  "TM", "1" },    { Tag(0x0008, 0x0035),
+          "Curve Time", "CurveTime",  "TM", "1" },    { Tag(0x0008, 0x0040),
+          "Data Set Type", "DataSetType",  "US", "1" },    { Tag(0x0008, 0x0041),
+          "Data Set Subtype", "DataSetSubtype",  "LO", "1" },    { Tag(0x0008, 0x0042),
+          "Nuclear Medicine Series Type", "NuclearMedicineSeriesType",  "CS", "1" },    { Tag(0x0008, 0x0050),
+          "Accession Number", "AccessionNumber",  "SH", "1" },    { Tag(0x0008, 0x0051),
+          "Issuer of Accession Number Sequence", "IssuerOfAccessionNumberSequence",  "SQ", "1" },    { Tag(0x0008, 0x0052),
+          "Query/Retrieve Level", "QueryRetrieveLevel",  "CS", "1" },    { Tag(0x0008, 0x0053),
+          "Query/Retrieve View", "QueryRetrieveView",  "CS", "1" },    { Tag(0x0008, 0x0054),
+          "Retrieve AE Title", "RetrieveAETitle",  "AE", "1-n" },    { Tag(0x0008, 0x0055),
+          "Station  AE Title", "StationAETitle",  "AE", "1" },    { Tag(0x0008, 0x0056),
+          "Instance Availability", "InstanceAvailability",  "CS", "1" },    { Tag(0x0008, 0x0058),
+          "Failed SOP Instance UID List", "FailedSOPInstanceUIDList",  "UI", "1-n" },    { Tag(0x0008, 0x0060),
+          "Modality", "Modality",  "CS", "1" },    { Tag(0x0008, 0x0061),
+          "Modalities in Study", "ModalitiesInStudy",  "CS", "1-n" },    { Tag(0x0008, 0x0062),
+          "SOP Classes in Study", "SOPClassesInStudy",  "UI", "1-n" },    { Tag(0x0008, 0x0064),
+          "Conversion Type", "ConversionType",  "CS", "1" },    { Tag(0x0008, 0x0068),
+          "Presentation Intent Type", "PresentationIntentType",  "CS", "1" },    { Tag(0x0008, 0x0070),
+          "Manufacturer", "Manufacturer",  "LO", "1" },    { Tag(0x0008, 0x0080),
+          "Institution Name", "InstitutionName",  "LO", "1" },    { Tag(0x0008, 0x0081),
+          "Institution Address", "InstitutionAddress",  "ST", "1" },    { Tag(0x0008, 0x0082),
+          "Institution Code Sequence", "InstitutionCodeSequence",  "SQ", "1" },    { Tag(0x0008, 0x0090),
+          "Referring Physician's Name", "ReferringPhysicianName",  "PN", "1" },    { Tag(0x0008, 0x0092),
+          "Referring Physician's Address", "ReferringPhysicianAddress",  "ST", "1" },    { Tag(0x0008, 0x0094),
+          "Referring Physician's Telephone Numbers", "ReferringPhysicianTelephoneNumbers",  "SH", "1-n" },    { Tag(0x0008, 0x0096),
+          "Referring Physician Identification Sequence", "ReferringPhysicianIdentificationSequence",  "SQ", "1" },    { Tag(0x0008, 0x009c),
+          "Consulting Physician's Name", "ConsultingPhysicianName",  "PN", "1-n" },    { Tag(0x0008, 0x009d),
+          "Consulting Physician Identification Sequence", "ConsultingPhysicianIdentificationSequence",  "SQ", "1" },    { Tag(0x0008, 0x0100),
+          "Code Value", "CodeValue",  "SH", "1" },    { Tag(0x0008, 0x0101),
+          "Extended Code Value", "ExtendedCodeValue",  "LO", "1" },    { Tag(0x0008, 0x0102),
+          "Coding Scheme Designator", "CodingSchemeDesignator",  "SH", "1" },    { Tag(0x0008, 0x0103),
+          "Coding Scheme Version", "CodingSchemeVersion",  "SH", "1" },    { Tag(0x0008, 0x0104),
+          "Code Meaning", "CodeMeaning",  "LO", "1" },    { Tag(0x0008, 0x0105),
+          "Mapping Resource", "MappingResource",  "CS", "1" },    { Tag(0x0008, 0x0106),
+          "Context Group Version", "ContextGroupVersion",  "DT", "1" },    { Tag(0x0008, 0x0107),
+          "Context Group Local Version", "ContextGroupLocalVersion",  "DT", "1" },    { Tag(0x0008, 0x0108),
+          "Extended Code Meaning", "ExtendedCodeMeaning",  "LT", "1" },    { Tag(0x0008, 0x010b),
+          "Context Group Extension Flag", "ContextGroupExtensionFlag",  "CS", "1" },    { Tag(0x0008, 0x010c),
+          "Coding Scheme UID", "CodingSchemeUID",  "UI", "1" },    { Tag(0x0008, 0x010d),
+          "Context Group Extension Creator UID", "ContextGroupExtensionCreatorUID",  "UI", "1" },    { Tag(0x0008, 0x010f),
+          "Context Identifier", "ContextIdentifier",  "CS", "1" },    { Tag(0x0008, 0x0110),
+          "Coding Scheme Identification Sequence", "CodingSchemeIdentificationSequence",  "SQ", "1" },    { Tag(0x0008, 0x0112),
+          "Coding Scheme Registry", "CodingSchemeRegistry",  "LO", "1" },    { Tag(0x0008, 0x0114),
+          "Coding Scheme External ID", "CodingSchemeExternalID",  "ST", "1" },    { Tag(0x0008, 0x0115),
+          "Coding Scheme Name", "CodingSchemeName",  "ST", "1" },    { Tag(0x0008, 0x0116),
+          "Coding Scheme Responsible Organization", "CodingSchemeResponsibleOrganization",  "ST", "1" },    { Tag(0x0008, 0x0117),
+          "Context UID", "ContextUID",  "UI", "1" },    { Tag(0x0008, 0x0118),
+          "Mapping Resource UID", "MappingResourceUID",  "UI", "1" },    { Tag(0x0008, 0x0119),
+          "Long Code Value", "LongCodeValue",  "UC", "1" },    { Tag(0x0008, 0x0120),
+          "URN Code Value", "URNCodeValue",  "UR", "1" },    { Tag(0x0008, 0x0121),
+          "Equivalent Code Sequence", "EquivalentCodeSequence",  "SQ", "1" },    { Tag(0x0008, 0x0201),
+          "Timezone Offset From UTC", "TimezoneOffsetFromUTC",  "SH", "1" },    { Tag(0x0008, 0x0300),
+          "Private Data Element Characteristics Sequence", "PrivateDataElementCharacteristicsSequence",  "SQ", "1" },    { Tag(0x0008, 0x0301),
+          "Private Group Reference", "PrivateGroupReference",  "US", "1" },    { Tag(0x0008, 0x0302),
+          "Private Creator Reference", "PrivateCreatorReference",  "LO", "1" },    { Tag(0x0008, 0x0303),
+          "Block Identifying Information Status", "BlockIdentifyingInformationStatus",  "CS", "1" },    { Tag(0x0008, 0x0304),
+          "Nonidentifying Private Elements", "NonidentifyingPrivateElements",  "US", "1-n" },    { Tag(0x0008, 0x0306),
+          "Identifying Private Elements", "IdentifyingPrivateElements",  "US", "1-n" },    { Tag(0x0008, 0x0305),
+          "Deidentification Action Sequence", "DeidentificationActionSequence",  "SQ", "1" },    { Tag(0x0008, 0x0307),
+          "Deidentification Action", "DeidentificationAction",  "CS", "1" },    { Tag(0x0008, 0x1000),
+          "Network ID", "NetworkID",  "AE", "1" },    { Tag(0x0008, 0x1010),
+          "Station Name", "StationName",  "SH", "1" },    { Tag(0x0008, 0x1030),
+          "Study Description", "StudyDescription",  "LO", "1" },    { Tag(0x0008, 0x1032),
+          "Procedure Code Sequence", "ProcedureCodeSequence",  "SQ", "1" },    { Tag(0x0008, 0x103e),
+          "Series Description", "SeriesDescription",  "LO", "1" },    { Tag(0x0008, 0x103f),
+          "Series Description Code Sequence", "SeriesDescriptionCodeSequence",  "SQ", "1" },    { Tag(0x0008, 0x1040),
+          "Institutional Department Name", "InstitutionalDepartmentName",  "LO", "1" },    { Tag(0x0008, 0x1048),
+          "Physician(s) of Record", "PhysiciansOfRecord",  "PN", "1-n" },    { Tag(0x0008, 0x1049),
+          "Physician(s) of Record Identification Sequence", "PhysiciansOfRecordIdentificationSequence",  "SQ", "1" },    { Tag(0x0008, 0x1050),
+          "Performing Physician's Name", "PerformingPhysicianName",  "PN", "1-n" },    { Tag(0x0008, 0x1052),
+          "Performing Physician Identification Sequence", "PerformingPhysicianIdentificationSequence",  "SQ", "1" },    { Tag(0x0008, 0x1060),
+          "Name of Physician(s) Reading Study", "NameOfPhysiciansReadingStudy",  "PN", "1-n" },    { Tag(0x0008, 0x1062),
+          "Physician(s) Reading Study Identification Sequence", "PhysiciansReadingStudyIdentificationSequence",  "SQ", "1" },    { Tag(0x0008, 0x1070),
+          "Operators' Name", "OperatorsName",  "PN", "1-n" },    { Tag(0x0008, 0x1072),
+          "Operator Identification Sequence", "OperatorIdentificationSequence",  "SQ", "1" },    { Tag(0x0008, 0x1080),
+          "Admitting Diagnoses Description", "AdmittingDiagnosesDescription",  "LO", "1-n" },    { Tag(0x0008, 0x1084),
+          "Admitting Diagnoses Code Sequence", "AdmittingDiagnosesCodeSequence",  "SQ", "1" },    { Tag(0x0008, 0x1090),
+          "Manufacturer's Model Name", "ManufacturerModelName",  "LO", "1" },    { Tag(0x0008, 0x1100),
+          "Referenced Results Sequence", "ReferencedResultsSequence",  "SQ", "1" },    { Tag(0x0008, 0x1110),
+          "Referenced Study Sequence", "ReferencedStudySequence",  "SQ", "1" },    { Tag(0x0008, 0x1111),
+          "Referenced Performed Procedure Step Sequence", "ReferencedPerformedProcedureStepSequence",  "SQ", "1" },    { Tag(0x0008, 0x1115),
+          "Referenced Series Sequence", "ReferencedSeriesSequence",  "SQ", "1" },    { Tag(0x0008, 0x1120),
+          "Referenced Patient Sequence", "ReferencedPatientSequence",  "SQ", "1" },    { Tag(0x0008, 0x1125),
+          "Referenced Visit Sequence", "ReferencedVisitSequence",  "SQ", "1" },    { Tag(0x0008, 0x1130),
+          "Referenced Overlay Sequence", "ReferencedOverlaySequence",  "SQ", "1" },    { Tag(0x0008, 0x1134),
+          "Referenced Stereometric Instance Sequence", "ReferencedStereometricInstanceSequence",  "SQ", "1" },    { Tag(0x0008, 0x113a),
+          "Referenced Waveform Sequence", "ReferencedWaveformSequence",  "SQ", "1" },    { Tag(0x0008, 0x1140),
+          "Referenced Image Sequence", "ReferencedImageSequence",  "SQ", "1" },    { Tag(0x0008, 0x1145),
+          "Referenced Curve Sequence", "ReferencedCurveSequence",  "SQ", "1" },    { Tag(0x0008, 0x114a),
+          "Referenced Instance Sequence", "ReferencedInstanceSequence",  "SQ", "1" },    { Tag(0x0008, 0x114b),
+          "Referenced Real World Value Mapping Instance Sequence", "ReferencedRealWorldValueMappingInstanceSequence",  "SQ", "1" },    { Tag(0x0008, 0x1150),
+          "Referenced SOP Class UID", "ReferencedSOPClassUID",  "UI", "1" },    { Tag(0x0008, 0x1155),
+          "Referenced SOP Instance UID", "ReferencedSOPInstanceUID",  "UI", "1" },    { Tag(0x0008, 0x115a),
+          "SOP Classes Supported", "SOPClassesSupported",  "UI", "1-n" },    { Tag(0x0008, 0x1160),
+          "Referenced Frame Number", "ReferencedFrameNumber",  "IS", "1-n" },    { Tag(0x0008, 0x1161),
+          "Simple Frame List", "SimpleFrameList",  "UL", "1-n" },    { Tag(0x0008, 0x1162),
+          "Calculated Frame List", "CalculatedFrameList",  "UL", "3-3n" },    { Tag(0x0008, 0x1163),
+          "Time Range", "TimeRange",  "FD", "2" },    { Tag(0x0008, 0x1164),
+          "Frame Extraction Sequence", "FrameExtractionSequence",  "SQ", "1" },    { Tag(0x0008, 0x1167),
+          "Multi-frame Source SOP Instance UID", "MultiFrameSourceSOPInstanceUID",  "UI", "1" },    { Tag(0x0008, 0x1190),
+          "Retrieve URL", "RetrieveURL",  "UR", "1" },    { Tag(0x0008, 0x1195),
+          "Transaction UID", "TransactionUID",  "UI", "1" },    { Tag(0x0008, 0x1196),
+          "Warning Reason", "WarningReason",  "US", "1" },    { Tag(0x0008, 0x1197),
+          "Failure Reason", "FailureReason",  "US", "1" },    { Tag(0x0008, 0x1198),
+          "Failed SOP Sequence", "FailedSOPSequence",  "SQ", "1" },    { Tag(0x0008, 0x1199),
+          "Referenced SOP Sequence", "ReferencedSOPSequence",  "SQ", "1" },    { Tag(0x0008, 0x119a),
+          "Other Failures Sequence", "OtherFailuresSequence",  "SQ", "1" },    { Tag(0x0008, 0x1200),
+          "Studies Containing Other Referenced Instances Sequence", "StudiesContainingOtherReferencedInstancesSequence",  "SQ", "1" },    { Tag(0x0008, 0x1250),
+          "Related Series Sequence", "RelatedSeriesSequence",  "SQ", "1" },    { Tag(0x0008, 0x2110),
+          "Lossy Image Compression (Retired)", "LossyImageCompressionRetired",  "CS", "1" },    { Tag(0x0008, 0x2111),
+          "Derivation Description", "DerivationDescription",  "ST", "1" },    { Tag(0x0008, 0x2112),
+          "Source Image Sequence", "SourceImageSequence",  "SQ", "1" },    { Tag(0x0008, 0x2120),
+          "Stage Name", "StageName",  "SH", "1" },    { Tag(0x0008, 0x2122),
+          "Stage Number", "StageNumber",  "IS", "1" },    { Tag(0x0008, 0x2124),
+          "Number of Stages", "NumberOfStages",  "IS", "1" },    { Tag(0x0008, 0x2127),
+          "View Name", "ViewName",  "SH", "1" },    { Tag(0x0008, 0x2128),
+          "View Number", "ViewNumber",  "IS", "1" },    { Tag(0x0008, 0x2129),
+          "Number of Event Timers", "NumberOfEventTimers",  "IS", "1" },    { Tag(0x0008, 0x212a),
+          "Number of Views in Stage", "NumberOfViewsInStage",  "IS", "1" },    { Tag(0x0008, 0x2130),
+          "Event Elapsed Time(s)", "EventElapsedTimes",  "DS", "1-n" },    { Tag(0x0008, 0x2132),
+          "Event Timer Name(s)", "EventTimerNames",  "LO", "1-n" },    { Tag(0x0008, 0x2133),
+          "Event Timer Sequence", "EventTimerSequence",  "SQ", "1" },    { Tag(0x0008, 0x2134),
+          "Event Time Offset", "EventTimeOffset",  "FD", "1" },    { Tag(0x0008, 0x2135),
+          "Event Code Sequence", "EventCodeSequence",  "SQ", "1" },    { Tag(0x0008, 0x2142),
+          "Start Trim", "StartTrim",  "IS", "1" },    { Tag(0x0008, 0x2143),
+          "Stop Trim", "StopTrim",  "IS", "1" },    { Tag(0x0008, 0x2144),
+          "Recommended Display Frame Rate", "RecommendedDisplayFrameRate",  "IS", "1" },    { Tag(0x0008, 0x2200),
+          "Transducer Position", "TransducerPosition",  "CS", "1" },    { Tag(0x0008, 0x2204),
+          "Transducer Orientation", "TransducerOrientation",  "CS", "1" },    { Tag(0x0008, 0x2208),
+          "Anatomic Structure", "AnatomicStructure",  "CS", "1" },    { Tag(0x0008, 0x2218),
+          "Anatomic Region Sequence", "AnatomicRegionSequence",  "SQ", "1" },    { Tag(0x0008, 0x2220),
+          "Anatomic Region Modifier Sequence", "AnatomicRegionModifierSequence",  "SQ", "1" },    { Tag(0x0008, 0x2228),
+          "Primary Anatomic Structure Sequence", "PrimaryAnatomicStructureSequence",  "SQ", "1" },    { Tag(0x0008, 0x2229),
+          "Anatomic Structure, Space or Region Sequence", "AnatomicStructureSpaceOrRegionSequence",  "SQ", "1" },    { Tag(0x0008, 0x2230),
+          "Primary Anatomic Structure Modifier Sequence", "PrimaryAnatomicStructureModifierSequence",  "SQ", "1" },    { Tag(0x0008, 0x2240),
+          "Transducer Position Sequence", "TransducerPositionSequence",  "SQ", "1" },    { Tag(0x0008, 0x2242),
+          "Transducer Position Modifier Sequence", "TransducerPositionModifierSequence",  "SQ", "1" },    { Tag(0x0008, 0x2244),
+          "Transducer Orientation Sequence", "TransducerOrientationSequence",  "SQ", "1" },    { Tag(0x0008, 0x2246),
+          "Transducer Orientation Modifier Sequence", "TransducerOrientationModifierSequence",  "SQ", "1" },    { Tag(0x0008, 0x2251),
+          "Anatomic Structure Space Or Region Code Sequence (Trial)", "AnatomicStructureSpaceOrRegionCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0008, 0x2253),
+          "Anatomic Portal Of Entrance Code Sequence (Trial)", "AnatomicPortalOfEntranceCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0008, 0x2255),
+          "Anatomic Approach Direction Code Sequence (Trial)", "AnatomicApproachDirectionCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0008, 0x2256),
+          "Anatomic Perspective Description (Trial)", "AnatomicPerspectiveDescriptionTrial",  "ST", "1" },    { Tag(0x0008, 0x2257),
+          "Anatomic Perspective Code Sequence (Trial)", "AnatomicPerspectiveCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0008, 0x2258),
+          "Anatomic Location Of Examining Instrument Description (Trial)", "AnatomicLocationOfExaminingInstrumentDescriptionTrial",  "ST", "1" },    { Tag(0x0008, 0x2259),
+          "Anatomic Location Of Examining Instrument Code Sequence (Trial)", "AnatomicLocationOfExaminingInstrumentCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0008, 0x225a),
+          "Anatomic Structure Space Or Region Modifier Code Sequence (Trial)", "AnatomicStructureSpaceOrRegionModifierCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0008, 0x225c),
+          "On Axis Background Anatomic Structure Code Sequence (Trial)", "OnAxisBackgroundAnatomicStructureCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0008, 0x3001),
+          "Alternate Representation Sequence", "AlternateRepresentationSequence",  "SQ", "1" },    { Tag(0x0008, 0x3010),
+          "Irradiation Event UID", "IrradiationEventUID",  "UI", "1-n" },    { Tag(0x0008, 0x3011),
+          "Source Irradiation Event Sequence", "SourceIrradiationEventSequence",  "SQ", "1" },    { Tag(0x0008, 0x3012),
+          "Radiopharmaceutical Administration Event UID", "RadiopharmaceuticalAdministrationEventUID",  "UI", "1" },    { Tag(0x0008, 0x4000),
+          "Identifying Comments", "IdentifyingComments",  "LT", "1" },    { Tag(0x0008, 0x9007),
+          "Frame Type", "FrameType",  "CS", "4" },    { Tag(0x0008, 0x9092),
+          "Referenced Image Evidence Sequence", "ReferencedImageEvidenceSequence",  "SQ", "1" },    { Tag(0x0008, 0x9121),
+          "Referenced Raw Data Sequence", "ReferencedRawDataSequence",  "SQ", "1" },    { Tag(0x0008, 0x9123),
+          "Creator-Version UID", "CreatorVersionUID",  "UI", "1" },    { Tag(0x0008, 0x9124),
+          "Derivation Image Sequence", "DerivationImageSequence",  "SQ", "1" },    { Tag(0x0008, 0x9154),
+          "Source Image Evidence Sequence", "SourceImageEvidenceSequence",  "SQ", "1" },    { Tag(0x0008, 0x9205),
+          "Pixel Presentation", "PixelPresentation",  "CS", "1" },    { Tag(0x0008, 0x9206),
+          "Volumetric Properties", "VolumetricProperties",  "CS", "1" },    { Tag(0x0008, 0x9207),
+          "Volume Based Calculation Technique", "VolumeBasedCalculationTechnique",  "CS", "1" },    { Tag(0x0008, 0x9208),
+          "Complex Image Component", "ComplexImageComponent",  "CS", "1" },    { Tag(0x0008, 0x9209),
+          "Acquisition Contrast", "AcquisitionContrast",  "CS", "1" },    { Tag(0x0008, 0x9215),
+          "Derivation Code Sequence", "DerivationCodeSequence",  "SQ", "1" },    { Tag(0x0008, 0x9237),
+          "Referenced Presentation State Sequence", "ReferencedPresentationStateSequence",  "SQ", "1" },    { Tag(0x0008, 0x9410),
+          "Referenced Other Plane Sequence", "ReferencedOtherPlaneSequence",  "SQ", "1" },    { Tag(0x0008, 0x9458),
+          "Frame Display Sequence", "FrameDisplaySequence",  "SQ", "1" },    { Tag(0x0008, 0x9459),
+          "Recommended Display Frame Rate in Float", "RecommendedDisplayFrameRateInFloat",  "FL", "1" },    { Tag(0x0008, 0x9460),
+          "Skip Frame Range Flag", "SkipFrameRangeFlag",  "CS", "1" },    { Tag(0x0010, 0x0010),
+          "Patient's Name", "PatientName",  "PN", "1" },    { Tag(0x0010, 0x0020),
+          "Patient ID", "PatientID",  "LO", "1" },    { Tag(0x0010, 0x0021),
+          "Issuer of Patient ID", "IssuerOfPatientID",  "LO", "1" },    { Tag(0x0010, 0x0022),
+          "Type of Patient ID", "TypeOfPatientID",  "CS", "1" },    { Tag(0x0010, 0x0024),
+          "Issuer of Patient ID Qualifiers Sequence", "IssuerOfPatientIDQualifiersSequence",  "SQ", "1" },    { Tag(0x0010, 0x0026),
+          "Source Patient Group Identification Sequence", "SourcePatientGroupIdentificationSequence",  "SQ", "1" },    { Tag(0x0010, 0x0027),
+          "Group of Patients Identification Sequence", "GroupOfPatientsIdentificationSequence",  "SQ", "1" },    { Tag(0x0010, 0x0028),
+          "Subject Relative Position in Image", "SubjectRelativePositionInImage",  "US", "3" },    { Tag(0x0010, 0x0030),
+          "Patient's Birth Date", "PatientBirthDate",  "DA", "1" },    { Tag(0x0010, 0x0032),
+          "Patient's Birth Time", "PatientBirthTime",  "TM", "1" },    { Tag(0x0010, 0x0033),
+          "Patient's Birth Date in Alternative Calendar", "PatientBirthDateInAlternativeCalendar",  "LO", "1" },    { Tag(0x0010, 0x0034),
+          "Patient's Death Date in Alternative Calendar", "PatientDeathDateInAlternativeCalendar",  "LO", "1" },    { Tag(0x0010, 0x0035),
+          "Patient's Alternative Calendar", "PatientAlternativeCalendar",  "CS", "1" },    { Tag(0x0010, 0x0040),
+          "Patient's Sex", "PatientSex",  "CS", "1" },    { Tag(0x0010, 0x0050),
+          "Patient's Insurance Plan Code Sequence", "PatientInsurancePlanCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x0101),
+          "Patient's Primary Language Code Sequence", "PatientPrimaryLanguageCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x0102),
+          "Patient's Primary Language Modifier Code Sequence", "PatientPrimaryLanguageModifierCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x0200),
+          "Quality Control Subject", "QualityControlSubject",  "CS", "1" },    { Tag(0x0010, 0x0201),
+          "Quality Control Subject Type Code Sequence", "QualityControlSubjectTypeCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x0212),
+          "Strain Description", "StrainDescription",  "UC", "1" },    { Tag(0x0010, 0x0213),
+          "Strain Nomenclature", "StrainNomenclature",  "LO", "1" },    { Tag(0x0010, 0x0214),
+          "Strain Stock Number", "StrainStockNumber",  "LO", "1" },    { Tag(0x0010, 0x0215),
+          "Strain Source Registry Code Sequence", "StrainSourceRegistryCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x0216),
+          "Strain Stock Sequence", "StrainStockSequence",  "SQ", "1" },    { Tag(0x0010, 0x0217),
+          "Strain Source", "StrainSource",  "LO", "1" },    { Tag(0x0010, 0x0218),
+          "Strain Additional Information", "StrainAdditionalInformation",  "UT", "1" },    { Tag(0x0010, 0x0219),
+          "Strain Code Sequence", "StrainCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x1000),
+          "Other Patient IDs", "OtherPatientIDs",  "LO", "1-n" },    { Tag(0x0010, 0x1001),
+          "Other Patient Names", "OtherPatientNames",  "PN", "1-n" },    { Tag(0x0010, 0x1002),
+          "Other Patient IDs Sequence", "OtherPatientIDsSequence",  "SQ", "1" },    { Tag(0x0010, 0x1005),
+          "Patient's Birth Name", "PatientBirthName",  "PN", "1" },    { Tag(0x0010, 0x1010),
+          "Patient's Age", "PatientAge",  "AS", "1" },    { Tag(0x0010, 0x1020),
+          "Patient's Size", "PatientSize",  "DS", "1" },    { Tag(0x0010, 0x1021),
+          "Patient's Size Code Sequence", "PatientSizeCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x1030),
+          "Patient's Weight", "PatientWeight",  "DS", "1" },    { Tag(0x0010, 0x1040),
+          "Patient's Address", "PatientAddress",  "LO", "1" },    { Tag(0x0010, 0x1050),
+          "Insurance Plan Identification", "InsurancePlanIdentification",  "LO", "1-n" },    { Tag(0x0010, 0x1060),
+          "Patient's Mother's Birth Name", "PatientMotherBirthName",  "PN", "1" },    { Tag(0x0010, 0x1080),
+          "Military Rank", "MilitaryRank",  "LO", "1" },    { Tag(0x0010, 0x1081),
+          "Branch of Service", "BranchOfService",  "LO", "1" },    { Tag(0x0010, 0x1090),
+          "Medical Record Locator", "MedicalRecordLocator",  "LO", "1" },    { Tag(0x0010, 0x1100),
+          "Referenced Patient Photo Sequence", "ReferencedPatientPhotoSequence",  "SQ", "1" },    { Tag(0x0010, 0x2000),
+          "Medical Alerts", "MedicalAlerts",  "LO", "1-n" },    { Tag(0x0010, 0x2110),
+          "Allergies", "Allergies",  "LO", "1-n" },    { Tag(0x0010, 0x2150),
+          "Country of Residence", "CountryOfResidence",  "LO", "1" },    { Tag(0x0010, 0x2152),
+          "Region of Residence", "RegionOfResidence",  "LO", "1" },    { Tag(0x0010, 0x2154),
+          "Patient's Telephone Numbers", "PatientTelephoneNumbers",  "SH", "1-n" },    { Tag(0x0010, 0x2155),
+          "Patient's Telecom Information", "PatientTelecomInformation",  "LT", "1" },    { Tag(0x0010, 0x2160),
+          "Ethnic Group", "EthnicGroup",  "SH", "1" },    { Tag(0x0010, 0x2180),
+          "Occupation", "Occupation",  "SH", "1" },    { Tag(0x0010, 0x21a0),
+          "Smoking Status", "SmokingStatus",  "CS", "1" },    { Tag(0x0010, 0x21b0),
+          "Additional Patient History", "AdditionalPatientHistory",  "LT", "1" },    { Tag(0x0010, 0x21c0),
+          "Pregnancy Status", "PregnancyStatus",  "US", "1" },    { Tag(0x0010, 0x21d0),
+          "Last Menstrual Date", "LastMenstrualDate",  "DA", "1" },    { Tag(0x0010, 0x21f0),
+          "Patient's Religious Preference", "PatientReligiousPreference",  "LO", "1" },    { Tag(0x0010, 0x2201),
+          "Patient Species Description", "PatientSpeciesDescription",  "LO", "1" },    { Tag(0x0010, 0x2202),
+          "Patient Species Code Sequence", "PatientSpeciesCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x2203),
+          "Patient's Sex Neutered", "PatientSexNeutered",  "CS", "1" },    { Tag(0x0010, 0x2210),
+          "Anatomical Orientation Type", "AnatomicalOrientationType",  "CS", "1" },    { Tag(0x0010, 0x2292),
+          "Patient Breed Description", "PatientBreedDescription",  "LO", "1" },    { Tag(0x0010, 0x2293),
+          "Patient Breed Code Sequence", "PatientBreedCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x2294),
+          "Breed Registration Sequence", "BreedRegistrationSequence",  "SQ", "1" },    { Tag(0x0010, 0x2295),
+          "Breed Registration Number", "BreedRegistrationNumber",  "LO", "1" },    { Tag(0x0010, 0x2296),
+          "Breed Registry Code Sequence", "BreedRegistryCodeSequence",  "SQ", "1" },    { Tag(0x0010, 0x2297),
+          "Responsible Person", "ResponsiblePerson",  "PN", "1" },    { Tag(0x0010, 0x2298),
+          "Responsible Person Role", "ResponsiblePersonRole",  "CS", "1" },    { Tag(0x0010, 0x2299),
+          "Responsible Organization", "ResponsibleOrganization",  "LO", "1" },    { Tag(0x0010, 0x4000),
+          "Patient Comments", "PatientComments",  "LT", "1" },    { Tag(0x0010, 0x9431),
+          "Examined Body Thickness", "ExaminedBodyThickness",  "FL", "1" },    { Tag(0x0012, 0x0010),
+          "Clinical Trial Sponsor Name", "ClinicalTrialSponsorName",  "LO", "1" },    { Tag(0x0012, 0x0020),
+          "Clinical Trial Protocol ID", "ClinicalTrialProtocolID",  "LO", "1" },    { Tag(0x0012, 0x0021),
+          "Clinical Trial Protocol Name", "ClinicalTrialProtocolName",  "LO", "1" },    { Tag(0x0012, 0x0030),
+          "Clinical Trial Site ID", "ClinicalTrialSiteID",  "LO", "1" },    { Tag(0x0012, 0x0031),
+          "Clinical Trial Site Name", "ClinicalTrialSiteName",  "LO", "1" },    { Tag(0x0012, 0x0040),
+          "Clinical Trial Subject ID", "ClinicalTrialSubjectID",  "LO", "1" },    { Tag(0x0012, 0x0042),
+          "Clinical Trial Subject Reading ID", "ClinicalTrialSubjectReadingID",  "LO", "1" },    { Tag(0x0012, 0x0050),
+          "Clinical Trial Time Point ID", "ClinicalTrialTimePointID",  "LO", "1" },    { Tag(0x0012, 0x0051),
+          "Clinical Trial Time Point Description", "ClinicalTrialTimePointDescription",  "ST", "1" },    { Tag(0x0012, 0x0060),
+          "Clinical Trial Coordinating Center Name", "ClinicalTrialCoordinatingCenterName",  "LO", "1" },    { Tag(0x0012, 0x0062),
+          "Patient Identity Removed", "PatientIdentityRemoved",  "CS", "1" },    { Tag(0x0012, 0x0063),
+          "De-identification Method", "DeidentificationMethod",  "LO", "1-n" },    { Tag(0x0012, 0x0064),
+          "De-identification Method Code Sequence", "DeidentificationMethodCodeSequence",  "SQ", "1" },    { Tag(0x0012, 0x0071),
+          "Clinical Trial Series ID", "ClinicalTrialSeriesID",  "LO", "1" },    { Tag(0x0012, 0x0072),
+          "Clinical Trial Series Description", "ClinicalTrialSeriesDescription",  "LO", "1" },    { Tag(0x0012, 0x0081),
+          "Clinical Trial Protocol Ethics Committee Name", "ClinicalTrialProtocolEthicsCommitteeName",  "LO", "1" },    { Tag(0x0012, 0x0082),
+          "Clinical Trial Protocol Ethics Committee Approval Number", "ClinicalTrialProtocolEthicsCommitteeApprovalNumber",  "LO", "1" },    { Tag(0x0012, 0x0083),
+          "Consent for Clinical Trial Use Sequence", "ConsentForClinicalTrialUseSequence",  "SQ", "1" },    { Tag(0x0012, 0x0084),
+          "Distribution Type", "DistributionType",  "CS", "1" },    { Tag(0x0012, 0x0085),
+          "Consent for Distribution Flag", "ConsentForDistributionFlag",  "CS", "1" },    { Tag(0x0014, 0x0023),
+          "CAD File Format", "CADFileFormat",  "ST", "1" },    { Tag(0x0014, 0x0024),
+          "Component Reference System", "ComponentReferenceSystem",  "ST", "1" },    { Tag(0x0014, 0x0025),
+          "Component Manufacturing Procedure", "ComponentManufacturingProcedure",  "ST", "1" },    { Tag(0x0014, 0x0028),
+          "Component Manufacturer", "ComponentManufacturer",  "ST", "1" },    { Tag(0x0014, 0x0030),
+          "Material Thickness", "MaterialThickness",  "DS", "1-n" },    { Tag(0x0014, 0x0032),
+          "Material Pipe Diameter", "MaterialPipeDiameter",  "DS", "1-n" },    { Tag(0x0014, 0x0034),
+          "Material Isolation Diameter", "MaterialIsolationDiameter",  "DS", "1-n" },    { Tag(0x0014, 0x0042),
+          "Material Grade", "MaterialGrade",  "ST", "1" },    { Tag(0x0014, 0x0044),
+          "Material Properties Description", "MaterialPropertiesDescription",  "ST", "1" },    { Tag(0x0014, 0x0045),
+          "Material Properties File Format (Retired)", "MaterialPropertiesFileFormatRetired",  "ST", "1" },    { Tag(0x0014, 0x0046),
+          "Material Notes", "MaterialNotes",  "LT", "1" },    { Tag(0x0014, 0x0050),
+          "Component Shape", "ComponentShape",  "CS", "1" },    { Tag(0x0014, 0x0052),
+          "Curvature Type", "CurvatureType",  "CS", "1" },    { Tag(0x0014, 0x0054),
+          "Outer Diameter", "OuterDiameter",  "DS", "1" },    { Tag(0x0014, 0x0056),
+          "Inner Diameter", "InnerDiameter",  "DS", "1" },    { Tag(0x0014, 0x0100),
+          "Component Welder IDs", "ComponentWelderIDs",  "LO", "1-n" },    { Tag(0x0014, 0x0101),
+          "Secondary Approval Status", "SecondaryApprovalStatus",  "CS", "1" },    { Tag(0x0014, 0x0102),
+          "Secondary Review Date", "SecondaryReviewDate",  "DA", "1" },    { Tag(0x0014, 0x0103),
+          "Secondary Review Time", "SecondaryReviewTime",  "TM", "1" },    { Tag(0x0014, 0x0104),
+          "Secondary Reviewer Name", "SecondaryReviewerName",  "PN", "1" },    { Tag(0x0014, 0x0105),
+          "Repair ID", "RepairID",  "ST", "1" },    { Tag(0x0014, 0x0106),
+          "Multiple Component Approval Sequence", "MultipleComponentApprovalSequence",  "SQ", "1" },    { Tag(0x0014, 0x0107),
+          "Other Approval Status", "OtherApprovalStatus",  "CS", "1-n" },    { Tag(0x0014, 0x0108),
+          "Other Secondary Approval Status", "OtherSecondaryApprovalStatus",  "CS", "1-n" },    { Tag(0x0014, 0x1010),
+          "Actual Environmental Conditions", "ActualEnvironmentalConditions",  "ST", "1" },    { Tag(0x0014, 0x1020),
+          "Expiry Date", "ExpiryDate",  "DA", "1" },    { Tag(0x0014, 0x1040),
+          "Environmental Conditions", "EnvironmentalConditions",  "ST", "1" },    { Tag(0x0014, 0x2002),
+          "Evaluator Sequence", "EvaluatorSequence",  "SQ", "1" },    { Tag(0x0014, 0x2004),
+          "Evaluator Number", "EvaluatorNumber",  "IS", "1" },    { Tag(0x0014, 0x2006),
+          "Evaluator Name", "EvaluatorName",  "PN", "1" },    { Tag(0x0014, 0x2008),
+          "Evaluation Attempt", "EvaluationAttempt",  "IS", "1" },    { Tag(0x0014, 0x2012),
+          "Indication Sequence", "IndicationSequence",  "SQ", "1" },    { Tag(0x0014, 0x2014),
+          "Indication Number", "IndicationNumber",  "IS", "1" },    { Tag(0x0014, 0x2016),
+          "Indication Label", "IndicationLabel",  "SH", "1" },    { Tag(0x0014, 0x2018),
+          "Indication Description", "IndicationDescription",  "ST", "1" },    { Tag(0x0014, 0x201a),
+          "Indication Type", "IndicationType",  "CS", "1-n" },    { Tag(0x0014, 0x201c),
+          "Indication Disposition", "IndicationDisposition",  "CS", "1" },    { Tag(0x0014, 0x201e),
+          "Indication ROI Sequence", "IndicationROISequence",  "SQ", "1" },    { Tag(0x0014, 0x2030),
+          "Indication Physical Property Sequence", "IndicationPhysicalPropertySequence",  "SQ", "1" },    { Tag(0x0014, 0x2032),
+          "Property Label", "PropertyLabel",  "SH", "1" },    { Tag(0x0014, 0x2202),
+          "Coordinate System Number of Axes", "CoordinateSystemNumberOfAxes",  "IS", "1" },    { Tag(0x0014, 0x2204),
+          "Coordinate System Axes Sequence", "CoordinateSystemAxesSequence",  "SQ", "1" },    { Tag(0x0014, 0x2206),
+          "Coordinate System Axis Description", "CoordinateSystemAxisDescription",  "ST", "1" },    { Tag(0x0014, 0x2208),
+          "Coordinate System Data Set Mapping", "CoordinateSystemDataSetMapping",  "CS", "1" },    { Tag(0x0014, 0x220a),
+          "Coordinate System Axis Number", "CoordinateSystemAxisNumber",  "IS", "1" },    { Tag(0x0014, 0x220c),
+          "Coordinate System Axis Type", "CoordinateSystemAxisType",  "CS", "1" },    { Tag(0x0014, 0x220e),
+          "Coordinate System Axis Units", "CoordinateSystemAxisUnits",  "CS", "1" },    { Tag(0x0014, 0x2210),
+          "Coordinate System Axis Values", "CoordinateSystemAxisValues",  "OB", "1" },    { Tag(0x0014, 0x2220),
+          "Coordinate System Transform Sequence", "CoordinateSystemTransformSequence",  "SQ", "1" },    { Tag(0x0014, 0x2222),
+          "Transform Description", "TransformDescription",  "ST", "1" },    { Tag(0x0014, 0x2224),
+          "Transform Number of Axes", "TransformNumberOfAxes",  "IS", "1" },    { Tag(0x0014, 0x2226),
+          "Transform Order of Axes", "TransformOrderOfAxes",  "IS", "1-n" },    { Tag(0x0014, 0x2228),
+          "Transformed Axis Units", "TransformedAxisUnits",  "CS", "1" },    { Tag(0x0014, 0x222a),
+          "Coordinate System Transform Rotation and Scale Matrix", "CoordinateSystemTransformRotationAndScaleMatrix",  "DS", "1-n" },    { Tag(0x0014, 0x222c),
+          "Coordinate System Transform Translation Matrix", "CoordinateSystemTransformTranslationMatrix",  "DS", "1-n" },    { Tag(0x0014, 0x3011),
+          "Internal Detector Frame Time", "InternalDetectorFrameTime",  "DS", "1" },    { Tag(0x0014, 0x3012),
+          "Number of Frames Integrated", "NumberOfFramesIntegrated",  "DS", "1" },    { Tag(0x0014, 0x3020),
+          "Detector Temperature Sequence", "DetectorTemperatureSequence",  "SQ", "1" },    { Tag(0x0014, 0x3022),
+          "Sensor Name", "SensorName",  "ST", "1" },    { Tag(0x0014, 0x3024),
+          "Horizontal Offset of Sensor", "HorizontalOffsetOfSensor",  "DS", "1" },    { Tag(0x0014, 0x3026),
+          "Vertical Offset of Sensor", "VerticalOffsetOfSensor",  "DS", "1" },    { Tag(0x0014, 0x3028),
+          "Sensor Temperature", "SensorTemperature",  "DS", "1" },    { Tag(0x0014, 0x3040),
+          "Dark Current Sequence", "DarkCurrentSequence",  "SQ", "1" },    { Tag(0x0014, 0x3050),
+          "Dark Current Counts", "DarkCurrentCounts",  "OB or OW", "1" },    { Tag(0x0014, 0x3060),
+          "Gain Correction Reference Sequence", "GainCorrectionReferenceSequence",  "SQ", "1" },    { Tag(0x0014, 0x3070),
+          "Air Counts", "AirCounts",  "OB or OW", "1" },    { Tag(0x0014, 0x3071),
+          "KV Used in Gain Calibration", "KVUsedInGainCalibration",  "DS", "1" },    { Tag(0x0014, 0x3072),
+          "MA Used in Gain Calibration", "MAUsedInGainCalibration",  "DS", "1" },    { Tag(0x0014, 0x3073),
+          "Number of Frames Used for Integration", "NumberOfFramesUsedForIntegration",  "DS", "1" },    { Tag(0x0014, 0x3074),
+          "Filter Material Used in Gain Calibration", "FilterMaterialUsedInGainCalibration",  "LO", "1" },    { Tag(0x0014, 0x3075),
+          "Filter Thickness Used in Gain Calibration", "FilterThicknessUsedInGainCalibration",  "DS", "1" },    { Tag(0x0014, 0x3076),
+          "Date of Gain Calibration", "DateOfGainCalibration",  "DA", "1" },    { Tag(0x0014, 0x3077),
+          "Time of Gain Calibration", "TimeOfGainCalibration",  "TM", "1" },    { Tag(0x0014, 0x3080),
+          "Bad Pixel Image", "BadPixelImage",  "OB", "1" },    { Tag(0x0014, 0x3099),
+          "Calibration Notes", "CalibrationNotes",  "LT", "1" },    { Tag(0x0014, 0x4002),
+          "Pulser Equipment Sequence", "PulserEquipmentSequence",  "SQ", "1" },    { Tag(0x0014, 0x4004),
+          "Pulser Type", "PulserType",  "CS", "1" },    { Tag(0x0014, 0x4006),
+          "Pulser Notes", "PulserNotes",  "LT", "1" },    { Tag(0x0014, 0x4008),
+          "Receiver Equipment Sequence", "ReceiverEquipmentSequence",  "SQ", "1" },    { Tag(0x0014, 0x400a),
+          "Amplifier Type", "AmplifierType",  "CS", "1" },    { Tag(0x0014, 0x400c),
+          "Receiver Notes", "ReceiverNotes",  "LT", "1" },    { Tag(0x0014, 0x400e),
+          "Pre-Amplifier Equipment Sequence", "PreAmplifierEquipmentSequence",  "SQ", "1" },    { Tag(0x0014, 0x400f),
+          "Pre-Amplifier Notes", "PreAmplifierNotes",  "LT", "1" },    { Tag(0x0014, 0x4010),
+          "Transmit Transducer Sequence", "TransmitTransducerSequence",  "SQ", "1" },    { Tag(0x0014, 0x4011),
+          "Receive Transducer Sequence", "ReceiveTransducerSequence",  "SQ", "1" },    { Tag(0x0014, 0x4012),
+          "Number of Elements", "NumberOfElements",  "US", "1" },    { Tag(0x0014, 0x4013),
+          "Element Shape", "ElementShape",  "CS", "1" },    { Tag(0x0014, 0x4014),
+          "Element Dimension A", "ElementDimensionA",  "DS", "1" },    { Tag(0x0014, 0x4015),
+          "Element Dimension B", "ElementDimensionB",  "DS", "1" },    { Tag(0x0014, 0x4016),
+          "Element Pitch A", "ElementPitchA",  "DS", "1" },    { Tag(0x0014, 0x4017),
+          "Measured Beam Dimension A", "MeasuredBeamDimensionA",  "DS", "1" },    { Tag(0x0014, 0x4018),
+          "Measured Beam Dimension B", "MeasuredBeamDimensionB",  "DS", "1" },    { Tag(0x0014, 0x4019),
+          "Location of Measured Beam Diameter", "LocationOfMeasuredBeamDiameter",  "DS", "1" },    { Tag(0x0014, 0x401a),
+          "Nominal Frequency", "NominalFrequency",  "DS", "1" },    { Tag(0x0014, 0x401b),
+          "Measured Center Frequency", "MeasuredCenterFrequency",  "DS", "1" },    { Tag(0x0014, 0x401c),
+          "Measured Bandwidth", "MeasuredBandwidth",  "DS", "1" },    { Tag(0x0014, 0x401d),
+          "Element Pitch B", "ElementPitchB",  "DS", "1" },    { Tag(0x0014, 0x4020),
+          "Pulser Settings Sequence", "PulserSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x4022),
+          "Pulse Width", "PulseWidth",  "DS", "1" },    { Tag(0x0014, 0x4024),
+          "Excitation Frequency", "ExcitationFrequency",  "DS", "1" },    { Tag(0x0014, 0x4026),
+          "Modulation Type", "ModulationType",  "CS", "1" },    { Tag(0x0014, 0x4028),
+          "Damping", "Damping",  "DS", "1" },    { Tag(0x0014, 0x4030),
+          "Receiver Settings Sequence", "ReceiverSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x4031),
+          "Acquired Soundpath Length", "AcquiredSoundpathLength",  "DS", "1" },    { Tag(0x0014, 0x4032),
+          "Acquisition Compression Type", "AcquisitionCompressionType",  "CS", "1" },    { Tag(0x0014, 0x4033),
+          "Acquisition Sample Size", "AcquisitionSampleSize",  "IS", "1" },    { Tag(0x0014, 0x4034),
+          "Rectifier Smoothing", "RectifierSmoothing",  "DS", "1" },    { Tag(0x0014, 0x4035),
+          "DAC Sequence", "DACSequence",  "SQ", "1" },    { Tag(0x0014, 0x4036),
+          "DAC Type", "DACType",  "CS", "1" },    { Tag(0x0014, 0x4038),
+          "DAC Gain Points", "DACGainPoints",  "DS", "1-n" },    { Tag(0x0014, 0x403a),
+          "DAC Time Points", "DACTimePoints",  "DS", "1-n" },    { Tag(0x0014, 0x403c),
+          "DAC Amplitude", "DACAmplitude",  "DS", "1-n" },    { Tag(0x0014, 0x4040),
+          "Pre-Amplifier Settings Sequence", "PreAmplifierSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x4050),
+          "Transmit Transducer Settings Sequence", "TransmitTransducerSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x4051),
+          "Receive Transducer Settings Sequence", "ReceiveTransducerSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x4052),
+          "Incident Angle", "IncidentAngle",  "DS", "1" },    { Tag(0x0014, 0x4054),
+          "Coupling Technique", "CouplingTechnique",  "ST", "1" },    { Tag(0x0014, 0x4056),
+          "Coupling Medium", "CouplingMedium",  "ST", "1" },    { Tag(0x0014, 0x4057),
+          "Coupling Velocity", "CouplingVelocity",  "DS", "1" },    { Tag(0x0014, 0x4058),
+          "Probe Center Location X", "ProbeCenterLocationX",  "DS", "1" },    { Tag(0x0014, 0x4059),
+          "Probe Center Location Z", "ProbeCenterLocationZ",  "DS", "1" },    { Tag(0x0014, 0x405a),
+          "Sound Path Length", "SoundPathLength",  "DS", "1" },    { Tag(0x0014, 0x405c),
+          "Delay Law Identifier", "DelayLawIdentifier",  "ST", "1" },    { Tag(0x0014, 0x4060),
+          "Gate Settings Sequence", "GateSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x4062),
+          "Gate Threshold", "GateThreshold",  "DS", "1" },    { Tag(0x0014, 0x4064),
+          "Velocity of Sound", "VelocityOfSound",  "DS", "1" },    { Tag(0x0014, 0x4070),
+          "Calibration Settings Sequence", "CalibrationSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x4072),
+          "Calibration Procedure", "CalibrationProcedure",  "ST", "1" },    { Tag(0x0014, 0x4074),
+          "Procedure Version", "ProcedureVersion",  "SH", "1" },    { Tag(0x0014, 0x4076),
+          "Procedure Creation Date", "ProcedureCreationDate",  "DA", "1" },    { Tag(0x0014, 0x4078),
+          "Procedure Expiration Date", "ProcedureExpirationDate",  "DA", "1" },    { Tag(0x0014, 0x407a),
+          "Procedure Last Modified Date", "ProcedureLastModifiedDate",  "DA", "1" },    { Tag(0x0014, 0x407c),
+          "Calibration Time", "CalibrationTime",  "TM", "1-n" },    { Tag(0x0014, 0x407e),
+          "Calibration Date", "CalibrationDate",  "DA", "1-n" },    { Tag(0x0014, 0x4080),
+          "Probe Drive Equipment Sequence", "ProbeDriveEquipmentSequence",  "SQ", "1" },    { Tag(0x0014, 0x4081),
+          "Drive Type", "DriveType",  "CS", "1" },    { Tag(0x0014, 0x4082),
+          "Probe Drive Notes", "ProbeDriveNotes",  "LT", "1" },    { Tag(0x0014, 0x4083),
+          "Drive Probe Sequence", "DriveProbeSequence",  "SQ", "1" },    { Tag(0x0014, 0x4084),
+          "Probe Inductance", "ProbeInductance",  "DS", "1" },    { Tag(0x0014, 0x4085),
+          "Probe Resistance", "ProbeResistance",  "DS", "1" },    { Tag(0x0014, 0x4086),
+          "Receive Probe Sequence", "ReceiveProbeSequence",  "SQ", "1" },    { Tag(0x0014, 0x4087),
+          "Probe Drive Settings Sequence", "ProbeDriveSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x4088),
+          "Bridge Resistors", "BridgeResistors",  "DS", "1" },    { Tag(0x0014, 0x4089),
+          "Probe Orientation Angle", "ProbeOrientationAngle",  "DS", "1" },    { Tag(0x0014, 0x408b),
+          "User Selected Gain Y", "UserSelectedGainY",  "DS", "1" },    { Tag(0x0014, 0x408c),
+          "User Selected Phase", "UserSelectedPhase",  "DS", "1" },    { Tag(0x0014, 0x408d),
+          "User Selected Offset X", "UserSelectedOffsetX",  "DS", "1" },    { Tag(0x0014, 0x408e),
+          "User Selected Offset Y", "UserSelectedOffsetY",  "DS", "1" },    { Tag(0x0014, 0x4091),
+          "Channel Settings Sequence", "ChannelSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x4092),
+          "Channel Threshold", "ChannelThreshold",  "DS", "1" },    { Tag(0x0014, 0x409a),
+          "Scanner Settings Sequence", "ScannerSettingsSequence",  "SQ", "1" },    { Tag(0x0014, 0x409b),
+          "Scan Procedure", "ScanProcedure",  "ST", "1" },    { Tag(0x0014, 0x409c),
+          "Translation Rate X", "TranslationRateX",  "DS", "1" },    { Tag(0x0014, 0x409d),
+          "Translation Rate Y", "TranslationRateY",  "DS", "1" },    { Tag(0x0014, 0x409f),
+          "Channel Overlap", "ChannelOverlap",  "DS", "1" },    { Tag(0x0014, 0x40a0),
+          "Image Quality Indicator Type", "ImageQualityIndicatorType",  "LO", "1" },    { Tag(0x0014, 0x40a1),
+          "Image Quality Indicator Material", "ImageQualityIndicatorMaterial",  "LO", "1" },    { Tag(0x0014, 0x40a2),
+          "Image Quality Indicator Size", "ImageQualityIndicatorSize",  "LO", "1" },    { Tag(0x0014, 0x5002),
+          "LINAC Energy", "LINACEnergy",  "IS", "1" },    { Tag(0x0014, 0x5004),
+          "LINAC Output", "LINACOutput",  "IS", "1" },    { Tag(0x0014, 0x5100),
+          "Active Aperture", "ActiveAperture",  "US", "1" },    { Tag(0x0014, 0x5101),
+          "Total Aperture", "TotalAperture",  "DS", "1" },    { Tag(0x0014, 0x5102),
+          "Aperture Elevation", "ApertureElevation",  "DS", "1" },    { Tag(0x0014, 0x5103),
+          "Main Lobe Angle", "MainLobeAngle",  "DS", "1" },    { Tag(0x0014, 0x5104),
+          "Main Roof Angle", "MainRoofAngle",  "DS", "1" },    { Tag(0x0014, 0x5105),
+          "Connector Type", "ConnectorType",  "CS", "1" },    { Tag(0x0014, 0x5106),
+          "Wedge Model Number", "WedgeModelNumber",  "SH", "1" },    { Tag(0x0014, 0x5107),
+          "Wedge Angle Float", "WedgeAngleFloat",  "DS", "1" },    { Tag(0x0014, 0x5108),
+          "Wedge Roof Angle", "WedgeRoofAngle",  "DS", "1" },    { Tag(0x0014, 0x5109),
+          "Wedge Element 1 Position", "WedgeElement1Position",  "CS", "1" },    { Tag(0x0014, 0x510a),
+          "Wedge Material Velocity", "WedgeMaterialVelocity",  "DS", "1" },    { Tag(0x0014, 0x510b),
+          "Wedge Material", "WedgeMaterial",  "SH", "1" },    { Tag(0x0014, 0x510c),
+          "Wedge Offset Z", "WedgeOffsetZ",  "DS", "1" },    { Tag(0x0014, 0x510d),
+          "Wedge Origin Offset X", "WedgeOriginOffsetX",  "DS", "1" },    { Tag(0x0014, 0x510e),
+          "Wedge Time Delay", "WedgeTimeDelay",  "DS", "1" },    { Tag(0x0014, 0x510f),
+          "Wedge Name", "WedgeName",  "SH", "1" },    { Tag(0x0014, 0x5110),
+          "Wedge Manufacturer Name", "WedgeManufacturerName",  "SH", "1" },    { Tag(0x0014, 0x5111),
+          "Wedge Description", "WedgeDescription",  "LO", "1" },    { Tag(0x0014, 0x5112),
+          "Nominal Beam Angle", "NominalBeamAngle",  "DS", "1" },    { Tag(0x0014, 0x5113),
+          "Wedge Offset X", "WedgeOffsetX",  "DS", "1" },    { Tag(0x0014, 0x5114),
+          "Wedge Offset Y", "WedgeOffsetY",  "DS", "1" },    { Tag(0x0014, 0x5115),
+          "Wedge Total Length", "WedgeTotalLength",  "DS", "1" },    { Tag(0x0014, 0x5116),
+          "Wedge In Contact Length", "WedgeInContactLength",  "DS", "1" },    { Tag(0x0014, 0x5117),
+          "Wedge Front Gap", "WedgeFrontGap",  "DS", "1" },    { Tag(0x0014, 0x5118),
+          "Wedge Total Height", "WedgeTotalHeight",  "DS", "1" },    { Tag(0x0014, 0x5119),
+          "Wedge Front Height", "WedgeFrontHeight",  "DS", "1" },    { Tag(0x0014, 0x511a),
+          "Wedge Rear Height", "WedgeRearHeight",  "DS", "1" },    { Tag(0x0014, 0x511b),
+          "Wedge Total Width", "WedgeTotalWidth",  "DS", "1" },    { Tag(0x0014, 0x511c),
+          "Wedge In Contact Width", "WedgeInContactWidth",  "DS", "1" },    { Tag(0x0014, 0x511d),
+          "Wedge Chamfer Height", "WedgeChamferHeight",  "DS", "1" },    { Tag(0x0014, 0x511e),
+          "Wedge Curve", "WedgeCurve",  "CS", "1" },    { Tag(0x0014, 0x511f),
+          "Radius Along the Wedge", "RadiusAlongWedge",  "DS", "1" },    { Tag(0x0018, 0x0010),
+          "Contrast/Bolus Agent", "ContrastBolusAgent",  "LO", "1" },    { Tag(0x0018, 0x0012),
+          "Contrast/Bolus Agent Sequence", "ContrastBolusAgentSequence",  "SQ", "1" },    { Tag(0x0018, 0x0013),
+          "Contrast/Bolus T1 Relaxivity", "ContrastBolusT1Relaxivity",  "FL", "1" },    { Tag(0x0018, 0x0014),
+          "Contrast/Bolus Administration Route Sequence", "ContrastBolusAdministrationRouteSequence",  "SQ", "1" },    { Tag(0x0018, 0x0015),
+          "Body Part Examined", "BodyPartExamined",  "CS", "1" },    { Tag(0x0018, 0x0020),
+          "Scanning Sequence", "ScanningSequence",  "CS", "1-n" },    { Tag(0x0018, 0x0021),
+          "Sequence Variant", "SequenceVariant",  "CS", "1-n" },    { Tag(0x0018, 0x0022),
+          "Scan Options", "ScanOptions",  "CS", "1-n" },    { Tag(0x0018, 0x0023),
+          "MR Acquisition Type", "MRAcquisitionType",  "CS", "1" },    { Tag(0x0018, 0x0024),
+          "Sequence Name", "SequenceName",  "SH", "1" },    { Tag(0x0018, 0x0025),
+          "Angio Flag", "AngioFlag",  "CS", "1" },    { Tag(0x0018, 0x0026),
+          "Intervention Drug Information Sequence", "InterventionDrugInformationSequence",  "SQ", "1" },    { Tag(0x0018, 0x0027),
+          "Intervention Drug Stop Time", "InterventionDrugStopTime",  "TM", "1" },    { Tag(0x0018, 0x0028),
+          "Intervention Drug Dose", "InterventionDrugDose",  "DS", "1" },    { Tag(0x0018, 0x0029),
+          "Intervention Drug Code Sequence", "InterventionDrugCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x002a),
+          "Additional Drug Sequence", "AdditionalDrugSequence",  "SQ", "1" },    { Tag(0x0018, 0x0030),
+          "Radionuclide", "Radionuclide",  "LO", "1-n" },    { Tag(0x0018, 0x0031),
+          "Radiopharmaceutical", "Radiopharmaceutical",  "LO", "1" },    { Tag(0x0018, 0x0032),
+          "Energy Window Centerline", "EnergyWindowCenterline",  "DS", "1" },    { Tag(0x0018, 0x0033),
+          "Energy Window Total Width", "EnergyWindowTotalWidth",  "DS", "1-n" },    { Tag(0x0018, 0x0034),
+          "Intervention Drug Name", "InterventionDrugName",  "LO", "1" },    { Tag(0x0018, 0x0035),
+          "Intervention Drug Start Time", "InterventionDrugStartTime",  "TM", "1" },    { Tag(0x0018, 0x0036),
+          "Intervention Sequence", "InterventionSequence",  "SQ", "1" },    { Tag(0x0018, 0x0037),
+          "Therapy Type", "TherapyType",  "CS", "1" },    { Tag(0x0018, 0x0038),
+          "Intervention Status", "InterventionStatus",  "CS", "1" },    { Tag(0x0018, 0x0039),
+          "Therapy Description", "TherapyDescription",  "CS", "1" },    { Tag(0x0018, 0x003a),
+          "Intervention Description", "InterventionDescription",  "ST", "1" },    { Tag(0x0018, 0x0040),
+          "Cine Rate", "CineRate",  "IS", "1" },    { Tag(0x0018, 0x0042),
+          "Initial Cine Run State", "InitialCineRunState",  "CS", "1" },    { Tag(0x0018, 0x0050),
+          "Slice Thickness", "SliceThickness",  "DS", "1" },    { Tag(0x0018, 0x0060),
+          "KVP", "KVP",  "DS", "1" },    { Tag(0x0018, 0x0070),
+          "Counts Accumulated", "CountsAccumulated",  "IS", "1" },    { Tag(0x0018, 0x0071),
+          "Acquisition Termination Condition", "AcquisitionTerminationCondition",  "CS", "1" },    { Tag(0x0018, 0x0072),
+          "Effective Duration", "EffectiveDuration",  "DS", "1" },    { Tag(0x0018, 0x0073),
+          "Acquisition Start Condition", "AcquisitionStartCondition",  "CS", "1" },    { Tag(0x0018, 0x0074),
+          "Acquisition Start Condition Data", "AcquisitionStartConditionData",  "IS", "1" },    { Tag(0x0018, 0x0075),
+          "Acquisition Termination Condition Data", "AcquisitionTerminationConditionData",  "IS", "1" },    { Tag(0x0018, 0x0080),
+          "Repetition Time", "RepetitionTime",  "DS", "1" },    { Tag(0x0018, 0x0081),
+          "Echo Time", "EchoTime",  "DS", "1" },    { Tag(0x0018, 0x0082),
+          "Inversion Time", "InversionTime",  "DS", "1" },    { Tag(0x0018, 0x0083),
+          "Number of Averages", "NumberOfAverages",  "DS", "1" },    { Tag(0x0018, 0x0084),
+          "Imaging Frequency", "ImagingFrequency",  "DS", "1" },    { Tag(0x0018, 0x0085),
+          "Imaged Nucleus", "ImagedNucleus",  "SH", "1" },    { Tag(0x0018, 0x0086),
+          "Echo Number(s)", "EchoNumbers",  "IS", "1-n" },    { Tag(0x0018, 0x0087),
+          "Magnetic Field Strength", "MagneticFieldStrength",  "DS", "1" },    { Tag(0x0018, 0x0088),
+          "Spacing Between Slices", "SpacingBetweenSlices",  "DS", "1" },    { Tag(0x0018, 0x0089),
+          "Number of Phase Encoding Steps", "NumberOfPhaseEncodingSteps",  "IS", "1" },    { Tag(0x0018, 0x0090),
+          "Data Collection Diameter", "DataCollectionDiameter",  "DS", "1" },    { Tag(0x0018, 0x0091),
+          "Echo Train Length", "EchoTrainLength",  "IS", "1" },    { Tag(0x0018, 0x0093),
+          "Percent Sampling", "PercentSampling",  "DS", "1" },    { Tag(0x0018, 0x0094),
+          "Percent Phase Field of View", "PercentPhaseFieldOfView",  "DS", "1" },    { Tag(0x0018, 0x0095),
+          "Pixel Bandwidth", "PixelBandwidth",  "DS", "1" },    { Tag(0x0018, 0x1000),
+          "Device Serial Number", "DeviceSerialNumber",  "LO", "1" },    { Tag(0x0018, 0x1002),
+          "Device UID", "DeviceUID",  "UI", "1" },    { Tag(0x0018, 0x1003),
+          "Device ID", "DeviceID",  "LO", "1" },    { Tag(0x0018, 0x1004),
+          "Plate ID", "PlateID",  "LO", "1" },    { Tag(0x0018, 0x1005),
+          "Generator ID", "GeneratorID",  "LO", "1" },    { Tag(0x0018, 0x1006),
+          "Grid ID", "GridID",  "LO", "1" },    { Tag(0x0018, 0x1007),
+          "Cassette ID", "CassetteID",  "LO", "1" },    { Tag(0x0018, 0x1008),
+          "Gantry ID", "GantryID",  "LO", "1" },    { Tag(0x0018, 0x1010),
+          "Secondary Capture Device ID", "SecondaryCaptureDeviceID",  "LO", "1" },    { Tag(0x0018, 0x1011),
+          "Hardcopy Creation Device ID", "HardcopyCreationDeviceID",  "LO", "1" },    { Tag(0x0018, 0x1012),
+          "Date of Secondary Capture", "DateOfSecondaryCapture",  "DA", "1" },    { Tag(0x0018, 0x1014),
+          "Time of Secondary Capture", "TimeOfSecondaryCapture",  "TM", "1" },    { Tag(0x0018, 0x1016),
+          "Secondary Capture Device Manufacturer", "SecondaryCaptureDeviceManufacturer",  "LO", "1" },    { Tag(0x0018, 0x1017),
+          "Hardcopy Device Manufacturer", "HardcopyDeviceManufacturer",  "LO", "1" },    { Tag(0x0018, 0x1018),
+          "Secondary Capture Device Manufacturer's Model Name", "SecondaryCaptureDeviceManufacturerModelName",  "LO", "1" },    { Tag(0x0018, 0x1019),
+          "Secondary Capture Device Software Versions", "SecondaryCaptureDeviceSoftwareVersions",  "LO", "1-n" },    { Tag(0x0018, 0x101a),
+          "Hardcopy Device Software Version", "HardcopyDeviceSoftwareVersion",  "LO", "1-n" },    { Tag(0x0018, 0x101b),
+          "Hardcopy Device Manufacturer's Model Name", "HardcopyDeviceManufacturerModelName",  "LO", "1" },    { Tag(0x0018, 0x1020),
+          "Software Version(s)", "SoftwareVersions",  "LO", "1-n" },    { Tag(0x0018, 0x1022),
+          "Video Image Format Acquired", "VideoImageFormatAcquired",  "SH", "1" },    { Tag(0x0018, 0x1023),
+          "Digital Image Format Acquired", "DigitalImageFormatAcquired",  "LO", "1" },    { Tag(0x0018, 0x1030),
+          "Protocol Name", "ProtocolName",  "LO", "1" },    { Tag(0x0018, 0x1040),
+          "Contrast/Bolus Route", "ContrastBolusRoute",  "LO", "1" },    { Tag(0x0018, 0x1041),
+          "Contrast/Bolus Volume", "ContrastBolusVolume",  "DS", "1" },    { Tag(0x0018, 0x1042),
+          "Contrast/Bolus Start Time", "ContrastBolusStartTime",  "TM", "1" },    { Tag(0x0018, 0x1043),
+          "Contrast/Bolus Stop Time", "ContrastBolusStopTime",  "TM", "1" },    { Tag(0x0018, 0x1044),
+          "Contrast/Bolus Total Dose", "ContrastBolusTotalDose",  "DS", "1" },    { Tag(0x0018, 0x1045),
+          "Syringe Counts", "SyringeCounts",  "IS", "1" },    { Tag(0x0018, 0x1046),
+          "Contrast Flow Rate", "ContrastFlowRate",  "DS", "1-n" },    { Tag(0x0018, 0x1047),
+          "Contrast Flow Duration", "ContrastFlowDuration",  "DS", "1-n" },    { Tag(0x0018, 0x1048),
+          "Contrast/Bolus Ingredient", "ContrastBolusIngredient",  "CS", "1" },    { Tag(0x0018, 0x1049),
+          "Contrast/Bolus Ingredient Concentration", "ContrastBolusIngredientConcentration",  "DS", "1" },    { Tag(0x0018, 0x1050),
+          "Spatial Resolution", "SpatialResolution",  "DS", "1" },    { Tag(0x0018, 0x1060),
+          "Trigger Time", "TriggerTime",  "DS", "1" },    { Tag(0x0018, 0x1061),
+          "Trigger Source or Type", "TriggerSourceOrType",  "LO", "1" },    { Tag(0x0018, 0x1062),
+          "Nominal Interval", "NominalInterval",  "IS", "1" },    { Tag(0x0018, 0x1063),
+          "Frame Time", "FrameTime",  "DS", "1" },    { Tag(0x0018, 0x1064),
+          "Cardiac Framing Type", "CardiacFramingType",  "LO", "1" },    { Tag(0x0018, 0x1065),
+          "Frame Time Vector", "FrameTimeVector",  "DS", "1-n" },    { Tag(0x0018, 0x1066),
+          "Frame Delay", "FrameDelay",  "DS", "1" },    { Tag(0x0018, 0x1067),
+          "Image Trigger Delay", "ImageTriggerDelay",  "DS", "1" },    { Tag(0x0018, 0x1068),
+          "Multiplex Group Time Offset", "MultiplexGroupTimeOffset",  "DS", "1" },    { Tag(0x0018, 0x1069),
+          "Trigger Time Offset", "TriggerTimeOffset",  "DS", "1" },    { Tag(0x0018, 0x106a),
+          "Synchronization Trigger", "SynchronizationTrigger",  "CS", "1" },    { Tag(0x0018, 0x106c),
+          "Synchronization Channel", "SynchronizationChannel",  "US", "2" },    { Tag(0x0018, 0x106e),
+          "Trigger Sample Position", "TriggerSamplePosition",  "UL", "1" },    { Tag(0x0018, 0x1070),
+          "Radiopharmaceutical Route", "RadiopharmaceuticalRoute",  "LO", "1" },    { Tag(0x0018, 0x1071),
+          "Radiopharmaceutical Volume", "RadiopharmaceuticalVolume",  "DS", "1" },    { Tag(0x0018, 0x1072),
+          "Radiopharmaceutical Start Time", "RadiopharmaceuticalStartTime",  "TM", "1" },    { Tag(0x0018, 0x1073),
+          "Radiopharmaceutical Stop Time", "RadiopharmaceuticalStopTime",  "TM", "1" },    { Tag(0x0018, 0x1074),
+          "Radionuclide Total Dose", "RadionuclideTotalDose",  "DS", "1" },    { Tag(0x0018, 0x1075),
+          "Radionuclide Half Life", "RadionuclideHalfLife",  "DS", "1" },    { Tag(0x0018, 0x1076),
+          "Radionuclide Positron Fraction", "RadionuclidePositronFraction",  "DS", "1" },    { Tag(0x0018, 0x1077),
+          "Radiopharmaceutical Specific Activity", "RadiopharmaceuticalSpecificActivity",  "DS", "1" },    { Tag(0x0018, 0x1078),
+          "Radiopharmaceutical Start DateTime", "RadiopharmaceuticalStartDateTime",  "DT", "1" },    { Tag(0x0018, 0x1079),
+          "Radiopharmaceutical Stop DateTime", "RadiopharmaceuticalStopDateTime",  "DT", "1" },    { Tag(0x0018, 0x1080),
+          "Beat Rejection Flag", "BeatRejectionFlag",  "CS", "1" },    { Tag(0x0018, 0x1081),
+          "Low R-R Value", "LowRRValue",  "IS", "1" },    { Tag(0x0018, 0x1082),
+          "High R-R Value", "HighRRValue",  "IS", "1" },    { Tag(0x0018, 0x1083),
+          "Intervals Acquired", "IntervalsAcquired",  "IS", "1" },    { Tag(0x0018, 0x1084),
+          "Intervals Rejected", "IntervalsRejected",  "IS", "1" },    { Tag(0x0018, 0x1085),
+          "PVC Rejection", "PVCRejection",  "LO", "1" },    { Tag(0x0018, 0x1086),
+          "Skip Beats", "SkipBeats",  "IS", "1" },    { Tag(0x0018, 0x1088),
+          "Heart Rate", "HeartRate",  "IS", "1" },    { Tag(0x0018, 0x1090),
+          "Cardiac Number of Images", "CardiacNumberOfImages",  "IS", "1" },    { Tag(0x0018, 0x1094),
+          "Trigger Window", "TriggerWindow",  "IS", "1" },    { Tag(0x0018, 0x1100),
+          "Reconstruction Diameter", "ReconstructionDiameter",  "DS", "1" },    { Tag(0x0018, 0x1110),
+          "Distance Source to Detector", "DistanceSourceToDetector",  "DS", "1" },    { Tag(0x0018, 0x1111),
+          "Distance Source to Patient", "DistanceSourceToPatient",  "DS", "1" },    { Tag(0x0018, 0x1114),
+          "Estimated Radiographic Magnification Factor", "EstimatedRadiographicMagnificationFactor",  "DS", "1" },    { Tag(0x0018, 0x1120),
+          "Gantry/Detector Tilt", "GantryDetectorTilt",  "DS", "1" },    { Tag(0x0018, 0x1121),
+          "Gantry/Detector Slew", "GantryDetectorSlew",  "DS", "1" },    { Tag(0x0018, 0x1130),
+          "Table Height", "TableHeight",  "DS", "1" },    { Tag(0x0018, 0x1131),
+          "Table Traverse", "TableTraverse",  "DS", "1" },    { Tag(0x0018, 0x1134),
+          "Table Motion", "TableMotion",  "CS", "1" },    { Tag(0x0018, 0x1135),
+          "Table Vertical Increment", "TableVerticalIncrement",  "DS", "1-n" },    { Tag(0x0018, 0x1136),
+          "Table Lateral Increment", "TableLateralIncrement",  "DS", "1-n" },    { Tag(0x0018, 0x1137),
+          "Table Longitudinal Increment", "TableLongitudinalIncrement",  "DS", "1-n" },    { Tag(0x0018, 0x1138),
+          "Table Angle", "TableAngle",  "DS", "1" },    { Tag(0x0018, 0x113a),
+          "Table Type", "TableType",  "CS", "1" },    { Tag(0x0018, 0x1140),
+          "Rotation Direction", "RotationDirection",  "CS", "1" },    { Tag(0x0018, 0x1141),
+          "Angular Position", "AngularPosition",  "DS", "1" },    { Tag(0x0018, 0x1142),
+          "Radial Position", "RadialPosition",  "DS", "1-n" },    { Tag(0x0018, 0x1143),
+          "Scan Arc", "ScanArc",  "DS", "1" },    { Tag(0x0018, 0x1144),
+          "Angular Step", "AngularStep",  "DS", "1" },    { Tag(0x0018, 0x1145),
+          "Center of Rotation Offset", "CenterOfRotationOffset",  "DS", "1" },    { Tag(0x0018, 0x1146),
+          "Rotation Offset", "RotationOffset",  "DS", "1-n" },    { Tag(0x0018, 0x1147),
+          "Field of View Shape", "FieldOfViewShape",  "CS", "1" },    { Tag(0x0018, 0x1149),
+          "Field of View Dimension(s)", "FieldOfViewDimensions",  "IS", "1-2" },    { Tag(0x0018, 0x1150),
+          "Exposure Time", "ExposureTime",  "IS", "1" },    { Tag(0x0018, 0x1151),
+          "X-Ray Tube Current", "XRayTubeCurrent",  "IS", "1" },    { Tag(0x0018, 0x1152),
+          "Exposure", "Exposure",  "IS", "1" },    { Tag(0x0018, 0x1153),
+          "Exposure in uAs", "ExposureInuAs",  "IS", "1" },    { Tag(0x0018, 0x1154),
+          "Average Pulse Width", "AveragePulseWidth",  "DS", "1" },    { Tag(0x0018, 0x1155),
+          "Radiation Setting", "RadiationSetting",  "CS", "1" },    { Tag(0x0018, 0x1156),
+          "Rectification Type", "RectificationType",  "CS", "1" },    { Tag(0x0018, 0x115a),
+          "Radiation Mode", "RadiationMode",  "CS", "1" },    { Tag(0x0018, 0x115e),
+          "Image and Fluoroscopy Area Dose Product", "ImageAndFluoroscopyAreaDoseProduct",  "DS", "1" },    { Tag(0x0018, 0x1160),
+          "Filter Type", "FilterType",  "SH", "1" },    { Tag(0x0018, 0x1161),
+          "Type of Filters", "TypeOfFilters",  "LO", "1-n" },    { Tag(0x0018, 0x1162),
+          "Intensifier Size", "IntensifierSize",  "DS", "1" },    { Tag(0x0018, 0x1164),
+          "Imager Pixel Spacing", "ImagerPixelSpacing",  "DS", "2" },    { Tag(0x0018, 0x1166),
+          "Grid", "Grid",  "CS", "1-n" },    { Tag(0x0018, 0x1170),
+          "Generator Power", "GeneratorPower",  "IS", "1" },    { Tag(0x0018, 0x1180),
+          "Collimator/grid Name", "CollimatorGridName",  "SH", "1" },    { Tag(0x0018, 0x1181),
+          "Collimator Type", "CollimatorType",  "CS", "1" },    { Tag(0x0018, 0x1182),
+          "Focal Distance", "FocalDistance",  "IS", "1-2" },    { Tag(0x0018, 0x1183),
+          "X Focus Center", "XFocusCenter",  "DS", "1-2" },    { Tag(0x0018, 0x1184),
+          "Y Focus Center", "YFocusCenter",  "DS", "1-2" },    { Tag(0x0018, 0x1190),
+          "Focal Spot(s)", "FocalSpots",  "DS", "1-n" },    { Tag(0x0018, 0x1191),
+          "Anode Target Material", "AnodeTargetMaterial",  "CS", "1" },    { Tag(0x0018, 0x11a0),
+          "Body Part Thickness", "BodyPartThickness",  "DS", "1" },    { Tag(0x0018, 0x11a2),
+          "Compression Force", "CompressionForce",  "DS", "1" },    { Tag(0x0018, 0x11a4),
+          "Paddle Description", "PaddleDescription",  "LO", "1" },    { Tag(0x0018, 0x1200),
+          "Date of Last Calibration", "DateOfLastCalibration",  "DA", "1-n" },    { Tag(0x0018, 0x1201),
+          "Time of Last Calibration", "TimeOfLastCalibration",  "TM", "1-n" },    { Tag(0x0018, 0x1202),
+          "DateTime of Last Calibration", "DateTimeOfLastCalibration",  "DT", "1" },    { Tag(0x0018, 0x1210),
+          "Convolution Kernel", "ConvolutionKernel",  "SH", "1-n" },    { Tag(0x0018, 0x1240),
+          "Upper/Lower Pixel Values", "UpperLowerPixelValues",  "IS", "1-n" },    { Tag(0x0018, 0x1242),
+          "Actual Frame Duration", "ActualFrameDuration",  "IS", "1" },    { Tag(0x0018, 0x1243),
+          "Count Rate", "CountRate",  "IS", "1" },    { Tag(0x0018, 0x1244),
+          "Preferred Playback Sequencing", "PreferredPlaybackSequencing",  "US", "1" },    { Tag(0x0018, 0x1250),
+          "Receive Coil Name", "ReceiveCoilName",  "SH", "1" },    { Tag(0x0018, 0x1251),
+          "Transmit Coil Name", "TransmitCoilName",  "SH", "1" },    { Tag(0x0018, 0x1260),
+          "Plate Type", "PlateType",  "SH", "1" },    { Tag(0x0018, 0x1261),
+          "Phosphor Type", "PhosphorType",  "LO", "1" },    { Tag(0x0018, 0x1271),
+          "Water Equivalent Diameter", "WaterEquivalentDiameter",  "FD", "1" },    { Tag(0x0018, 0x1272),
+          "Water Equivalent Diameter Calculation Method Code Sequence", "WaterEquivalentDiameterCalculationMethodCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x1300),
+          "Scan Velocity", "ScanVelocity",  "DS", "1" },    { Tag(0x0018, 0x1301),
+          "Whole Body Technique", "WholeBodyTechnique",  "CS", "1-n" },    { Tag(0x0018, 0x1302),
+          "Scan Length", "ScanLength",  "IS", "1" },    { Tag(0x0018, 0x1310),
+          "Acquisition Matrix", "AcquisitionMatrix",  "US", "4" },    { Tag(0x0018, 0x1312),
+          "In-plane Phase Encoding Direction", "InPlanePhaseEncodingDirection",  "CS", "1" },    { Tag(0x0018, 0x1314),
+          "Flip Angle", "FlipAngle",  "DS", "1" },    { Tag(0x0018, 0x1315),
+          "Variable Flip Angle Flag", "VariableFlipAngleFlag",  "CS", "1" },    { Tag(0x0018, 0x1316),
+          "SAR", "SAR",  "DS", "1" },    { Tag(0x0018, 0x1318),
+          "dB/dt", "dBdt",  "DS", "1" },    { Tag(0x0018, 0x1320),
+          "B1rms", "B1rms",  "FL", "1" },    { Tag(0x0018, 0x1400),
+          "Acquisition Device Processing Description", "AcquisitionDeviceProcessingDescription",  "LO", "1" },    { Tag(0x0018, 0x1401),
+          "Acquisition Device Processing Code", "AcquisitionDeviceProcessingCode",  "LO", "1" },    { Tag(0x0018, 0x1402),
+          "Cassette Orientation", "CassetteOrientation",  "CS", "1" },    { Tag(0x0018, 0x1403),
+          "Cassette Size", "CassetteSize",  "CS", "1" },    { Tag(0x0018, 0x1404),
+          "Exposures on Plate", "ExposuresOnPlate",  "US", "1" },    { Tag(0x0018, 0x1405),
+          "Relative X-Ray Exposure", "RelativeXRayExposure",  "IS", "1" },    { Tag(0x0018, 0x1411),
+          "Exposure Index", "ExposureIndex",  "DS", "1" },    { Tag(0x0018, 0x1412),
+          "Target Exposure Index", "TargetExposureIndex",  "DS", "1" },    { Tag(0x0018, 0x1413),
+          "Deviation Index", "DeviationIndex",  "DS", "1" },    { Tag(0x0018, 0x1450),
+          "Column Angulation", "ColumnAngulation",  "DS", "1" },    { Tag(0x0018, 0x1460),
+          "Tomo Layer Height", "TomoLayerHeight",  "DS", "1" },    { Tag(0x0018, 0x1470),
+          "Tomo Angle", "TomoAngle",  "DS", "1" },    { Tag(0x0018, 0x1480),
+          "Tomo Time", "TomoTime",  "DS", "1" },    { Tag(0x0018, 0x1490),
+          "Tomo Type", "TomoType",  "CS", "1" },    { Tag(0x0018, 0x1491),
+          "Tomo Class", "TomoClass",  "CS", "1" },    { Tag(0x0018, 0x1495),
+          "Number of Tomosynthesis Source Images", "NumberOfTomosynthesisSourceImages",  "IS", "1" },    { Tag(0x0018, 0x1500),
+          "Positioner Motion", "PositionerMotion",  "CS", "1" },    { Tag(0x0018, 0x1508),
+          "Positioner Type", "PositionerType",  "CS", "1" },    { Tag(0x0018, 0x1510),
+          "Positioner Primary Angle", "PositionerPrimaryAngle",  "DS", "1" },    { Tag(0x0018, 0x1511),
+          "Positioner Secondary Angle", "PositionerSecondaryAngle",  "DS", "1" },    { Tag(0x0018, 0x1520),
+          "Positioner Primary Angle Increment", "PositionerPrimaryAngleIncrement",  "DS", "1-n" },    { Tag(0x0018, 0x1521),
+          "Positioner Secondary Angle Increment", "PositionerSecondaryAngleIncrement",  "DS", "1-n" },    { Tag(0x0018, 0x1530),
+          "Detector Primary Angle", "DetectorPrimaryAngle",  "DS", "1" },    { Tag(0x0018, 0x1531),
+          "Detector Secondary Angle", "DetectorSecondaryAngle",  "DS", "1" },    { Tag(0x0018, 0x1600),
+          "Shutter Shape", "ShutterShape",  "CS", "1-3" },    { Tag(0x0018, 0x1602),
+          "Shutter Left Vertical Edge", "ShutterLeftVerticalEdge",  "IS", "1" },    { Tag(0x0018, 0x1604),
+          "Shutter Right Vertical Edge", "ShutterRightVerticalEdge",  "IS", "1" },    { Tag(0x0018, 0x1606),
+          "Shutter Upper Horizontal Edge", "ShutterUpperHorizontalEdge",  "IS", "1" },    { Tag(0x0018, 0x1608),
+          "Shutter Lower Horizontal Edge", "ShutterLowerHorizontalEdge",  "IS", "1" },    { Tag(0x0018, 0x1610),
+          "Center of Circular Shutter", "CenterOfCircularShutter",  "IS", "2" },    { Tag(0x0018, 0x1612),
+          "Radius of Circular Shutter", "RadiusOfCircularShutter",  "IS", "1" },    { Tag(0x0018, 0x1620),
+          "Vertices of the Polygonal Shutter", "VerticesOfThePolygonalShutter",  "IS", "2-2n" },    { Tag(0x0018, 0x1622),
+          "Shutter Presentation Value", "ShutterPresentationValue",  "US", "1" },    { Tag(0x0018, 0x1623),
+          "Shutter Overlay Group", "ShutterOverlayGroup",  "US", "1" },    { Tag(0x0018, 0x1624),
+          "Shutter Presentation Color CIELab Value", "ShutterPresentationColorCIELabValue",  "US", "3" },    { Tag(0x0018, 0x1700),
+          "Collimator Shape", "CollimatorShape",  "CS", "1-3" },    { Tag(0x0018, 0x1702),
+          "Collimator Left Vertical Edge", "CollimatorLeftVerticalEdge",  "IS", "1" },    { Tag(0x0018, 0x1704),
+          "Collimator Right Vertical Edge", "CollimatorRightVerticalEdge",  "IS", "1" },    { Tag(0x0018, 0x1706),
+          "Collimator Upper Horizontal Edge", "CollimatorUpperHorizontalEdge",  "IS", "1" },    { Tag(0x0018, 0x1708),
+          "Collimator Lower Horizontal Edge", "CollimatorLowerHorizontalEdge",  "IS", "1" },    { Tag(0x0018, 0x1710),
+          "Center of Circular Collimator", "CenterOfCircularCollimator",  "IS", "2" },    { Tag(0x0018, 0x1712),
+          "Radius of Circular Collimator", "RadiusOfCircularCollimator",  "IS", "1" },    { Tag(0x0018, 0x1720),
+          "Vertices of the Polygonal Collimator", "VerticesOfThePolygonalCollimator",  "IS", "2-2n" },    { Tag(0x0018, 0x1800),
+          "Acquisition Time Synchronized", "AcquisitionTimeSynchronized",  "CS", "1" },    { Tag(0x0018, 0x1801),
+          "Time Source", "TimeSource",  "SH", "1" },    { Tag(0x0018, 0x1802),
+          "Time Distribution Protocol", "TimeDistributionProtocol",  "CS", "1" },    { Tag(0x0018, 0x1803),
+          "NTP Source Address", "NTPSourceAddress",  "LO", "1" },    { Tag(0x0018, 0x2001),
+          "Page Number Vector", "PageNumberVector",  "IS", "1-n" },    { Tag(0x0018, 0x2002),
+          "Frame Label Vector", "FrameLabelVector",  "SH", "1-n" },    { Tag(0x0018, 0x2003),
+          "Frame Primary Angle Vector", "FramePrimaryAngleVector",  "DS", "1-n" },    { Tag(0x0018, 0x2004),
+          "Frame Secondary Angle Vector", "FrameSecondaryAngleVector",  "DS", "1-n" },    { Tag(0x0018, 0x2005),
+          "Slice Location Vector", "SliceLocationVector",  "DS", "1-n" },    { Tag(0x0018, 0x2006),
+          "Display Window Label Vector", "DisplayWindowLabelVector",  "SH", "1-n" },    { Tag(0x0018, 0x2010),
+          "Nominal Scanned Pixel Spacing", "NominalScannedPixelSpacing",  "DS", "2" },    { Tag(0x0018, 0x2020),
+          "Digitizing Device Transport Direction", "DigitizingDeviceTransportDirection",  "CS", "1" },    { Tag(0x0018, 0x2030),
+          "Rotation of Scanned Film", "RotationOfScannedFilm",  "DS", "1" },    { Tag(0x0018, 0x2041),
+          "Biopsy Target Sequence", "BiopsyTargetSequence",  "SQ", "1" },    { Tag(0x0018, 0x2042),
+          "Target UID", "TargetUID",  "UI", "1" },    { Tag(0x0018, 0x2043),
+          "Localizing Cursor Position", "LocalizingCursorPosition",  "FL", "2" },    { Tag(0x0018, 0x2044),
+          "Calculated Target Position", "CalculatedTargetPosition",  "FL", "3" },    { Tag(0x0018, 0x2045),
+          "Target Label", "TargetLabel",  "SH", "1" },    { Tag(0x0018, 0x2046),
+          "Displayed Z Value", "DisplayedZValue",  "FL", "1" },    { Tag(0x0018, 0x3100),
+          "IVUS Acquisition", "IVUSAcquisition",  "CS", "1" },    { Tag(0x0018, 0x3101),
+          "IVUS Pullback Rate", "IVUSPullbackRate",  "DS", "1" },    { Tag(0x0018, 0x3102),
+          "IVUS Gated Rate", "IVUSGatedRate",  "DS", "1" },    { Tag(0x0018, 0x3103),
+          "IVUS Pullback Start Frame Number", "IVUSPullbackStartFrameNumber",  "IS", "1" },    { Tag(0x0018, 0x3104),
+          "IVUS Pullback Stop Frame Number", "IVUSPullbackStopFrameNumber",  "IS", "1" },    { Tag(0x0018, 0x3105),
+          "Lesion Number", "LesionNumber",  "IS", "1-n" },    { Tag(0x0018, 0x4000),
+          "Acquisition Comments", "AcquisitionComments",  "LT", "1" },    { Tag(0x0018, 0x5000),
+          "Output Power", "OutputPower",  "SH", "1-n" },    { Tag(0x0018, 0x5010),
+          "Transducer Data", "TransducerData",  "LO", "1-n" },    { Tag(0x0018, 0x5012),
+          "Focus Depth", "FocusDepth",  "DS", "1" },    { Tag(0x0018, 0x5020),
+          "Processing Function", "ProcessingFunction",  "LO", "1" },    { Tag(0x0018, 0x5021),
+          "Postprocessing Function", "PostprocessingFunction",  "LO", "1" },    { Tag(0x0018, 0x5022),
+          "Mechanical Index", "MechanicalIndex",  "DS", "1" },    { Tag(0x0018, 0x5024),
+          "Bone Thermal Index", "BoneThermalIndex",  "DS", "1" },    { Tag(0x0018, 0x5026),
+          "Cranial Thermal Index", "CranialThermalIndex",  "DS", "1" },    { Tag(0x0018, 0x5027),
+          "Soft Tissue Thermal Index", "SoftTissueThermalIndex",  "DS", "1" },    { Tag(0x0018, 0x5028),
+          "Soft Tissue-focus Thermal Index", "SoftTissueFocusThermalIndex",  "DS", "1" },    { Tag(0x0018, 0x5029),
+          "Soft Tissue-surface Thermal Index", "SoftTissueSurfaceThermalIndex",  "DS", "1" },    { Tag(0x0018, 0x5030),
+          "Dynamic Range", "DynamicRange",  "DS", "1" },    { Tag(0x0018, 0x5040),
+          "Total Gain", "TotalGain",  "DS", "1" },    { Tag(0x0018, 0x5050),
+          "Depth of Scan Field", "DepthOfScanField",  "IS", "1" },    { Tag(0x0018, 0x5100),
+          "Patient Position", "PatientPosition",  "CS", "1" },    { Tag(0x0018, 0x5101),
+          "View Position", "ViewPosition",  "CS", "1" },    { Tag(0x0018, 0x5104),
+          "Projection Eponymous Name Code Sequence", "ProjectionEponymousNameCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x5210),
+          "Image Transformation Matrix", "ImageTransformationMatrix",  "DS", "6" },    { Tag(0x0018, 0x5212),
+          "Image Translation Vector", "ImageTranslationVector",  "DS", "3" },    { Tag(0x0018, 0x6000),
+          "Sensitivity", "Sensitivity",  "DS", "1" },    { Tag(0x0018, 0x6011),
+          "Sequence of Ultrasound Regions", "SequenceOfUltrasoundRegions",  "SQ", "1" },    { Tag(0x0018, 0x6012),
+          "Region Spatial Format", "RegionSpatialFormat",  "US", "1" },    { Tag(0x0018, 0x6014),
+          "Region Data Type", "RegionDataType",  "US", "1" },    { Tag(0x0018, 0x6016),
+          "Region Flags", "RegionFlags",  "UL", "1" },    { Tag(0x0018, 0x6018),
+          "Region Location Min X0", "RegionLocationMinX0",  "UL", "1" },    { Tag(0x0018, 0x601a),
+          "Region Location Min Y0", "RegionLocationMinY0",  "UL", "1" },    { Tag(0x0018, 0x601c),
+          "Region Location Max X1", "RegionLocationMaxX1",  "UL", "1" },    { Tag(0x0018, 0x601e),
+          "Region Location Max Y1", "RegionLocationMaxY1",  "UL", "1" },    { Tag(0x0018, 0x6020),
+          "Reference Pixel X0", "ReferencePixelX0",  "SL", "1" },    { Tag(0x0018, 0x6022),
+          "Reference Pixel Y0", "ReferencePixelY0",  "SL", "1" },    { Tag(0x0018, 0x6024),
+          "Physical Units X Direction", "PhysicalUnitsXDirection",  "US", "1" },    { Tag(0x0018, 0x6026),
+          "Physical Units Y Direction", "PhysicalUnitsYDirection",  "US", "1" },    { Tag(0x0018, 0x6028),
+          "Reference Pixel Physical Value X", "ReferencePixelPhysicalValueX",  "FD", "1" },    { Tag(0x0018, 0x602a),
+          "Reference Pixel Physical Value Y", "ReferencePixelPhysicalValueY",  "FD", "1" },    { Tag(0x0018, 0x602c),
+          "Physical Delta X", "PhysicalDeltaX",  "FD", "1" },    { Tag(0x0018, 0x602e),
+          "Physical Delta Y", "PhysicalDeltaY",  "FD", "1" },    { Tag(0x0018, 0x6030),
+          "Transducer Frequency", "TransducerFrequency",  "UL", "1" },    { Tag(0x0018, 0x6031),
+          "Transducer Type", "TransducerType",  "CS", "1" },    { Tag(0x0018, 0x6032),
+          "Pulse Repetition Frequency", "PulseRepetitionFrequency",  "UL", "1" },    { Tag(0x0018, 0x6034),
+          "Doppler Correction Angle", "DopplerCorrectionAngle",  "FD", "1" },    { Tag(0x0018, 0x6036),
+          "Steering Angle", "SteeringAngle",  "FD", "1" },    { Tag(0x0018, 0x6038),
+          "Doppler Sample Volume X Position (Retired)", "DopplerSampleVolumeXPositionRetired",  "UL", "1" },    { Tag(0x0018, 0x6039),
+          "Doppler Sample Volume X Position", "DopplerSampleVolumeXPosition",  "SL", "1" },    { Tag(0x0018, 0x603a),
+          "Doppler Sample Volume Y Position (Retired)", "DopplerSampleVolumeYPositionRetired",  "UL", "1" },    { Tag(0x0018, 0x603b),
+          "Doppler Sample Volume Y Position", "DopplerSampleVolumeYPosition",  "SL", "1" },    { Tag(0x0018, 0x603c),
+          "TM-Line Position X0 (Retired)", "TMLinePositionX0Retired",  "UL", "1" },    { Tag(0x0018, 0x603d),
+          "TM-Line Position X0", "TMLinePositionX0",  "SL", "1" },    { Tag(0x0018, 0x603e),
+          "TM-Line Position Y0 (Retired)", "TMLinePositionY0Retired",  "UL", "1" },    { Tag(0x0018, 0x603f),
+          "TM-Line Position Y0", "TMLinePositionY0",  "SL", "1" },    { Tag(0x0018, 0x6040),
+          "TM-Line Position X1 (Retired)", "TMLinePositionX1Retired",  "UL", "1" },    { Tag(0x0018, 0x6041),
+          "TM-Line Position X1", "TMLinePositionX1",  "SL", "1" },    { Tag(0x0018, 0x6042),
+          "TM-Line Position Y1 (Retired)", "TMLinePositionY1Retired",  "UL", "1" },    { Tag(0x0018, 0x6043),
+          "TM-Line Position Y1", "TMLinePositionY1",  "SL", "1" },    { Tag(0x0018, 0x6044),
+          "Pixel Component Organization", "PixelComponentOrganization",  "US", "1" },    { Tag(0x0018, 0x6046),
+          "Pixel Component Mask", "PixelComponentMask",  "UL", "1" },    { Tag(0x0018, 0x6048),
+          "Pixel Component Range Start", "PixelComponentRangeStart",  "UL", "1" },    { Tag(0x0018, 0x604a),
+          "Pixel Component Range Stop", "PixelComponentRangeStop",  "UL", "1" },    { Tag(0x0018, 0x604c),
+          "Pixel Component Physical Units", "PixelComponentPhysicalUnits",  "US", "1" },    { Tag(0x0018, 0x604e),
+          "Pixel Component Data Type", "PixelComponentDataType",  "US", "1" },    { Tag(0x0018, 0x6050),
+          "Number of Table Break Points", "NumberOfTableBreakPoints",  "UL", "1" },    { Tag(0x0018, 0x6052),
+          "Table of X Break Points", "TableOfXBreakPoints",  "UL", "1-n" },    { Tag(0x0018, 0x6054),
+          "Table of Y Break Points", "TableOfYBreakPoints",  "FD", "1-n" },    { Tag(0x0018, 0x6056),
+          "Number of Table Entries", "NumberOfTableEntries",  "UL", "1" },    { Tag(0x0018, 0x6058),
+          "Table of Pixel Values", "TableOfPixelValues",  "UL", "1-n" },    { Tag(0x0018, 0x605a),
+          "Table of Parameter Values", "TableOfParameterValues",  "FL", "1-n" },    { Tag(0x0018, 0x6060),
+          "R Wave Time Vector", "RWaveTimeVector",  "FL", "1-n" },    { Tag(0x0018, 0x7000),
+          "Detector Conditions Nominal Flag", "DetectorConditionsNominalFlag",  "CS", "1" },    { Tag(0x0018, 0x7001),
+          "Detector Temperature", "DetectorTemperature",  "DS", "1" },    { Tag(0x0018, 0x7004),
+          "Detector Type", "DetectorType",  "CS", "1" },    { Tag(0x0018, 0x7005),
+          "Detector Configuration", "DetectorConfiguration",  "CS", "1" },    { Tag(0x0018, 0x7006),
+          "Detector Description", "DetectorDescription",  "LT", "1" },    { Tag(0x0018, 0x7008),
+          "Detector Mode", "DetectorMode",  "LT", "1" },    { Tag(0x0018, 0x700a),
+          "Detector ID", "DetectorID",  "SH", "1" },    { Tag(0x0018, 0x700c),
+          "Date of Last Detector Calibration", "DateOfLastDetectorCalibration",  "DA", "1" },    { Tag(0x0018, 0x700e),
+          "Time of Last Detector Calibration", "TimeOfLastDetectorCalibration",  "TM", "1" },    { Tag(0x0018, 0x7010),
+          "Exposures on Detector Since Last Calibration", "ExposuresOnDetectorSinceLastCalibration",  "IS", "1" },    { Tag(0x0018, 0x7011),
+          "Exposures on Detector Since Manufactured", "ExposuresOnDetectorSinceManufactured",  "IS", "1" },    { Tag(0x0018, 0x7012),
+          "Detector Time Since Last Exposure", "DetectorTimeSinceLastExposure",  "DS", "1" },    { Tag(0x0018, 0x7014),
+          "Detector Active Time", "DetectorActiveTime",  "DS", "1" },    { Tag(0x0018, 0x7016),
+          "Detector Activation Offset From Exposure", "DetectorActivationOffsetFromExposure",  "DS", "1" },    { Tag(0x0018, 0x701a),
+          "Detector Binning", "DetectorBinning",  "DS", "2" },    { Tag(0x0018, 0x7020),
+          "Detector Element Physical Size", "DetectorElementPhysicalSize",  "DS", "2" },    { Tag(0x0018, 0x7022),
+          "Detector Element Spacing", "DetectorElementSpacing",  "DS", "2" },    { Tag(0x0018, 0x7024),
+          "Detector Active Shape", "DetectorActiveShape",  "CS", "1" },    { Tag(0x0018, 0x7026),
+          "Detector Active Dimension(s)", "DetectorActiveDimensions",  "DS", "1-2" },    { Tag(0x0018, 0x7028),
+          "Detector Active Origin", "DetectorActiveOrigin",  "DS", "2" },    { Tag(0x0018, 0x702a),
+          "Detector Manufacturer Name", "DetectorManufacturerName",  "LO", "1" },    { Tag(0x0018, 0x702b),
+          "Detector Manufacturer's Model Name", "DetectorManufacturerModelName",  "LO", "1" },    { Tag(0x0018, 0x7030),
+          "Field of View Origin", "FieldOfViewOrigin",  "DS", "2" },    { Tag(0x0018, 0x7032),
+          "Field of View Rotation", "FieldOfViewRotation",  "DS", "1" },    { Tag(0x0018, 0x7034),
+          "Field of View Horizontal Flip", "FieldOfViewHorizontalFlip",  "CS", "1" },    { Tag(0x0018, 0x7036),
+          "Pixel Data Area Origin Relative To FOV", "PixelDataAreaOriginRelativeToFOV",  "FL", "2" },    { Tag(0x0018, 0x7038),
+          "Pixel Data Area Rotation Angle Relative To FOV", "PixelDataAreaRotationAngleRelativeToFOV",  "FL", "1" },    { Tag(0x0018, 0x7040),
+          "Grid Absorbing Material", "GridAbsorbingMaterial",  "LT", "1" },    { Tag(0x0018, 0x7041),
+          "Grid Spacing Material", "GridSpacingMaterial",  "LT", "1" },    { Tag(0x0018, 0x7042),
+          "Grid Thickness", "GridThickness",  "DS", "1" },    { Tag(0x0018, 0x7044),
+          "Grid Pitch", "GridPitch",  "DS", "1" },    { Tag(0x0018, 0x7046),
+          "Grid Aspect Ratio", "GridAspectRatio",  "IS", "2" },    { Tag(0x0018, 0x7048),
+          "Grid Period", "GridPeriod",  "DS", "1" },    { Tag(0x0018, 0x704c),
+          "Grid Focal Distance", "GridFocalDistance",  "DS", "1" },    { Tag(0x0018, 0x7050),
+          "Filter Material", "FilterMaterial",  "CS", "1-n" },    { Tag(0x0018, 0x7052),
+          "Filter Thickness Minimum", "FilterThicknessMinimum",  "DS", "1-n" },    { Tag(0x0018, 0x7054),
+          "Filter Thickness Maximum", "FilterThicknessMaximum",  "DS", "1-n" },    { Tag(0x0018, 0x7056),
+          "Filter Beam Path Length Minimum", "FilterBeamPathLengthMinimum",  "FL", "1-n" },    { Tag(0x0018, 0x7058),
+          "Filter Beam Path Length Maximum", "FilterBeamPathLengthMaximum",  "FL", "1-n" },    { Tag(0x0018, 0x7060),
+          "Exposure Control Mode", "ExposureControlMode",  "CS", "1" },    { Tag(0x0018, 0x7062),
+          "Exposure Control Mode Description", "ExposureControlModeDescription",  "LT", "1" },    { Tag(0x0018, 0x7064),
+          "Exposure Status", "ExposureStatus",  "CS", "1" },    { Tag(0x0018, 0x7065),
+          "Phototimer Setting", "PhototimerSetting",  "DS", "1" },    { Tag(0x0018, 0x8150),
+          "Exposure Time in uS", "ExposureTimeInuS",  "DS", "1" },    { Tag(0x0018, 0x8151),
+          "X-Ray Tube Current in uA", "XRayTubeCurrentInuA",  "DS", "1" },    { Tag(0x0018, 0x9004),
+          "Content Qualification", "ContentQualification",  "CS", "1" },    { Tag(0x0018, 0x9005),
+          "Pulse Sequence Name", "PulseSequenceName",  "SH", "1" },    { Tag(0x0018, 0x9006),
+          "MR Imaging Modifier Sequence", "MRImagingModifierSequence",  "SQ", "1" },    { Tag(0x0018, 0x9008),
+          "Echo Pulse Sequence", "EchoPulseSequence",  "CS", "1" },    { Tag(0x0018, 0x9009),
+          "Inversion Recovery", "InversionRecovery",  "CS", "1" },    { Tag(0x0018, 0x9010),
+          "Flow Compensation", "FlowCompensation",  "CS", "1" },    { Tag(0x0018, 0x9011),
+          "Multiple Spin Echo", "MultipleSpinEcho",  "CS", "1" },    { Tag(0x0018, 0x9012),
+          "Multi-planar Excitation", "MultiPlanarExcitation",  "CS", "1" },    { Tag(0x0018, 0x9014),
+          "Phase Contrast", "PhaseContrast",  "CS", "1" },    { Tag(0x0018, 0x9015),
+          "Time of Flight Contrast", "TimeOfFlightContrast",  "CS", "1" },    { Tag(0x0018, 0x9016),
+          "Spoiling", "Spoiling",  "CS", "1" },    { Tag(0x0018, 0x9017),
+          "Steady State Pulse Sequence", "SteadyStatePulseSequence",  "CS", "1" },    { Tag(0x0018, 0x9018),
+          "Echo Planar Pulse Sequence", "EchoPlanarPulseSequence",  "CS", "1" },    { Tag(0x0018, 0x9019),
+          "Tag Angle First Axis", "TagAngleFirstAxis",  "FD", "1" },    { Tag(0x0018, 0x9020),
+          "Magnetization Transfer", "MagnetizationTransfer",  "CS", "1" },    { Tag(0x0018, 0x9021),
+          "T2 Preparation", "T2Preparation",  "CS", "1" },    { Tag(0x0018, 0x9022),
+          "Blood Signal Nulling", "BloodSignalNulling",  "CS", "1" },    { Tag(0x0018, 0x9024),
+          "Saturation Recovery", "SaturationRecovery",  "CS", "1" },    { Tag(0x0018, 0x9025),
+          "Spectrally Selected Suppression", "SpectrallySelectedSuppression",  "CS", "1" },    { Tag(0x0018, 0x9026),
+          "Spectrally Selected Excitation", "SpectrallySelectedExcitation",  "CS", "1" },    { Tag(0x0018, 0x9027),
+          "Spatial Pre-saturation", "SpatialPresaturation",  "CS", "1" },    { Tag(0x0018, 0x9028),
+          "Tagging", "Tagging",  "CS", "1" },    { Tag(0x0018, 0x9029),
+          "Oversampling Phase", "OversamplingPhase",  "CS", "1" },    { Tag(0x0018, 0x9030),
+          "Tag Spacing First Dimension", "TagSpacingFirstDimension",  "FD", "1" },    { Tag(0x0018, 0x9032),
+          "Geometry of k-Space Traversal", "GeometryOfKSpaceTraversal",  "CS", "1" },    { Tag(0x0018, 0x9033),
+          "Segmented k-Space Traversal", "SegmentedKSpaceTraversal",  "CS", "1" },    { Tag(0x0018, 0x9034),
+          "Rectilinear Phase Encode Reordering", "RectilinearPhaseEncodeReordering",  "CS", "1" },    { Tag(0x0018, 0x9035),
+          "Tag Thickness", "TagThickness",  "FD", "1" },    { Tag(0x0018, 0x9036),
+          "Partial Fourier Direction", "PartialFourierDirection",  "CS", "1" },    { Tag(0x0018, 0x9037),
+          "Cardiac Synchronization Technique", "CardiacSynchronizationTechnique",  "CS", "1" },    { Tag(0x0018, 0x9041),
+          "Receive Coil Manufacturer Name", "ReceiveCoilManufacturerName",  "LO", "1" },    { Tag(0x0018, 0x9042),
+          "MR Receive Coil Sequence", "MRReceiveCoilSequence",  "SQ", "1" },    { Tag(0x0018, 0x9043),
+          "Receive Coil Type", "ReceiveCoilType",  "CS", "1" },    { Tag(0x0018, 0x9044),
+          "Quadrature Receive Coil", "QuadratureReceiveCoil",  "CS", "1" },    { Tag(0x0018, 0x9045),
+          "Multi-Coil Definition Sequence", "MultiCoilDefinitionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9046),
+          "Multi-Coil Configuration", "MultiCoilConfiguration",  "LO", "1" },    { Tag(0x0018, 0x9047),
+          "Multi-Coil Element Name", "MultiCoilElementName",  "SH", "1" },    { Tag(0x0018, 0x9048),
+          "Multi-Coil Element Used", "MultiCoilElementUsed",  "CS", "1" },    { Tag(0x0018, 0x9049),
+          "MR Transmit Coil Sequence", "MRTransmitCoilSequence",  "SQ", "1" },    { Tag(0x0018, 0x9050),
+          "Transmit Coil Manufacturer Name", "TransmitCoilManufacturerName",  "LO", "1" },    { Tag(0x0018, 0x9051),
+          "Transmit Coil Type", "TransmitCoilType",  "CS", "1" },    { Tag(0x0018, 0x9052),
+          "Spectral Width", "SpectralWidth",  "FD", "1-2" },    { Tag(0x0018, 0x9053),
+          "Chemical Shift Reference", "ChemicalShiftReference",  "FD", "1-2" },    { Tag(0x0018, 0x9054),
+          "Volume Localization Technique", "VolumeLocalizationTechnique",  "CS", "1" },    { Tag(0x0018, 0x9058),
+          "MR Acquisition Frequency Encoding Steps", "MRAcquisitionFrequencyEncodingSteps",  "US", "1" },    { Tag(0x0018, 0x9059),
+          "De-coupling", "Decoupling",  "CS", "1" },    { Tag(0x0018, 0x9060),
+          "De-coupled Nucleus", "DecoupledNucleus",  "CS", "1-2" },    { Tag(0x0018, 0x9061),
+          "De-coupling Frequency", "DecouplingFrequency",  "FD", "1-2" },    { Tag(0x0018, 0x9062),
+          "De-coupling Method", "DecouplingMethod",  "CS", "1" },    { Tag(0x0018, 0x9063),
+          "De-coupling Chemical Shift Reference", "DecouplingChemicalShiftReference",  "FD", "1-2" },    { Tag(0x0018, 0x9064),
+          "k-space Filtering", "KSpaceFiltering",  "CS", "1" },    { Tag(0x0018, 0x9065),
+          "Time Domain Filtering", "TimeDomainFiltering",  "CS", "1-2" },    { Tag(0x0018, 0x9066),
+          "Number of Zero Fills", "NumberOfZeroFills",  "US", "1-2" },    { Tag(0x0018, 0x9067),
+          "Baseline Correction", "BaselineCorrection",  "CS", "1" },    { Tag(0x0018, 0x9069),
+          "Parallel Reduction Factor In-plane", "ParallelReductionFactorInPlane",  "FD", "1" },    { Tag(0x0018, 0x9070),
+          "Cardiac R-R Interval Specified", "CardiacRRIntervalSpecified",  "FD", "1" },    { Tag(0x0018, 0x9073),
+          "Acquisition Duration", "AcquisitionDuration",  "FD", "1" },    { Tag(0x0018, 0x9074),
+          "Frame Acquisition DateTime", "FrameAcquisitionDateTime",  "DT", "1" },    { Tag(0x0018, 0x9075),
+          "Diffusion Directionality", "DiffusionDirectionality",  "CS", "1" },    { Tag(0x0018, 0x9076),
+          "Diffusion Gradient Direction Sequence", "DiffusionGradientDirectionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9077),
+          "Parallel Acquisition", "ParallelAcquisition",  "CS", "1" },    { Tag(0x0018, 0x9078),
+          "Parallel Acquisition Technique", "ParallelAcquisitionTechnique",  "CS", "1" },    { Tag(0x0018, 0x9079),
+          "Inversion Times", "InversionTimes",  "FD", "1-n" },    { Tag(0x0018, 0x9080),
+          "Metabolite Map Description", "MetaboliteMapDescription",  "ST", "1" },    { Tag(0x0018, 0x9081),
+          "Partial Fourier", "PartialFourier",  "CS", "1" },    { Tag(0x0018, 0x9082),
+          "Effective Echo Time", "EffectiveEchoTime",  "FD", "1" },    { Tag(0x0018, 0x9083),
+          "Metabolite Map Code Sequence", "MetaboliteMapCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9084),
+          "Chemical Shift Sequence", "ChemicalShiftSequence",  "SQ", "1" },    { Tag(0x0018, 0x9085),
+          "Cardiac Signal Source", "CardiacSignalSource",  "CS", "1" },    { Tag(0x0018, 0x9087),
+          "Diffusion b-value", "DiffusionBValue",  "FD", "1" },    { Tag(0x0018, 0x9089),
+          "Diffusion Gradient Orientation", "DiffusionGradientOrientation",  "FD", "3" },    { Tag(0x0018, 0x9090),
+          "Velocity Encoding Direction", "VelocityEncodingDirection",  "FD", "3" },    { Tag(0x0018, 0x9091),
+          "Velocity Encoding Minimum Value", "VelocityEncodingMinimumValue",  "FD", "1" },    { Tag(0x0018, 0x9092),
+          "Velocity Encoding Acquisition Sequence", "VelocityEncodingAcquisitionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9093),
+          "Number of k-Space Trajectories", "NumberOfKSpaceTrajectories",  "US", "1" },    { Tag(0x0018, 0x9094),
+          "Coverage of k-Space", "CoverageOfKSpace",  "CS", "1" },    { Tag(0x0018, 0x9095),
+          "Spectroscopy Acquisition Phase Rows", "SpectroscopyAcquisitionPhaseRows",  "UL", "1" },    { Tag(0x0018, 0x9096),
+          "Parallel Reduction Factor In-plane (Retired)", "ParallelReductionFactorInPlaneRetired",  "FD", "1" },    { Tag(0x0018, 0x9098),
+          "Transmitter Frequency", "TransmitterFrequency",  "FD", "1-2" },    { Tag(0x0018, 0x9100),
+          "Resonant Nucleus", "ResonantNucleus",  "CS", "1-2" },    { Tag(0x0018, 0x9101),
+          "Frequency Correction", "FrequencyCorrection",  "CS", "1" },    { Tag(0x0018, 0x9103),
+          "MR Spectroscopy FOV/Geometry Sequence", "MRSpectroscopyFOVGeometrySequence",  "SQ", "1" },    { Tag(0x0018, 0x9104),
+          "Slab Thickness", "SlabThickness",  "FD", "1" },    { Tag(0x0018, 0x9105),
+          "Slab Orientation", "SlabOrientation",  "FD", "3" },    { Tag(0x0018, 0x9106),
+          "Mid Slab Position", "MidSlabPosition",  "FD", "3" },    { Tag(0x0018, 0x9107),
+          "MR Spatial Saturation Sequence", "MRSpatialSaturationSequence",  "SQ", "1" },    { Tag(0x0018, 0x9112),
+          "MR Timing and Related Parameters Sequence", "MRTimingAndRelatedParametersSequence",  "SQ", "1" },    { Tag(0x0018, 0x9114),
+          "MR Echo Sequence", "MREchoSequence",  "SQ", "1" },    { Tag(0x0018, 0x9115),
+          "MR Modifier Sequence", "MRModifierSequence",  "SQ", "1" },    { Tag(0x0018, 0x9117),
+          "MR Diffusion Sequence", "MRDiffusionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9118),
+          "Cardiac Synchronization Sequence", "CardiacSynchronizationSequence",  "SQ", "1" },    { Tag(0x0018, 0x9119),
+          "MR Averages Sequence", "MRAveragesSequence",  "SQ", "1" },    { Tag(0x0018, 0x9125),
+          "MR FOV/Geometry Sequence", "MRFOVGeometrySequence",  "SQ", "1" },    { Tag(0x0018, 0x9126),
+          "Volume Localization Sequence", "VolumeLocalizationSequence",  "SQ", "1" },    { Tag(0x0018, 0x9127),
+          "Spectroscopy Acquisition Data Columns", "SpectroscopyAcquisitionDataColumns",  "UL", "1" },    { Tag(0x0018, 0x9147),
+          "Diffusion Anisotropy Type", "DiffusionAnisotropyType",  "CS", "1" },    { Tag(0x0018, 0x9151),
+          "Frame Reference DateTime", "FrameReferenceDateTime",  "DT", "1" },    { Tag(0x0018, 0x9152),
+          "MR Metabolite Map Sequence", "MRMetaboliteMapSequence",  "SQ", "1" },    { Tag(0x0018, 0x9155),
+          "Parallel Reduction Factor out-of-plane", "ParallelReductionFactorOutOfPlane",  "FD", "1" },    { Tag(0x0018, 0x9159),
+          "Spectroscopy Acquisition Out-of-plane Phase Steps", "SpectroscopyAcquisitionOutOfPlanePhaseSteps",  "UL", "1" },    { Tag(0x0018, 0x9166),
+          "Bulk Motion Status", "BulkMotionStatus",  "CS", "1" },    { Tag(0x0018, 0x9168),
+          "Parallel Reduction Factor Second In-plane", "ParallelReductionFactorSecondInPlane",  "FD", "1" },    { Tag(0x0018, 0x9169),
+          "Cardiac Beat Rejection Technique", "CardiacBeatRejectionTechnique",  "CS", "1" },    { Tag(0x0018, 0x9170),
+          "Respiratory Motion Compensation Technique", "RespiratoryMotionCompensationTechnique",  "CS", "1" },    { Tag(0x0018, 0x9171),
+          "Respiratory Signal Source", "RespiratorySignalSource",  "CS", "1" },    { Tag(0x0018, 0x9172),
+          "Bulk Motion Compensation Technique", "BulkMotionCompensationTechnique",  "CS", "1" },    { Tag(0x0018, 0x9173),
+          "Bulk Motion Signal Source", "BulkMotionSignalSource",  "CS", "1" },    { Tag(0x0018, 0x9174),
+          "Applicable Safety Standard Agency", "ApplicableSafetyStandardAgency",  "CS", "1" },    { Tag(0x0018, 0x9175),
+          "Applicable Safety Standard Description", "ApplicableSafetyStandardDescription",  "LO", "1" },    { Tag(0x0018, 0x9176),
+          "Operating Mode Sequence", "OperatingModeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9177),
+          "Operating Mode Type", "OperatingModeType",  "CS", "1" },    { Tag(0x0018, 0x9178),
+          "Operating Mode", "OperatingMode",  "CS", "1" },    { Tag(0x0018, 0x9179),
+          "Specific Absorption Rate Definition", "SpecificAbsorptionRateDefinition",  "CS", "1" },    { Tag(0x0018, 0x9180),
+          "Gradient Output Type", "GradientOutputType",  "CS", "1" },    { Tag(0x0018, 0x9181),
+          "Specific Absorption Rate Value", "SpecificAbsorptionRateValue",  "FD", "1" },    { Tag(0x0018, 0x9182),
+          "Gradient Output", "GradientOutput",  "FD", "1" },    { Tag(0x0018, 0x9183),
+          "Flow Compensation Direction", "FlowCompensationDirection",  "CS", "1" },    { Tag(0x0018, 0x9184),
+          "Tagging Delay", "TaggingDelay",  "FD", "1" },    { Tag(0x0018, 0x9185),
+          "Respiratory Motion Compensation Technique Description", "RespiratoryMotionCompensationTechniqueDescription",  "ST", "1" },    { Tag(0x0018, 0x9186),
+          "Respiratory Signal Source ID", "RespiratorySignalSourceID",  "SH", "1" },    { Tag(0x0018, 0x9195),
+          "Chemical Shift Minimum Integration Limit in Hz", "ChemicalShiftMinimumIntegrationLimitInHz",  "FD", "1" },    { Tag(0x0018, 0x9196),
+          "Chemical Shift Maximum Integration Limit in Hz", "ChemicalShiftMaximumIntegrationLimitInHz",  "FD", "1" },    { Tag(0x0018, 0x9197),
+          "MR Velocity Encoding Sequence", "MRVelocityEncodingSequence",  "SQ", "1" },    { Tag(0x0018, 0x9198),
+          "First Order Phase Correction", "FirstOrderPhaseCorrection",  "CS", "1" },    { Tag(0x0018, 0x9199),
+          "Water Referenced Phase Correction", "WaterReferencedPhaseCorrection",  "CS", "1" },    { Tag(0x0018, 0x9200),
+          "MR Spectroscopy Acquisition Type", "MRSpectroscopyAcquisitionType",  "CS", "1" },    { Tag(0x0018, 0x9214),
+          "Respiratory Cycle Position", "RespiratoryCyclePosition",  "CS", "1" },    { Tag(0x0018, 0x9217),
+          "Velocity Encoding Maximum Value", "VelocityEncodingMaximumValue",  "FD", "1" },    { Tag(0x0018, 0x9218),
+          "Tag Spacing Second Dimension", "TagSpacingSecondDimension",  "FD", "1" },    { Tag(0x0018, 0x9219),
+          "Tag Angle Second Axis", "TagAngleSecondAxis",  "SS", "1" },    { Tag(0x0018, 0x9220),
+          "Frame Acquisition Duration", "FrameAcquisitionDuration",  "FD", "1" },    { Tag(0x0018, 0x9226),
+          "MR Image Frame Type Sequence", "MRImageFrameTypeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9227),
+          "MR Spectroscopy Frame Type Sequence", "MRSpectroscopyFrameTypeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9231),
+          "MR Acquisition Phase Encoding Steps in-plane", "MRAcquisitionPhaseEncodingStepsInPlane",  "US", "1" },    { Tag(0x0018, 0x9232),
+          "MR Acquisition Phase Encoding Steps out-of-plane", "MRAcquisitionPhaseEncodingStepsOutOfPlane",  "US", "1" },    { Tag(0x0018, 0x9234),
+          "Spectroscopy Acquisition Phase Columns", "SpectroscopyAcquisitionPhaseColumns",  "UL", "1" },    { Tag(0x0018, 0x9236),
+          "Cardiac Cycle Position", "CardiacCyclePosition",  "CS", "1" },    { Tag(0x0018, 0x9239),
+          "Specific Absorption Rate Sequence", "SpecificAbsorptionRateSequence",  "SQ", "1" },    { Tag(0x0018, 0x9240),
+          "RF Echo Train Length", "RFEchoTrainLength",  "US", "1" },    { Tag(0x0018, 0x9241),
+          "Gradient Echo Train Length", "GradientEchoTrainLength",  "US", "1" },    { Tag(0x0018, 0x9250),
+          "Arterial Spin Labeling Contrast", "ArterialSpinLabelingContrast",  "CS", "1" },    { Tag(0x0018, 0x9251),
+          "MR Arterial Spin Labeling Sequence", "MRArterialSpinLabelingSequence",  "SQ", "1" },    { Tag(0x0018, 0x9252),
+          "ASL Technique Description", "ASLTechniqueDescription",  "LO", "1" },    { Tag(0x0018, 0x9253),
+          "ASL Slab Number", "ASLSlabNumber",  "US", "1" },    { Tag(0x0018, 0x9254),
+          "ASL Slab Thickness", "ASLSlabThickness",  "FD", "1" },    { Tag(0x0018, 0x9255),
+          "ASL Slab Orientation", "ASLSlabOrientation",  "FD", "3" },    { Tag(0x0018, 0x9256),
+          "ASL Mid Slab Position", "ASLMidSlabPosition",  "FD", "3" },    { Tag(0x0018, 0x9257),
+          "ASL Context", "ASLContext",  "CS", "1" },    { Tag(0x0018, 0x9258),
+          "ASL Pulse Train Duration", "ASLPulseTrainDuration",  "UL", "1" },    { Tag(0x0018, 0x9259),
+          "ASL Crusher Flag", "ASLCrusherFlag",  "CS", "1" },    { Tag(0x0018, 0x925a),
+          "ASL Crusher Flow Limit", "ASLCrusherFlowLimit",  "FD", "1" },    { Tag(0x0018, 0x925b),
+          "ASL Crusher Description", "ASLCrusherDescription",  "LO", "1" },    { Tag(0x0018, 0x925c),
+          "ASL Bolus Cut-off Flag", "ASLBolusCutoffFlag",  "CS", "1" },    { Tag(0x0018, 0x925d),
+          "ASL Bolus Cut-off Timing Sequence", "ASLBolusCutoffTimingSequence",  "SQ", "1" },    { Tag(0x0018, 0x925e),
+          "ASL Bolus Cut-off Technique", "ASLBolusCutoffTechnique",  "LO", "1" },    { Tag(0x0018, 0x925f),
+          "ASL Bolus Cut-off Delay Time", "ASLBolusCutoffDelayTime",  "UL", "1" },    { Tag(0x0018, 0x9260),
+          "ASL Slab Sequence", "ASLSlabSequence",  "SQ", "1" },    { Tag(0x0018, 0x9295),
+          "Chemical Shift Minimum Integration Limit in ppm", "ChemicalShiftMinimumIntegrationLimitInppm",  "FD", "1" },    { Tag(0x0018, 0x9296),
+          "Chemical Shift Maximum Integration Limit in ppm", "ChemicalShiftMaximumIntegrationLimitInppm",  "FD", "1" },    { Tag(0x0018, 0x9297),
+          "Water Reference Acquisition", "WaterReferenceAcquisition",  "CS", "1" },    { Tag(0x0018, 0x9298),
+          "Echo Peak Position", "EchoPeakPosition",  "IS", "1" },    { Tag(0x0018, 0x9301),
+          "CT Acquisition Type Sequence", "CTAcquisitionTypeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9302),
+          "Acquisition Type", "AcquisitionType",  "CS", "1" },    { Tag(0x0018, 0x9303),
+          "Tube Angle", "TubeAngle",  "FD", "1" },    { Tag(0x0018, 0x9304),
+          "CT Acquisition Details Sequence", "CTAcquisitionDetailsSequence",  "SQ", "1" },    { Tag(0x0018, 0x9305),
+          "Revolution Time", "RevolutionTime",  "FD", "1" },    { Tag(0x0018, 0x9306),
+          "Single Collimation Width", "SingleCollimationWidth",  "FD", "1" },    { Tag(0x0018, 0x9307),
+          "Total Collimation Width", "TotalCollimationWidth",  "FD", "1" },    { Tag(0x0018, 0x9308),
+          "CT Table Dynamics Sequence", "CTTableDynamicsSequence",  "SQ", "1" },    { Tag(0x0018, 0x9309),
+          "Table Speed", "TableSpeed",  "FD", "1" },    { Tag(0x0018, 0x9310),
+          "Table Feed per Rotation", "TableFeedPerRotation",  "FD", "1" },    { Tag(0x0018, 0x9311),
+          "Spiral Pitch Factor", "SpiralPitchFactor",  "FD", "1" },    { Tag(0x0018, 0x9312),
+          "CT Geometry Sequence", "CTGeometrySequence",  "SQ", "1" },    { Tag(0x0018, 0x9313),
+          "Data Collection Center (Patient)", "DataCollectionCenterPatient",  "FD", "3" },    { Tag(0x0018, 0x9314),
+          "CT Reconstruction Sequence", "CTReconstructionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9315),
+          "Reconstruction Algorithm", "ReconstructionAlgorithm",  "CS", "1" },    { Tag(0x0018, 0x9316),
+          "Convolution Kernel Group", "ConvolutionKernelGroup",  "CS", "1" },    { Tag(0x0018, 0x9317),
+          "Reconstruction Field of View", "ReconstructionFieldOfView",  "FD", "2" },    { Tag(0x0018, 0x9318),
+          "Reconstruction Target Center (Patient)", "ReconstructionTargetCenterPatient",  "FD", "3" },    { Tag(0x0018, 0x9319),
+          "Reconstruction Angle", "ReconstructionAngle",  "FD", "1" },    { Tag(0x0018, 0x9320),
+          "Image Filter", "ImageFilter",  "SH", "1" },    { Tag(0x0018, 0x9321),
+          "CT Exposure Sequence", "CTExposureSequence",  "SQ", "1" },    { Tag(0x0018, 0x9322),
+          "Reconstruction Pixel Spacing", "ReconstructionPixelSpacing",  "FD", "2" },    { Tag(0x0018, 0x9323),
+          "Exposure Modulation Type", "ExposureModulationType",  "CS", "1" },    { Tag(0x0018, 0x9324),
+          "Estimated Dose Saving", "EstimatedDoseSaving",  "FD", "1" },    { Tag(0x0018, 0x9325),
+          "CT X-Ray Details Sequence", "CTXRayDetailsSequence",  "SQ", "1" },    { Tag(0x0018, 0x9326),
+          "CT Position Sequence", "CTPositionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9327),
+          "Table Position", "TablePosition",  "FD", "1" },    { Tag(0x0018, 0x9328),
+          "Exposure Time in ms", "ExposureTimeInms",  "FD", "1" },    { Tag(0x0018, 0x9329),
+          "CT Image Frame Type Sequence", "CTImageFrameTypeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9330),
+          "X-Ray Tube Current in mA", "XRayTubeCurrentInmA",  "FD", "1" },    { Tag(0x0018, 0x9332),
+          "Exposure in mAs", "ExposureInmAs",  "FD", "1" },    { Tag(0x0018, 0x9333),
+          "Constant Volume Flag", "ConstantVolumeFlag",  "CS", "1" },    { Tag(0x0018, 0x9334),
+          "Fluoroscopy Flag", "FluoroscopyFlag",  "CS", "1" },    { Tag(0x0018, 0x9335),
+          "Distance Source to Data Collection Center", "DistanceSourceToDataCollectionCenter",  "FD", "1" },    { Tag(0x0018, 0x9337),
+          "Contrast/Bolus Agent Number", "ContrastBolusAgentNumber",  "US", "1" },    { Tag(0x0018, 0x9338),
+          "Contrast/Bolus Ingredient Code Sequence", "ContrastBolusIngredientCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9340),
+          "Contrast Administration Profile Sequence", "ContrastAdministrationProfileSequence",  "SQ", "1" },    { Tag(0x0018, 0x9341),
+          "Contrast/Bolus Usage Sequence", "ContrastBolusUsageSequence",  "SQ", "1" },    { Tag(0x0018, 0x9342),
+          "Contrast/Bolus Agent Administered", "ContrastBolusAgentAdministered",  "CS", "1" },    { Tag(0x0018, 0x9343),
+          "Contrast/Bolus Agent Detected", "ContrastBolusAgentDetected",  "CS", "1" },    { Tag(0x0018, 0x9344),
+          "Contrast/Bolus Agent Phase", "ContrastBolusAgentPhase",  "CS", "1" },    { Tag(0x0018, 0x9345),
+          "CTDIvol", "CTDIvol",  "FD", "1" },    { Tag(0x0018, 0x9346),
+          "CTDI Phantom Type Code Sequence", "CTDIPhantomTypeCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9351),
+          "Calcium Scoring Mass Factor Patient", "CalciumScoringMassFactorPatient",  "FL", "1" },    { Tag(0x0018, 0x9352),
+          "Calcium Scoring Mass Factor Device", "CalciumScoringMassFactorDevice",  "FL", "3" },    { Tag(0x0018, 0x9353),
+          "Energy Weighting Factor", "EnergyWeightingFactor",  "FL", "1" },    { Tag(0x0018, 0x9360),
+          "CT Additional X-Ray Source Sequence", "CTAdditionalXRaySourceSequence",  "SQ", "1" },    { Tag(0x0018, 0x9401),
+          "Projection Pixel Calibration Sequence", "ProjectionPixelCalibrationSequence",  "SQ", "1" },    { Tag(0x0018, 0x9402),
+          "Distance Source to Isocenter", "DistanceSourceToIsocenter",  "FL", "1" },    { Tag(0x0018, 0x9403),
+          "Distance Object to Table Top", "DistanceObjectToTableTop",  "FL", "1" },    { Tag(0x0018, 0x9404),
+          "Object Pixel Spacing in Center of Beam", "ObjectPixelSpacingInCenterOfBeam",  "FL", "2" },    { Tag(0x0018, 0x9405),
+          "Positioner Position Sequence", "PositionerPositionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9406),
+          "Table Position Sequence", "TablePositionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9407),
+          "Collimator Shape Sequence", "CollimatorShapeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9410),
+          "Planes in Acquisition", "PlanesInAcquisition",  "CS", "1" },    { Tag(0x0018, 0x9412),
+          "XA/XRF Frame Characteristics Sequence", "XAXRFFrameCharacteristicsSequence",  "SQ", "1" },    { Tag(0x0018, 0x9417),
+          "Frame Acquisition Sequence", "FrameAcquisitionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9420),
+          "X-Ray Receptor Type", "XRayReceptorType",  "CS", "1" },    { Tag(0x0018, 0x9423),
+          "Acquisition Protocol Name", "AcquisitionProtocolName",  "LO", "1" },    { Tag(0x0018, 0x9424),
+          "Acquisition Protocol Description", "AcquisitionProtocolDescription",  "LT", "1" },    { Tag(0x0018, 0x9425),
+          "Contrast/Bolus Ingredient Opaque", "ContrastBolusIngredientOpaque",  "CS", "1" },    { Tag(0x0018, 0x9426),
+          "Distance Receptor Plane to Detector Housing", "DistanceReceptorPlaneToDetectorHousing",  "FL", "1" },    { Tag(0x0018, 0x9427),
+          "Intensifier Active Shape", "IntensifierActiveShape",  "CS", "1" },    { Tag(0x0018, 0x9428),
+          "Intensifier Active Dimension(s)", "IntensifierActiveDimensions",  "FL", "1-2" },    { Tag(0x0018, 0x9429),
+          "Physical Detector Size", "PhysicalDetectorSize",  "FL", "2" },    { Tag(0x0018, 0x9430),
+          "Position of Isocenter Projection", "PositionOfIsocenterProjection",  "FL", "2" },    { Tag(0x0018, 0x9432),
+          "Field of View Sequence", "FieldOfViewSequence",  "SQ", "1" },    { Tag(0x0018, 0x9433),
+          "Field of View Description", "FieldOfViewDescription",  "LO", "1" },    { Tag(0x0018, 0x9434),
+          "Exposure Control Sensing Regions Sequence", "ExposureControlSensingRegionsSequence",  "SQ", "1" },    { Tag(0x0018, 0x9435),
+          "Exposure Control Sensing Region Shape", "ExposureControlSensingRegionShape",  "CS", "1" },    { Tag(0x0018, 0x9436),
+          "Exposure Control Sensing Region Left Vertical Edge", "ExposureControlSensingRegionLeftVerticalEdge",  "SS", "1" },    { Tag(0x0018, 0x9437),
+          "Exposure Control Sensing Region Right Vertical Edge", "ExposureControlSensingRegionRightVerticalEdge",  "SS", "1" },    { Tag(0x0018, 0x9438),
+          "Exposure Control Sensing Region Upper Horizontal Edge", "ExposureControlSensingRegionUpperHorizontalEdge",  "SS", "1" },    { Tag(0x0018, 0x9439),
+          "Exposure Control Sensing Region Lower Horizontal Edge", "ExposureControlSensingRegionLowerHorizontalEdge",  "SS", "1" },    { Tag(0x0018, 0x9440),
+          "Center of Circular Exposure Control Sensing Region", "CenterOfCircularExposureControlSensingRegion",  "SS", "2" },    { Tag(0x0018, 0x9441),
+          "Radius of Circular Exposure Control Sensing Region", "RadiusOfCircularExposureControlSensingRegion",  "US", "1" },    { Tag(0x0018, 0x9442),
+          "Vertices of the Polygonal Exposure Control Sensing Region", "VerticesOfThePolygonalExposureControlSensingRegion",  "SS", "2-n" },    { Tag(0x0018, 0x9447),
+          "Column Angulation (Patient)", "ColumnAngulationPatient",  "FL", "1" },    { Tag(0x0018, 0x9449),
+          "Beam Angle", "BeamAngle",  "FL", "1" },    { Tag(0x0018, 0x9451),
+          "Frame Detector Parameters Sequence", "FrameDetectorParametersSequence",  "SQ", "1" },    { Tag(0x0018, 0x9452),
+          "Calculated Anatomy Thickness", "CalculatedAnatomyThickness",  "FL", "1" },    { Tag(0x0018, 0x9455),
+          "Calibration Sequence", "CalibrationSequence",  "SQ", "1" },    { Tag(0x0018, 0x9456),
+          "Object Thickness Sequence", "ObjectThicknessSequence",  "SQ", "1" },    { Tag(0x0018, 0x9457),
+          "Plane Identification", "PlaneIdentification",  "CS", "1" },    { Tag(0x0018, 0x9461),
+          "Field of View Dimension(s) in Float", "FieldOfViewDimensionsInFloat",  "FL", "1-2" },    { Tag(0x0018, 0x9462),
+          "Isocenter Reference System Sequence", "IsocenterReferenceSystemSequence",  "SQ", "1" },    { Tag(0x0018, 0x9463),
+          "Positioner Isocenter Primary Angle", "PositionerIsocenterPrimaryAngle",  "FL", "1" },    { Tag(0x0018, 0x9464),
+          "Positioner Isocenter Secondary Angle", "PositionerIsocenterSecondaryAngle",  "FL", "1" },    { Tag(0x0018, 0x9465),
+          "Positioner Isocenter Detector Rotation Angle", "PositionerIsocenterDetectorRotationAngle",  "FL", "1" },    { Tag(0x0018, 0x9466),
+          "Table X Position to Isocenter", "TableXPositionToIsocenter",  "FL", "1" },    { Tag(0x0018, 0x9467),
+          "Table Y Position to Isocenter", "TableYPositionToIsocenter",  "FL", "1" },    { Tag(0x0018, 0x9468),
+          "Table Z Position to Isocenter", "TableZPositionToIsocenter",  "FL", "1" },    { Tag(0x0018, 0x9469),
+          "Table Horizontal Rotation Angle", "TableHorizontalRotationAngle",  "FL", "1" },    { Tag(0x0018, 0x9470),
+          "Table Head Tilt Angle", "TableHeadTiltAngle",  "FL", "1" },    { Tag(0x0018, 0x9471),
+          "Table Cradle Tilt Angle", "TableCradleTiltAngle",  "FL", "1" },    { Tag(0x0018, 0x9472),
+          "Frame Display Shutter Sequence", "FrameDisplayShutterSequence",  "SQ", "1" },    { Tag(0x0018, 0x9473),
+          "Acquired Image Area Dose Product", "AcquiredImageAreaDoseProduct",  "FL", "1" },    { Tag(0x0018, 0x9474),
+          "C-arm Positioner Tabletop Relationship", "CArmPositionerTabletopRelationship",  "CS", "1" },    { Tag(0x0018, 0x9476),
+          "X-Ray Geometry Sequence", "XRayGeometrySequence",  "SQ", "1" },    { Tag(0x0018, 0x9477),
+          "Irradiation Event Identification Sequence", "IrradiationEventIdentificationSequence",  "SQ", "1" },    { Tag(0x0018, 0x9504),
+          "X-Ray 3D Frame Type Sequence", "XRay3DFrameTypeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9506),
+          "Contributing Sources Sequence", "ContributingSourcesSequence",  "SQ", "1" },    { Tag(0x0018, 0x9507),
+          "X-Ray 3D Acquisition Sequence", "XRay3DAcquisitionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9508),
+          "Primary Positioner Scan Arc", "PrimaryPositionerScanArc",  "FL", "1" },    { Tag(0x0018, 0x9509),
+          "Secondary Positioner Scan Arc", "SecondaryPositionerScanArc",  "FL", "1" },    { Tag(0x0018, 0x9510),
+          "Primary Positioner Scan Start Angle", "PrimaryPositionerScanStartAngle",  "FL", "1" },    { Tag(0x0018, 0x9511),
+          "Secondary Positioner Scan Start Angle", "SecondaryPositionerScanStartAngle",  "FL", "1" },    { Tag(0x0018, 0x9514),
+          "Primary Positioner Increment", "PrimaryPositionerIncrement",  "FL", "1" },    { Tag(0x0018, 0x9515),
+          "Secondary Positioner Increment", "SecondaryPositionerIncrement",  "FL", "1" },    { Tag(0x0018, 0x9516),
+          "Start Acquisition DateTime", "StartAcquisitionDateTime",  "DT", "1" },    { Tag(0x0018, 0x9517),
+          "End Acquisition DateTime", "EndAcquisitionDateTime",  "DT", "1" },    { Tag(0x0018, 0x9518),
+          "Primary Positioner Increment Sign", "PrimaryPositionerIncrementSign",  "SS", "1" },    { Tag(0x0018, 0x9519),
+          "Secondary Positioner Increment Sign", "SecondaryPositionerIncrementSign",  "SS", "1" },    { Tag(0x0018, 0x9524),
+          "Application Name", "ApplicationName",  "LO", "1" },    { Tag(0x0018, 0x9525),
+          "Application Version", "ApplicationVersion",  "LO", "1" },    { Tag(0x0018, 0x9526),
+          "Application Manufacturer", "ApplicationManufacturer",  "LO", "1" },    { Tag(0x0018, 0x9527),
+          "Algorithm Type", "AlgorithmType",  "CS", "1" },    { Tag(0x0018, 0x9528),
+          "Algorithm Description", "AlgorithmDescription",  "LO", "1" },    { Tag(0x0018, 0x9530),
+          "X-Ray 3D Reconstruction Sequence", "XRay3DReconstructionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9531),
+          "Reconstruction Description", "ReconstructionDescription",  "LO", "1" },    { Tag(0x0018, 0x9538),
+          "Per Projection Acquisition Sequence", "PerProjectionAcquisitionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9541),
+          "Detector Position Sequence", "DetectorPositionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9542),
+          "X-Ray Acquisition Dose Sequence", "XRayAcquisitionDoseSequence",  "SQ", "1" },    { Tag(0x0018, 0x9543),
+          "X-Ray Source Isocenter Primary Angle", "XRaySourceIsocenterPrimaryAngle",  "FD", "1" },    { Tag(0x0018, 0x9544),
+          "X-Ray Source Isocenter Secondary Angle", "XRaySourceIsocenterSecondaryAngle",  "FD", "1" },    { Tag(0x0018, 0x9545),
+          "Breast Support Isocenter Primary Angle", "BreastSupportIsocenterPrimaryAngle",  "FD", "1" },    { Tag(0x0018, 0x9546),
+          "Breast Support Isocenter Secondary Angle", "BreastSupportIsocenterSecondaryAngle",  "FD", "1" },    { Tag(0x0018, 0x9547),
+          "Breast Support X Position to Isocenter", "BreastSupportXPositionToIsocenter",  "FD", "1" },    { Tag(0x0018, 0x9548),
+          "Breast Support Y Position to Isocenter", "BreastSupportYPositionToIsocenter",  "FD", "1" },    { Tag(0x0018, 0x9549),
+          "Breast Support Z Position to Isocenter", "BreastSupportZPositionToIsocenter",  "FD", "1" },    { Tag(0x0018, 0x9550),
+          "Detector Isocenter Primary Angle", "DetectorIsocenterPrimaryAngle",  "FD", "1" },    { Tag(0x0018, 0x9551),
+          "Detector Isocenter Secondary Angle", "DetectorIsocenterSecondaryAngle",  "FD", "1" },    { Tag(0x0018, 0x9552),
+          "Detector X Position to Isocenter", "DetectorXPositionToIsocenter",  "FD", "1" },    { Tag(0x0018, 0x9553),
+          "Detector Y Position to Isocenter", "DetectorYPositionToIsocenter",  "FD", "1" },    { Tag(0x0018, 0x9554),
+          "Detector Z Position to Isocenter", "DetectorZPositionToIsocenter",  "FD", "1" },    { Tag(0x0018, 0x9555),
+          "X-Ray Grid Sequence", "XRayGridSequence",  "SQ", "1" },    { Tag(0x0018, 0x9556),
+          "X-Ray Filter Sequence", "XRayFilterSequence",  "SQ", "1" },    { Tag(0x0018, 0x9557),
+          "Detector Active Area TLHC Position", "DetectorActiveAreaTLHCPosition",  "FD", "3" },    { Tag(0x0018, 0x9558),
+          "Detector Active Area Orientation", "DetectorActiveAreaOrientation",  "FD", "6" },    { Tag(0x0018, 0x9559),
+          "Positioner Primary Angle Direction", "PositionerPrimaryAngleDirection",  "CS", "1" },    { Tag(0x0018, 0x9601),
+          "Diffusion b-matrix Sequence", "DiffusionBMatrixSequence",  "SQ", "1" },    { Tag(0x0018, 0x9602),
+          "Diffusion b-value XX", "DiffusionBValueXX",  "FD", "1" },    { Tag(0x0018, 0x9603),
+          "Diffusion b-value XY", "DiffusionBValueXY",  "FD", "1" },    { Tag(0x0018, 0x9604),
+          "Diffusion b-value XZ", "DiffusionBValueXZ",  "FD", "1" },    { Tag(0x0018, 0x9605),
+          "Diffusion b-value YY", "DiffusionBValueYY",  "FD", "1" },    { Tag(0x0018, 0x9606),
+          "Diffusion b-value YZ", "DiffusionBValueYZ",  "FD", "1" },    { Tag(0x0018, 0x9607),
+          "Diffusion b-value ZZ", "DiffusionBValueZZ",  "FD", "1" },    { Tag(0x0018, 0x9621),
+          "Functional MR Sequence", "FunctionalMRSequence",  "SQ", "1" },    { Tag(0x0018, 0x9622),
+          "Functional Settling Phase Frames Present", "FunctionalSettlingPhaseFramesPresent",  "CS", "1" },    { Tag(0x0018, 0x9623),
+          "Functional Sync Pulse", "FunctionalSyncPulse",  "DT", "1" },    { Tag(0x0018, 0x9624),
+          "Settling Phase Frame", "SettlingPhaseFrame",  "CS", "1" },    { Tag(0x0018, 0x9701),
+          "Decay Correction DateTime", "DecayCorrectionDateTime",  "DT", "1" },    { Tag(0x0018, 0x9715),
+          "Start Density Threshold", "StartDensityThreshold",  "FD", "1" },    { Tag(0x0018, 0x9716),
+          "Start Relative Density Difference Threshold", "StartRelativeDensityDifferenceThreshold",  "FD", "1" },    { Tag(0x0018, 0x9717),
+          "Start Cardiac Trigger Count Threshold", "StartCardiacTriggerCountThreshold",  "FD", "1" },    { Tag(0x0018, 0x9718),
+          "Start Respiratory Trigger Count Threshold", "StartRespiratoryTriggerCountThreshold",  "FD", "1" },    { Tag(0x0018, 0x9719),
+          "Termination Counts Threshold", "TerminationCountsThreshold",  "FD", "1" },    { Tag(0x0018, 0x9720),
+          "Termination Density Threshold", "TerminationDensityThreshold",  "FD", "1" },    { Tag(0x0018, 0x9721),
+          "Termination Relative Density Threshold", "TerminationRelativeDensityThreshold",  "FD", "1" },    { Tag(0x0018, 0x9722),
+          "Termination Time Threshold", "TerminationTimeThreshold",  "FD", "1" },    { Tag(0x0018, 0x9723),
+          "Termination Cardiac Trigger Count Threshold", "TerminationCardiacTriggerCountThreshold",  "FD", "1" },    { Tag(0x0018, 0x9724),
+          "Termination Respiratory Trigger Count Threshold", "TerminationRespiratoryTriggerCountThreshold",  "FD", "1" },    { Tag(0x0018, 0x9725),
+          "Detector Geometry", "DetectorGeometry",  "CS", "1" },    { Tag(0x0018, 0x9726),
+          "Transverse Detector Separation", "TransverseDetectorSeparation",  "FD", "1" },    { Tag(0x0018, 0x9727),
+          "Axial Detector Dimension", "AxialDetectorDimension",  "FD", "1" },    { Tag(0x0018, 0x9729),
+          "Radiopharmaceutical Agent Number", "RadiopharmaceuticalAgentNumber",  "US", "1" },    { Tag(0x0018, 0x9732),
+          "PET Frame Acquisition Sequence", "PETFrameAcquisitionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9733),
+          "PET Detector Motion Details Sequence", "PETDetectorMotionDetailsSequence",  "SQ", "1" },    { Tag(0x0018, 0x9734),
+          "PET Table Dynamics Sequence", "PETTableDynamicsSequence",  "SQ", "1" },    { Tag(0x0018, 0x9735),
+          "PET Position Sequence", "PETPositionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9736),
+          "PET Frame Correction Factors Sequence", "PETFrameCorrectionFactorsSequence",  "SQ", "1" },    { Tag(0x0018, 0x9737),
+          "Radiopharmaceutical Usage Sequence", "RadiopharmaceuticalUsageSequence",  "SQ", "1" },    { Tag(0x0018, 0x9738),
+          "Attenuation Correction Source", "AttenuationCorrectionSource",  "CS", "1" },    { Tag(0x0018, 0x9739),
+          "Number of Iterations", "NumberOfIterations",  "US", "1" },    { Tag(0x0018, 0x9740),
+          "Number of Subsets", "NumberOfSubsets",  "US", "1" },    { Tag(0x0018, 0x9749),
+          "PET Reconstruction Sequence", "PETReconstructionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9751),
+          "PET Frame Type Sequence", "PETFrameTypeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9755),
+          "Time of Flight Information Used", "TimeOfFlightInformationUsed",  "CS", "1" },    { Tag(0x0018, 0x9756),
+          "Reconstruction Type", "ReconstructionType",  "CS", "1" },    { Tag(0x0018, 0x9758),
+          "Decay Corrected", "DecayCorrected",  "CS", "1" },    { Tag(0x0018, 0x9759),
+          "Attenuation Corrected", "AttenuationCorrected",  "CS", "1" },    { Tag(0x0018, 0x9760),
+          "Scatter Corrected", "ScatterCorrected",  "CS", "1" },    { Tag(0x0018, 0x9761),
+          "Dead Time Corrected", "DeadTimeCorrected",  "CS", "1" },    { Tag(0x0018, 0x9762),
+          "Gantry Motion Corrected", "GantryMotionCorrected",  "CS", "1" },    { Tag(0x0018, 0x9763),
+          "Patient Motion Corrected", "PatientMotionCorrected",  "CS", "1" },    { Tag(0x0018, 0x9764),
+          "Count Loss Normalization Corrected", "CountLossNormalizationCorrected",  "CS", "1" },    { Tag(0x0018, 0x9765),
+          "Randoms Corrected", "RandomsCorrected",  "CS", "1" },    { Tag(0x0018, 0x9766),
+          "Non-uniform Radial Sampling Corrected", "NonUniformRadialSamplingCorrected",  "CS", "1" },    { Tag(0x0018, 0x9767),
+          "Sensitivity Calibrated", "SensitivityCalibrated",  "CS", "1" },    { Tag(0x0018, 0x9768),
+          "Detector Normalization Correction", "DetectorNormalizationCorrection",  "CS", "1" },    { Tag(0x0018, 0x9769),
+          "Iterative Reconstruction Method", "IterativeReconstructionMethod",  "CS", "1" },    { Tag(0x0018, 0x9770),
+          "Attenuation Correction Temporal Relationship", "AttenuationCorrectionTemporalRelationship",  "CS", "1" },    { Tag(0x0018, 0x9771),
+          "Patient Physiological State Sequence", "PatientPhysiologicalStateSequence",  "SQ", "1" },    { Tag(0x0018, 0x9772),
+          "Patient Physiological State Code Sequence", "PatientPhysiologicalStateCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9801),
+          "Depth(s) of Focus", "DepthsOfFocus",  "FD", "1-n" },    { Tag(0x0018, 0x9803),
+          "Excluded Intervals Sequence", "ExcludedIntervalsSequence",  "SQ", "1" },    { Tag(0x0018, 0x9804),
+          "Exclusion Start DateTime", "ExclusionStartDateTime",  "DT", "1" },    { Tag(0x0018, 0x9805),
+          "Exclusion Duration", "ExclusionDuration",  "FD", "1" },    { Tag(0x0018, 0x9806),
+          "US Image Description Sequence", "USImageDescriptionSequence",  "SQ", "1" },    { Tag(0x0018, 0x9807),
+          "Image Data Type Sequence", "ImageDataTypeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9808),
+          "Data Type", "DataType",  "CS", "1" },    { Tag(0x0018, 0x9809),
+          "Transducer Scan Pattern Code Sequence", "TransducerScanPatternCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x980b),
+          "Aliased Data Type", "AliasedDataType",  "CS", "1" },    { Tag(0x0018, 0x980c),
+          "Position Measuring Device Used", "PositionMeasuringDeviceUsed",  "CS", "1" },    { Tag(0x0018, 0x980d),
+          "Transducer Geometry Code Sequence", "TransducerGeometryCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x980e),
+          "Transducer Beam Steering Code Sequence", "TransducerBeamSteeringCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x980f),
+          "Transducer Application Code Sequence", "TransducerApplicationCodeSequence",  "SQ", "1" },    { Tag(0x0018, 0x9810),
+          "Zero Velocity Pixel Value", "ZeroVelocityPixelValue",  "US or SS", "1" },    { Tag(0x0018, 0xa001),
+          "Contributing Equipment Sequence", "ContributingEquipmentSequence",  "SQ", "1" },    { Tag(0x0018, 0xa002),
+          "Contribution DateTime", "ContributionDateTime",  "DT", "1" },    { Tag(0x0018, 0xa003),
+          "Contribution Description", "ContributionDescription",  "ST", "1" },    { Tag(0x0020, 0x000d),
+          "Study Instance UID", "StudyInstanceUID",  "UI", "1" },    { Tag(0x0020, 0x000e),
+          "Series Instance UID", "SeriesInstanceUID",  "UI", "1" },    { Tag(0x0020, 0x0010),
+          "Study ID", "StudyID",  "SH", "1" },    { Tag(0x0020, 0x0011),
+          "Series Number", "SeriesNumber",  "IS", "1" },    { Tag(0x0020, 0x0012),
+          "Acquisition Number", "AcquisitionNumber",  "IS", "1" },    { Tag(0x0020, 0x0013),
+          "Instance Number", "InstanceNumber",  "IS", "1" },    { Tag(0x0020, 0x0014),
+          "Isotope Number", "IsotopeNumber",  "IS", "1" },    { Tag(0x0020, 0x0015),
+          "Phase Number", "PhaseNumber",  "IS", "1" },    { Tag(0x0020, 0x0016),
+          "Interval Number", "IntervalNumber",  "IS", "1" },    { Tag(0x0020, 0x0017),
+          "Time Slot Number", "TimeSlotNumber",  "IS", "1" },    { Tag(0x0020, 0x0018),
+          "Angle Number", "AngleNumber",  "IS", "1" },    { Tag(0x0020, 0x0019),
+          "Item Number", "ItemNumber",  "IS", "1" },    { Tag(0x0020, 0x0020),
+          "Patient Orientation", "PatientOrientation",  "CS", "2" },    { Tag(0x0020, 0x0022),
+          "Overlay Number", "OverlayNumber",  "IS", "1" },    { Tag(0x0020, 0x0024),
+          "Curve Number", "CurveNumber",  "IS", "1" },    { Tag(0x0020, 0x0026),
+          "LUT Number", "LUTNumber",  "IS", "1" },    { Tag(0x0020, 0x0030),
+          "Image Position", "ImagePosition",  "DS", "3" },    { Tag(0x0020, 0x0032),
+          "Image Position (Patient)", "ImagePositionPatient",  "DS", "3" },    { Tag(0x0020, 0x0035),
+          "Image Orientation", "ImageOrientation",  "DS", "6" },    { Tag(0x0020, 0x0037),
+          "Image Orientation (Patient)", "ImageOrientationPatient",  "DS", "6" },    { Tag(0x0020, 0x0050),
+          "Location", "Location",  "DS", "1" },    { Tag(0x0020, 0x0052),
+          "Frame of Reference UID", "FrameOfReferenceUID",  "UI", "1" },    { Tag(0x0020, 0x0060),
+          "Laterality", "Laterality",  "CS", "1" },    { Tag(0x0020, 0x0062),
+          "Image Laterality", "ImageLaterality",  "CS", "1" },    { Tag(0x0020, 0x0070),
+          "Image Geometry Type", "ImageGeometryType",  "LO", "1" },    { Tag(0x0020, 0x0080),
+          "Masking Image", "MaskingImage",  "CS", "1-n" },    { Tag(0x0020, 0x00aa),
+          "Report Number", "ReportNumber",  "IS", "1" },    { Tag(0x0020, 0x0100),
+          "Temporal Position Identifier", "TemporalPositionIdentifier",  "IS", "1" },    { Tag(0x0020, 0x0105),
+          "Number of Temporal Positions", "NumberOfTemporalPositions",  "IS", "1" },    { Tag(0x0020, 0x0110),
+          "Temporal Resolution", "TemporalResolution",  "DS", "1" },    { Tag(0x0020, 0x0200),
+          "Synchronization Frame of Reference UID", "SynchronizationFrameOfReferenceUID",  "UI", "1" },    { Tag(0x0020, 0x0242),
+          "SOP Instance UID of Concatenation Source", "SOPInstanceUIDOfConcatenationSource",  "UI", "1" },    { Tag(0x0020, 0x1000),
+          "Series in Study", "SeriesInStudy",  "IS", "1" },    { Tag(0x0020, 0x1001),
+          "Acquisitions in Series", "AcquisitionsInSeries",  "IS", "1" },    { Tag(0x0020, 0x1002),
+          "Images in Acquisition", "ImagesInAcquisition",  "IS", "1" },    { Tag(0x0020, 0x1003),
+          "Images in Series", "ImagesInSeries",  "IS", "1" },    { Tag(0x0020, 0x1004),
+          "Acquisitions in Study", "AcquisitionsInStudy",  "IS", "1" },    { Tag(0x0020, 0x1005),
+          "Images in Study", "ImagesInStudy",  "IS", "1" },    { Tag(0x0020, 0x1020),
+          "Reference", "Reference",  "LO", "1-n" },    { Tag(0x0020, 0x1040),
+          "Position Reference Indicator", "PositionReferenceIndicator",  "LO", "1" },    { Tag(0x0020, 0x1041),
+          "Slice Location", "SliceLocation",  "DS", "1" },    { Tag(0x0020, 0x1070),
+          "Other Study Numbers", "OtherStudyNumbers",  "IS", "1-n" },    { Tag(0x0020, 0x1200),
+          "Number of Patient Related Studies", "NumberOfPatientRelatedStudies",  "IS", "1" },    { Tag(0x0020, 0x1202),
+          "Number of Patient Related Series", "NumberOfPatientRelatedSeries",  "IS", "1" },    { Tag(0x0020, 0x1204),
+          "Number of Patient Related Instances", "NumberOfPatientRelatedInstances",  "IS", "1" },    { Tag(0x0020, 0x1206),
+          "Number of Study Related Series", "NumberOfStudyRelatedSeries",  "IS", "1" },    { Tag(0x0020, 0x1208),
+          "Number of Study Related Instances", "NumberOfStudyRelatedInstances",  "IS", "1" },    { Tag(0x0020, 0x1209),
+          "Number of Series Related Instances", "NumberOfSeriesRelatedInstances",  "IS", "1" },        { Tag(0x0020, 0x3401),
+          "Modifying Device ID", "ModifyingDeviceID",  "CS", "1" },    { Tag(0x0020, 0x3402),
+          "Modified Image ID", "ModifiedImageID",  "CS", "1" },    { Tag(0x0020, 0x3403),
+          "Modified Image Date", "ModifiedImageDate",  "DA", "1" },    { Tag(0x0020, 0x3404),
+          "Modifying Device Manufacturer", "ModifyingDeviceManufacturer",  "LO", "1" },    { Tag(0x0020, 0x3405),
+          "Modified Image Time", "ModifiedImageTime",  "TM", "1" },    { Tag(0x0020, 0x3406),
+          "Modified Image Description", "ModifiedImageDescription",  "LO", "1" },    { Tag(0x0020, 0x4000),
+          "Image Comments", "ImageComments",  "LT", "1" },    { Tag(0x0020, 0x5000),
+          "Original Image Identification", "OriginalImageIdentification",  "AT", "1-n" },    { Tag(0x0020, 0x5002),
+          "Original Image Identification Nomenclature", "OriginalImageIdentificationNomenclature",  "LO", "1-n" },    { Tag(0x0020, 0x9056),
+          "Stack ID", "StackID",  "SH", "1" },    { Tag(0x0020, 0x9057),
+          "In-Stack Position Number", "InStackPositionNumber",  "UL", "1" },    { Tag(0x0020, 0x9071),
+          "Frame Anatomy Sequence", "FrameAnatomySequence",  "SQ", "1" },    { Tag(0x0020, 0x9072),
+          "Frame Laterality", "FrameLaterality",  "CS", "1" },    { Tag(0x0020, 0x9111),
+          "Frame Content Sequence", "FrameContentSequence",  "SQ", "1" },    { Tag(0x0020, 0x9113),
+          "Plane Position Sequence", "PlanePositionSequence",  "SQ", "1" },    { Tag(0x0020, 0x9116),
+          "Plane Orientation Sequence", "PlaneOrientationSequence",  "SQ", "1" },    { Tag(0x0020, 0x9128),
+          "Temporal Position Index", "TemporalPositionIndex",  "UL", "1" },    { Tag(0x0020, 0x9153),
+          "Nominal Cardiac Trigger Delay Time", "NominalCardiacTriggerDelayTime",  "FD", "1" },    { Tag(0x0020, 0x9154),
+          "Nominal Cardiac Trigger Time Prior To R-Peak", "NominalCardiacTriggerTimePriorToRPeak",  "FL", "1" },    { Tag(0x0020, 0x9155),
+          "Actual Cardiac Trigger Time Prior To R-Peak", "ActualCardiacTriggerTimePriorToRPeak",  "FL", "1" },    { Tag(0x0020, 0x9156),
+          "Frame Acquisition Number", "FrameAcquisitionNumber",  "US", "1" },    { Tag(0x0020, 0x9157),
+          "Dimension Index Values", "DimensionIndexValues",  "UL", "1-n" },    { Tag(0x0020, 0x9158),
+          "Frame Comments", "FrameComments",  "LT", "1" },    { Tag(0x0020, 0x9161),
+          "Concatenation UID", "ConcatenationUID",  "UI", "1" },    { Tag(0x0020, 0x9162),
+          "In-concatenation Number", "InConcatenationNumber",  "US", "1" },    { Tag(0x0020, 0x9163),
+          "In-concatenation Total Number", "InConcatenationTotalNumber",  "US", "1" },    { Tag(0x0020, 0x9164),
+          "Dimension Organization UID", "DimensionOrganizationUID",  "UI", "1" },    { Tag(0x0020, 0x9165),
+          "Dimension Index Pointer", "DimensionIndexPointer",  "AT", "1" },    { Tag(0x0020, 0x9167),
+          "Functional Group Pointer", "FunctionalGroupPointer",  "AT", "1" },    { Tag(0x0020, 0x9170),
+          "Unassigned Shared Converted Attributes Sequence", "UnassignedSharedConvertedAttributesSequence",  "SQ", "1" },    { Tag(0x0020, 0x9171),
+          "Unassigned Per-Frame Converted Attributes Sequence", "UnassignedPerFrameConvertedAttributesSequence",  "SQ", "1" },    { Tag(0x0020, 0x9172),
+          "Conversion Source Attributes Sequence", "ConversionSourceAttributesSequence",  "SQ", "1" },    { Tag(0x0020, 0x9213),
+          "Dimension Index Private Creator", "DimensionIndexPrivateCreator",  "LO", "1" },    { Tag(0x0020, 0x9221),
+          "Dimension Organization Sequence", "DimensionOrganizationSequence",  "SQ", "1" },    { Tag(0x0020, 0x9222),
+          "Dimension Index Sequence", "DimensionIndexSequence",  "SQ", "1" },    { Tag(0x0020, 0x9228),
+          "Concatenation Frame Offset Number", "ConcatenationFrameOffsetNumber",  "UL", "1" },    { Tag(0x0020, 0x9238),
+          "Functional Group Private Creator", "FunctionalGroupPrivateCreator",  "LO", "1" },    { Tag(0x0020, 0x9241),
+          "Nominal Percentage of Cardiac Phase", "NominalPercentageOfCardiacPhase",  "FL", "1" },    { Tag(0x0020, 0x9245),
+          "Nominal Percentage of Respiratory Phase", "NominalPercentageOfRespiratoryPhase",  "FL", "1" },    { Tag(0x0020, 0x9246),
+          "Starting Respiratory Amplitude", "StartingRespiratoryAmplitude",  "FL", "1" },    { Tag(0x0020, 0x9247),
+          "Starting Respiratory Phase", "StartingRespiratoryPhase",  "CS", "1" },    { Tag(0x0020, 0x9248),
+          "Ending Respiratory Amplitude", "EndingRespiratoryAmplitude",  "FL", "1" },    { Tag(0x0020, 0x9249),
+          "Ending Respiratory Phase", "EndingRespiratoryPhase",  "CS", "1" },    { Tag(0x0020, 0x9250),
+          "Respiratory Trigger Type", "RespiratoryTriggerType",  "CS", "1" },    { Tag(0x0020, 0x9251),
+          "R-R Interval Time Nominal", "RRIntervalTimeNominal",  "FD", "1" },    { Tag(0x0020, 0x9252),
+          "Actual Cardiac Trigger Delay Time", "ActualCardiacTriggerDelayTime",  "FD", "1" },    { Tag(0x0020, 0x9253),
+          "Respiratory Synchronization Sequence", "RespiratorySynchronizationSequence",  "SQ", "1" },    { Tag(0x0020, 0x9254),
+          "Respiratory Interval Time", "RespiratoryIntervalTime",  "FD", "1" },    { Tag(0x0020, 0x9255),
+          "Nominal Respiratory Trigger Delay Time", "NominalRespiratoryTriggerDelayTime",  "FD", "1" },    { Tag(0x0020, 0x9256),
+          "Respiratory Trigger Delay Threshold", "RespiratoryTriggerDelayThreshold",  "FD", "1" },    { Tag(0x0020, 0x9257),
+          "Actual Respiratory Trigger Delay Time", "ActualRespiratoryTriggerDelayTime",  "FD", "1" },    { Tag(0x0020, 0x9301),
+          "Image Position (Volume)", "ImagePositionVolume",  "FD", "3" },    { Tag(0x0020, 0x9302),
+          "Image Orientation (Volume)", "ImageOrientationVolume",  "FD", "6" },    { Tag(0x0020, 0x9307),
+          "Ultrasound Acquisition Geometry", "UltrasoundAcquisitionGeometry",  "CS", "1" },    { Tag(0x0020, 0x9308),
+          "Apex Position", "ApexPosition",  "FD", "3" },    { Tag(0x0020, 0x9309),
+          "Volume to Transducer Mapping Matrix", "VolumeToTransducerMappingMatrix",  "FD", "16" },    { Tag(0x0020, 0x930a),
+          "Volume to Table Mapping Matrix", "VolumeToTableMappingMatrix",  "FD", "16" },    { Tag(0x0020, 0x930b),
+          "Volume to Transducer Relationship", "VolumeToTransducerRelationship",  "CS", "1" },    { Tag(0x0020, 0x930c),
+          "Patient Frame of Reference Source", "PatientFrameOfReferenceSource",  "CS", "1" },    { Tag(0x0020, 0x930d),
+          "Temporal Position Time Offset", "TemporalPositionTimeOffset",  "FD", "1" },    { Tag(0x0020, 0x930e),
+          "Plane Position (Volume) Sequence", "PlanePositionVolumeSequence",  "SQ", "1" },    { Tag(0x0020, 0x930f),
+          "Plane Orientation (Volume) Sequence", "PlaneOrientationVolumeSequence",  "SQ", "1" },    { Tag(0x0020, 0x9310),
+          "Temporal Position Sequence", "TemporalPositionSequence",  "SQ", "1" },    { Tag(0x0020, 0x9311),
+          "Dimension Organization Type", "DimensionOrganizationType",  "CS", "1" },    { Tag(0x0020, 0x9312),
+          "Volume Frame of Reference UID", "VolumeFrameOfReferenceUID",  "UI", "1" },    { Tag(0x0020, 0x9313),
+          "Table Frame of Reference UID", "TableFrameOfReferenceUID",  "UI", "1" },    { Tag(0x0020, 0x9421),
+          "Dimension Description Label", "DimensionDescriptionLabel",  "LO", "1" },    { Tag(0x0020, 0x9450),
+          "Patient Orientation in Frame Sequence", "PatientOrientationInFrameSequence",  "SQ", "1" },    { Tag(0x0020, 0x9453),
+          "Frame Label", "FrameLabel",  "LO", "1" },    { Tag(0x0020, 0x9518),
+          "Acquisition Index", "AcquisitionIndex",  "US", "1-n" },    { Tag(0x0020, 0x9529),
+          "Contributing SOP Instances Reference Sequence", "ContributingSOPInstancesReferenceSequence",  "SQ", "1" },    { Tag(0x0020, 0x9536),
+          "Reconstruction Index", "ReconstructionIndex",  "US", "1" },    { Tag(0x0022, 0x0001),
+          "Light Path Filter Pass-Through Wavelength", "LightPathFilterPassThroughWavelength",  "US", "1" },    { Tag(0x0022, 0x0002),
+          "Light Path Filter Pass Band", "LightPathFilterPassBand",  "US", "2" },    { Tag(0x0022, 0x0003),
+          "Image Path Filter Pass-Through Wavelength", "ImagePathFilterPassThroughWavelength",  "US", "1" },    { Tag(0x0022, 0x0004),
+          "Image Path Filter Pass Band", "ImagePathFilterPassBand",  "US", "2" },    { Tag(0x0022, 0x0005),
+          "Patient Eye Movement Commanded", "PatientEyeMovementCommanded",  "CS", "1" },    { Tag(0x0022, 0x0006),
+          "Patient Eye Movement Command Code Sequence", "PatientEyeMovementCommandCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x0007),
+          "Spherical Lens Power", "SphericalLensPower",  "FL", "1" },    { Tag(0x0022, 0x0008),
+          "Cylinder Lens Power", "CylinderLensPower",  "FL", "1" },    { Tag(0x0022, 0x0009),
+          "Cylinder Axis", "CylinderAxis",  "FL", "1" },    { Tag(0x0022, 0x000a),
+          "Emmetropic Magnification", "EmmetropicMagnification",  "FL", "1" },    { Tag(0x0022, 0x000b),
+          "Intra Ocular Pressure", "IntraOcularPressure",  "FL", "1" },    { Tag(0x0022, 0x000c),
+          "Horizontal Field of View", "HorizontalFieldOfView",  "FL", "1" },    { Tag(0x0022, 0x000d),
+          "Pupil Dilated", "PupilDilated",  "CS", "1" },    { Tag(0x0022, 0x000e),
+          "Degree of Dilation", "DegreeOfDilation",  "FL", "1" },    { Tag(0x0022, 0x0010),
+          "Stereo Baseline Angle", "StereoBaselineAngle",  "FL", "1" },    { Tag(0x0022, 0x0011),
+          "Stereo Baseline Displacement", "StereoBaselineDisplacement",  "FL", "1" },    { Tag(0x0022, 0x0012),
+          "Stereo Horizontal Pixel Offset", "StereoHorizontalPixelOffset",  "FL", "1" },    { Tag(0x0022, 0x0013),
+          "Stereo Vertical Pixel Offset", "StereoVerticalPixelOffset",  "FL", "1" },    { Tag(0x0022, 0x0014),
+          "Stereo Rotation", "StereoRotation",  "FL", "1" },    { Tag(0x0022, 0x0015),
+          "Acquisition Device Type Code Sequence", "AcquisitionDeviceTypeCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x0016),
+          "Illumination Type Code Sequence", "IlluminationTypeCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x0017),
+          "Light Path Filter Type Stack Code Sequence", "LightPathFilterTypeStackCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x0018),
+          "Image Path Filter Type Stack Code Sequence", "ImagePathFilterTypeStackCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x0019),
+          "Lenses Code Sequence", "LensesCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x001a),
+          "Channel Description Code Sequence", "ChannelDescriptionCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x001b),
+          "Refractive State Sequence", "RefractiveStateSequence",  "SQ", "1" },    { Tag(0x0022, 0x001c),
+          "Mydriatic Agent Code Sequence", "MydriaticAgentCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x001d),
+          "Relative Image Position Code Sequence", "RelativeImagePositionCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x001e),
+          "Camera Angle of View", "CameraAngleOfView",  "FL", "1" },    { Tag(0x0022, 0x0020),
+          "Stereo Pairs Sequence", "StereoPairsSequence",  "SQ", "1" },    { Tag(0x0022, 0x0021),
+          "Left Image Sequence", "LeftImageSequence",  "SQ", "1" },    { Tag(0x0022, 0x0022),
+          "Right Image Sequence", "RightImageSequence",  "SQ", "1" },    { Tag(0x0022, 0x0028),
+          "Stereo Pairs Present", "StereoPairsPresent",  "CS", "1" },    { Tag(0x0022, 0x0030),
+          "Axial Length of the Eye", "AxialLengthOfTheEye",  "FL", "1" },    { Tag(0x0022, 0x0031),
+          "Ophthalmic Frame Location Sequence", "OphthalmicFrameLocationSequence",  "SQ", "1" },    { Tag(0x0022, 0x0032),
+          "Reference Coordinates", "ReferenceCoordinates",  "FL", "2-2n" },    { Tag(0x0022, 0x0035),
+          "Depth Spatial Resolution", "DepthSpatialResolution",  "FL", "1" },    { Tag(0x0022, 0x0036),
+          "Maximum Depth Distortion", "MaximumDepthDistortion",  "FL", "1" },    { Tag(0x0022, 0x0037),
+          "Along-scan Spatial Resolution", "AlongScanSpatialResolution",  "FL", "1" },    { Tag(0x0022, 0x0038),
+          "Maximum Along-scan Distortion", "MaximumAlongScanDistortion",  "FL", "1" },    { Tag(0x0022, 0x0039),
+          "Ophthalmic Image Orientation", "OphthalmicImageOrientation",  "CS", "1" },    { Tag(0x0022, 0x0041),
+          "Depth of Transverse Image", "DepthOfTransverseImage",  "FL", "1" },    { Tag(0x0022, 0x0042),
+          "Mydriatic Agent Concentration Units Sequence", "MydriaticAgentConcentrationUnitsSequence",  "SQ", "1" },    { Tag(0x0022, 0x0048),
+          "Across-scan Spatial Resolution", "AcrossScanSpatialResolution",  "FL", "1" },    { Tag(0x0022, 0x0049),
+          "Maximum Across-scan Distortion", "MaximumAcrossScanDistortion",  "FL", "1" },    { Tag(0x0022, 0x004e),
+          "Mydriatic Agent Concentration", "MydriaticAgentConcentration",  "DS", "1" },    { Tag(0x0022, 0x0055),
+          "Illumination Wave Length", "IlluminationWaveLength",  "FL", "1" },    { Tag(0x0022, 0x0056),
+          "Illumination Power", "IlluminationPower",  "FL", "1" },    { Tag(0x0022, 0x0057),
+          "Illumination Bandwidth", "IlluminationBandwidth",  "FL", "1" },    { Tag(0x0022, 0x0058),
+          "Mydriatic Agent Sequence", "MydriaticAgentSequence",  "SQ", "1" },    { Tag(0x0022, 0x1007),
+          "Ophthalmic Axial Measurements Right Eye Sequence", "OphthalmicAxialMeasurementsRightEyeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1008),
+          "Ophthalmic Axial Measurements Left Eye Sequence", "OphthalmicAxialMeasurementsLeftEyeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1009),
+          "Ophthalmic Axial Measurements Device Type", "OphthalmicAxialMeasurementsDeviceType",  "CS", "1" },    { Tag(0x0022, 0x1010),
+          "Ophthalmic Axial Length Measurements Type", "OphthalmicAxialLengthMeasurementsType",  "CS", "1" },    { Tag(0x0022, 0x1012),
+          "Ophthalmic Axial Length Sequence", "OphthalmicAxialLengthSequence",  "SQ", "1" },    { Tag(0x0022, 0x1019),
+          "Ophthalmic Axial Length", "OphthalmicAxialLength",  "FL", "1" },    { Tag(0x0022, 0x1024),
+          "Lens Status Code Sequence", "LensStatusCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1025),
+          "Vitreous Status Code Sequence", "VitreousStatusCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1028),
+          "IOL Formula Code Sequence", "IOLFormulaCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1029),
+          "IOL Formula Detail", "IOLFormulaDetail",  "LO", "1" },    { Tag(0x0022, 0x1033),
+          "Keratometer Index", "KeratometerIndex",  "FL", "1" },    { Tag(0x0022, 0x1035),
+          "Source of Ophthalmic Axial Length Code Sequence", "SourceOfOphthalmicAxialLengthCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1037),
+          "Target Refraction", "TargetRefraction",  "FL", "1" },    { Tag(0x0022, 0x1039),
+          "Refractive Procedure Occurred", "RefractiveProcedureOccurred",  "CS", "1" },    { Tag(0x0022, 0x1040),
+          "Refractive Surgery Type Code Sequence", "RefractiveSurgeryTypeCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1044),
+          "Ophthalmic Ultrasound Method Code Sequence", "OphthalmicUltrasoundMethodCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1050),
+          "Ophthalmic Axial Length Measurements Sequence", "OphthalmicAxialLengthMeasurementsSequence",  "SQ", "1" },    { Tag(0x0022, 0x1053),
+          "IOL Power", "IOLPower",  "FL", "1" },    { Tag(0x0022, 0x1054),
+          "Predicted Refractive Error", "PredictedRefractiveError",  "FL", "1" },    { Tag(0x0022, 0x1059),
+          "Ophthalmic Axial Length Velocity", "OphthalmicAxialLengthVelocity",  "FL", "1" },    { Tag(0x0022, 0x1065),
+          "Lens Status Description", "LensStatusDescription",  "LO", "1" },    { Tag(0x0022, 0x1066),
+          "Vitreous Status Description", "VitreousStatusDescription",  "LO", "1" },    { Tag(0x0022, 0x1090),
+          "IOL Power Sequence", "IOLPowerSequence",  "SQ", "1" },    { Tag(0x0022, 0x1092),
+          "Lens Constant Sequence", "LensConstantSequence",  "SQ", "1" },    { Tag(0x0022, 0x1093),
+          "IOL Manufacturer", "IOLManufacturer",  "LO", "1" },    { Tag(0x0022, 0x1094),
+          "Lens Constant Description", "LensConstantDescription",  "LO", "1" },    { Tag(0x0022, 0x1095),
+          "Implant Name", "ImplantName",  "LO", "1" },    { Tag(0x0022, 0x1096),
+          "Keratometry Measurement Type Code Sequence", "KeratometryMeasurementTypeCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1097),
+          "Implant Part Number", "ImplantPartNumber",  "LO", "1" },    { Tag(0x0022, 0x1100),
+          "Referenced Ophthalmic Axial Measurements Sequence", "ReferencedOphthalmicAxialMeasurementsSequence",  "SQ", "1" },    { Tag(0x0022, 0x1101),
+          "Ophthalmic Axial Length Measurements Segment Name Code Sequence", "OphthalmicAxialLengthMeasurementsSegmentNameCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1103),
+          "Refractive Error Before Refractive Surgery Code Sequence", "RefractiveErrorBeforeRefractiveSurgeryCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1121),
+          "IOL Power For Exact Emmetropia", "IOLPowerForExactEmmetropia",  "FL", "1" },    { Tag(0x0022, 0x1122),
+          "IOL Power For Exact Target Refraction", "IOLPowerForExactTargetRefraction",  "FL", "1" },    { Tag(0x0022, 0x1125),
+          "Anterior Chamber Depth Definition Code Sequence", "AnteriorChamberDepthDefinitionCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1127),
+          "Lens Thickness Sequence", "LensThicknessSequence",  "SQ", "1" },    { Tag(0x0022, 0x1128),
+          "Anterior Chamber Depth Sequence", "AnteriorChamberDepthSequence",  "SQ", "1" },    { Tag(0x0022, 0x1130),
+          "Lens Thickness", "LensThickness",  "FL", "1" },    { Tag(0x0022, 0x1131),
+          "Anterior Chamber Depth", "AnteriorChamberDepth",  "FL", "1" },    { Tag(0x0022, 0x1132),
+          "Source of Lens Thickness Data Code Sequence", "SourceOfLensThicknessDataCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1133),
+          "Source of Anterior Chamber Depth Data Code Sequence", "SourceOfAnteriorChamberDepthDataCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1134),
+          "Source of Refractive Measurements Sequence", "SourceOfRefractiveMeasurementsSequence",  "SQ", "1" },    { Tag(0x0022, 0x1135),
+          "Source of Refractive Measurements Code Sequence", "SourceOfRefractiveMeasurementsCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1140),
+          "Ophthalmic Axial Length Measurement Modified", "OphthalmicAxialLengthMeasurementModified",  "CS", "1" },    { Tag(0x0022, 0x1150),
+          "Ophthalmic Axial Length Data Source Code Sequence", "OphthalmicAxialLengthDataSourceCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1153),
+          "Ophthalmic Axial Length Acquisition Method Code Sequence", "OphthalmicAxialLengthAcquisitionMethodCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1155),
+          "Signal to Noise Ratio", "SignalToNoiseRatio",  "FL", "1" },    { Tag(0x0022, 0x1159),
+          "Ophthalmic Axial Length Data Source Description", "OphthalmicAxialLengthDataSourceDescription",  "LO", "1" },    { Tag(0x0022, 0x1210),
+          "Ophthalmic Axial Length Measurements Total Length Sequence", "OphthalmicAxialLengthMeasurementsTotalLengthSequence",  "SQ", "1" },    { Tag(0x0022, 0x1211),
+          "Ophthalmic Axial Length Measurements Segmental Length Sequence", "OphthalmicAxialLengthMeasurementsSegmentalLengthSequence",  "SQ", "1" },    { Tag(0x0022, 0x1212),
+          "Ophthalmic Axial Length Measurements Length Summation Sequence", "OphthalmicAxialLengthMeasurementsLengthSummationSequence",  "SQ", "1" },    { Tag(0x0022, 0x1220),
+          "Ultrasound Ophthalmic Axial Length Measurements Sequence", "UltrasoundOphthalmicAxialLengthMeasurementsSequence",  "SQ", "1" },    { Tag(0x0022, 0x1225),
+          "Optical Ophthalmic Axial Length Measurements Sequence", "OpticalOphthalmicAxialLengthMeasurementsSequence",  "SQ", "1" },    { Tag(0x0022, 0x1230),
+          "Ultrasound Selected Ophthalmic Axial Length Sequence", "UltrasoundSelectedOphthalmicAxialLengthSequence",  "SQ", "1" },    { Tag(0x0022, 0x1250),
+          "Ophthalmic Axial Length Selection Method Code Sequence", "OphthalmicAxialLengthSelectionMethodCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1255),
+          "Optical Selected Ophthalmic Axial Length Sequence", "OpticalSelectedOphthalmicAxialLengthSequence",  "SQ", "1" },    { Tag(0x0022, 0x1257),
+          "Selected Segmental Ophthalmic Axial Length Sequence", "SelectedSegmentalOphthalmicAxialLengthSequence",  "SQ", "1" },    { Tag(0x0022, 0x1260),
+          "Selected Total Ophthalmic Axial Length Sequence", "SelectedTotalOphthalmicAxialLengthSequence",  "SQ", "1" },    { Tag(0x0022, 0x1262),
+          "Ophthalmic Axial Length Quality Metric Sequence", "OphthalmicAxialLengthQualityMetricSequence",  "SQ", "1" },    { Tag(0x0022, 0x1265),
+          "Ophthalmic Axial Length Quality Metric Type Code Sequence", "OphthalmicAxialLengthQualityMetricTypeCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1273),
+          "Ophthalmic Axial Length Quality Metric Type Description", "OphthalmicAxialLengthQualityMetricTypeDescription",  "LO", "1" },    { Tag(0x0022, 0x1300),
+          "Intraocular Lens Calculations Right Eye Sequence", "IntraocularLensCalculationsRightEyeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1310),
+          "Intraocular Lens Calculations Left Eye Sequence", "IntraocularLensCalculationsLeftEyeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1330),
+          "Referenced Ophthalmic Axial Length Measurement QC Image Sequence", "ReferencedOphthalmicAxialLengthMeasurementQCImageSequence",  "SQ", "1" },    { Tag(0x0022, 0x1415),
+          "Ophthalmic Mapping Device Type", "OphthalmicMappingDeviceType",  "CS", "1" },    { Tag(0x0022, 0x1420),
+          "Acquisition Method Code Sequence", "AcquisitionMethodCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1423),
+          "Acquisition Method Algorithm Sequence", "AcquisitionMethodAlgorithmSequence",  "SQ", "1" },    { Tag(0x0022, 0x1436),
+          "Ophthalmic Thickness Map Type Code Sequence", "OphthalmicThicknessMapTypeCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1443),
+          "Ophthalmic Thickness Mapping Normals Sequence", "OphthalmicThicknessMappingNormalsSequence",  "SQ", "1" },    { Tag(0x0022, 0x1445),
+          "Retinal Thickness Definition Code Sequence", "RetinalThicknessDefinitionCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1450),
+          "Pixel Value Mapping to Coded Concept Sequence", "PixelValueMappingToCodedConceptSequence",  "SQ", "1" },    { Tag(0x0022, 0x1452),
+          "Mapped Pixel Value", "MappedPixelValue",  "US or SS", "1" },    { Tag(0x0022, 0x1454),
+          "Pixel Value Mapping Explanation", "PixelValueMappingExplanation",  "LO", "1" },    { Tag(0x0022, 0x1458),
+          "Ophthalmic Thickness Map Quality Threshold Sequence", "OphthalmicThicknessMapQualityThresholdSequence",  "SQ", "1" },    { Tag(0x0022, 0x1460),
+          "Ophthalmic Thickness Map Threshold Quality Rating", "OphthalmicThicknessMapThresholdQualityRating",  "FL", "1" },    { Tag(0x0022, 0x1463),
+          "Anatomic Structure Reference Point", "AnatomicStructureReferencePoint",  "FL", "2" },    { Tag(0x0022, 0x1465),
+          "Registration to Localizer Sequence", "RegistrationToLocalizerSequence",  "SQ", "1" },    { Tag(0x0022, 0x1466),
+          "Registered Localizer Units", "RegisteredLocalizerUnits",  "CS", "1" },    { Tag(0x0022, 0x1467),
+          "Registered Localizer Top Left Hand Corner", "RegisteredLocalizerTopLeftHandCorner",  "FL", "2" },    { Tag(0x0022, 0x1468),
+          "Registered Localizer Bottom Right Hand Corner", "RegisteredLocalizerBottomRightHandCorner",  "FL", "2" },    { Tag(0x0022, 0x1470),
+          "Ophthalmic Thickness Map Quality Rating Sequence", "OphthalmicThicknessMapQualityRatingSequence",  "SQ", "1" },    { Tag(0x0022, 0x1472),
+          "Relevant OPT Attributes Sequence", "RelevantOPTAttributesSequence",  "SQ", "1" },    { Tag(0x0022, 0x1512),
+          "Transformation Method Code Sequence", "TransformationMethodCodeSequence",  "SQ", "1" },    { Tag(0x0022, 0x1513),
+          "Transformation Algorithm Sequence", "TransformationAlgorithmSequence",  "SQ", "1" },    { Tag(0x0022, 0x1515),
+          "Ophthalmic Axial Length Method", "OphthalmicAxialLengthMethod",  "CS", "1" },    { Tag(0x0022, 0x1517),
+          "Ophthalmic FOV", "OphthalmicFOV",  "FL", "1" },    { Tag(0x0022, 0x1518),
+          "Two Dimensional to Three Dimensional Map Sequence", "TwoDimensionalToThreeDimensionalMapSequence",  "SQ", "1" },    { Tag(0x0022, 0x1525),
+          "Wide Field Ophthalmic Photography Quality Rating Sequence", "WideFieldOphthalmicPhotographyQualityRatingSequence",  "SQ", "1" },    { Tag(0x0022, 0x1526),
+          "Wide Field Ophthalmic Photography Quality Threshold Sequence", "WideFieldOphthalmicPhotographyQualityThresholdSequence",  "SQ", "1" },    { Tag(0x0022, 0x1527),
+          "Wide Field Ophthalmic Photography Threshold Quality Rating", "WideFieldOphthalmicPhotographyThresholdQualityRating",  "FL", "1" },    { Tag(0x0022, 0x1528),
+          "X Coordinates Center Pixel View Angle", "XCoordinatesCenterPixelViewAngle",  "FL", "1" },    { Tag(0x0022, 0x1529),
+          "Y Coordinates Center Pixel View Angle", "YCoordinatesCenterPixelViewAngle",  "FL", "1" },    { Tag(0x0022, 0x1530),
+          "Number of Map Points", "NumberOfMapPoints",  "UL", "1" },    { Tag(0x0022, 0x1531),
+          "Two Dimensional to Three Dimensional Map Data", "TwoDimensionalToThreeDimensionalMapData",  "OF", "1" },    { Tag(0x0024, 0x0010),
+          "Visual Field Horizontal Extent", "VisualFieldHorizontalExtent",  "FL", "1" },    { Tag(0x0024, 0x0011),
+          "Visual Field Vertical Extent", "VisualFieldVerticalExtent",  "FL", "1" },    { Tag(0x0024, 0x0012),
+          "Visual Field Shape", "VisualFieldShape",  "CS", "1" },    { Tag(0x0024, 0x0016),
+          "Screening Test Mode Code Sequence", "ScreeningTestModeCodeSequence",  "SQ", "1" },    { Tag(0x0024, 0x0018),
+          "Maximum Stimulus Luminance", "MaximumStimulusLuminance",  "FL", "1" },    { Tag(0x0024, 0x0020),
+          "Background Luminance", "BackgroundLuminance",  "FL", "1" },    { Tag(0x0024, 0x0021),
+          "Stimulus Color Code Sequence", "StimulusColorCodeSequence",  "SQ", "1" },    { Tag(0x0024, 0x0024),
+          "Background Illumination Color Code Sequence", "BackgroundIlluminationColorCodeSequence",  "SQ", "1" },    { Tag(0x0024, 0x0025),
+          "Stimulus Area", "StimulusArea",  "FL", "1" },    { Tag(0x0024, 0x0028),
+          "Stimulus Presentation Time", "StimulusPresentationTime",  "FL", "1" },    { Tag(0x0024, 0x0032),
+          "Fixation Sequence", "FixationSequence",  "SQ", "1" },    { Tag(0x0024, 0x0033),
+          "Fixation Monitoring Code Sequence", "FixationMonitoringCodeSequence",  "SQ", "1" },    { Tag(0x0024, 0x0034),
+          "Visual Field Catch Trial Sequence", "VisualFieldCatchTrialSequence",  "SQ", "1" },    { Tag(0x0024, 0x0035),
+          "Fixation Checked Quantity", "FixationCheckedQuantity",  "US", "1" },    { Tag(0x0024, 0x0036),
+          "Patient Not Properly Fixated Quantity", "PatientNotProperlyFixatedQuantity",  "US", "1" },    { Tag(0x0024, 0x0037),
+          "Presented Visual Stimuli Data Flag", "PresentedVisualStimuliDataFlag",  "CS", "1" },    { Tag(0x0024, 0x0038),
+          "Number of Visual Stimuli", "NumberOfVisualStimuli",  "US", "1" },    { Tag(0x0024, 0x0039),
+          "Excessive Fixation Losses Data Flag", "ExcessiveFixationLossesDataFlag",  "CS", "1" },    { Tag(0x0024, 0x0040),
+          "Excessive Fixation Losses", "ExcessiveFixationLosses",  "CS", "1" },    { Tag(0x0024, 0x0042),
+          "Stimuli Retesting Quantity", "StimuliRetestingQuantity",  "US", "1" },    { Tag(0x0024, 0x0044),
+          "Comments on Patient's Performance of Visual Field", "CommentsOnPatientPerformanceOfVisualField",  "LT", "1" },    { Tag(0x0024, 0x0045),
+          "False Negatives Estimate Flag", "FalseNegativesEstimateFlag",  "CS", "1" },    { Tag(0x0024, 0x0046),
+          "False Negatives Estimate", "FalseNegativesEstimate",  "FL", "1" },    { Tag(0x0024, 0x0048),
+          "Negative Catch Trials Quantity", "NegativeCatchTrialsQuantity",  "US", "1" },    { Tag(0x0024, 0x0050),
+          "False Negatives Quantity", "FalseNegativesQuantity",  "US", "1" },    { Tag(0x0024, 0x0051),
+          "Excessive False Negatives Data Flag", "ExcessiveFalseNegativesDataFlag",  "CS", "1" },    { Tag(0x0024, 0x0052),
+          "Excessive False Negatives", "ExcessiveFalseNegatives",  "CS", "1" },    { Tag(0x0024, 0x0053),
+          "False Positives Estimate Flag", "FalsePositivesEstimateFlag",  "CS", "1" },    { Tag(0x0024, 0x0054),
+          "False Positives Estimate", "FalsePositivesEstimate",  "FL", "1" },    { Tag(0x0024, 0x0055),
+          "Catch Trials Data Flag", "CatchTrialsDataFlag",  "CS", "1" },    { Tag(0x0024, 0x0056),
+          "Positive Catch Trials Quantity", "PositiveCatchTrialsQuantity",  "US", "1" },    { Tag(0x0024, 0x0057),
+          "Test Point Normals Data Flag", "TestPointNormalsDataFlag",  "CS", "1" },    { Tag(0x0024, 0x0058),
+          "Test Point Normals Sequence", "TestPointNormalsSequence",  "SQ", "1" },    { Tag(0x0024, 0x0059),
+          "Global Deviation Probability Normals Flag", "GlobalDeviationProbabilityNormalsFlag",  "CS", "1" },    { Tag(0x0024, 0x0060),
+          "False Positives Quantity", "FalsePositivesQuantity",  "US", "1" },    { Tag(0x0024, 0x0061),
+          "Excessive False Positives Data Flag", "ExcessiveFalsePositivesDataFlag",  "CS", "1" },    { Tag(0x0024, 0x0062),
+          "Excessive False Positives", "ExcessiveFalsePositives",  "CS", "1" },    { Tag(0x0024, 0x0063),
+          "Visual Field Test Normals Flag", "VisualFieldTestNormalsFlag",  "CS", "1" },    { Tag(0x0024, 0x0064),
+          "Results Normals Sequence", "ResultsNormalsSequence",  "SQ", "1" },    { Tag(0x0024, 0x0065),
+          "Age Corrected Sensitivity Deviation Algorithm Sequence", "AgeCorrectedSensitivityDeviationAlgorithmSequence",  "SQ", "1" },    { Tag(0x0024, 0x0066),
+          "Global Deviation From Normal", "GlobalDeviationFromNormal",  "FL", "1" },    { Tag(0x0024, 0x0067),
+          "Generalized Defect Sensitivity Deviation Algorithm Sequence", "GeneralizedDefectSensitivityDeviationAlgorithmSequence",  "SQ", "1" },    { Tag(0x0024, 0x0068),
+          "Localized Deviation From Normal", "LocalizedDeviationFromNormal",  "FL", "1" },    { Tag(0x0024, 0x0069),
+          "Patient Reliability Indicator", "PatientReliabilityIndicator",  "LO", "1" },    { Tag(0x0024, 0x0070),
+          "Visual Field Mean Sensitivity", "VisualFieldMeanSensitivity",  "FL", "1" },    { Tag(0x0024, 0x0071),
+          "Global Deviation Probability", "GlobalDeviationProbability",  "FL", "1" },    { Tag(0x0024, 0x0072),
+          "Local Deviation Probability Normals Flag", "LocalDeviationProbabilityNormalsFlag",  "CS", "1" },    { Tag(0x0024, 0x0073),
+          "Localized Deviation Probability", "LocalizedDeviationProbability",  "FL", "1" },    { Tag(0x0024, 0x0074),
+          "Short Term Fluctuation Calculated", "ShortTermFluctuationCalculated",  "CS", "1" },    { Tag(0x0024, 0x0075),
+          "Short Term Fluctuation", "ShortTermFluctuation",  "FL", "1" },    { Tag(0x0024, 0x0076),
+          "Short Term Fluctuation Probability Calculated", "ShortTermFluctuationProbabilityCalculated",  "CS", "1" },    { Tag(0x0024, 0x0077),
+          "Short Term Fluctuation Probability", "ShortTermFluctuationProbability",  "FL", "1" },    { Tag(0x0024, 0x0078),
+          "Corrected Localized Deviation From Normal Calculated", "CorrectedLocalizedDeviationFromNormalCalculated",  "CS", "1" },    { Tag(0x0024, 0x0079),
+          "Corrected Localized Deviation From Normal", "CorrectedLocalizedDeviationFromNormal",  "FL", "1" },    { Tag(0x0024, 0x0080),
+          "Corrected Localized Deviation From Normal Probability Calculated", "CorrectedLocalizedDeviationFromNormalProbabilityCalculated",  "CS", "1" },    { Tag(0x0024, 0x0081),
+          "Corrected Localized Deviation From Normal Probability", "CorrectedLocalizedDeviationFromNormalProbability",  "FL", "1" },    { Tag(0x0024, 0x0083),
+          "Global Deviation Probability Sequence", "GlobalDeviationProbabilitySequence",  "SQ", "1" },    { Tag(0x0024, 0x0085),
+          "Localized Deviation Probability Sequence", "LocalizedDeviationProbabilitySequence",  "SQ", "1" },    { Tag(0x0024, 0x0086),
+          "Foveal Sensitivity Measured", "FovealSensitivityMeasured",  "CS", "1" },    { Tag(0x0024, 0x0087),
+          "Foveal Sensitivity", "FovealSensitivity",  "FL", "1" },    { Tag(0x0024, 0x0088),
+          "Visual Field Test Duration", "VisualFieldTestDuration",  "FL", "1" },    { Tag(0x0024, 0x0089),
+          "Visual Field Test Point Sequence", "VisualFieldTestPointSequence",  "SQ", "1" },    { Tag(0x0024, 0x0090),
+          "Visual Field Test Point X-Coordinate", "VisualFieldTestPointXCoordinate",  "FL", "1" },    { Tag(0x0024, 0x0091),
+          "Visual Field Test Point Y-Coordinate", "VisualFieldTestPointYCoordinate",  "FL", "1" },    { Tag(0x0024, 0x0092),
+          "Age Corrected Sensitivity Deviation Value", "AgeCorrectedSensitivityDeviationValue",  "FL", "1" },    { Tag(0x0024, 0x0093),
+          "Stimulus Results", "StimulusResults",  "CS", "1" },    { Tag(0x0024, 0x0094),
+          "Sensitivity Value", "SensitivityValue",  "FL", "1" },    { Tag(0x0024, 0x0095),
+          "Retest Stimulus Seen", "RetestStimulusSeen",  "CS", "1" },    { Tag(0x0024, 0x0096),
+          "Retest Sensitivity Value", "RetestSensitivityValue",  "FL", "1" },    { Tag(0x0024, 0x0097),
+          "Visual Field Test Point Normals Sequence", "VisualFieldTestPointNormalsSequence",  "SQ", "1" },    { Tag(0x0024, 0x0098),
+          "Quantified Defect", "QuantifiedDefect",  "FL", "1" },    { Tag(0x0024, 0x0100),
+          "Age Corrected Sensitivity Deviation Probability Value", "AgeCorrectedSensitivityDeviationProbabilityValue",  "FL", "1" },    { Tag(0x0024, 0x0102),
+          "Generalized Defect Corrected Sensitivity Deviation Flag", "GeneralizedDefectCorrectedSensitivityDeviationFlag",  "CS", "1" },    { Tag(0x0024, 0x0103),
+          "Generalized Defect Corrected Sensitivity Deviation Value", "GeneralizedDefectCorrectedSensitivityDeviationValue",  "FL", "1" },    { Tag(0x0024, 0x0104),
+          "Generalized Defect Corrected Sensitivity Deviation Probability Value", "GeneralizedDefectCorrectedSensitivityDeviationProbabilityValue",  "FL", "1" },    { Tag(0x0024, 0x0105),
+          "Minimum Sensitivity Value", "MinimumSensitivityValue",  "FL", "1" },    { Tag(0x0024, 0x0106),
+          "Blind Spot Localized", "BlindSpotLocalized",  "CS", "1" },    { Tag(0x0024, 0x0107),
+          "Blind Spot X-Coordinate", "BlindSpotXCoordinate",  "FL", "1" },    { Tag(0x0024, 0x0108),
+          "Blind Spot Y-Coordinate", "BlindSpotYCoordinate",  "FL", "1" },    { Tag(0x0024, 0x0110),
+          "Visual Acuity Measurement Sequence", "VisualAcuityMeasurementSequence",  "SQ", "1" },    { Tag(0x0024, 0x0112),
+          "Refractive Parameters Used on Patient Sequence", "RefractiveParametersUsedOnPatientSequence",  "SQ", "1" },    { Tag(0x0024, 0x0113),
+          "Measurement Laterality", "MeasurementLaterality",  "CS", "1" },    { Tag(0x0024, 0x0114),
+          "Ophthalmic Patient Clinical Information Left Eye Sequence", "OphthalmicPatientClinicalInformationLeftEyeSequence",  "SQ", "1" },    { Tag(0x0024, 0x0115),
+          "Ophthalmic Patient Clinical Information Right Eye Sequence", "OphthalmicPatientClinicalInformationRightEyeSequence",  "SQ", "1" },    { Tag(0x0024, 0x0117),
+          "Foveal Point Normative Data Flag", "FovealPointNormativeDataFlag",  "CS", "1" },    { Tag(0x0024, 0x0118),
+          "Foveal Point Probability Value", "FovealPointProbabilityValue",  "FL", "1" },    { Tag(0x0024, 0x0120),
+          "Screening Baseline Measured", "ScreeningBaselineMeasured",  "CS", "1" },    { Tag(0x0024, 0x0122),
+          "Screening Baseline Measured Sequence", "ScreeningBaselineMeasuredSequence",  "SQ", "1" },    { Tag(0x0024, 0x0124),
+          "Screening Baseline Type", "ScreeningBaselineType",  "CS", "1" },    { Tag(0x0024, 0x0126),
+          "Screening Baseline Value", "ScreeningBaselineValue",  "FL", "1" },    { Tag(0x0024, 0x0202),
+          "Algorithm Source", "AlgorithmSource",  "LO", "1" },    { Tag(0x0024, 0x0306),
+          "Data Set Name", "DataSetName",  "LO", "1" },    { Tag(0x0024, 0x0307),
+          "Data Set Version", "DataSetVersion",  "LO", "1" },    { Tag(0x0024, 0x0308),
+          "Data Set Source", "DataSetSource",  "LO", "1" },    { Tag(0x0024, 0x0309),
+          "Data Set Description", "DataSetDescription",  "LO", "1" },    { Tag(0x0024, 0x0317),
+          "Visual Field Test Reliability Global Index Sequence", "VisualFieldTestReliabilityGlobalIndexSequence",  "SQ", "1" },    { Tag(0x0024, 0x0320),
+          "Visual Field Global Results Index Sequence", "VisualFieldGlobalResultsIndexSequence",  "SQ", "1" },    { Tag(0x0024, 0x0325),
+          "Data Observation Sequence", "DataObservationSequence",  "SQ", "1" },    { Tag(0x0024, 0x0338),
+          "Index Normals Flag", "IndexNormalsFlag",  "CS", "1" },    { Tag(0x0024, 0x0341),
+          "Index Probability", "IndexProbability",  "FL", "1" },    { Tag(0x0024, 0x0344),
+          "Index Probability Sequence", "IndexProbabilitySequence",  "SQ", "1" },    { Tag(0x0028, 0x0002),
+          "Samples per Pixel", "SamplesPerPixel",  "US", "1" },    { Tag(0x0028, 0x0003),
+          "Samples per Pixel Used", "SamplesPerPixelUsed",  "US", "1" },    { Tag(0x0028, 0x0004),
+          "Photometric Interpretation", "PhotometricInterpretation",  "CS", "1" },    { Tag(0x0028, 0x0005),
+          "Image Dimensions", "ImageDimensions",  "US", "1" },    { Tag(0x0028, 0x0006),
+          "Planar Configuration", "PlanarConfiguration",  "US", "1" },    { Tag(0x0028, 0x0008),
+          "Number of Frames", "NumberOfFrames",  "IS", "1" },    { Tag(0x0028, 0x0009),
+          "Frame Increment Pointer", "FrameIncrementPointer",  "AT", "1-n" },    { Tag(0x0028, 0x000a),
+          "Frame Dimension Pointer", "FrameDimensionPointer",  "AT", "1-n" },    { Tag(0x0028, 0x0010),
+          "Rows", "Rows",  "US", "1" },    { Tag(0x0028, 0x0011),
+          "Columns", "Columns",  "US", "1" },    { Tag(0x0028, 0x0012),
+          "Planes", "Planes",  "US", "1" },    { Tag(0x0028, 0x0014),
+          "Ultrasound Color Data Present", "UltrasoundColorDataPresent",  "US", "1" },    { Tag(0x0028, 0x0030),
+          "Pixel Spacing", "PixelSpacing",  "DS", "2" },    { Tag(0x0028, 0x0031),
+          "Zoom Factor", "ZoomFactor",  "DS", "2" },    { Tag(0x0028, 0x0032),
+          "Zoom Center", "ZoomCenter",  "DS", "2" },    { Tag(0x0028, 0x0034),
+          "Pixel Aspect Ratio", "PixelAspectRatio",  "IS", "2" },    { Tag(0x0028, 0x0040),
+          "Image Format", "ImageFormat",  "CS", "1" },    { Tag(0x0028, 0x0050),
+          "Manipulated Image", "ManipulatedImage",  "LO", "1-n" },    { Tag(0x0028, 0x0051),
+          "Corrected Image", "CorrectedImage",  "CS", "1-n" },    { Tag(0x0028, 0x005f),
+          "Compression Recognition Code", "CompressionRecognitionCode",  "LO", "1" },    { Tag(0x0028, 0x0060),
+          "Compression Code", "CompressionCode",  "CS", "1" },    { Tag(0x0028, 0x0061),
+          "Compression Originator", "CompressionOriginator",  "SH", "1" },    { Tag(0x0028, 0x0062),
+          "Compression Label", "CompressionLabel",  "LO", "1" },    { Tag(0x0028, 0x0063),
+          "Compression Description", "CompressionDescription",  "SH", "1" },    { Tag(0x0028, 0x0065),
+          "Compression Sequence", "CompressionSequence",  "CS", "1-n" },    { Tag(0x0028, 0x0066),
+          "Compression Step Pointers", "CompressionStepPointers",  "AT", "1-n" },    { Tag(0x0028, 0x0068),
+          "Repeat Interval", "RepeatInterval",  "US", "1" },    { Tag(0x0028, 0x0069),
+          "Bits Grouped", "BitsGrouped",  "US", "1" },    { Tag(0x0028, 0x0070),
+          "Perimeter Table", "PerimeterTable",  "US", "1-n" },    { Tag(0x0028, 0x0071),
+          "Perimeter Value", "PerimeterValue",  "US or SS", "1" },    { Tag(0x0028, 0x0080),
+          "Predictor Rows", "PredictorRows",  "US", "1" },    { Tag(0x0028, 0x0081),
+          "Predictor Columns", "PredictorColumns",  "US", "1" },    { Tag(0x0028, 0x0082),
+          "Predictor Constants", "PredictorConstants",  "US", "1-n" },    { Tag(0x0028, 0x0090),
+          "Blocked Pixels", "BlockedPixels",  "CS", "1" },    { Tag(0x0028, 0x0091),
+          "Block Rows", "BlockRows",  "US", "1" },    { Tag(0x0028, 0x0092),
+          "Block Columns", "BlockColumns",  "US", "1" },    { Tag(0x0028, 0x0093),
+          "Row Overlap", "RowOverlap",  "US", "1" },    { Tag(0x0028, 0x0094),
+          "Column Overlap", "ColumnOverlap",  "US", "1" },    { Tag(0x0028, 0x0100),
+          "Bits Allocated", "BitsAllocated",  "US", "1" },    { Tag(0x0028, 0x0101),
+          "Bits Stored", "BitsStored",  "US", "1" },    { Tag(0x0028, 0x0102),
+          "High Bit", "HighBit",  "US", "1" },    { Tag(0x0028, 0x0103),
+          "Pixel Representation", "PixelRepresentation",  "US", "1" },    { Tag(0x0028, 0x0104),
+          "Smallest Valid Pixel Value", "SmallestValidPixelValue",  "US or SS", "1" },    { Tag(0x0028, 0x0105),
+          "Largest Valid Pixel Value", "LargestValidPixelValue",  "US or SS", "1" },    { Tag(0x0028, 0x0106),
+          "Smallest Image Pixel Value", "SmallestImagePixelValue",  "US or SS", "1" },    { Tag(0x0028, 0x0107),
+          "Largest Image Pixel Value", "LargestImagePixelValue",  "US or SS", "1" },    { Tag(0x0028, 0x0108),
+          "Smallest Pixel Value in Series", "SmallestPixelValueInSeries",  "US or SS", "1" },    { Tag(0x0028, 0x0109),
+          "Largest Pixel Value in Series", "LargestPixelValueInSeries",  "US or SS", "1" },    { Tag(0x0028, 0x0110),
+          "Smallest Image Pixel Value in Plane", "SmallestImagePixelValueInPlane",  "US or SS", "1" },    { Tag(0x0028, 0x0111),
+          "Largest Image Pixel Value in Plane", "LargestImagePixelValueInPlane",  "US or SS", "1" },    { Tag(0x0028, 0x0120),
+          "Pixel Padding Value", "PixelPaddingValue",  "US or SS", "1" },    { Tag(0x0028, 0x0121),
+          "Pixel Padding Range Limit", "PixelPaddingRangeLimit",  "US or SS", "1" },    { Tag(0x0028, 0x0122),
+          "Float Pixel Padding Value", "FloatPixelPaddingValue",  "FL", "1" },    { Tag(0x0028, 0x0123),
+          "Double Float Pixel Padding Value", "DoubleFloatPixelPaddingValue",  "FD", "1" },    { Tag(0x0028, 0x0124),
+          "Float Pixel Padding Range Limit", "FloatPixelPaddingRangeLimit",  "FL", "1" },    { Tag(0x0028, 0x0125),
+          "Double Float Pixel Padding Range Limit", "DoubleFloatPixelPaddingRangeLimit",  "FD", "1" },    { Tag(0x0028, 0x0200),
+          "Image Location", "ImageLocation",  "US", "1" },    { Tag(0x0028, 0x0300),
+          "Quality Control Image", "QualityControlImage",  "CS", "1" },    { Tag(0x0028, 0x0301),
+          "Burned In Annotation", "BurnedInAnnotation",  "CS", "1" },    { Tag(0x0028, 0x0302),
+          "Recognizable Visual Features", "RecognizableVisualFeatures",  "CS", "1" },    { Tag(0x0028, 0x0303),
+          "Longitudinal Temporal Information Modified", "LongitudinalTemporalInformationModified",  "CS", "1" },    { Tag(0x0028, 0x0304),
+          "Referenced Color Palette Instance UID", "ReferencedColorPaletteInstanceUID",  "UI", "1" },    { Tag(0x0028, 0x0400),
+          "Transform Label", "TransformLabel",  "LO", "1" },    { Tag(0x0028, 0x0401),
+          "Transform Version Number", "TransformVersionNumber",  "LO", "1" },    { Tag(0x0028, 0x0402),
+          "Number of Transform Steps", "NumberOfTransformSteps",  "US", "1" },    { Tag(0x0028, 0x0403),
+          "Sequence of Compressed Data", "SequenceOfCompressedData",  "LO", "1-n" },    { Tag(0x0028, 0x0404),
+          "Details of Coefficients", "DetailsOfCoefficients",  "AT", "1-n" },                    { Tag(0x0028, 0x0700),
+          "DCT Label", "DCTLabel",  "LO", "1" },    { Tag(0x0028, 0x0701),
+          "Data Block Description", "DataBlockDescription",  "CS", "1-n" },    { Tag(0x0028, 0x0702),
+          "Data Block", "DataBlock",  "AT", "1-n" },    { Tag(0x0028, 0x0710),
+          "Normalization Factor Format", "NormalizationFactorFormat",  "US", "1" },    { Tag(0x0028, 0x0720),
+          "Zonal Map Number Format", "ZonalMapNumberFormat",  "US", "1" },    { Tag(0x0028, 0x0721),
+          "Zonal Map Location", "ZonalMapLocation",  "AT", "1-n" },    { Tag(0x0028, 0x0722),
+          "Zonal Map Format", "ZonalMapFormat",  "US", "1" },    { Tag(0x0028, 0x0730),
+          "Adaptive Map Format", "AdaptiveMapFormat",  "US", "1" },    { Tag(0x0028, 0x0740),
+          "Code Number Format", "CodeNumberFormat",  "US", "1" },                        { Tag(0x0028, 0x0a02),
+          "Pixel Spacing Calibration Type", "PixelSpacingCalibrationType",  "CS", "1" },    { Tag(0x0028, 0x0a04),
+          "Pixel Spacing Calibration Description", "PixelSpacingCalibrationDescription",  "LO", "1" },    { Tag(0x0028, 0x1040),
+          "Pixel Intensity Relationship", "PixelIntensityRelationship",  "CS", "1" },    { Tag(0x0028, 0x1041),
+          "Pixel Intensity Relationship Sign", "PixelIntensityRelationshipSign",  "SS", "1" },    { Tag(0x0028, 0x1050),
+          "Window Center", "WindowCenter",  "DS", "1-n" },    { Tag(0x0028, 0x1051),
+          "Window Width", "WindowWidth",  "DS", "1-n" },    { Tag(0x0028, 0x1052),
+          "Rescale Intercept", "RescaleIntercept",  "DS", "1" },    { Tag(0x0028, 0x1053),
+          "Rescale Slope", "RescaleSlope",  "DS", "1" },    { Tag(0x0028, 0x1054),
+          "Rescale Type", "RescaleType",  "LO", "1" },    { Tag(0x0028, 0x1055),
+          "Window Center & Width Explanation", "WindowCenterWidthExplanation",  "LO", "1-n" },    { Tag(0x0028, 0x1056),
+          "VOI LUT Function", "VOILUTFunction",  "CS", "1" },    { Tag(0x0028, 0x1080),
+          "Gray Scale", "GrayScale",  "CS", "1" },    { Tag(0x0028, 0x1090),
+          "Recommended Viewing Mode", "RecommendedViewingMode",  "CS", "1" },    { Tag(0x0028, 0x1100),
+          "Gray Lookup Table Descriptor", "GrayLookupTableDescriptor",  "US or SS", "3" },    { Tag(0x0028, 0x1101),
+          "Red Palette Color Lookup Table Descriptor", "RedPaletteColorLookupTableDescriptor",  "US or SS", "3" },    { Tag(0x0028, 0x1102),
+          "Green Palette Color Lookup Table Descriptor", "GreenPaletteColorLookupTableDescriptor",  "US or SS", "3" },    { Tag(0x0028, 0x1103),
+          "Blue Palette Color Lookup Table Descriptor", "BluePaletteColorLookupTableDescriptor",  "US or SS", "3" },    { Tag(0x0028, 0x1104),
+          "Alpha Palette Color Lookup Table Descriptor", "AlphaPaletteColorLookupTableDescriptor",  "US", "3" },    { Tag(0x0028, 0x1111),
+          "Large Red Palette Color Lookup Table Descriptor", "LargeRedPaletteColorLookupTableDescriptor",  "US or SS", "4" },    { Tag(0x0028, 0x1112),
+          "Large Green Palette Color Lookup Table Descriptor", "LargeGreenPaletteColorLookupTableDescriptor",  "US or SS", "4" },    { Tag(0x0028, 0x1113),
+          "Large Blue Palette Color Lookup Table Descriptor", "LargeBluePaletteColorLookupTableDescriptor",  "US or SS", "4" },    { Tag(0x0028, 0x1199),
+          "Palette Color Lookup Table UID", "PaletteColorLookupTableUID",  "UI", "1" },    { Tag(0x0028, 0x1200),
+          "Gray Lookup Table Data", "GrayLookupTableData",  "US or SS or OW", "1-n or 1" },    { Tag(0x0028, 0x1201),
+          "Red Palette Color Lookup Table Data", "RedPaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1202),
+          "Green Palette Color Lookup Table Data", "GreenPaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1203),
+          "Blue Palette Color Lookup Table Data", "BluePaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1204),
+          "Alpha Palette Color Lookup Table Data", "AlphaPaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1211),
+          "Large Red Palette Color Lookup Table Data", "LargeRedPaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1212),
+          "Large Green Palette Color Lookup Table Data", "LargeGreenPaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1213),
+          "Large Blue Palette Color Lookup Table Data", "LargeBluePaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1214),
+          "Large Palette Color Lookup Table UID", "LargePaletteColorLookupTableUID",  "UI", "1" },    { Tag(0x0028, 0x1221),
+          "Segmented Red Palette Color Lookup Table Data", "SegmentedRedPaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1222),
+          "Segmented Green Palette Color Lookup Table Data", "SegmentedGreenPaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1223),
+          "Segmented Blue Palette Color Lookup Table Data", "SegmentedBluePaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1224),
+          "Segmented Alpha Palette Color Lookup Table Data", "SegmentedAlphaPaletteColorLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x1300),
+          "Breast Implant Present", "BreastImplantPresent",  "CS", "1" },    { Tag(0x0028, 0x1350),
+          "Partial View", "PartialView",  "CS", "1" },    { Tag(0x0028, 0x1351),
+          "Partial View Description", "PartialViewDescription",  "ST", "1" },    { Tag(0x0028, 0x1352),
+          "Partial View Code Sequence", "PartialViewCodeSequence",  "SQ", "1" },    { Tag(0x0028, 0x135a),
+          "Spatial Locations Preserved", "SpatialLocationsPreserved",  "CS", "1" },    { Tag(0x0028, 0x1401),
+          "Data Frame Assignment Sequence", "DataFrameAssignmentSequence",  "SQ", "1" },    { Tag(0x0028, 0x1402),
+          "Data Path Assignment", "DataPathAssignment",  "CS", "1" },    { Tag(0x0028, 0x1403),
+          "Bits Mapped to Color Lookup Table", "BitsMappedToColorLookupTable",  "US", "1" },    { Tag(0x0028, 0x1404),
+          "Blending LUT 1 Sequence", "BlendingLUT1Sequence",  "SQ", "1" },    { Tag(0x0028, 0x1405),
+          "Blending LUT 1 Transfer Function", "BlendingLUT1TransferFunction",  "CS", "1" },    { Tag(0x0028, 0x1406),
+          "Blending Weight Constant", "BlendingWeightConstant",  "FD", "1" },    { Tag(0x0028, 0x1407),
+          "Blending Lookup Table Descriptor", "BlendingLookupTableDescriptor",  "US", "3" },    { Tag(0x0028, 0x1408),
+          "Blending Lookup Table Data", "BlendingLookupTableData",  "OW", "1" },    { Tag(0x0028, 0x140b),
+          "Enhanced Palette Color Lookup Table Sequence", "EnhancedPaletteColorLookupTableSequence",  "SQ", "1" },    { Tag(0x0028, 0x140c),
+          "Blending LUT 2 Sequence", "BlendingLUT2Sequence",  "SQ", "1" },    { Tag(0x0028, 0x140d),
+          "Blending LUT 2 Transfer Function", "BlendingLUT2TransferFunction",  "CS", "1" },    { Tag(0x0028, 0x140e),
+          "Data Path ID", "DataPathID",  "CS", "1" },    { Tag(0x0028, 0x140f),
+          "RGB LUT Transfer Function", "RGBLUTTransferFunction",  "CS", "1" },    { Tag(0x0028, 0x1410),
+          "Alpha LUT Transfer Function", "AlphaLUTTransferFunction",  "CS", "1" },    { Tag(0x0028, 0x2000),
+          "ICC Profile", "ICCProfile",  "OB", "1" },    { Tag(0x0028, 0x2002),
+          "Color Space", "ColorSpace",  "CS", "1" },    { Tag(0x0028, 0x2110),
+          "Lossy Image Compression", "LossyImageCompression",  "CS", "1" },    { Tag(0x0028, 0x2112),
+          "Lossy Image Compression Ratio", "LossyImageCompressionRatio",  "DS", "1-n" },    { Tag(0x0028, 0x2114),
+          "Lossy Image Compression Method", "LossyImageCompressionMethod",  "CS", "1-n" },    { Tag(0x0028, 0x3000),
+          "Modality LUT Sequence", "ModalityLUTSequence",  "SQ", "1" },    { Tag(0x0028, 0x3002),
+          "LUT Descriptor", "LUTDescriptor",  "US or SS", "3" },    { Tag(0x0028, 0x3003),
+          "LUT Explanation", "LUTExplanation",  "LO", "1" },    { Tag(0x0028, 0x3004),
+          "Modality LUT Type", "ModalityLUTType",  "LO", "1" },    { Tag(0x0028, 0x3006),
+          "LUT Data", "LUTData",  "US or OW", "1-n or 1" },    { Tag(0x0028, 0x3010),
+          "VOI LUT Sequence", "VOILUTSequence",  "SQ", "1" },    { Tag(0x0028, 0x3110),
+          "Softcopy VOI LUT Sequence", "SoftcopyVOILUTSequence",  "SQ", "1" },    { Tag(0x0028, 0x4000),
+          "Image Presentation Comments", "ImagePresentationComments",  "LT", "1" },    { Tag(0x0028, 0x5000),
+          "Bi-Plane Acquisition Sequence", "BiPlaneAcquisitionSequence",  "SQ", "1" },    { Tag(0x0028, 0x6010),
+          "Representative Frame Number", "RepresentativeFrameNumber",  "US", "1" },    { Tag(0x0028, 0x6020),
+          "Frame Numbers of Interest (FOI)", "FrameNumbersOfInterest",  "US", "1-n" },    { Tag(0x0028, 0x6022),
+          "Frame of Interest Description", "FrameOfInterestDescription",  "LO", "1-n" },    { Tag(0x0028, 0x6023),
+          "Frame of Interest Type", "FrameOfInterestType",  "CS", "1-n" },    { Tag(0x0028, 0x6030),
+          "Mask Pointer(s)", "MaskPointers",  "US", "1-n" },    { Tag(0x0028, 0x6040),
+          "R Wave Pointer", "RWavePointer",  "US", "1-n" },    { Tag(0x0028, 0x6100),
+          "Mask Subtraction Sequence", "MaskSubtractionSequence",  "SQ", "1" },    { Tag(0x0028, 0x6101),
+          "Mask Operation", "MaskOperation",  "CS", "1" },    { Tag(0x0028, 0x6102),
+          "Applicable Frame Range", "ApplicableFrameRange",  "US", "2-2n" },    { Tag(0x0028, 0x6110),
+          "Mask Frame Numbers", "MaskFrameNumbers",  "US", "1-n" },    { Tag(0x0028, 0x6112),
+          "Contrast Frame Averaging", "ContrastFrameAveraging",  "US", "1" },    { Tag(0x0028, 0x6114),
+          "Mask Sub-pixel Shift", "MaskSubPixelShift",  "FL", "2" },    { Tag(0x0028, 0x6120),
+          "TID Offset", "TIDOffset",  "SS", "1" },    { Tag(0x0028, 0x6190),
+          "Mask Operation Explanation", "MaskOperationExplanation",  "ST", "1" },    { Tag(0x0028, 0x7000),
+          "Equipment Administrator Sequence", "EquipmentAdministratorSequence",  "SQ", "1" },    { Tag(0x0028, 0x7001),
+          "Number of Display Subsystems", "NumberOfDisplaySubsystems",  "US", "1" },    { Tag(0x0028, 0x7002),
+          "Current Configuration ID", "CurrentConfigurationID",  "US", "1" },    { Tag(0x0028, 0x7003),
+          "Display Subsystem ID", "DisplaySubsystemID",  "US", "1" },    { Tag(0x0028, 0x7004),
+          "Display Subsystem Name", "DisplaySubsystemName",  "SH", "1" },    { Tag(0x0028, 0x7005),
+          "Display Subsystem Description", "DisplaySubsystemDescription",  "LO", "1" },    { Tag(0x0028, 0x7006),
+          "System Status", "SystemStatus",  "CS", "1" },    { Tag(0x0028, 0x7007),
+          "System Status Comment", "SystemStatusComment",  "LO", "1" },    { Tag(0x0028, 0x7008),
+          "Target Luminance Characteristics Sequence", "TargetLuminanceCharacteristicsSequence",  "SQ", "1" },    { Tag(0x0028, 0x7009),
+          "Luminance Characteristics ID", "LuminanceCharacteristicsID",  "US", "1" },    { Tag(0x0028, 0x700a),
+          "Display Subsystem Configuration Sequence", "DisplaySubsystemConfigurationSequence",  "SQ", "1" },    { Tag(0x0028, 0x700b),
+          "Configuration ID", "ConfigurationID",  "US", "1" },    { Tag(0x0028, 0x700c),
+          "Configuration Name", "ConfigurationName",  "SH", "1" },    { Tag(0x0028, 0x700d),
+          "Configuration Description", "ConfigurationDescription",  "LO", "1" },    { Tag(0x0028, 0x700e),
+          "Referenced Target Luminance Characteristics ID", "ReferencedTargetLuminanceCharacteristicsID",  "US", "1" },    { Tag(0x0028, 0x700f),
+          "QA Results Sequence", "QAResultsSequence",  "SQ", "1" },    { Tag(0x0028, 0x7010),
+          "Display Subsystem QA Results Sequence", "DisplaySubsystemQAResultsSequence",  "SQ", "1" },    { Tag(0x0028, 0x7011),
+          "Configuration QA Results Sequence", "ConfigurationQAResultsSequence",  "SQ", "1" },    { Tag(0x0028, 0x7012),
+          "Measurement Equipment Sequence", "MeasurementEquipmentSequence",  "SQ", "1" },    { Tag(0x0028, 0x7013),
+          "Measurement Functions", "MeasurementFunctions",  "CS", "1-n" },    { Tag(0x0028, 0x7014),
+          "Measurement Equipment Type", "MeasurementEquipmentType",  "CS", "1" },    { Tag(0x0028, 0x7015),
+          "Visual Evaluation Result Sequence", "VisualEvaluationResultSequence",  "SQ", "1" },    { Tag(0x0028, 0x7016),
+          "Display Calibration Result Sequence", "DisplayCalibrationResultSequence",  "SQ", "1" },    { Tag(0x0028, 0x7017),
+          "DDL Value", "DDLValue",  "US", "1" },    { Tag(0x0028, 0x7018),
+          "CIExy White Point", "CIExyWhitePoint",  "FL", "2" },    { Tag(0x0028, 0x7019),
+          "Display Function Type", "DisplayFunctionType",  "CS", "1" },    { Tag(0x0028, 0x701a),
+          "Gamma Value", "GammaValue",  "FL", "1" },    { Tag(0x0028, 0x701b),
+          "Number of Luminance Points", "NumberOfLuminancePoints",  "US", "1" },    { Tag(0x0028, 0x701c),
+          "Luminance Response Sequence", "LuminanceResponseSequence",  "SQ", "1" },    { Tag(0x0028, 0x701d),
+          "Target Minimum Luminance", "TargetMinimumLuminance",  "FL", "1" },    { Tag(0x0028, 0x701e),
+          "Target Maximum Luminance", "TargetMaximumLuminance",  "FL", "1" },    { Tag(0x0028, 0x701f),
+          "Luminance Value", "LuminanceValue",  "FL", "1" },    { Tag(0x0028, 0x7020),
+          "Luminance Response Description", "LuminanceResponseDescription",  "LO", "1" },    { Tag(0x0028, 0x7021),
+          "White Point Flag", "WhitePointFlag",  "CS", "1" },    { Tag(0x0028, 0x7022),
+          "Display Device Type Code Sequence", "DisplayDeviceTypeCodeSequence",  "SQ", "1" },    { Tag(0x0028, 0x7023),
+          "Display Subsystem Sequence", "DisplaySubsystemSequence",  "SQ", "1" },    { Tag(0x0028, 0x7024),
+          "Luminance Result Sequence", "LuminanceResultSequence",  "SQ", "1" },    { Tag(0x0028, 0x7025),
+          "Ambient Light Value Source", "AmbientLightValueSource",  "CS", "1" },    { Tag(0x0028, 0x7026),
+          "Measured Characteristics", "MeasuredCharacteristics",  "CS", "1-n" },    { Tag(0x0028, 0x7027),
+          "Luminance Uniformity Result Sequence", "LuminanceUniformityResultSequence",  "SQ", "1" },    { Tag(0x0028, 0x7028),
+          "Visual Evaluation Test Sequence", "VisualEvaluationTestSequence",  "SQ", "1" },    { Tag(0x0028, 0x7029),
+          "Test Result", "TestResult",  "CS", "1" },    { Tag(0x0028, 0x702a),
+          "Test Result Comment", "TestResultComment",  "LO", "1" },    { Tag(0x0028, 0x702b),
+          "Test Image Validation", "TestImageValidation",  "CS", "1" },    { Tag(0x0028, 0x702c),
+          "Test Pattern Code Sequence", "TestPatternCodeSequence",  "SQ", "1" },    { Tag(0x0028, 0x702d),
+          "Measurement Pattern Code Sequence", "MeasurementPatternCodeSequence",  "SQ", "1" },    { Tag(0x0028, 0x702e),
+          "Visual Evaluation Method Code Sequence", "VisualEvaluationMethodCodeSequence",  "SQ", "1" },    { Tag(0x0028, 0x7fe0),
+          "Pixel Data Provider URL", "PixelDataProviderURL",  "UR", "1" },    { Tag(0x0028, 0x9001),
+          "Data Point Rows", "DataPointRows",  "UL", "1" },    { Tag(0x0028, 0x9002),
+          "Data Point Columns", "DataPointColumns",  "UL", "1" },    { Tag(0x0028, 0x9003),
+          "Signal Domain Columns", "SignalDomainColumns",  "CS", "1" },    { Tag(0x0028, 0x9099),
+          "Largest Monochrome Pixel Value", "LargestMonochromePixelValue",  "US", "1" },    { Tag(0x0028, 0x9108),
+          "Data Representation", "DataRepresentation",  "CS", "1" },    { Tag(0x0028, 0x9110),
+          "Pixel Measures Sequence", "PixelMeasuresSequence",  "SQ", "1" },    { Tag(0x0028, 0x9132),
+          "Frame VOI LUT Sequence", "FrameVOILUTSequence",  "SQ", "1" },    { Tag(0x0028, 0x9145),
+          "Pixel Value Transformation Sequence", "PixelValueTransformationSequence",  "SQ", "1" },    { Tag(0x0028, 0x9235),
+          "Signal Domain Rows", "SignalDomainRows",  "CS", "1" },    { Tag(0x0028, 0x9411),
+          "Display Filter Percentage", "DisplayFilterPercentage",  "FL", "1" },    { Tag(0x0028, 0x9415),
+          "Frame Pixel Shift Sequence", "FramePixelShiftSequence",  "SQ", "1" },    { Tag(0x0028, 0x9416),
+          "Subtraction Item ID", "SubtractionItemID",  "US", "1" },    { Tag(0x0028, 0x9422),
+          "Pixel Intensity Relationship LUT Sequence", "PixelIntensityRelationshipLUTSequence",  "SQ", "1" },    { Tag(0x0028, 0x9443),
+          "Frame Pixel Data Properties Sequence", "FramePixelDataPropertiesSequence",  "SQ", "1" },    { Tag(0x0028, 0x9444),
+          "Geometrical Properties", "GeometricalProperties",  "CS", "1" },    { Tag(0x0028, 0x9445),
+          "Geometric Maximum Distortion", "GeometricMaximumDistortion",  "FL", "1" },    { Tag(0x0028, 0x9446),
+          "Image Processing Applied", "ImageProcessingApplied",  "CS", "1-n" },    { Tag(0x0028, 0x9454),
+          "Mask Selection Mode", "MaskSelectionMode",  "CS", "1" },    { Tag(0x0028, 0x9474),
+          "LUT Function", "LUTFunction",  "CS", "1" },    { Tag(0x0028, 0x9478),
+          "Mask Visibility Percentage", "MaskVisibilityPercentage",  "FL", "1" },    { Tag(0x0028, 0x9501),
+          "Pixel Shift Sequence", "PixelShiftSequence",  "SQ", "1" },    { Tag(0x0028, 0x9502),
+          "Region Pixel Shift Sequence", "RegionPixelShiftSequence",  "SQ", "1" },    { Tag(0x0028, 0x9503),
+          "Vertices of the Region", "VerticesOfTheRegion",  "SS", "2-2n" },    { Tag(0x0028, 0x9505),
+          "Multi-frame Presentation Sequence", "MultiFramePresentationSequence",  "SQ", "1" },    { Tag(0x0028, 0x9506),
+          "Pixel Shift Frame Range", "PixelShiftFrameRange",  "US", "2-2n" },    { Tag(0x0028, 0x9507),
+          "LUT Frame Range", "LUTFrameRange",  "US", "2-2n" },    { Tag(0x0028, 0x9520),
+          "Image to Equipment Mapping Matrix", "ImageToEquipmentMappingMatrix",  "DS", "16" },    { Tag(0x0028, 0x9537),
+          "Equipment Coordinate System Identification", "EquipmentCoordinateSystemIdentification",  "CS", "1" },    { Tag(0x0032, 0x000a),
+          "Study Status ID", "StudyStatusID",  "CS", "1" },    { Tag(0x0032, 0x000c),
+          "Study Priority ID", "StudyPriorityID",  "CS", "1" },    { Tag(0x0032, 0x0012),
+          "Study ID Issuer", "StudyIDIssuer",  "LO", "1" },    { Tag(0x0032, 0x0032),
+          "Study Verified Date", "StudyVerifiedDate",  "DA", "1" },    { Tag(0x0032, 0x0033),
+          "Study Verified Time", "StudyVerifiedTime",  "TM", "1" },    { Tag(0x0032, 0x0034),
+          "Study Read Date", "StudyReadDate",  "DA", "1" },    { Tag(0x0032, 0x0035),
+          "Study Read Time", "StudyReadTime",  "TM", "1" },    { Tag(0x0032, 0x1000),
+          "Scheduled Study Start Date", "ScheduledStudyStartDate",  "DA", "1" },    { Tag(0x0032, 0x1001),
+          "Scheduled Study Start Time", "ScheduledStudyStartTime",  "TM", "1" },    { Tag(0x0032, 0x1010),
+          "Scheduled Study Stop Date", "ScheduledStudyStopDate",  "DA", "1" },    { Tag(0x0032, 0x1011),
+          "Scheduled Study Stop Time", "ScheduledStudyStopTime",  "TM", "1" },    { Tag(0x0032, 0x1020),
+          "Scheduled Study Location", "ScheduledStudyLocation",  "LO", "1" },    { Tag(0x0032, 0x1021),
+          "Scheduled Study Location AE Title", "ScheduledStudyLocationAETitle",  "AE", "1-n" },    { Tag(0x0032, 0x1030),
+          "Reason for Study", "ReasonForStudy",  "LO", "1" },    { Tag(0x0032, 0x1031),
+          "Requesting Physician Identification Sequence", "RequestingPhysicianIdentificationSequence",  "SQ", "1" },    { Tag(0x0032, 0x1032),
+          "Requesting Physician", "RequestingPhysician",  "PN", "1" },    { Tag(0x0032, 0x1033),
+          "Requesting Service", "RequestingService",  "LO", "1" },    { Tag(0x0032, 0x1034),
+          "Requesting Service Code Sequence", "RequestingServiceCodeSequence",  "SQ", "1" },    { Tag(0x0032, 0x1040),
+          "Study Arrival Date", "StudyArrivalDate",  "DA", "1" },    { Tag(0x0032, 0x1041),
+          "Study Arrival Time", "StudyArrivalTime",  "TM", "1" },    { Tag(0x0032, 0x1050),
+          "Study Completion Date", "StudyCompletionDate",  "DA", "1" },    { Tag(0x0032, 0x1051),
+          "Study Completion Time", "StudyCompletionTime",  "TM", "1" },    { Tag(0x0032, 0x1055),
+          "Study Component Status ID", "StudyComponentStatusID",  "CS", "1" },    { Tag(0x0032, 0x1060),
+          "Requested Procedure Description", "RequestedProcedureDescription",  "LO", "1" },    { Tag(0x0032, 0x1064),
+          "Requested Procedure Code Sequence", "RequestedProcedureCodeSequence",  "SQ", "1" },    { Tag(0x0032, 0x1070),
+          "Requested Contrast Agent", "RequestedContrastAgent",  "LO", "1" },    { Tag(0x0032, 0x4000),
+          "Study Comments", "StudyComments",  "LT", "1" },    { Tag(0x0038, 0x0004),
+          "Referenced Patient Alias Sequence", "ReferencedPatientAliasSequence",  "SQ", "1" },    { Tag(0x0038, 0x0008),
+          "Visit Status ID", "VisitStatusID",  "CS", "1" },    { Tag(0x0038, 0x0010),
+          "Admission ID", "AdmissionID",  "LO", "1" },    { Tag(0x0038, 0x0011),
+          "Issuer of Admission ID", "IssuerOfAdmissionID",  "LO", "1" },    { Tag(0x0038, 0x0014),
+          "Issuer of Admission ID Sequence", "IssuerOfAdmissionIDSequence",  "SQ", "1" },    { Tag(0x0038, 0x0016),
+          "Route of Admissions", "RouteOfAdmissions",  "LO", "1" },    { Tag(0x0038, 0x001a),
+          "Scheduled Admission Date", "ScheduledAdmissionDate",  "DA", "1" },    { Tag(0x0038, 0x001b),
+          "Scheduled Admission Time", "ScheduledAdmissionTime",  "TM", "1" },    { Tag(0x0038, 0x001c),
+          "Scheduled Discharge Date", "ScheduledDischargeDate",  "DA", "1" },    { Tag(0x0038, 0x001d),
+          "Scheduled Discharge Time", "ScheduledDischargeTime",  "TM", "1" },    { Tag(0x0038, 0x001e),
+          "Scheduled Patient Institution Residence", "ScheduledPatientInstitutionResidence",  "LO", "1" },    { Tag(0x0038, 0x0020),
+          "Admitting Date", "AdmittingDate",  "DA", "1" },    { Tag(0x0038, 0x0021),
+          "Admitting Time", "AdmittingTime",  "TM", "1" },    { Tag(0x0038, 0x0030),
+          "Discharge Date", "DischargeDate",  "DA", "1" },    { Tag(0x0038, 0x0032),
+          "Discharge Time", "DischargeTime",  "TM", "1" },    { Tag(0x0038, 0x0040),
+          "Discharge Diagnosis Description", "DischargeDiagnosisDescription",  "LO", "1" },    { Tag(0x0038, 0x0044),
+          "Discharge Diagnosis Code Sequence", "DischargeDiagnosisCodeSequence",  "SQ", "1" },    { Tag(0x0038, 0x0050),
+          "Special Needs", "SpecialNeeds",  "LO", "1" },    { Tag(0x0038, 0x0060),
+          "Service Episode ID", "ServiceEpisodeID",  "LO", "1" },    { Tag(0x0038, 0x0061),
+          "Issuer of Service Episode ID", "IssuerOfServiceEpisodeID",  "LO", "1" },    { Tag(0x0038, 0x0062),
+          "Service Episode Description", "ServiceEpisodeDescription",  "LO", "1" },    { Tag(0x0038, 0x0064),
+          "Issuer of Service Episode ID Sequence", "IssuerOfServiceEpisodeIDSequence",  "SQ", "1" },    { Tag(0x0038, 0x0100),
+          "Pertinent Documents Sequence", "PertinentDocumentsSequence",  "SQ", "1" },    { Tag(0x0038, 0x0101),
+          "Pertinent Resources Sequence", "PertinentResourcesSequence",  "SQ", "1" },    { Tag(0x0038, 0x0102),
+          "Resource Description", "ResourceDescription",  "LO", "1" },    { Tag(0x0038, 0x0300),
+          "Current Patient Location", "CurrentPatientLocation",  "LO", "1" },    { Tag(0x0038, 0x0400),
+          "Patient's Institution Residence", "PatientInstitutionResidence",  "LO", "1" },    { Tag(0x0038, 0x0500),
+          "Patient State", "PatientState",  "LO", "1" },    { Tag(0x0038, 0x0502),
+          "Patient Clinical Trial Participation Sequence", "PatientClinicalTrialParticipationSequence",  "SQ", "1" },    { Tag(0x0038, 0x4000),
+          "Visit Comments", "VisitComments",  "LT", "1" },    { Tag(0x003a, 0x0004),
+          "Waveform Originality", "WaveformOriginality",  "CS", "1" },    { Tag(0x003a, 0x0005),
+          "Number of Waveform Channels", "NumberOfWaveformChannels",  "US", "1" },    { Tag(0x003a, 0x0010),
+          "Number of Waveform Samples", "NumberOfWaveformSamples",  "UL", "1" },    { Tag(0x003a, 0x001a),
+          "Sampling Frequency", "SamplingFrequency",  "DS", "1" },    { Tag(0x003a, 0x0020),
+          "Multiplex Group Label", "MultiplexGroupLabel",  "SH", "1" },    { Tag(0x003a, 0x0200),
+          "Channel Definition Sequence", "ChannelDefinitionSequence",  "SQ", "1" },    { Tag(0x003a, 0x0202),
+          "Waveform Channel Number", "WaveformChannelNumber",  "IS", "1" },    { Tag(0x003a, 0x0203),
+          "Channel Label", "ChannelLabel",  "SH", "1" },    { Tag(0x003a, 0x0205),
+          "Channel Status", "ChannelStatus",  "CS", "1-n" },    { Tag(0x003a, 0x0208),
+          "Channel Source Sequence", "ChannelSourceSequence",  "SQ", "1" },    { Tag(0x003a, 0x0209),
+          "Channel Source Modifiers Sequence", "ChannelSourceModifiersSequence",  "SQ", "1" },    { Tag(0x003a, 0x020a),
+          "Source Waveform Sequence", "SourceWaveformSequence",  "SQ", "1" },    { Tag(0x003a, 0x020c),
+          "Channel Derivation Description", "ChannelDerivationDescription",  "LO", "1" },    { Tag(0x003a, 0x0210),
+          "Channel Sensitivity", "ChannelSensitivity",  "DS", "1" },    { Tag(0x003a, 0x0211),
+          "Channel Sensitivity Units Sequence", "ChannelSensitivityUnitsSequence",  "SQ", "1" },    { Tag(0x003a, 0x0212),
+          "Channel Sensitivity Correction Factor", "ChannelSensitivityCorrectionFactor",  "DS", "1" },    { Tag(0x003a, 0x0213),
+          "Channel Baseline", "ChannelBaseline",  "DS", "1" },    { Tag(0x003a, 0x0214),
+          "Channel Time Skew", "ChannelTimeSkew",  "DS", "1" },    { Tag(0x003a, 0x0215),
+          "Channel Sample Skew", "ChannelSampleSkew",  "DS", "1" },    { Tag(0x003a, 0x0218),
+          "Channel Offset", "ChannelOffset",  "DS", "1" },    { Tag(0x003a, 0x021a),
+          "Waveform Bits Stored", "WaveformBitsStored",  "US", "1" },    { Tag(0x003a, 0x0220),
+          "Filter Low Frequency", "FilterLowFrequency",  "DS", "1" },    { Tag(0x003a, 0x0221),
+          "Filter High Frequency", "FilterHighFrequency",  "DS", "1" },    { Tag(0x003a, 0x0222),
+          "Notch Filter Frequency", "NotchFilterFrequency",  "DS", "1" },    { Tag(0x003a, 0x0223),
+          "Notch Filter Bandwidth", "NotchFilterBandwidth",  "DS", "1" },    { Tag(0x003a, 0x0230),
+          "Waveform Data Display Scale", "WaveformDataDisplayScale",  "FL", "1" },    { Tag(0x003a, 0x0231),
+          "Waveform Display Background CIELab Value", "WaveformDisplayBackgroundCIELabValue",  "US", "3" },    { Tag(0x003a, 0x0240),
+          "Waveform Presentation Group Sequence", "WaveformPresentationGroupSequence",  "SQ", "1" },    { Tag(0x003a, 0x0241),
+          "Presentation Group Number", "PresentationGroupNumber",  "US", "1" },    { Tag(0x003a, 0x0242),
+          "Channel Display Sequence", "ChannelDisplaySequence",  "SQ", "1" },    { Tag(0x003a, 0x0244),
+          "Channel Recommended Display CIELab Value", "ChannelRecommendedDisplayCIELabValue",  "US", "3" },    { Tag(0x003a, 0x0245),
+          "Channel Position", "ChannelPosition",  "FL", "1" },    { Tag(0x003a, 0x0246),
+          "Display Shading Flag", "DisplayShadingFlag",  "CS", "1" },    { Tag(0x003a, 0x0247),
+          "Fractional Channel Display Scale", "FractionalChannelDisplayScale",  "FL", "1" },    { Tag(0x003a, 0x0248),
+          "Absolute Channel Display Scale", "AbsoluteChannelDisplayScale",  "FL", "1" },    { Tag(0x003a, 0x0300),
+          "Multiplexed Audio Channels Description Code Sequence", "MultiplexedAudioChannelsDescriptionCodeSequence",  "SQ", "1" },    { Tag(0x003a, 0x0301),
+          "Channel Identification Code", "ChannelIdentificationCode",  "IS", "1" },    { Tag(0x003a, 0x0302),
+          "Channel Mode", "ChannelMode",  "CS", "1" },    { Tag(0x0040, 0x0001),
+          "Scheduled Station AE Title", "ScheduledStationAETitle",  "AE", "1-n" },    { Tag(0x0040, 0x0002),
+          "Scheduled Procedure Step Start Date", "ScheduledProcedureStepStartDate",  "DA", "1" },    { Tag(0x0040, 0x0003),
+          "Scheduled Procedure Step Start Time", "ScheduledProcedureStepStartTime",  "TM", "1" },    { Tag(0x0040, 0x0004),
+          "Scheduled Procedure Step End Date", "ScheduledProcedureStepEndDate",  "DA", "1" },    { Tag(0x0040, 0x0005),
+          "Scheduled Procedure Step End Time", "ScheduledProcedureStepEndTime",  "TM", "1" },    { Tag(0x0040, 0x0006),
+          "Scheduled Performing Physician's Name", "ScheduledPerformingPhysicianName",  "PN", "1" },    { Tag(0x0040, 0x0007),
+          "Scheduled Procedure Step Description", "ScheduledProcedureStepDescription",  "LO", "1" },    { Tag(0x0040, 0x0008),
+          "Scheduled Protocol Code Sequence", "ScheduledProtocolCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x0009),
+          "Scheduled Procedure Step ID", "ScheduledProcedureStepID",  "SH", "1" },    { Tag(0x0040, 0x000a),
+          "Stage Code Sequence", "StageCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x000b),
+          "Scheduled Performing Physician Identification Sequence", "ScheduledPerformingPhysicianIdentificationSequence",  "SQ", "1" },    { Tag(0x0040, 0x0010),
+          "Scheduled Station Name", "ScheduledStationName",  "SH", "1-n" },    { Tag(0x0040, 0x0011),
+          "Scheduled Procedure Step Location", "ScheduledProcedureStepLocation",  "SH", "1" },    { Tag(0x0040, 0x0012),
+          "Pre-Medication", "PreMedication",  "LO", "1" },    { Tag(0x0040, 0x0020),
+          "Scheduled Procedure Step Status", "ScheduledProcedureStepStatus",  "CS", "1" },    { Tag(0x0040, 0x0026),
+          "Order Placer Identifier Sequence", "OrderPlacerIdentifierSequence",  "SQ", "1" },    { Tag(0x0040, 0x0027),
+          "Order Filler Identifier Sequence", "OrderFillerIdentifierSequence",  "SQ", "1" },    { Tag(0x0040, 0x0031),
+          "Local Namespace Entity ID", "LocalNamespaceEntityID",  "UT", "1" },    { Tag(0x0040, 0x0032),
+          "Universal Entity ID", "UniversalEntityID",  "UT", "1" },    { Tag(0x0040, 0x0033),
+          "Universal Entity ID Type", "UniversalEntityIDType",  "CS", "1" },    { Tag(0x0040, 0x0035),
+          "Identifier Type Code", "IdentifierTypeCode",  "CS", "1" },    { Tag(0x0040, 0x0036),
+          "Assigning Facility Sequence", "AssigningFacilitySequence",  "SQ", "1" },    { Tag(0x0040, 0x0039),
+          "Assigning Jurisdiction Code Sequence", "AssigningJurisdictionCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x003a),
+          "Assigning Agency or Department Code Sequence", "AssigningAgencyOrDepartmentCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x0100),
+          "Scheduled Procedure Step Sequence", "ScheduledProcedureStepSequence",  "SQ", "1" },    { Tag(0x0040, 0x0220),
+          "Referenced Non-Image Composite SOP Instance Sequence", "ReferencedNonImageCompositeSOPInstanceSequence",  "SQ", "1" },    { Tag(0x0040, 0x0241),
+          "Performed Station AE Title", "PerformedStationAETitle",  "AE", "1" },    { Tag(0x0040, 0x0242),
+          "Performed Station Name", "PerformedStationName",  "SH", "1" },    { Tag(0x0040, 0x0243),
+          "Performed Location", "PerformedLocation",  "SH", "1" },    { Tag(0x0040, 0x0244),
+          "Performed Procedure Step Start Date", "PerformedProcedureStepStartDate",  "DA", "1" },    { Tag(0x0040, 0x0245),
+          "Performed Procedure Step Start Time", "PerformedProcedureStepStartTime",  "TM", "1" },    { Tag(0x0040, 0x0250),
+          "Performed Procedure Step End Date", "PerformedProcedureStepEndDate",  "DA", "1" },    { Tag(0x0040, 0x0251),
+          "Performed Procedure Step End Time", "PerformedProcedureStepEndTime",  "TM", "1" },    { Tag(0x0040, 0x0252),
+          "Performed Procedure Step Status", "PerformedProcedureStepStatus",  "CS", "1" },    { Tag(0x0040, 0x0253),
+          "Performed Procedure Step ID", "PerformedProcedureStepID",  "SH", "1" },    { Tag(0x0040, 0x0254),
+          "Performed Procedure Step Description", "PerformedProcedureStepDescription",  "LO", "1" },    { Tag(0x0040, 0x0255),
+          "Performed Procedure Type Description", "PerformedProcedureTypeDescription",  "LO", "1" },    { Tag(0x0040, 0x0260),
+          "Performed Protocol Code Sequence", "PerformedProtocolCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x0261),
+          "Performed Protocol Type", "PerformedProtocolType",  "CS", "1" },    { Tag(0x0040, 0x0270),
+          "Scheduled Step Attributes Sequence", "ScheduledStepAttributesSequence",  "SQ", "1" },    { Tag(0x0040, 0x0275),
+          "Request Attributes Sequence", "RequestAttributesSequence",  "SQ", "1" },    { Tag(0x0040, 0x0280),
+          "Comments on the Performed Procedure Step", "CommentsOnThePerformedProcedureStep",  "ST", "1" },    { Tag(0x0040, 0x0281),
+          "Performed Procedure Step Discontinuation Reason Code Sequence", "PerformedProcedureStepDiscontinuationReasonCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x0293),
+          "Quantity Sequence", "QuantitySequence",  "SQ", "1" },    { Tag(0x0040, 0x0294),
+          "Quantity", "Quantity",  "DS", "1" },    { Tag(0x0040, 0x0295),
+          "Measuring Units Sequence", "MeasuringUnitsSequence",  "SQ", "1" },    { Tag(0x0040, 0x0296),
+          "Billing Item Sequence", "BillingItemSequence",  "SQ", "1" },    { Tag(0x0040, 0x0300),
+          "Total Time of Fluoroscopy", "TotalTimeOfFluoroscopy",  "US", "1" },    { Tag(0x0040, 0x0301),
+          "Total Number of Exposures", "TotalNumberOfExposures",  "US", "1" },    { Tag(0x0040, 0x0302),
+          "Entrance Dose", "EntranceDose",  "US", "1" },    { Tag(0x0040, 0x0303),
+          "Exposed Area", "ExposedArea",  "US", "1-2" },    { Tag(0x0040, 0x0306),
+          "Distance Source to Entrance", "DistanceSourceToEntrance",  "DS", "1" },    { Tag(0x0040, 0x0307),
+          "Distance Source to Support", "DistanceSourceToSupport",  "DS", "1" },    { Tag(0x0040, 0x030e),
+          "Exposure Dose Sequence", "ExposureDoseSequence",  "SQ", "1" },    { Tag(0x0040, 0x0310),
+          "Comments on Radiation Dose", "CommentsOnRadiationDose",  "ST", "1" },    { Tag(0x0040, 0x0312),
+          "X-Ray Output", "XRayOutput",  "DS", "1" },    { Tag(0x0040, 0x0314),
+          "Half Value Layer", "HalfValueLayer",  "DS", "1" },    { Tag(0x0040, 0x0316),
+          "Organ Dose", "OrganDose",  "DS", "1" },    { Tag(0x0040, 0x0318),
+          "Organ Exposed", "OrganExposed",  "CS", "1" },    { Tag(0x0040, 0x0320),
+          "Billing Procedure Step Sequence", "BillingProcedureStepSequence",  "SQ", "1" },    { Tag(0x0040, 0x0321),
+          "Film Consumption Sequence", "FilmConsumptionSequence",  "SQ", "1" },    { Tag(0x0040, 0x0324),
+          "Billing Supplies and Devices Sequence", "BillingSuppliesAndDevicesSequence",  "SQ", "1" },    { Tag(0x0040, 0x0330),
+          "Referenced Procedure Step Sequence", "ReferencedProcedureStepSequence",  "SQ", "1" },    { Tag(0x0040, 0x0340),
+          "Performed Series Sequence", "PerformedSeriesSequence",  "SQ", "1" },    { Tag(0x0040, 0x0400),
+          "Comments on the Scheduled Procedure Step", "CommentsOnTheScheduledProcedureStep",  "LT", "1" },    { Tag(0x0040, 0x0440),
+          "Protocol Context Sequence", "ProtocolContextSequence",  "SQ", "1" },    { Tag(0x0040, 0x0441),
+          "Content Item Modifier Sequence", "ContentItemModifierSequence",  "SQ", "1" },    { Tag(0x0040, 0x0500),
+          "Scheduled Specimen Sequence", "ScheduledSpecimenSequence",  "SQ", "1" },    { Tag(0x0040, 0x050a),
+          "Specimen Accession Number", "SpecimenAccessionNumber",  "LO", "1" },    { Tag(0x0040, 0x0512),
+          "Container Identifier", "ContainerIdentifier",  "LO", "1" },    { Tag(0x0040, 0x0513),
+          "Issuer of the Container Identifier Sequence", "IssuerOfTheContainerIdentifierSequence",  "SQ", "1" },    { Tag(0x0040, 0x0515),
+          "Alternate Container Identifier Sequence", "AlternateContainerIdentifierSequence",  "SQ", "1" },    { Tag(0x0040, 0x0518),
+          "Container Type Code Sequence", "ContainerTypeCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x051a),
+          "Container Description", "ContainerDescription",  "LO", "1" },    { Tag(0x0040, 0x0520),
+          "Container Component Sequence", "ContainerComponentSequence",  "SQ", "1" },    { Tag(0x0040, 0x0550),
+          "Specimen Sequence", "SpecimenSequence",  "SQ", "1" },    { Tag(0x0040, 0x0551),
+          "Specimen Identifier", "SpecimenIdentifier",  "LO", "1" },    { Tag(0x0040, 0x0552),
+          "Specimen Description Sequence (Trial)", "SpecimenDescriptionSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0x0553),
+          "Specimen Description (Trial)", "SpecimenDescriptionTrial",  "ST", "1" },    { Tag(0x0040, 0x0554),
+          "Specimen UID", "SpecimenUID",  "UI", "1" },    { Tag(0x0040, 0x0555),
+          "Acquisition Context Sequence", "AcquisitionContextSequence",  "SQ", "1" },    { Tag(0x0040, 0x0556),
+          "Acquisition Context Description", "AcquisitionContextDescription",  "ST", "1" },    { Tag(0x0040, 0x059a),
+          "Specimen Type Code Sequence", "SpecimenTypeCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x0560),
+          "Specimen Description Sequence", "SpecimenDescriptionSequence",  "SQ", "1" },    { Tag(0x0040, 0x0562),
+          "Issuer of the Specimen Identifier Sequence", "IssuerOfTheSpecimenIdentifierSequence",  "SQ", "1" },    { Tag(0x0040, 0x0600),
+          "Specimen Short Description", "SpecimenShortDescription",  "LO", "1" },    { Tag(0x0040, 0x0602),
+          "Specimen Detailed Description", "SpecimenDetailedDescription",  "UT", "1" },    { Tag(0x0040, 0x0610),
+          "Specimen Preparation Sequence", "SpecimenPreparationSequence",  "SQ", "1" },    { Tag(0x0040, 0x0612),
+          "Specimen Preparation Step Content Item Sequence", "SpecimenPreparationStepContentItemSequence",  "SQ", "1" },    { Tag(0x0040, 0x0620),
+          "Specimen Localization Content Item Sequence", "SpecimenLocalizationContentItemSequence",  "SQ", "1" },    { Tag(0x0040, 0x06fa),
+          "Slide Identifier", "SlideIdentifier",  "LO", "1" },    { Tag(0x0040, 0x071a),
+          "Image Center Point Coordinates Sequence", "ImageCenterPointCoordinatesSequence",  "SQ", "1" },    { Tag(0x0040, 0x072a),
+          "X Offset in Slide Coordinate System", "XOffsetInSlideCoordinateSystem",  "DS", "1" },    { Tag(0x0040, 0x073a),
+          "Y Offset in Slide Coordinate System", "YOffsetInSlideCoordinateSystem",  "DS", "1" },    { Tag(0x0040, 0x074a),
+          "Z Offset in Slide Coordinate System", "ZOffsetInSlideCoordinateSystem",  "DS", "1" },    { Tag(0x0040, 0x08d8),
+          "Pixel Spacing Sequence", "PixelSpacingSequence",  "SQ", "1" },    { Tag(0x0040, 0x08da),
+          "Coordinate System Axis Code Sequence", "CoordinateSystemAxisCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x08ea),
+          "Measurement Units Code Sequence", "MeasurementUnitsCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x09f8),
+          "Vital Stain Code Sequence (Trial)", "VitalStainCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0x1001),
+          "Requested Procedure ID", "RequestedProcedureID",  "SH", "1" },    { Tag(0x0040, 0x1002),
+          "Reason for the Requested Procedure", "ReasonForTheRequestedProcedure",  "LO", "1" },    { Tag(0x0040, 0x1003),
+          "Requested Procedure Priority", "RequestedProcedurePriority",  "SH", "1" },    { Tag(0x0040, 0x1004),
+          "Patient Transport Arrangements", "PatientTransportArrangements",  "LO", "1" },    { Tag(0x0040, 0x1005),
+          "Requested Procedure Location", "RequestedProcedureLocation",  "LO", "1" },    { Tag(0x0040, 0x1006),
+          "Placer Order Number / Procedure", "PlacerOrderNumberProcedure",  "SH", "1" },    { Tag(0x0040, 0x1007),
+          "Filler Order Number / Procedure", "FillerOrderNumberProcedure",  "SH", "1" },    { Tag(0x0040, 0x1008),
+          "Confidentiality Code", "ConfidentialityCode",  "LO", "1" },    { Tag(0x0040, 0x1009),
+          "Reporting Priority", "ReportingPriority",  "SH", "1" },    { Tag(0x0040, 0x100a),
+          "Reason for Requested Procedure Code Sequence", "ReasonForRequestedProcedureCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x1010),
+          "Names of Intended Recipients of Results", "NamesOfIntendedRecipientsOfResults",  "PN", "1-n" },    { Tag(0x0040, 0x1011),
+          "Intended Recipients of Results Identification Sequence", "IntendedRecipientsOfResultsIdentificationSequence",  "SQ", "1" },    { Tag(0x0040, 0x1012),
+          "Reason For Performed Procedure Code Sequence", "ReasonForPerformedProcedureCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x1060),
+          "Requested Procedure Description (Trial)", "RequestedProcedureDescriptionTrial",  "LO", "1" },    { Tag(0x0040, 0x1101),
+          "Person Identification Code Sequence", "PersonIdentificationCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x1102),
+          "Person's Address", "PersonAddress",  "ST", "1" },    { Tag(0x0040, 0x1103),
+          "Person's Telephone Numbers", "PersonTelephoneNumbers",  "LO", "1-n" },    { Tag(0x0040, 0x1104),
+          "Person's Telecom Information", "PersonTelecomInformation",  "LT", "1" },    { Tag(0x0040, 0x1400),
+          "Requested Procedure Comments", "RequestedProcedureComments",  "LT", "1" },    { Tag(0x0040, 0x2001),
+          "Reason for the Imaging Service Request", "ReasonForTheImagingServiceRequest",  "LO", "1" },    { Tag(0x0040, 0x2004),
+          "Issue Date of Imaging Service Request", "IssueDateOfImagingServiceRequest",  "DA", "1" },    { Tag(0x0040, 0x2005),
+          "Issue Time of Imaging Service Request", "IssueTimeOfImagingServiceRequest",  "TM", "1" },    { Tag(0x0040, 0x2006),
+          "Placer Order Number / Imaging Service Request (Retired)", "PlacerOrderNumberImagingServiceRequestRetired",  "SH", "1" },    { Tag(0x0040, 0x2007),
+          "Filler Order Number / Imaging Service Request (Retired)", "FillerOrderNumberImagingServiceRequestRetired",  "SH", "1" },    { Tag(0x0040, 0x2008),
+          "Order Entered By", "OrderEnteredBy",  "PN", "1" },    { Tag(0x0040, 0x2009),
+          "Order Enterer's Location", "OrderEntererLocation",  "SH", "1" },    { Tag(0x0040, 0x2010),
+          "Order Callback Phone Number", "OrderCallbackPhoneNumber",  "SH", "1" },    { Tag(0x0040, 0x2011),
+          "Order Callback Telecom Information", "OrderCallbackTelecomInformation",  "LT", "1" },    { Tag(0x0040, 0x2016),
+          "Placer Order Number / Imaging Service Request", "PlacerOrderNumberImagingServiceRequest",  "LO", "1" },    { Tag(0x0040, 0x2017),
+          "Filler Order Number / Imaging Service Request", "FillerOrderNumberImagingServiceRequest",  "LO", "1" },    { Tag(0x0040, 0x2400),
+          "Imaging Service Request Comments", "ImagingServiceRequestComments",  "LT", "1" },    { Tag(0x0040, 0x3001),
+          "Confidentiality Constraint on Patient Data Description", "ConfidentialityConstraintOnPatientDataDescription",  "LO", "1" },    { Tag(0x0040, 0x4001),
+          "General Purpose Scheduled Procedure Step Status", "GeneralPurposeScheduledProcedureStepStatus",  "CS", "1" },    { Tag(0x0040, 0x4002),
+          "General Purpose Performed Procedure Step Status", "GeneralPurposePerformedProcedureStepStatus",  "CS", "1" },    { Tag(0x0040, 0x4003),
+          "General Purpose Scheduled Procedure Step Priority", "GeneralPurposeScheduledProcedureStepPriority",  "CS", "1" },    { Tag(0x0040, 0x4004),
+          "Scheduled Processing Applications Code Sequence", "ScheduledProcessingApplicationsCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4005),
+          "Scheduled Procedure Step Start DateTime", "ScheduledProcedureStepStartDateTime",  "DT", "1" },    { Tag(0x0040, 0x4006),
+          "Multiple Copies Flag", "MultipleCopiesFlag",  "CS", "1" },    { Tag(0x0040, 0x4007),
+          "Performed Processing Applications Code Sequence", "PerformedProcessingApplicationsCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4009),
+          "Human Performer Code Sequence", "HumanPerformerCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4010),
+          "Scheduled Procedure Step Modification DateTime", "ScheduledProcedureStepModificationDateTime",  "DT", "1" },    { Tag(0x0040, 0x4011),
+          "Expected Completion DateTime", "ExpectedCompletionDateTime",  "DT", "1" },    { Tag(0x0040, 0x4015),
+          "Resulting General Purpose Performed Procedure Steps Sequence", "ResultingGeneralPurposePerformedProcedureStepsSequence",  "SQ", "1" },    { Tag(0x0040, 0x4016),
+          "Referenced General Purpose Scheduled Procedure Step Sequence", "ReferencedGeneralPurposeScheduledProcedureStepSequence",  "SQ", "1" },    { Tag(0x0040, 0x4018),
+          "Scheduled Workitem Code Sequence", "ScheduledWorkitemCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4019),
+          "Performed Workitem Code Sequence", "PerformedWorkitemCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4020),
+          "Input Availability Flag", "InputAvailabilityFlag",  "CS", "1" },    { Tag(0x0040, 0x4021),
+          "Input Information Sequence", "InputInformationSequence",  "SQ", "1" },    { Tag(0x0040, 0x4022),
+          "Relevant Information Sequence", "RelevantInformationSequence",  "SQ", "1" },    { Tag(0x0040, 0x4023),
+          "Referenced General Purpose Scheduled Procedure Step Transaction UID", "ReferencedGeneralPurposeScheduledProcedureStepTransactionUID",  "UI", "1" },    { Tag(0x0040, 0x4025),
+          "Scheduled Station Name Code Sequence", "ScheduledStationNameCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4026),
+          "Scheduled Station Class Code Sequence", "ScheduledStationClassCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4027),
+          "Scheduled Station Geographic Location Code Sequence", "ScheduledStationGeographicLocationCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4028),
+          "Performed Station Name Code Sequence", "PerformedStationNameCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4029),
+          "Performed Station Class Code Sequence", "PerformedStationClassCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4030),
+          "Performed Station Geographic Location Code Sequence", "PerformedStationGeographicLocationCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4031),
+          "Requested Subsequent Workitem Code Sequence", "RequestedSubsequentWorkitemCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4032),
+          "Non-DICOM Output Code Sequence", "NonDICOMOutputCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x4033),
+          "Output Information Sequence", "OutputInformationSequence",  "SQ", "1" },    { Tag(0x0040, 0x4034),
+          "Scheduled Human Performers Sequence", "ScheduledHumanPerformersSequence",  "SQ", "1" },    { Tag(0x0040, 0x4035),
+          "Actual Human Performers Sequence", "ActualHumanPerformersSequence",  "SQ", "1" },    { Tag(0x0040, 0x4036),
+          "Human Performer's Organization", "HumanPerformerOrganization",  "LO", "1" },    { Tag(0x0040, 0x4037),
+          "Human Performer's Name", "HumanPerformerName",  "PN", "1" },    { Tag(0x0040, 0x4040),
+          "Raw Data Handling", "RawDataHandling",  "CS", "1" },    { Tag(0x0040, 0x4041),
+          "Input Readiness State", "InputReadinessState",  "CS", "1" },    { Tag(0x0040, 0x4050),
+          "Performed Procedure Step Start DateTime", "PerformedProcedureStepStartDateTime",  "DT", "1" },    { Tag(0x0040, 0x4051),
+          "Performed Procedure Step End DateTime", "PerformedProcedureStepEndDateTime",  "DT", "1" },    { Tag(0x0040, 0x4052),
+          "Procedure Step Cancellation DateTime", "ProcedureStepCancellationDateTime",  "DT", "1" },    { Tag(0x0040, 0x4070),
+          "Output Destination Sequence", "OutputDestinationSequence",  "SQ", "1" },    { Tag(0x0040, 0x4071),
+          "DICOM Storage Sequence", "DICOMStorageSequence",  "SQ", "1" },    { Tag(0x0040, 0x4072),
+          "STOW-RS Storage Sequence", "STOWRSStorageSequence",  "SQ", "1" },    { Tag(0x0040, 0x4073),
+          "Storage URL", "StorageURL",  "UR", "1" },    { Tag(0x0040, 0x4074),
+          "XDS Storage Sequence", "XDSStorageSequence",  "SQ", "1" },    { Tag(0x0040, 0x8302),
+          "Entrance Dose in mGy", "EntranceDoseInmGy",  "DS", "1" },    { Tag(0x0040, 0x9092),
+          "Parametric Map Frame Type Sequence", "ParametricMapFrameTypeSequence",  "SQ", "1" },    { Tag(0x0040, 0x9094),
+          "Referenced Image Real World Value Mapping Sequence", "ReferencedImageRealWorldValueMappingSequence",  "SQ", "1" },    { Tag(0x0040, 0x9096),
+          "Real World Value Mapping Sequence", "RealWorldValueMappingSequence",  "SQ", "1" },    { Tag(0x0040, 0x9098),
+          "Pixel Value Mapping Code Sequence", "PixelValueMappingCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0x9210),
+          "LUT Label", "LUTLabel",  "SH", "1" },    { Tag(0x0040, 0x9211),
+          "Real World Value Last Value Mapped", "RealWorldValueLastValueMapped",  "US or SS", "1" },    { Tag(0x0040, 0x9212),
+          "Real World Value LUT Data", "RealWorldValueLUTData",  "FD", "1-n" },    { Tag(0x0040, 0x9213),
+          "Double Float Real World Value Last Value Mapped", "DoubleFloatRealWorldValueLastValueMapped",  "FD", "1" },    { Tag(0x0040, 0x9214),
+          "Double Float Real World Value First Value Mapped", "DoubleFloatRealWorldValueFirstValueMapped",  "FD", "1" },    { Tag(0x0040, 0x9216),
+          "Real World Value First Value Mapped", "RealWorldValueFirstValueMapped",  "US or SS", "1" },    { Tag(0x0040, 0x9220),
+          "Quantity Definition Sequence", "QuantityDefinitionSequence",  "SQ", "1" },    { Tag(0x0040, 0x9224),
+          "Real World Value Intercept", "RealWorldValueIntercept",  "FD", "1" },    { Tag(0x0040, 0x9225),
+          "Real World Value Slope", "RealWorldValueSlope",  "FD", "1" },    { Tag(0x0040, 0xa007),
+          "Findings Flag (Trial)", "FindingsFlagTrial",  "CS", "1" },    { Tag(0x0040, 0xa010),
+          "Relationship Type", "RelationshipType",  "CS", "1" },    { Tag(0x0040, 0xa020),
+          "Findings Sequence (Trial)", "FindingsSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa021),
+          "Findings Group UID (Trial)", "FindingsGroupUIDTrial",  "UI", "1" },    { Tag(0x0040, 0xa022),
+          "Referenced Findings Group UID (Trial)", "ReferencedFindingsGroupUIDTrial",  "UI", "1" },    { Tag(0x0040, 0xa023),
+          "Findings Group Recording Date (Trial)", "FindingsGroupRecordingDateTrial",  "DA", "1" },    { Tag(0x0040, 0xa024),
+          "Findings Group Recording Time (Trial)", "FindingsGroupRecordingTimeTrial",  "TM", "1" },    { Tag(0x0040, 0xa026),
+          "Findings Source Category Code Sequence (Trial)", "FindingsSourceCategoryCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa027),
+          "Verifying Organization", "VerifyingOrganization",  "LO", "1" },    { Tag(0x0040, 0xa028),
+          "Documenting Organization Identifier Code Sequence (Trial)", "DocumentingOrganizationIdentifierCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa030),
+          "Verification DateTime", "VerificationDateTime",  "DT", "1" },    { Tag(0x0040, 0xa032),
+          "Observation DateTime", "ObservationDateTime",  "DT", "1" },    { Tag(0x0040, 0xa040),
+          "Value Type", "ValueType",  "CS", "1" },    { Tag(0x0040, 0xa043),
+          "Concept Name Code Sequence", "ConceptNameCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0xa047),
+          "Measurement Precision Description (Trial)", "MeasurementPrecisionDescriptionTrial",  "LO", "1" },    { Tag(0x0040, 0xa050),
+          "Continuity Of Content", "ContinuityOfContent",  "CS", "1" },    { Tag(0x0040, 0xa057),
+          "Urgency or Priority Alerts (Trial)", "UrgencyOrPriorityAlertsTrial",  "CS", "1-n" },    { Tag(0x0040, 0xa060),
+          "Sequencing Indicator (Trial)", "SequencingIndicatorTrial",  "LO", "1" },    { Tag(0x0040, 0xa066),
+          "Document Identifier Code Sequence (Trial)", "DocumentIdentifierCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa067),
+          "Document Author (Trial)", "DocumentAuthorTrial",  "PN", "1" },    { Tag(0x0040, 0xa068),
+          "Document Author Identifier Code Sequence (Trial)", "DocumentAuthorIdentifierCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa070),
+          "Identifier Code Sequence (Trial)", "IdentifierCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa073),
+          "Verifying Observer Sequence", "VerifyingObserverSequence",  "SQ", "1" },    { Tag(0x0040, 0xa074),
+          "Object Binary Identifier (Trial)", "ObjectBinaryIdentifierTrial",  "OB", "1" },    { Tag(0x0040, 0xa075),
+          "Verifying Observer Name", "VerifyingObserverName",  "PN", "1" },    { Tag(0x0040, 0xa076),
+          "Documenting Observer Identifier Code Sequence (Trial)", "DocumentingObserverIdentifierCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa078),
+          "Author Observer Sequence", "AuthorObserverSequence",  "SQ", "1" },    { Tag(0x0040, 0xa07a),
+          "Participant Sequence", "ParticipantSequence",  "SQ", "1" },    { Tag(0x0040, 0xa07c),
+          "Custodial Organization Sequence", "CustodialOrganizationSequence",  "SQ", "1" },    { Tag(0x0040, 0xa080),
+          "Participation Type", "ParticipationType",  "CS", "1" },    { Tag(0x0040, 0xa082),
+          "Participation DateTime", "ParticipationDateTime",  "DT", "1" },    { Tag(0x0040, 0xa084),
+          "Observer Type", "ObserverType",  "CS", "1" },    { Tag(0x0040, 0xa085),
+          "Procedure Identifier Code Sequence (Trial)", "ProcedureIdentifierCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa088),
+          "Verifying Observer Identification Code Sequence", "VerifyingObserverIdentificationCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0xa089),
+          "Object Directory Binary Identifier (Trial)", "ObjectDirectoryBinaryIdentifierTrial",  "OB", "1" },    { Tag(0x0040, 0xa090),
+          "Equivalent CDA Document Sequence", "EquivalentCDADocumentSequence",  "SQ", "1" },    { Tag(0x0040, 0xa0b0),
+          "Referenced Waveform Channels", "ReferencedWaveformChannels",  "US", "2-2n" },    { Tag(0x0040, 0xa110),
+          "Date of Document or Verbal Transaction (Trial)", "DateOfDocumentOrVerbalTransactionTrial",  "DA", "1" },    { Tag(0x0040, 0xa112),
+          "Time of Document Creation or Verbal Transaction (Trial)", "TimeOfDocumentCreationOrVerbalTransactionTrial",  "TM", "1" },    { Tag(0x0040, 0xa120),
+          "DateTime", "DateTime",  "DT", "1" },    { Tag(0x0040, 0xa121),
+          "Date", "Date",  "DA", "1" },    { Tag(0x0040, 0xa122),
+          "Time", "Time",  "TM", "1" },    { Tag(0x0040, 0xa123),
+          "Person Name", "PersonName",  "PN", "1" },    { Tag(0x0040, 0xa124),
+          "UID", "UID",  "UI", "1" },    { Tag(0x0040, 0xa125),
+          "Report Status ID (Trial)", "ReportStatusIDTrial",  "CS", "2" },    { Tag(0x0040, 0xa130),
+          "Temporal Range Type", "TemporalRangeType",  "CS", "1" },    { Tag(0x0040, 0xa132),
+          "Referenced Sample Positions", "ReferencedSamplePositions",  "UL", "1-n" },    { Tag(0x0040, 0xa136),
+          "Referenced Frame Numbers", "ReferencedFrameNumbers",  "US", "1-n" },    { Tag(0x0040, 0xa138),
+          "Referenced Time Offsets", "ReferencedTimeOffsets",  "DS", "1-n" },    { Tag(0x0040, 0xa13a),
+          "Referenced DateTime", "ReferencedDateTime",  "DT", "1-n" },    { Tag(0x0040, 0xa160),
+          "Text Value", "TextValue",  "UT", "1" },    { Tag(0x0040, 0xa161),
+          "Floating Point Value", "FloatingPointValue",  "FD", "1-n" },    { Tag(0x0040, 0xa162),
+          "Rational Numerator Value", "RationalNumeratorValue",  "SL", "1-n" },    { Tag(0x0040, 0xa163),
+          "Rational Denominator Value", "RationalDenominatorValue",  "UL", "1-n" },    { Tag(0x0040, 0xa167),
+          "Observation Category Code Sequence (Trial)", "ObservationCategoryCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa168),
+          "Concept Code Sequence", "ConceptCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0xa16a),
+          "Bibliographic Citation (Trial)", "BibliographicCitationTrial",  "ST", "1" },    { Tag(0x0040, 0xa170),
+          "Purpose of Reference Code Sequence", "PurposeOfReferenceCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0xa171),
+          "Observation UID", "ObservationUID",  "UI", "1" },    { Tag(0x0040, 0xa172),
+          "Referenced Observation UID (Trial)", "ReferencedObservationUIDTrial",  "UI", "1" },    { Tag(0x0040, 0xa173),
+          "Referenced Observation Class (Trial)", "ReferencedObservationClassTrial",  "CS", "1" },    { Tag(0x0040, 0xa174),
+          "Referenced Object Observation Class (Trial)", "ReferencedObjectObservationClassTrial",  "CS", "1" },    { Tag(0x0040, 0xa180),
+          "Annotation Group Number", "AnnotationGroupNumber",  "US", "1" },    { Tag(0x0040, 0xa192),
+          "Observation Date (Trial)", "ObservationDateTrial",  "DA", "1" },    { Tag(0x0040, 0xa193),
+          "Observation Time (Trial)", "ObservationTimeTrial",  "TM", "1" },    { Tag(0x0040, 0xa194),
+          "Measurement Automation (Trial)", "MeasurementAutomationTrial",  "CS", "1" },    { Tag(0x0040, 0xa195),
+          "Modifier Code Sequence", "ModifierCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0xa224),
+          "Identification Description (Trial)", "IdentificationDescriptionTrial",  "ST", "1" },    { Tag(0x0040, 0xa290),
+          "Coordinates Set Geometric Type (Trial)", "CoordinatesSetGeometricTypeTrial",  "CS", "1" },    { Tag(0x0040, 0xa296),
+          "Algorithm Code Sequence (Trial)", "AlgorithmCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa297),
+          "Algorithm Description (Trial)", "AlgorithmDescriptionTrial",  "ST", "1" },    { Tag(0x0040, 0xa29a),
+          "Pixel Coordinates Set (Trial)", "PixelCoordinatesSetTrial",  "SL", "2-2n" },    { Tag(0x0040, 0xa300),
+          "Measured Value Sequence", "MeasuredValueSequence",  "SQ", "1" },    { Tag(0x0040, 0xa301),
+          "Numeric Value Qualifier Code Sequence", "NumericValueQualifierCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0xa307),
+          "Current Observer (Trial)", "CurrentObserverTrial",  "PN", "1" },    { Tag(0x0040, 0xa30a),
+          "Numeric Value", "NumericValue",  "DS", "1-n" },    { Tag(0x0040, 0xa313),
+          "Referenced Accession Sequence (Trial)", "ReferencedAccessionSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa33a),
+          "Report Status Comment (Trial)", "ReportStatusCommentTrial",  "ST", "1" },    { Tag(0x0040, 0xa340),
+          "Procedure Context Sequence (Trial)", "ProcedureContextSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa352),
+          "Verbal Source (Trial)", "VerbalSourceTrial",  "PN", "1" },    { Tag(0x0040, 0xa353),
+          "Address (Trial)", "AddressTrial",  "ST", "1" },    { Tag(0x0040, 0xa354),
+          "Telephone Number (Trial)", "TelephoneNumberTrial",  "LO", "1" },    { Tag(0x0040, 0xa358),
+          "Verbal Source Identifier Code Sequence (Trial)", "VerbalSourceIdentifierCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa360),
+          "Predecessor Documents Sequence", "PredecessorDocumentsSequence",  "SQ", "1" },    { Tag(0x0040, 0xa370),
+          "Referenced Request Sequence", "ReferencedRequestSequence",  "SQ", "1" },    { Tag(0x0040, 0xa372),
+          "Performed Procedure Code Sequence", "PerformedProcedureCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0xa375),
+          "Current Requested Procedure Evidence Sequence", "CurrentRequestedProcedureEvidenceSequence",  "SQ", "1" },    { Tag(0x0040, 0xa380),
+          "Report Detail Sequence (Trial)", "ReportDetailSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa385),
+          "Pertinent Other Evidence Sequence", "PertinentOtherEvidenceSequence",  "SQ", "1" },    { Tag(0x0040, 0xa390),
+          "HL7 Structured Document Reference Sequence", "HL7StructuredDocumentReferenceSequence",  "SQ", "1" },    { Tag(0x0040, 0xa402),
+          "Observation Subject UID (Trial)", "ObservationSubjectUIDTrial",  "UI", "1" },    { Tag(0x0040, 0xa403),
+          "Observation Subject Class (Trial)", "ObservationSubjectClassTrial",  "CS", "1" },    { Tag(0x0040, 0xa404),
+          "Observation Subject Type Code Sequence (Trial)", "ObservationSubjectTypeCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa491),
+          "Completion Flag", "CompletionFlag",  "CS", "1" },    { Tag(0x0040, 0xa492),
+          "Completion Flag Description", "CompletionFlagDescription",  "LO", "1" },    { Tag(0x0040, 0xa493),
+          "Verification Flag", "VerificationFlag",  "CS", "1" },    { Tag(0x0040, 0xa494),
+          "Archive Requested", "ArchiveRequested",  "CS", "1" },    { Tag(0x0040, 0xa496),
+          "Preliminary Flag", "PreliminaryFlag",  "CS", "1" },    { Tag(0x0040, 0xa504),
+          "Content Template Sequence", "ContentTemplateSequence",  "SQ", "1" },    { Tag(0x0040, 0xa525),
+          "Identical Documents Sequence", "IdenticalDocumentsSequence",  "SQ", "1" },    { Tag(0x0040, 0xa600),
+          "Observation Subject Context Flag (Trial)", "ObservationSubjectContextFlagTrial",  "CS", "1" },    { Tag(0x0040, 0xa601),
+          "Observer Context Flag (Trial)", "ObserverContextFlagTrial",  "CS", "1" },    { Tag(0x0040, 0xa603),
+          "Procedure Context Flag (Trial)", "ProcedureContextFlagTrial",  "CS", "1" },    { Tag(0x0040, 0xa730),
+          "Content Sequence", "ContentSequence",  "SQ", "1" },    { Tag(0x0040, 0xa731),
+          "Relationship Sequence (Trial)", "RelationshipSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa732),
+          "Relationship Type Code Sequence (Trial)", "RelationshipTypeCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa744),
+          "Language Code Sequence (Trial)", "LanguageCodeSequenceTrial",  "SQ", "1" },    { Tag(0x0040, 0xa992),
+          "Uniform Resource Locator (Trial)", "UniformResourceLocatorTrial",  "ST", "1" },    { Tag(0x0040, 0xb020),
+          "Waveform Annotation Sequence", "WaveformAnnotationSequence",  "SQ", "1" },    { Tag(0x0040, 0xdb00),
+          "Template Identifier", "TemplateIdentifier",  "CS", "1" },    { Tag(0x0040, 0xdb06),
+          "Template Version", "TemplateVersion",  "DT", "1" },    { Tag(0x0040, 0xdb07),
+          "Template Local Version", "TemplateLocalVersion",  "DT", "1" },    { Tag(0x0040, 0xdb0b),
+          "Template Extension Flag", "TemplateExtensionFlag",  "CS", "1" },    { Tag(0x0040, 0xdb0c),
+          "Template Extension Organization UID", "TemplateExtensionOrganizationUID",  "UI", "1" },    { Tag(0x0040, 0xdb0d),
+          "Template Extension Creator UID", "TemplateExtensionCreatorUID",  "UI", "1" },    { Tag(0x0040, 0xdb73),
+          "Referenced Content Item Identifier", "ReferencedContentItemIdentifier",  "UL", "1-n" },    { Tag(0x0040, 0xe001),
+          "HL7 Instance Identifier", "HL7InstanceIdentifier",  "ST", "1" },    { Tag(0x0040, 0xe004),
+          "HL7 Document Effective Time", "HL7DocumentEffectiveTime",  "DT", "1" },    { Tag(0x0040, 0xe006),
+          "HL7 Document Type Code Sequence", "HL7DocumentTypeCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0xe008),
+          "Document Class Code Sequence", "DocumentClassCodeSequence",  "SQ", "1" },    { Tag(0x0040, 0xe010),
+          "Retrieve URI", "RetrieveURI",  "UR", "1" },    { Tag(0x0040, 0xe011),
+          "Retrieve Location UID", "RetrieveLocationUID",  "UI", "1" },    { Tag(0x0040, 0xe020),
+          "Type of Instances", "TypeOfInstances",  "CS", "1" },    { Tag(0x0040, 0xe021),
+          "DICOM Retrieval Sequence", "DICOMRetrievalSequence",  "SQ", "1" },    { Tag(0x0040, 0xe022),
+          "DICOM Media Retrieval Sequence", "DICOMMediaRetrievalSequence",  "SQ", "1" },    { Tag(0x0040, 0xe023),
+          "WADO Retrieval Sequence", "WADORetrievalSequence",  "SQ", "1" },    { Tag(0x0040, 0xe024),
+          "XDS Retrieval Sequence", "XDSRetrievalSequence",  "SQ", "1" },    { Tag(0x0040, 0xe025),
+          "WADO-RS Retrieval Sequence", "WADORSRetrievalSequence",  "SQ", "1" },    { Tag(0x0040, 0xe030),
+          "Repository Unique ID", "RepositoryUniqueID",  "UI", "1" },    { Tag(0x0040, 0xe031),
+          "Home Community ID", "HomeCommunityID",  "UI", "1" },    { Tag(0x0042, 0x0010),
+          "Document Title", "DocumentTitle",  "ST", "1" },    { Tag(0x0042, 0x0011),
+          "Encapsulated Document", "EncapsulatedDocument",  "OB", "1" },    { Tag(0x0042, 0x0012),
+          "MIME Type of Encapsulated Document", "MIMETypeOfEncapsulatedDocument",  "LO", "1" },    { Tag(0x0042, 0x0013),
+          "Source Instance Sequence", "SourceInstanceSequence",  "SQ", "1" },    { Tag(0x0042, 0x0014),
+          "List of MIME Types", "ListOfMIMETypes",  "LO", "1-n" },    { Tag(0x0044, 0x0001),
+          "Product Package Identifier", "ProductPackageIdentifier",  "ST", "1" },    { Tag(0x0044, 0x0002),
+          "Substance Administration Approval", "SubstanceAdministrationApproval",  "CS", "1" },    { Tag(0x0044, 0x0003),
+          "Approval Status Further Description", "ApprovalStatusFurtherDescription",  "LT", "1" },    { Tag(0x0044, 0x0004),
+          "Approval Status DateTime", "ApprovalStatusDateTime",  "DT", "1" },    { Tag(0x0044, 0x0007),
+          "Product Type Code Sequence", "ProductTypeCodeSequence",  "SQ", "1" },    { Tag(0x0044, 0x0008),
+          "Product Name", "ProductName",  "LO", "1-n" },    { Tag(0x0044, 0x0009),
+          "Product Description", "ProductDescription",  "LT", "1" },    { Tag(0x0044, 0x000a),
+          "Product Lot Identifier", "ProductLotIdentifier",  "LO", "1" },    { Tag(0x0044, 0x000b),
+          "Product Expiration DateTime", "ProductExpirationDateTime",  "DT", "1" },    { Tag(0x0044, 0x0010),
+          "Substance Administration DateTime", "SubstanceAdministrationDateTime",  "DT", "1" },    { Tag(0x0044, 0x0011),
+          "Substance Administration Notes", "SubstanceAdministrationNotes",  "LO", "1" },    { Tag(0x0044, 0x0012),
+          "Substance Administration Device ID", "SubstanceAdministrationDeviceID",  "LO", "1" },    { Tag(0x0044, 0x0013),
+          "Product Parameter Sequence", "ProductParameterSequence",  "SQ", "1" },    { Tag(0x0044, 0x0019),
+          "Substance Administration Parameter Sequence", "SubstanceAdministrationParameterSequence",  "SQ", "1" },    { Tag(0x0046, 0x0012),
+          "Lens Description", "LensDescription",  "LO", "1" },    { Tag(0x0046, 0x0014),
+          "Right Lens Sequence", "RightLensSequence",  "SQ", "1" },    { Tag(0x0046, 0x0015),
+          "Left Lens Sequence", "LeftLensSequence",  "SQ", "1" },    { Tag(0x0046, 0x0016),
+          "Unspecified Laterality Lens Sequence", "UnspecifiedLateralityLensSequence",  "SQ", "1" },    { Tag(0x0046, 0x0018),
+          "Cylinder Sequence", "CylinderSequence",  "SQ", "1" },    { Tag(0x0046, 0x0028),
+          "Prism Sequence", "PrismSequence",  "SQ", "1" },    { Tag(0x0046, 0x0030),
+          "Horizontal Prism Power", "HorizontalPrismPower",  "FD", "1" },    { Tag(0x0046, 0x0032),
+          "Horizontal Prism Base", "HorizontalPrismBase",  "CS", "1" },    { Tag(0x0046, 0x0034),
+          "Vertical Prism Power", "VerticalPrismPower",  "FD", "1" },    { Tag(0x0046, 0x0036),
+          "Vertical Prism Base", "VerticalPrismBase",  "CS", "1" },    { Tag(0x0046, 0x0038),
+          "Lens Segment Type", "LensSegmentType",  "CS", "1" },    { Tag(0x0046, 0x0040),
+          "Optical Transmittance", "OpticalTransmittance",  "FD", "1" },    { Tag(0x0046, 0x0042),
+          "Channel Width", "ChannelWidth",  "FD", "1" },    { Tag(0x0046, 0x0044),
+          "Pupil Size", "PupilSize",  "FD", "1" },    { Tag(0x0046, 0x0046),
+          "Corneal Size", "CornealSize",  "FD", "1" },    { Tag(0x0046, 0x0050),
+          "Autorefraction Right Eye Sequence", "AutorefractionRightEyeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0052),
+          "Autorefraction Left Eye Sequence", "AutorefractionLeftEyeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0060),
+          "Distance Pupillary Distance", "DistancePupillaryDistance",  "FD", "1" },    { Tag(0x0046, 0x0062),
+          "Near Pupillary Distance", "NearPupillaryDistance",  "FD", "1" },    { Tag(0x0046, 0x0063),
+          "Intermediate Pupillary Distance", "IntermediatePupillaryDistance",  "FD", "1" },    { Tag(0x0046, 0x0064),
+          "Other Pupillary Distance", "OtherPupillaryDistance",  "FD", "1" },    { Tag(0x0046, 0x0070),
+          "Keratometry Right Eye Sequence", "KeratometryRightEyeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0071),
+          "Keratometry Left Eye Sequence", "KeratometryLeftEyeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0074),
+          "Steep Keratometric Axis Sequence", "SteepKeratometricAxisSequence",  "SQ", "1" },    { Tag(0x0046, 0x0075),
+          "Radius of Curvature", "RadiusOfCurvature",  "FD", "1" },    { Tag(0x0046, 0x0076),
+          "Keratometric Power", "KeratometricPower",  "FD", "1" },    { Tag(0x0046, 0x0077),
+          "Keratometric Axis", "KeratometricAxis",  "FD", "1" },    { Tag(0x0046, 0x0080),
+          "Flat Keratometric Axis Sequence", "FlatKeratometricAxisSequence",  "SQ", "1" },    { Tag(0x0046, 0x0092),
+          "Background Color", "BackgroundColor",  "CS", "1" },    { Tag(0x0046, 0x0094),
+          "Optotype", "Optotype",  "CS", "1" },    { Tag(0x0046, 0x0095),
+          "Optotype Presentation", "OptotypePresentation",  "CS", "1" },    { Tag(0x0046, 0x0097),
+          "Subjective Refraction Right Eye Sequence", "SubjectiveRefractionRightEyeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0098),
+          "Subjective Refraction Left Eye Sequence", "SubjectiveRefractionLeftEyeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0100),
+          "Add Near Sequence", "AddNearSequence",  "SQ", "1" },    { Tag(0x0046, 0x0101),
+          "Add Intermediate Sequence", "AddIntermediateSequence",  "SQ", "1" },    { Tag(0x0046, 0x0102),
+          "Add Other Sequence", "AddOtherSequence",  "SQ", "1" },    { Tag(0x0046, 0x0104),
+          "Add Power", "AddPower",  "FD", "1" },    { Tag(0x0046, 0x0106),
+          "Viewing Distance", "ViewingDistance",  "FD", "1" },    { Tag(0x0046, 0x0121),
+          "Visual Acuity Type Code Sequence", "VisualAcuityTypeCodeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0122),
+          "Visual Acuity Right Eye Sequence", "VisualAcuityRightEyeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0123),
+          "Visual Acuity Left Eye Sequence", "VisualAcuityLeftEyeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0124),
+          "Visual Acuity Both Eyes Open Sequence", "VisualAcuityBothEyesOpenSequence",  "SQ", "1" },    { Tag(0x0046, 0x0125),
+          "Viewing Distance Type", "ViewingDistanceType",  "CS", "1" },    { Tag(0x0046, 0x0135),
+          "Visual Acuity Modifiers", "VisualAcuityModifiers",  "SS", "2" },    { Tag(0x0046, 0x0137),
+          "Decimal Visual Acuity", "DecimalVisualAcuity",  "FD", "1" },    { Tag(0x0046, 0x0139),
+          "Optotype Detailed Definition", "OptotypeDetailedDefinition",  "LO", "1" },    { Tag(0x0046, 0x0145),
+          "Referenced Refractive Measurements Sequence", "ReferencedRefractiveMeasurementsSequence",  "SQ", "1" },    { Tag(0x0046, 0x0146),
+          "Sphere Power", "SpherePower",  "FD", "1" },    { Tag(0x0046, 0x0147),
+          "Cylinder Power", "CylinderPower",  "FD", "1" },    { Tag(0x0046, 0x0201),
+          "Corneal Topography Surface", "CornealTopographySurface",  "CS", "1" },    { Tag(0x0046, 0x0202),
+          "Corneal Vertex Location", "CornealVertexLocation",  "FL", "2" },    { Tag(0x0046, 0x0203),
+          "Pupil Centroid X-Coordinate", "PupilCentroidXCoordinate",  "FL", "1" },    { Tag(0x0046, 0x0204),
+          "Pupil Centroid Y-Coordinate", "PupilCentroidYCoordinate",  "FL", "1" },    { Tag(0x0046, 0x0205),
+          "Equivalent Pupil Radius", "EquivalentPupilRadius",  "FL", "1" },    { Tag(0x0046, 0x0207),
+          "Corneal Topography Map Type Code Sequence", "CornealTopographyMapTypeCodeSequence",  "SQ", "1" },    { Tag(0x0046, 0x0208),
+          "Vertices of the Outline of Pupil", "VerticesOfTheOutlineOfPupil",  "IS", "2-2n" },    { Tag(0x0046, 0x0210),
+          "Corneal Topography Mapping Normals Sequence", "CornealTopographyMappingNormalsSequence",  "SQ", "1" },    { Tag(0x0046, 0x0211),
+          "Maximum Corneal Curvature Sequence", "MaximumCornealCurvatureSequence",  "SQ", "1" },    { Tag(0x0046, 0x0212),
+          "Maximum Corneal Curvature", "MaximumCornealCurvature",  "FL", "1" },    { Tag(0x0046, 0x0213),
+          "Maximum Corneal Curvature Location", "MaximumCornealCurvatureLocation",  "FL", "2" },    { Tag(0x0046, 0x0215),
+          "Minimum Keratometric Sequence", "MinimumKeratometricSequence",  "SQ", "1" },    { Tag(0x0046, 0x0218),
+          "Simulated Keratometric Cylinder Sequence", "SimulatedKeratometricCylinderSequence",  "SQ", "1" },    { Tag(0x0046, 0x0220),
+          "Average Corneal Power", "AverageCornealPower",  "FL", "1" },    { Tag(0x0046, 0x0224),
+          "Corneal I-S Value", "CornealISValue",  "FL", "1" },    { Tag(0x0046, 0x0227),
+          "Analyzed Area", "AnalyzedArea",  "FL", "1" },    { Tag(0x0046, 0x0230),
+          "Surface Regularity Index", "SurfaceRegularityIndex",  "FL", "1" },    { Tag(0x0046, 0x0232),
+          "Surface Asymmetry Index", "SurfaceAsymmetryIndex",  "FL", "1" },    { Tag(0x0046, 0x0234),
+          "Corneal Eccentricity Index", "CornealEccentricityIndex",  "FL", "1" },    { Tag(0x0046, 0x0236),
+          "Keratoconus Prediction Index", "KeratoconusPredictionIndex",  "FL", "1" },    { Tag(0x0046, 0x0238),
+          "Decimal Potential Visual Acuity", "DecimalPotentialVisualAcuity",  "FL", "1" },    { Tag(0x0046, 0x0242),
+          "Corneal Topography Map Quality Evaluation", "CornealTopographyMapQualityEvaluation",  "CS", "1" },    { Tag(0x0046, 0x0244),
+          "Source Image Corneal Processed Data Sequence", "SourceImageCornealProcessedDataSequence",  "SQ", "1" },    { Tag(0x0046, 0x0247),
+          "Corneal Point Location", "CornealPointLocation",  "FL", "3" },    { Tag(0x0046, 0x0248),
+          "Corneal Point Estimated", "CornealPointEstimated",  "CS", "1" },    { Tag(0x0046, 0x0249),
+          "Axial Power", "AxialPower",  "FL", "1" },    { Tag(0x0046, 0x0250),
+          "Tangential Power", "TangentialPower",  "FL", "1" },    { Tag(0x0046, 0x0251),
+          "Refractive Power", "RefractivePower",  "FL", "1" },    { Tag(0x0046, 0x0252),
+          "Relative Elevation", "RelativeElevation",  "FL", "1" },    { Tag(0x0046, 0x0253),
+          "Corneal Wavefront", "CornealWavefront",  "FL", "1" },    { Tag(0x0048, 0x0001),
+          "Imaged Volume Width", "ImagedVolumeWidth",  "FL", "1" },    { Tag(0x0048, 0x0002),
+          "Imaged Volume Height", "ImagedVolumeHeight",  "FL", "1" },    { Tag(0x0048, 0x0003),
+          "Imaged Volume Depth", "ImagedVolumeDepth",  "FL", "1" },    { Tag(0x0048, 0x0006),
+          "Total Pixel Matrix Columns", "TotalPixelMatrixColumns",  "UL", "1" },    { Tag(0x0048, 0x0007),
+          "Total Pixel Matrix Rows", "TotalPixelMatrixRows",  "UL", "1" },    { Tag(0x0048, 0x0008),
+          "Total Pixel Matrix Origin Sequence", "TotalPixelMatrixOriginSequence",  "SQ", "1" },    { Tag(0x0048, 0x0010),
+          "Specimen Label in Image", "SpecimenLabelInImage",  "CS", "1" },    { Tag(0x0048, 0x0011),
+          "Focus Method", "FocusMethod",  "CS", "1" },    { Tag(0x0048, 0x0012),
+          "Extended Depth of Field", "ExtendedDepthOfField",  "CS", "1" },    { Tag(0x0048, 0x0013),
+          "Number of Focal Planes", "NumberOfFocalPlanes",  "US", "1" },    { Tag(0x0048, 0x0014),
+          "Distance Between Focal Planes", "DistanceBetweenFocalPlanes",  "FL", "1" },    { Tag(0x0048, 0x0015),
+          "Recommended Absent Pixel CIELab Value", "RecommendedAbsentPixelCIELabValue",  "US", "3" },    { Tag(0x0048, 0x0100),
+          "Illuminator Type Code Sequence", "IlluminatorTypeCodeSequence",  "SQ", "1" },    { Tag(0x0048, 0x0102),
+          "Image Orientation (Slide)", "ImageOrientationSlide",  "DS", "6" },    { Tag(0x0048, 0x0105),
+          "Optical Path Sequence", "OpticalPathSequence",  "SQ", "1" },    { Tag(0x0048, 0x0106),
+          "Optical Path Identifier", "OpticalPathIdentifier",  "SH", "1" },    { Tag(0x0048, 0x0107),
+          "Optical Path Description", "OpticalPathDescription",  "ST", "1" },    { Tag(0x0048, 0x0108),
+          "Illumination Color Code Sequence", "IlluminationColorCodeSequence",  "SQ", "1" },    { Tag(0x0048, 0x0110),
+          "Specimen Reference Sequence", "SpecimenReferenceSequence",  "SQ", "1" },    { Tag(0x0048, 0x0111),
+          "Condenser Lens Power", "CondenserLensPower",  "DS", "1" },    { Tag(0x0048, 0x0112),
+          "Objective Lens Power", "ObjectiveLensPower",  "DS", "1" },    { Tag(0x0048, 0x0113),
+          "Objective Lens Numerical Aperture", "ObjectiveLensNumericalAperture",  "DS", "1" },    { Tag(0x0048, 0x0120),
+          "Palette Color Lookup Table Sequence", "PaletteColorLookupTableSequence",  "SQ", "1" },    { Tag(0x0048, 0x0200),
+          "Referenced Image Navigation Sequence", "ReferencedImageNavigationSequence",  "SQ", "1" },    { Tag(0x0048, 0x0201),
+          "Top Left Hand Corner of Localizer Area", "TopLeftHandCornerOfLocalizerArea",  "US", "2" },    { Tag(0x0048, 0x0202),
+          "Bottom Right Hand Corner of Localizer Area", "BottomRightHandCornerOfLocalizerArea",  "US", "2" },    { Tag(0x0048, 0x0207),
+          "Optical Path Identification Sequence", "OpticalPathIdentificationSequence",  "SQ", "1" },    { Tag(0x0048, 0x021a),
+          "Plane Position (Slide) Sequence", "PlanePositionSlideSequence",  "SQ", "1" },    { Tag(0x0048, 0x021e),
+          "Column Position In Total Image Pixel Matrix", "ColumnPositionInTotalImagePixelMatrix",  "SL", "1" },    { Tag(0x0048, 0x021f),
+          "Row Position In Total Image Pixel Matrix", "RowPositionInTotalImagePixelMatrix",  "SL", "1" },    { Tag(0x0048, 0x0301),
+          "Pixel Origin Interpretation", "PixelOriginInterpretation",  "CS", "1" },    { Tag(0x0050, 0x0004),
+          "Calibration Image", "CalibrationImage",  "CS", "1" },    { Tag(0x0050, 0x0010),
+          "Device Sequence", "DeviceSequence",  "SQ", "1" },    { Tag(0x0050, 0x0012),
+          "Container Component Type Code Sequence", "ContainerComponentTypeCodeSequence",  "SQ", "1" },    { Tag(0x0050, 0x0013),
+          "Container Component Thickness", "ContainerComponentThickness",  "FD", "1" },    { Tag(0x0050, 0x0014),
+          "Device Length", "DeviceLength",  "DS", "1" },    { Tag(0x0050, 0x0015),
+          "Container Component Width", "ContainerComponentWidth",  "FD", "1" },    { Tag(0x0050, 0x0016),
+          "Device Diameter", "DeviceDiameter",  "DS", "1" },    { Tag(0x0050, 0x0017),
+          "Device Diameter Units", "DeviceDiameterUnits",  "CS", "1" },    { Tag(0x0050, 0x0018),
+          "Device Volume", "DeviceVolume",  "DS", "1" },    { Tag(0x0050, 0x0019),
+          "Inter-Marker Distance", "InterMarkerDistance",  "DS", "1" },    { Tag(0x0050, 0x001a),
+          "Container Component Material", "ContainerComponentMaterial",  "CS", "1" },    { Tag(0x0050, 0x001b),
+          "Container Component ID", "ContainerComponentID",  "LO", "1" },    { Tag(0x0050, 0x001c),
+          "Container Component Length", "ContainerComponentLength",  "FD", "1" },    { Tag(0x0050, 0x001d),
+          "Container Component Diameter", "ContainerComponentDiameter",  "FD", "1" },    { Tag(0x0050, 0x001e),
+          "Container Component Description", "ContainerComponentDescription",  "LO", "1" },    { Tag(0x0050, 0x0020),
+          "Device Description", "DeviceDescription",  "LO", "1" },    { Tag(0x0052, 0x0001),
+          "Contrast/Bolus Ingredient Percent by Volume", "ContrastBolusIngredientPercentByVolume",  "FL", "1" },    { Tag(0x0052, 0x0002),
+          "OCT Focal Distance", "OCTFocalDistance",  "FD", "1" },    { Tag(0x0052, 0x0003),
+          "Beam Spot Size", "BeamSpotSize",  "FD", "1" },    { Tag(0x0052, 0x0004),
+          "Effective Refractive Index", "EffectiveRefractiveIndex",  "FD", "1" },    { Tag(0x0052, 0x0006),
+          "OCT Acquisition Domain", "OCTAcquisitionDomain",  "CS", "1" },    { Tag(0x0052, 0x0007),
+          "OCT Optical Center Wavelength", "OCTOpticalCenterWavelength",  "FD", "1" },    { Tag(0x0052, 0x0008),
+          "Axial Resolution", "AxialResolution",  "FD", "1" },    { Tag(0x0052, 0x0009),
+          "Ranging Depth", "RangingDepth",  "FD", "1" },    { Tag(0x0052, 0x0011),
+          "A-line Rate", "ALineRate",  "FD", "1" },    { Tag(0x0052, 0x0012),
+          "A-lines Per Frame", "ALinesPerFrame",  "US", "1" },    { Tag(0x0052, 0x0013),
+          "Catheter Rotational Rate", "CatheterRotationalRate",  "FD", "1" },    { Tag(0x0052, 0x0014),
+          "A-line Pixel Spacing", "ALinePixelSpacing",  "FD", "1" },    { Tag(0x0052, 0x0016),
+          "Mode of Percutaneous Access Sequence", "ModeOfPercutaneousAccessSequence",  "SQ", "1" },    { Tag(0x0052, 0x0025),
+          "Intravascular OCT Frame Type Sequence", "IntravascularOCTFrameTypeSequence",  "SQ", "1" },    { Tag(0x0052, 0x0026),
+          "OCT Z Offset Applied", "OCTZOffsetApplied",  "CS", "1" },    { Tag(0x0052, 0x0027),
+          "Intravascular Frame Content Sequence", "IntravascularFrameContentSequence",  "SQ", "1" },    { Tag(0x0052, 0x0028),
+          "Intravascular Longitudinal Distance", "IntravascularLongitudinalDistance",  "FD", "1" },    { Tag(0x0052, 0x0029),
+          "Intravascular OCT Frame Content Sequence", "IntravascularOCTFrameContentSequence",  "SQ", "1" },    { Tag(0x0052, 0x0030),
+          "OCT Z Offset Correction", "OCTZOffsetCorrection",  "SS", "1" },    { Tag(0x0052, 0x0031),
+          "Catheter Direction of Rotation", "CatheterDirectionOfRotation",  "CS", "1" },    { Tag(0x0052, 0x0033),
+          "Seam Line Location", "SeamLineLocation",  "FD", "1" },    { Tag(0x0052, 0x0034),
+          "First A-line Location", "FirstALineLocation",  "FD", "1" },    { Tag(0x0052, 0x0036),
+          "Seam Line Index", "SeamLineIndex",  "US", "1" },    { Tag(0x0052, 0x0038),
+          "Number of Padded A-lines", "NumberOfPaddedALines",  "US", "1" },    { Tag(0x0052, 0x0039),
+          "Interpolation Type", "InterpolationType",  "CS", "1" },    { Tag(0x0052, 0x003a),
+          "Refractive Index Applied", "RefractiveIndexApplied",  "CS", "1" },    { Tag(0x0054, 0x0010),
+          "Energy Window Vector", "EnergyWindowVector",  "US", "1-n" },    { Tag(0x0054, 0x0011),
+          "Number of Energy Windows", "NumberOfEnergyWindows",  "US", "1" },    { Tag(0x0054, 0x0012),
+          "Energy Window Information Sequence", "EnergyWindowInformationSequence",  "SQ", "1" },    { Tag(0x0054, 0x0013),
+          "Energy Window Range Sequence", "EnergyWindowRangeSequence",  "SQ", "1" },    { Tag(0x0054, 0x0014),
+          "Energy Window Lower Limit", "EnergyWindowLowerLimit",  "DS", "1" },    { Tag(0x0054, 0x0015),
+          "Energy Window Upper Limit", "EnergyWindowUpperLimit",  "DS", "1" },    { Tag(0x0054, 0x0016),
+          "Radiopharmaceutical Information Sequence", "RadiopharmaceuticalInformationSequence",  "SQ", "1" },    { Tag(0x0054, 0x0017),
+          "Residual Syringe Counts", "ResidualSyringeCounts",  "IS", "1" },    { Tag(0x0054, 0x0018),
+          "Energy Window Name", "EnergyWindowName",  "SH", "1" },    { Tag(0x0054, 0x0020),
+          "Detector Vector", "DetectorVector",  "US", "1-n" },    { Tag(0x0054, 0x0021),
+          "Number of Detectors", "NumberOfDetectors",  "US", "1" },    { Tag(0x0054, 0x0022),
+          "Detector Information Sequence", "DetectorInformationSequence",  "SQ", "1" },    { Tag(0x0054, 0x0030),
+          "Phase Vector", "PhaseVector",  "US", "1-n" },    { Tag(0x0054, 0x0031),
+          "Number of Phases", "NumberOfPhases",  "US", "1" },    { Tag(0x0054, 0x0032),
+          "Phase Information Sequence", "PhaseInformationSequence",  "SQ", "1" },    { Tag(0x0054, 0x0033),
+          "Number of Frames in Phase", "NumberOfFramesInPhase",  "US", "1" },    { Tag(0x0054, 0x0036),
+          "Phase Delay", "PhaseDelay",  "IS", "1" },    { Tag(0x0054, 0x0038),
+          "Pause Between Frames", "PauseBetweenFrames",  "IS", "1" },    { Tag(0x0054, 0x0039),
+          "Phase Description", "PhaseDescription",  "CS", "1" },    { Tag(0x0054, 0x0050),
+          "Rotation Vector", "RotationVector",  "US", "1-n" },    { Tag(0x0054, 0x0051),
+          "Number of Rotations", "NumberOfRotations",  "US", "1" },    { Tag(0x0054, 0x0052),
+          "Rotation Information Sequence", "RotationInformationSequence",  "SQ", "1" },    { Tag(0x0054, 0x0053),
+          "Number of Frames in Rotation", "NumberOfFramesInRotation",  "US", "1" },    { Tag(0x0054, 0x0060),
+          "R-R Interval Vector", "RRIntervalVector",  "US", "1-n" },    { Tag(0x0054, 0x0061),
+          "Number of R-R Intervals", "NumberOfRRIntervals",  "US", "1" },    { Tag(0x0054, 0x0062),
+          "Gated Information Sequence", "GatedInformationSequence",  "SQ", "1" },    { Tag(0x0054, 0x0063),
+          "Data Information Sequence", "DataInformationSequence",  "SQ", "1" },    { Tag(0x0054, 0x0070),
+          "Time Slot Vector", "TimeSlotVector",  "US", "1-n" },    { Tag(0x0054, 0x0071),
+          "Number of Time Slots", "NumberOfTimeSlots",  "US", "1" },    { Tag(0x0054, 0x0072),
+          "Time Slot Information Sequence", "TimeSlotInformationSequence",  "SQ", "1" },    { Tag(0x0054, 0x0073),
+          "Time Slot Time", "TimeSlotTime",  "DS", "1" },    { Tag(0x0054, 0x0080),
+          "Slice Vector", "SliceVector",  "US", "1-n" },    { Tag(0x0054, 0x0081),
+          "Number of Slices", "NumberOfSlices",  "US", "1" },    { Tag(0x0054, 0x0090),
+          "Angular View Vector", "AngularViewVector",  "US", "1-n" },    { Tag(0x0054, 0x0100),
+          "Time Slice Vector", "TimeSliceVector",  "US", "1-n" },    { Tag(0x0054, 0x0101),
+          "Number of Time Slices", "NumberOfTimeSlices",  "US", "1" },    { Tag(0x0054, 0x0200),
+          "Start Angle", "StartAngle",  "DS", "1" },    { Tag(0x0054, 0x0202),
+          "Type of Detector Motion", "TypeOfDetectorMotion",  "CS", "1" },    { Tag(0x0054, 0x0210),
+          "Trigger Vector", "TriggerVector",  "IS", "1-n" },    { Tag(0x0054, 0x0211),
+          "Number of Triggers in Phase", "NumberOfTriggersInPhase",  "US", "1" },    { Tag(0x0054, 0x0220),
+          "View Code Sequence", "ViewCodeSequence",  "SQ", "1" },    { Tag(0x0054, 0x0222),
+          "View Modifier Code Sequence", "ViewModifierCodeSequence",  "SQ", "1" },    { Tag(0x0054, 0x0300),
+          "Radionuclide Code Sequence", "RadionuclideCodeSequence",  "SQ", "1" },    { Tag(0x0054, 0x0302),
+          "Administration Route Code Sequence", "AdministrationRouteCodeSequence",  "SQ", "1" },    { Tag(0x0054, 0x0304),
+          "Radiopharmaceutical Code Sequence", "RadiopharmaceuticalCodeSequence",  "SQ", "1" },    { Tag(0x0054, 0x0306),
+          "Calibration Data Sequence", "CalibrationDataSequence",  "SQ", "1" },    { Tag(0x0054, 0x0308),
+          "Energy Window Number", "EnergyWindowNumber",  "US", "1" },    { Tag(0x0054, 0x0400),
+          "Image ID", "ImageID",  "SH", "1" },    { Tag(0x0054, 0x0410),
+          "Patient Orientation Code Sequence", "PatientOrientationCodeSequence",  "SQ", "1" },    { Tag(0x0054, 0x0412),
+          "Patient Orientation Modifier Code Sequence", "PatientOrientationModifierCodeSequence",  "SQ", "1" },    { Tag(0x0054, 0x0414),
+          "Patient Gantry Relationship Code Sequence", "PatientGantryRelationshipCodeSequence",  "SQ", "1" },    { Tag(0x0054, 0x0500),
+          "Slice Progression Direction", "SliceProgressionDirection",  "CS", "1" },    { Tag(0x0054, 0x0501),
+          "Scan Progression Direction", "ScanProgressionDirection",  "CS", "1" },    { Tag(0x0054, 0x1000),
+          "Series Type", "SeriesType",  "CS", "2" },    { Tag(0x0054, 0x1001),
+          "Units", "Units",  "CS", "1" },    { Tag(0x0054, 0x1002),
+          "Counts Source", "CountsSource",  "CS", "1" },    { Tag(0x0054, 0x1004),
+          "Reprojection Method", "ReprojectionMethod",  "CS", "1" },    { Tag(0x0054, 0x1006),
+          "SUV Type", "SUVType",  "CS", "1" },    { Tag(0x0054, 0x1100),
+          "Randoms Correction Method", "RandomsCorrectionMethod",  "CS", "1" },    { Tag(0x0054, 0x1101),
+          "Attenuation Correction Method", "AttenuationCorrectionMethod",  "LO", "1" },    { Tag(0x0054, 0x1102),
+          "Decay Correction", "DecayCorrection",  "CS", "1" },    { Tag(0x0054, 0x1103),
+          "Reconstruction Method", "ReconstructionMethod",  "LO", "1" },    { Tag(0x0054, 0x1104),
+          "Detector Lines of Response Used", "DetectorLinesOfResponseUsed",  "LO", "1" },    { Tag(0x0054, 0x1105),
+          "Scatter Correction Method", "ScatterCorrectionMethod",  "LO", "1" },    { Tag(0x0054, 0x1200),
+          "Axial Acceptance", "AxialAcceptance",  "DS", "1" },    { Tag(0x0054, 0x1201),
+          "Axial Mash", "AxialMash",  "IS", "2" },    { Tag(0x0054, 0x1202),
+          "Transverse Mash", "TransverseMash",  "IS", "1" },    { Tag(0x0054, 0x1203),
+          "Detector Element Size", "DetectorElementSize",  "DS", "2" },    { Tag(0x0054, 0x1210),
+          "Coincidence Window Width", "CoincidenceWindowWidth",  "DS", "1" },    { Tag(0x0054, 0x1220),
+          "Secondary Counts Type", "SecondaryCountsType",  "CS", "1-n" },    { Tag(0x0054, 0x1300),
+          "Frame Reference Time", "FrameReferenceTime",  "DS", "1" },    { Tag(0x0054, 0x1310),
+          "Primary (Prompts) Counts Accumulated", "PrimaryPromptsCountsAccumulated",  "IS", "1" },    { Tag(0x0054, 0x1311),
+          "Secondary Counts Accumulated", "SecondaryCountsAccumulated",  "IS", "1-n" },    { Tag(0x0054, 0x1320),
+          "Slice Sensitivity Factor", "SliceSensitivityFactor",  "DS", "1" },    { Tag(0x0054, 0x1321),
+          "Decay Factor", "DecayFactor",  "DS", "1" },    { Tag(0x0054, 0x1322),
+          "Dose Calibration Factor", "DoseCalibrationFactor",  "DS", "1" },    { Tag(0x0054, 0x1323),
+          "Scatter Fraction Factor", "ScatterFractionFactor",  "DS", "1" },    { Tag(0x0054, 0x1324),
+          "Dead Time Factor", "DeadTimeFactor",  "DS", "1" },    { Tag(0x0054, 0x1330),
+          "Image Index", "ImageIndex",  "US", "1" },    { Tag(0x0054, 0x1400),
+          "Counts Included", "CountsIncluded",  "CS", "1-n" },    { Tag(0x0054, 0x1401),
+          "Dead Time Correction Flag", "DeadTimeCorrectionFlag",  "CS", "1" },    { Tag(0x0060, 0x3000),
+          "Histogram Sequence", "HistogramSequence",  "SQ", "1" },    { Tag(0x0060, 0x3002),
+          "Histogram Number of Bins", "HistogramNumberOfBins",  "US", "1" },    { Tag(0x0060, 0x3004),
+          "Histogram First Bin Value", "HistogramFirstBinValue",  "US or SS", "1" },    { Tag(0x0060, 0x3006),
+          "Histogram Last Bin Value", "HistogramLastBinValue",  "US or SS", "1" },    { Tag(0x0060, 0x3008),
+          "Histogram Bin Width", "HistogramBinWidth",  "US", "1" },    { Tag(0x0060, 0x3010),
+          "Histogram Explanation", "HistogramExplanation",  "LO", "1" },    { Tag(0x0060, 0x3020),
+          "Histogram Data", "HistogramData",  "UL", "1-n" },    { Tag(0x0062, 0x0001),
+          "Segmentation Type", "SegmentationType",  "CS", "1" },    { Tag(0x0062, 0x0002),
+          "Segment Sequence", "SegmentSequence",  "SQ", "1" },    { Tag(0x0062, 0x0003),
+          "Segmented Property Category Code Sequence", "SegmentedPropertyCategoryCodeSequence",  "SQ", "1" },    { Tag(0x0062, 0x0004),
+          "Segment Number", "SegmentNumber",  "US", "1" },    { Tag(0x0062, 0x0005),
+          "Segment Label", "SegmentLabel",  "LO", "1" },    { Tag(0x0062, 0x0006),
+          "Segment Description", "SegmentDescription",  "ST", "1" },    { Tag(0x0062, 0x0008),
+          "Segment Algorithm Type", "SegmentAlgorithmType",  "CS", "1" },    { Tag(0x0062, 0x0009),
+          "Segment Algorithm Name", "SegmentAlgorithmName",  "LO", "1" },    { Tag(0x0062, 0x000a),
+          "Segment Identification Sequence", "SegmentIdentificationSequence",  "SQ", "1" },    { Tag(0x0062, 0x000b),
+          "Referenced Segment Number", "ReferencedSegmentNumber",  "US", "1-n" },    { Tag(0x0062, 0x000c),
+          "Recommended Display Grayscale Value", "RecommendedDisplayGrayscaleValue",  "US", "1" },    { Tag(0x0062, 0x000d),
+          "Recommended Display CIELab Value", "RecommendedDisplayCIELabValue",  "US", "3" },    { Tag(0x0062, 0x000e),
+          "Maximum Fractional Value", "MaximumFractionalValue",  "US", "1" },    { Tag(0x0062, 0x000f),
+          "Segmented Property Type Code Sequence", "SegmentedPropertyTypeCodeSequence",  "SQ", "1" },    { Tag(0x0062, 0x0010),
+          "Segmentation Fractional Type", "SegmentationFractionalType",  "CS", "1" },    { Tag(0x0062, 0x0011),
+          "Segmented Property Type Modifier Code Sequence", "SegmentedPropertyTypeModifierCodeSequence",  "SQ", "1" },    { Tag(0x0062, 0x0012),
+          "Used Segments Sequence", "UsedSegmentsSequence",  "SQ", "1" },    { Tag(0x0062, 0x0020),
+          "Tracking ID", "TrackingID",  "UT", "1" },    { Tag(0x0062, 0x0021),
+          "Tracking UID", "TrackingUID",  "UI", "1" },    { Tag(0x0064, 0x0002),
+          "Deformable Registration Sequence", "DeformableRegistrationSequence",  "SQ", "1" },    { Tag(0x0064, 0x0003),
+          "Source Frame of Reference UID", "SourceFrameOfReferenceUID",  "UI", "1" },    { Tag(0x0064, 0x0005),
+          "Deformable Registration Grid Sequence", "DeformableRegistrationGridSequence",  "SQ", "1" },    { Tag(0x0064, 0x0007),
+          "Grid Dimensions", "GridDimensions",  "UL", "3" },    { Tag(0x0064, 0x0008),
+          "Grid Resolution", "GridResolution",  "FD", "3" },    { Tag(0x0064, 0x0009),
+          "Vector Grid Data", "VectorGridData",  "OF", "1" },    { Tag(0x0064, 0x000f),
+          "Pre Deformation Matrix Registration Sequence", "PreDeformationMatrixRegistrationSequence",  "SQ", "1" },    { Tag(0x0064, 0x0010),
+          "Post Deformation Matrix Registration Sequence", "PostDeformationMatrixRegistrationSequence",  "SQ", "1" },    { Tag(0x0066, 0x0001),
+          "Number of Surfaces", "NumberOfSurfaces",  "UL", "1" },    { Tag(0x0066, 0x0002),
+          "Surface Sequence", "SurfaceSequence",  "SQ", "1" },    { Tag(0x0066, 0x0003),
+          "Surface Number", "SurfaceNumber",  "UL", "1" },    { Tag(0x0066, 0x0004),
+          "Surface Comments", "SurfaceComments",  "LT", "1" },    { Tag(0x0066, 0x0009),
+          "Surface Processing", "SurfaceProcessing",  "CS", "1" },    { Tag(0x0066, 0x000a),
+          "Surface Processing Ratio", "SurfaceProcessingRatio",  "FL", "1" },    { Tag(0x0066, 0x000b),
+          "Surface Processing Description", "SurfaceProcessingDescription",  "LO", "1" },    { Tag(0x0066, 0x000c),
+          "Recommended Presentation Opacity", "RecommendedPresentationOpacity",  "FL", "1" },    { Tag(0x0066, 0x000d),
+          "Recommended Presentation Type", "RecommendedPresentationType",  "CS", "1" },    { Tag(0x0066, 0x000e),
+          "Finite Volume", "FiniteVolume",  "CS", "1" },    { Tag(0x0066, 0x0010),
+          "Manifold", "Manifold",  "CS", "1" },    { Tag(0x0066, 0x0011),
+          "Surface Points Sequence", "SurfacePointsSequence",  "SQ", "1" },    { Tag(0x0066, 0x0012),
+          "Surface Points Normals Sequence", "SurfacePointsNormalsSequence",  "SQ", "1" },    { Tag(0x0066, 0x0013),
+          "Surface Mesh Primitives Sequence", "SurfaceMeshPrimitivesSequence",  "SQ", "1" },    { Tag(0x0066, 0x0015),
+          "Number of Surface Points", "NumberOfSurfacePoints",  "UL", "1" },    { Tag(0x0066, 0x0016),
+          "Point Coordinates Data", "PointCoordinatesData",  "OF", "1" },    { Tag(0x0066, 0x0017),
+          "Point Position Accuracy", "PointPositionAccuracy",  "FL", "3" },    { Tag(0x0066, 0x0018),
+          "Mean Point Distance", "MeanPointDistance",  "FL", "1" },    { Tag(0x0066, 0x0019),
+          "Maximum Point Distance", "MaximumPointDistance",  "FL", "1" },    { Tag(0x0066, 0x001a),
+          "Points Bounding Box Coordinates", "PointsBoundingBoxCoordinates",  "FL", "6" },    { Tag(0x0066, 0x001b),
+          "Axis of Rotation", "AxisOfRotation",  "FL", "3" },    { Tag(0x0066, 0x001c),
+          "Center of Rotation", "CenterOfRotation",  "FL", "3" },    { Tag(0x0066, 0x001e),
+          "Number of Vectors", "NumberOfVectors",  "UL", "1" },    { Tag(0x0066, 0x001f),
+          "Vector Dimensionality", "VectorDimensionality",  "US", "1" },    { Tag(0x0066, 0x0020),
+          "Vector Accuracy", "VectorAccuracy",  "FL", "1-n" },    { Tag(0x0066, 0x0021),
+          "Vector Coordinate Data", "VectorCoordinateData",  "OF", "1" },    { Tag(0x0066, 0x0023),
+          "Triangle Point Index List", "TrianglePointIndexList",  "OW", "1" },    { Tag(0x0066, 0x0024),
+          "Edge Point Index List", "EdgePointIndexList",  "OW", "1" },    { Tag(0x0066, 0x0025),
+          "Vertex Point Index List", "VertexPointIndexList",  "OW", "1" },    { Tag(0x0066, 0x0026),
+          "Triangle Strip Sequence", "TriangleStripSequence",  "SQ", "1" },    { Tag(0x0066, 0x0027),
+          "Triangle Fan Sequence", "TriangleFanSequence",  "SQ", "1" },    { Tag(0x0066, 0x0028),
+          "Line Sequence", "LineSequence",  "SQ", "1" },    { Tag(0x0066, 0x0029),
+          "Primitive Point Index List", "PrimitivePointIndexList",  "OW", "1" },    { Tag(0x0066, 0x002a),
+          "Surface Count", "SurfaceCount",  "UL", "1" },    { Tag(0x0066, 0x002b),
+          "Referenced Surface Sequence", "ReferencedSurfaceSequence",  "SQ", "1" },    { Tag(0x0066, 0x002c),
+          "Referenced Surface Number", "ReferencedSurfaceNumber",  "UL", "1" },    { Tag(0x0066, 0x002d),
+          "Segment Surface Generation Algorithm Identification Sequence", "SegmentSurfaceGenerationAlgorithmIdentificationSequence",  "SQ", "1" },    { Tag(0x0066, 0x002e),
+          "Segment Surface Source Instance Sequence", "SegmentSurfaceSourceInstanceSequence",  "SQ", "1" },    { Tag(0x0066, 0x002f),
+          "Algorithm Family Code Sequence", "AlgorithmFamilyCodeSequence",  "SQ", "1" },    { Tag(0x0066, 0x0030),
+          "Algorithm Name Code Sequence", "AlgorithmNameCodeSequence",  "SQ", "1" },    { Tag(0x0066, 0x0031),
+          "Algorithm Version", "AlgorithmVersion",  "LO", "1" },    { Tag(0x0066, 0x0032),
+          "Algorithm Parameters", "AlgorithmParameters",  "LT", "1" },    { Tag(0x0066, 0x0034),
+          "Facet Sequence", "FacetSequence",  "SQ", "1" },    { Tag(0x0066, 0x0035),
+          "Surface Processing Algorithm Identification Sequence", "SurfaceProcessingAlgorithmIdentificationSequence",  "SQ", "1" },    { Tag(0x0066, 0x0036),
+          "Algorithm Name", "AlgorithmName",  "LO", "1" },    { Tag(0x0066, 0x0037),
+          "Recommended Point Radius", "RecommendedPointRadius",  "FL", "1" },    { Tag(0x0066, 0x0038),
+          "Recommended Line Thickness", "RecommendedLineThickness",  "FL", "1" },    { Tag(0x0066, 0x0040),
+          "Long Primitive Point Index List", "LongPrimitivePointIndexList",  "OL", "1" },    { Tag(0x0066, 0x0041),
+          "Long Triangle Point Index List", "LongTrianglePointIndexList",  "OL", "1" },    { Tag(0x0066, 0x0042),
+          "Long Edge Point Index List", "LongEdgePointIndexList",  "OL", "1" },    { Tag(0x0066, 0x0043),
+          "Long Vertex Point Index List", "LongVertexPointIndexList",  "OL", "1" },    { Tag(0x0066, 0x0101),
+          "Track Set Sequence", "TrackSetSequence",  "SQ", "1" },    { Tag(0x0066, 0x0102),
+          "Track Sequence", "TrackSequence",  "SQ", "1" },    { Tag(0x0066, 0x0103),
+          "Recommended Display CIELab Value List", "RecommendedDisplayCIELabValueList",  "OW", "1" },    { Tag(0x0066, 0x0104),
+          "Tracking Algorithm Identification Sequence", "TrackingAlgorithmIdentificationSequence",  "SQ", "1" },    { Tag(0x0066, 0x0105),
+          "Track Set Number", "TrackSetNumber",  "UL", "1" },    { Tag(0x0066, 0x0106),
+          "Track Set Label", "TrackSetLabel",  "LO", "1" },    { Tag(0x0066, 0x0107),
+          "Track Set Description", "TrackSetDescription",  "UT", "1" },    { Tag(0x0066, 0x0108),
+          "Track Set Anatomical Type Code Sequence", "TrackSetAnatomicalTypeCodeSequence",  "SQ", "1" },    { Tag(0x0066, 0x0121),
+          "Measurements Sequence", "MeasurementsSequence",  "SQ", "1" },    { Tag(0x0066, 0x0124),
+          "Track Set Statistics Sequence", "TrackSetStatisticsSequence",  "SQ", "1" },    { Tag(0x0066, 0x0125),
+          "Floating Point Values", "FloatingPointValues",  "OF", "1" },    { Tag(0x0066, 0x0129),
+          "Track Point Index List", "TrackPointIndexList",  "OL", "1" },    { Tag(0x0066, 0x0130),
+          "Track Statistics Sequence", "TrackStatisticsSequence",  "SQ", "1" },    { Tag(0x0066, 0x0132),
+          "Measurement Values Sequence", "MeasurementValuesSequence",  "SQ", "1" },    { Tag(0x0066, 0x0133),
+          "Diffusion Acquisition Code Sequence", "DiffusionAcquisitionCodeSequence",  "SQ", "1" },    { Tag(0x0066, 0x0134),
+          "Diffusion Model Code Sequence", "DiffusionModelCodeSequence",  "SQ", "1" },    { Tag(0x0068, 0x6210),
+          "Implant Size", "ImplantSize",  "LO", "1" },    { Tag(0x0068, 0x6221),
+          "Implant Template Version", "ImplantTemplateVersion",  "LO", "1" },    { Tag(0x0068, 0x6222),
+          "Replaced Implant Template Sequence", "ReplacedImplantTemplateSequence",  "SQ", "1" },    { Tag(0x0068, 0x6223),
+          "Implant Type", "ImplantType",  "CS", "1" },    { Tag(0x0068, 0x6224),
+          "Derivation Implant Template Sequence", "DerivationImplantTemplateSequence",  "SQ", "1" },    { Tag(0x0068, 0x6225),
+          "Original Implant Template Sequence", "OriginalImplantTemplateSequence",  "SQ", "1" },    { Tag(0x0068, 0x6226),
+          "Effective DateTime", "EffectiveDateTime",  "DT", "1" },    { Tag(0x0068, 0x6230),
+          "Implant Target Anatomy Sequence", "ImplantTargetAnatomySequence",  "SQ", "1" },    { Tag(0x0068, 0x6260),
+          "Information From Manufacturer Sequence", "InformationFromManufacturerSequence",  "SQ", "1" },    { Tag(0x0068, 0x6265),
+          "Notification From Manufacturer Sequence", "NotificationFromManufacturerSequence",  "SQ", "1" },    { Tag(0x0068, 0x6270),
+          "Information Issue DateTime", "InformationIssueDateTime",  "DT", "1" },    { Tag(0x0068, 0x6280),
+          "Information Summary", "InformationSummary",  "ST", "1" },    { Tag(0x0068, 0x62a0),
+          "Implant Regulatory Disapproval Code Sequence", "ImplantRegulatoryDisapprovalCodeSequence",  "SQ", "1" },    { Tag(0x0068, 0x62a5),
+          "Overall Template Spatial Tolerance", "OverallTemplateSpatialTolerance",  "FD", "1" },    { Tag(0x0068, 0x62c0),
+          "HPGL Document Sequence", "HPGLDocumentSequence",  "SQ", "1" },    { Tag(0x0068, 0x62d0),
+          "HPGL Document ID", "HPGLDocumentID",  "US", "1" },    { Tag(0x0068, 0x62d5),
+          "HPGL Document Label", "HPGLDocumentLabel",  "LO", "1" },    { Tag(0x0068, 0x62e0),
+          "View Orientation Code Sequence", "ViewOrientationCodeSequence",  "SQ", "1" },    { Tag(0x0068, 0x62f0),
+          "View Orientation Modifier", "ViewOrientationModifier",  "FD", "9" },    { Tag(0x0068, 0x62f2),
+          "HPGL Document Scaling", "HPGLDocumentScaling",  "FD", "1" },    { Tag(0x0068, 0x6300),
+          "HPGL Document", "HPGLDocument",  "OB", "1" },    { Tag(0x0068, 0x6310),
+          "HPGL Contour Pen Number", "HPGLContourPenNumber",  "US", "1" },    { Tag(0x0068, 0x6320),
+          "HPGL Pen Sequence", "HPGLPenSequence",  "SQ", "1" },    { Tag(0x0068, 0x6330),
+          "HPGL Pen Number", "HPGLPenNumber",  "US", "1" },    { Tag(0x0068, 0x6340),
+          "HPGL Pen Label", "HPGLPenLabel",  "LO", "1" },    { Tag(0x0068, 0x6345),
+          "HPGL Pen Description", "HPGLPenDescription",  "ST", "1" },    { Tag(0x0068, 0x6346),
+          "Recommended Rotation Point", "RecommendedRotationPoint",  "FD", "2" },    { Tag(0x0068, 0x6347),
+          "Bounding Rectangle", "BoundingRectangle",  "FD", "4" },    { Tag(0x0068, 0x6350),
+          "Implant Template 3D Model Surface Number", "ImplantTemplate3DModelSurfaceNumber",  "US", "1-n" },    { Tag(0x0068, 0x6360),
+          "Surface Model Description Sequence", "SurfaceModelDescriptionSequence",  "SQ", "1" },    { Tag(0x0068, 0x6380),
+          "Surface Model Label", "SurfaceModelLabel",  "LO", "1" },    { Tag(0x0068, 0x6390),
+          "Surface Model Scaling Factor", "SurfaceModelScalingFactor",  "FD", "1" },    { Tag(0x0068, 0x63a0),
+          "Materials Code Sequence", "MaterialsCodeSequence",  "SQ", "1" },    { Tag(0x0068, 0x63a4),
+          "Coating Materials Code Sequence", "CoatingMaterialsCodeSequence",  "SQ", "1" },    { Tag(0x0068, 0x63a8),
+          "Implant Type Code Sequence", "ImplantTypeCodeSequence",  "SQ", "1" },    { Tag(0x0068, 0x63ac),
+          "Fixation Method Code Sequence", "FixationMethodCodeSequence",  "SQ", "1" },    { Tag(0x0068, 0x63b0),
+          "Mating Feature Sets Sequence", "MatingFeatureSetsSequence",  "SQ", "1" },    { Tag(0x0068, 0x63c0),
+          "Mating Feature Set ID", "MatingFeatureSetID",  "US", "1" },    { Tag(0x0068, 0x63d0),
+          "Mating Feature Set Label", "MatingFeatureSetLabel",  "LO", "1" },    { Tag(0x0068, 0x63e0),
+          "Mating Feature Sequence", "MatingFeatureSequence",  "SQ", "1" },    { Tag(0x0068, 0x63f0),
+          "Mating Feature ID", "MatingFeatureID",  "US", "1" },    { Tag(0x0068, 0x6400),
+          "Mating Feature Degree of Freedom Sequence", "MatingFeatureDegreeOfFreedomSequence",  "SQ", "1" },    { Tag(0x0068, 0x6410),
+          "Degree of Freedom ID", "DegreeOfFreedomID",  "US", "1" },    { Tag(0x0068, 0x6420),
+          "Degree of Freedom Type", "DegreeOfFreedomType",  "CS", "1" },    { Tag(0x0068, 0x6430),
+          "2D Mating Feature Coordinates Sequence", "TwoDMatingFeatureCoordinatesSequence",  "SQ", "1" },    { Tag(0x0068, 0x6440),
+          "Referenced HPGL Document ID", "ReferencedHPGLDocumentID",  "US", "1" },    { Tag(0x0068, 0x6450),
+          "2D Mating Point", "TwoDMatingPoint",  "FD", "2" },    { Tag(0x0068, 0x6460),
+          "2D Mating Axes", "TwoDMatingAxes",  "FD", "4" },    { Tag(0x0068, 0x6470),
+          "2D Degree of Freedom Sequence", "TwoDDegreeOfFreedomSequence",  "SQ", "1" },    { Tag(0x0068, 0x6490),
+          "3D Degree of Freedom Axis", "ThreeDDegreeOfFreedomAxis",  "FD", "3" },    { Tag(0x0068, 0x64a0),
+          "Range of Freedom", "RangeOfFreedom",  "FD", "2" },    { Tag(0x0068, 0x64c0),
+          "3D Mating Point", "ThreeDMatingPoint",  "FD", "3" },    { Tag(0x0068, 0x64d0),
+          "3D Mating Axes", "ThreeDMatingAxes",  "FD", "9" },    { Tag(0x0068, 0x64f0),
+          "2D Degree of Freedom Axis", "TwoDDegreeOfFreedomAxis",  "FD", "3" },    { Tag(0x0068, 0x6500),
+          "Planning Landmark Point Sequence", "PlanningLandmarkPointSequence",  "SQ", "1" },    { Tag(0x0068, 0x6510),
+          "Planning Landmark Line Sequence", "PlanningLandmarkLineSequence",  "SQ", "1" },    { Tag(0x0068, 0x6520),
+          "Planning Landmark Plane Sequence", "PlanningLandmarkPlaneSequence",  "SQ", "1" },    { Tag(0x0068, 0x6530),
+          "Planning Landmark ID", "PlanningLandmarkID",  "US", "1" },    { Tag(0x0068, 0x6540),
+          "Planning Landmark Description", "PlanningLandmarkDescription",  "LO", "1" },    { Tag(0x0068, 0x6545),
+          "Planning Landmark Identification Code Sequence", "PlanningLandmarkIdentificationCodeSequence",  "SQ", "1" },    { Tag(0x0068, 0x6550),
+          "2D Point Coordinates Sequence", "TwoDPointCoordinatesSequence",  "SQ", "1" },    { Tag(0x0068, 0x6560),
+          "2D Point Coordinates", "TwoDPointCoordinates",  "FD", "2" },    { Tag(0x0068, 0x6590),
+          "3D Point Coordinates", "ThreeDPointCoordinates",  "FD", "3" },    { Tag(0x0068, 0x65a0),
+          "2D Line Coordinates Sequence", "TwoDLineCoordinatesSequence",  "SQ", "1" },    { Tag(0x0068, 0x65b0),
+          "2D Line Coordinates", "TwoDLineCoordinates",  "FD", "4" },    { Tag(0x0068, 0x65d0),
+          "3D Line Coordinates", "ThreeDLineCoordinates",  "FD", "6" },    { Tag(0x0068, 0x65e0),
+          "2D Plane Coordinates Sequence", "TwoDPlaneCoordinatesSequence",  "SQ", "1" },    { Tag(0x0068, 0x65f0),
+          "2D Plane Intersection", "TwoDPlaneIntersection",  "FD", "4" },    { Tag(0x0068, 0x6610),
+          "3D Plane Origin", "ThreeDPlaneOrigin",  "FD", "3" },    { Tag(0x0068, 0x6620),
+          "3D Plane Normal", "ThreeDPlaneNormal",  "FD", "3" },    { Tag(0x0070, 0x0001),
+          "Graphic Annotation Sequence", "GraphicAnnotationSequence",  "SQ", "1" },    { Tag(0x0070, 0x0002),
+          "Graphic Layer", "GraphicLayer",  "CS", "1" },    { Tag(0x0070, 0x0003),
+          "Bounding Box Annotation Units", "BoundingBoxAnnotationUnits",  "CS", "1" },    { Tag(0x0070, 0x0004),
+          "Anchor Point Annotation Units", "AnchorPointAnnotationUnits",  "CS", "1" },    { Tag(0x0070, 0x0005),
+          "Graphic Annotation Units", "GraphicAnnotationUnits",  "CS", "1" },    { Tag(0x0070, 0x0006),
+          "Unformatted Text Value", "UnformattedTextValue",  "ST", "1" },    { Tag(0x0070, 0x0008),
+          "Text Object Sequence", "TextObjectSequence",  "SQ", "1" },    { Tag(0x0070, 0x0009),
+          "Graphic Object Sequence", "GraphicObjectSequence",  "SQ", "1" },    { Tag(0x0070, 0x0010),
+          "Bounding Box Top Left Hand Corner", "BoundingBoxTopLeftHandCorner",  "FL", "2" },    { Tag(0x0070, 0x0011),
+          "Bounding Box Bottom Right Hand Corner", "BoundingBoxBottomRightHandCorner",  "FL", "2" },    { Tag(0x0070, 0x0012),
+          "Bounding Box Text Horizontal Justification", "BoundingBoxTextHorizontalJustification",  "CS", "1" },    { Tag(0x0070, 0x0014),
+          "Anchor Point", "AnchorPoint",  "FL", "2" },    { Tag(0x0070, 0x0015),
+          "Anchor Point Visibility", "AnchorPointVisibility",  "CS", "1" },    { Tag(0x0070, 0x0020),
+          "Graphic Dimensions", "GraphicDimensions",  "US", "1" },    { Tag(0x0070, 0x0021),
+          "Number of Graphic Points", "NumberOfGraphicPoints",  "US", "1" },    { Tag(0x0070, 0x0022),
+          "Graphic Data", "GraphicData",  "FL", "2-n" },    { Tag(0x0070, 0x0023),
+          "Graphic Type", "GraphicType",  "CS", "1" },    { Tag(0x0070, 0x0024),
+          "Graphic Filled", "GraphicFilled",  "CS", "1" },    { Tag(0x0070, 0x0040),
+          "Image Rotation (Retired)", "ImageRotationRetired",  "IS", "1" },    { Tag(0x0070, 0x0041),
+          "Image Horizontal Flip", "ImageHorizontalFlip",  "CS", "1" },    { Tag(0x0070, 0x0042),
+          "Image Rotation", "ImageRotation",  "US", "1" },    { Tag(0x0070, 0x0050),
+          "Displayed Area Top Left Hand Corner (Trial)", "DisplayedAreaTopLeftHandCornerTrial",  "US", "2" },    { Tag(0x0070, 0x0051),
+          "Displayed Area Bottom Right Hand Corner (Trial)", "DisplayedAreaBottomRightHandCornerTrial",  "US", "2" },    { Tag(0x0070, 0x0052),
+          "Displayed Area Top Left Hand Corner", "DisplayedAreaTopLeftHandCorner",  "SL", "2" },    { Tag(0x0070, 0x0053),
+          "Displayed Area Bottom Right Hand Corner", "DisplayedAreaBottomRightHandCorner",  "SL", "2" },    { Tag(0x0070, 0x005a),
+          "Displayed Area Selection Sequence", "DisplayedAreaSelectionSequence",  "SQ", "1" },    { Tag(0x0070, 0x0060),
+          "Graphic Layer Sequence", "GraphicLayerSequence",  "SQ", "1" },    { Tag(0x0070, 0x0062),
+          "Graphic Layer Order", "GraphicLayerOrder",  "IS", "1" },    { Tag(0x0070, 0x0066),
+          "Graphic Layer Recommended Display Grayscale Value", "GraphicLayerRecommendedDisplayGrayscaleValue",  "US", "1" },    { Tag(0x0070, 0x0067),
+          "Graphic Layer Recommended Display RGB Value", "GraphicLayerRecommendedDisplayRGBValue",  "US", "3" },    { Tag(0x0070, 0x0068),
+          "Graphic Layer Description", "GraphicLayerDescription",  "LO", "1" },    { Tag(0x0070, 0x0080),
+          "Content Label", "ContentLabel",  "CS", "1" },    { Tag(0x0070, 0x0081),
+          "Content Description", "ContentDescription",  "LO", "1" },    { Tag(0x0070, 0x0082),
+          "Presentation Creation Date", "PresentationCreationDate",  "DA", "1" },    { Tag(0x0070, 0x0083),
+          "Presentation Creation Time", "PresentationCreationTime",  "TM", "1" },    { Tag(0x0070, 0x0084),
+          "Content Creator's Name", "ContentCreatorName",  "PN", "1" },    { Tag(0x0070, 0x0086),
+          "Content Creator's Identification Code Sequence", "ContentCreatorIdentificationCodeSequence",  "SQ", "1" },    { Tag(0x0070, 0x0087),
+          "Alternate Content Description Sequence", "AlternateContentDescriptionSequence",  "SQ", "1" },    { Tag(0x0070, 0x0100),
+          "Presentation Size Mode", "PresentationSizeMode",  "CS", "1" },    { Tag(0x0070, 0x0101),
+          "Presentation Pixel Spacing", "PresentationPixelSpacing",  "DS", "2" },    { Tag(0x0070, 0x0102),
+          "Presentation Pixel Aspect Ratio", "PresentationPixelAspectRatio",  "IS", "2" },    { Tag(0x0070, 0x0103),
+          "Presentation Pixel Magnification Ratio", "PresentationPixelMagnificationRatio",  "FL", "1" },    { Tag(0x0070, 0x0207),
+          "Graphic Group Label", "GraphicGroupLabel",  "LO", "1" },    { Tag(0x0070, 0x0208),
+          "Graphic Group Description", "GraphicGroupDescription",  "ST", "1" },    { Tag(0x0070, 0x0209),
+          "Compound Graphic Sequence", "CompoundGraphicSequence",  "SQ", "1" },    { Tag(0x0070, 0x0226),
+          "Compound Graphic Instance ID", "CompoundGraphicInstanceID",  "UL", "1" },    { Tag(0x0070, 0x0227),
+          "Font Name", "FontName",  "LO", "1" },    { Tag(0x0070, 0x0228),
+          "Font Name Type", "FontNameType",  "CS", "1" },    { Tag(0x0070, 0x0229),
+          "CSS Font Name", "CSSFontName",  "LO", "1" },    { Tag(0x0070, 0x0230),
+          "Rotation Angle", "RotationAngle",  "FD", "1" },    { Tag(0x0070, 0x0231),
+          "Text Style Sequence", "TextStyleSequence",  "SQ", "1" },    { Tag(0x0070, 0x0232),
+          "Line Style Sequence", "LineStyleSequence",  "SQ", "1" },    { Tag(0x0070, 0x0233),
+          "Fill Style Sequence", "FillStyleSequence",  "SQ", "1" },    { Tag(0x0070, 0x0234),
+          "Graphic Group Sequence", "GraphicGroupSequence",  "SQ", "1" },    { Tag(0x0070, 0x0241),
+          "Text Color CIELab Value", "TextColorCIELabValue",  "US", "3" },    { Tag(0x0070, 0x0242),
+          "Horizontal Alignment", "HorizontalAlignment",  "CS", "1" },    { Tag(0x0070, 0x0243),
+          "Vertical Alignment", "VerticalAlignment",  "CS", "1" },    { Tag(0x0070, 0x0244),
+          "Shadow Style", "ShadowStyle",  "CS", "1" },    { Tag(0x0070, 0x0245),
+          "Shadow Offset X", "ShadowOffsetX",  "FL", "1" },    { Tag(0x0070, 0x0246),
+          "Shadow Offset Y", "ShadowOffsetY",  "FL", "1" },    { Tag(0x0070, 0x0247),
+          "Shadow Color CIELab Value", "ShadowColorCIELabValue",  "US", "3" },    { Tag(0x0070, 0x0248),
+          "Underlined", "Underlined",  "CS", "1" },    { Tag(0x0070, 0x0249),
+          "Bold", "Bold",  "CS", "1" },    { Tag(0x0070, 0x0250),
+          "Italic", "Italic",  "CS", "1" },    { Tag(0x0070, 0x0251),
+          "Pattern On Color CIELab Value", "PatternOnColorCIELabValue",  "US", "3" },    { Tag(0x0070, 0x0252),
+          "Pattern Off Color CIELab Value", "PatternOffColorCIELabValue",  "US", "3" },    { Tag(0x0070, 0x0253),
+          "Line Thickness", "LineThickness",  "FL", "1" },    { Tag(0x0070, 0x0254),
+          "Line Dashing Style", "LineDashingStyle",  "CS", "1" },    { Tag(0x0070, 0x0255),
+          "Line Pattern", "LinePattern",  "UL", "1" },    { Tag(0x0070, 0x0256),
+          "Fill Pattern", "FillPattern",  "OB", "1" },    { Tag(0x0070, 0x0257),
+          "Fill Mode", "FillMode",  "CS", "1" },    { Tag(0x0070, 0x0258),
+          "Shadow Opacity", "ShadowOpacity",  "FL", "1" },    { Tag(0x0070, 0x0261),
+          "Gap Length", "GapLength",  "FL", "1" },    { Tag(0x0070, 0x0262),
+          "Diameter of Visibility", "DiameterOfVisibility",  "FL", "1" },    { Tag(0x0070, 0x0273),
+          "Rotation Point", "RotationPoint",  "FL", "2" },    { Tag(0x0070, 0x0274),
+          "Tick Alignment", "TickAlignment",  "CS", "1" },    { Tag(0x0070, 0x0278),
+          "Show Tick Label", "ShowTickLabel",  "CS", "1" },    { Tag(0x0070, 0x0279),
+          "Tick Label Alignment", "TickLabelAlignment",  "CS", "1" },    { Tag(0x0070, 0x0282),
+          "Compound Graphic Units", "CompoundGraphicUnits",  "CS", "1" },    { Tag(0x0070, 0x0284),
+          "Pattern On Opacity", "PatternOnOpacity",  "FL", "1" },    { Tag(0x0070, 0x0285),
+          "Pattern Off Opacity", "PatternOffOpacity",  "FL", "1" },    { Tag(0x0070, 0x0287),
+          "Major Ticks Sequence", "MajorTicksSequence",  "SQ", "1" },    { Tag(0x0070, 0x0288),
+          "Tick Position", "TickPosition",  "FL", "1" },    { Tag(0x0070, 0x0289),
+          "Tick Label", "TickLabel",  "SH", "1" },    { Tag(0x0070, 0x0294),
+          "Compound Graphic Type", "CompoundGraphicType",  "CS", "1" },    { Tag(0x0070, 0x0295),
+          "Graphic Group ID", "GraphicGroupID",  "UL", "1" },    { Tag(0x0070, 0x0306),
+          "Shape Type", "ShapeType",  "CS", "1" },    { Tag(0x0070, 0x0308),
+          "Registration Sequence", "RegistrationSequence",  "SQ", "1" },    { Tag(0x0070, 0x0309),
+          "Matrix Registration Sequence", "MatrixRegistrationSequence",  "SQ", "1" },    { Tag(0x0070, 0x030a),
+          "Matrix Sequence", "MatrixSequence",  "SQ", "1" },    { Tag(0x0070, 0x030b),
+          "Frame of Reference to Displayed Coordinate System Transformation Matrix", "FrameOfReferenceToDisplayedCoordinateSystemTransformationMatrix",  "FD", "16" },    { Tag(0x0070, 0x030c),
+          "Frame of Reference Transformation Matrix Type", "FrameOfReferenceTransformationMatrixType",  "CS", "1" },    { Tag(0x0070, 0x030d),
+          "Registration Type Code Sequence", "RegistrationTypeCodeSequence",  "SQ", "1" },    { Tag(0x0070, 0x030f),
+          "Fiducial Description", "FiducialDescription",  "ST", "1" },    { Tag(0x0070, 0x0310),
+          "Fiducial Identifier", "FiducialIdentifier",  "SH", "1" },    { Tag(0x0070, 0x0311),
+          "Fiducial Identifier Code Sequence", "FiducialIdentifierCodeSequence",  "SQ", "1" },    { Tag(0x0070, 0x0312),
+          "Contour Uncertainty Radius", "ContourUncertaintyRadius",  "FD", "1" },    { Tag(0x0070, 0x0314),
+          "Used Fiducials Sequence", "UsedFiducialsSequence",  "SQ", "1" },    { Tag(0x0070, 0x0318),
+          "Graphic Coordinates Data Sequence", "GraphicCoordinatesDataSequence",  "SQ", "1" },    { Tag(0x0070, 0x031a),
+          "Fiducial UID", "FiducialUID",  "UI", "1" },    { Tag(0x0070, 0x031c),
+          "Fiducial Set Sequence", "FiducialSetSequence",  "SQ", "1" },    { Tag(0x0070, 0x031e),
+          "Fiducial Sequence", "FiducialSequence",  "SQ", "1" },    { Tag(0x0070, 0x0401),
+          "Graphic Layer Recommended Display CIELab Value", "GraphicLayerRecommendedDisplayCIELabValue",  "US", "3" },    { Tag(0x0070, 0x0402),
+          "Blending Sequence", "BlendingSequence",  "SQ", "1" },    { Tag(0x0070, 0x0403),
+          "Relative Opacity", "RelativeOpacity",  "FL", "1" },    { Tag(0x0070, 0x0404),
+          "Referenced Spatial Registration Sequence", "ReferencedSpatialRegistrationSequence",  "SQ", "1" },    { Tag(0x0070, 0x0405),
+          "Blending Position", "BlendingPosition",  "CS", "1" },    { Tag(0x0070, 0x1101),
+          "Presentation Display Collection UID", "PresentationDisplayCollectionUID",  "UI", "1" },    { Tag(0x0070, 0x1102),
+          "Presentation Sequence Collection UID", "PresentationSequenceCollectionUID",  "UI", "1" },    { Tag(0x0070, 0x1103),
+          "Presentation Sequence Position Index", "PresentationSequencePositionIndex",  "US", "1" },    { Tag(0x0070, 0x1104),
+          "Rendered Image Reference Sequence", "RenderedImageReferenceSequence",  "SQ", "1" },    { Tag(0x0070, 0x1201),
+          "Volumetric Presentation State Input Sequence", "VolumetricPresentationStateInputSequence",  "SQ", "1" },    { Tag(0x0070, 0x1202),
+          "Presentation Input Type", "PresentationInputType",  "CS", "1" },    { Tag(0x0070, 0x1203),
+          "Input Sequence Position Index", "InputSequencePositionIndex",  "US", "1" },    { Tag(0x0070, 0x1204),
+          "Crop", "Crop",  "CS", "1" },    { Tag(0x0070, 0x1205),
+          "Cropping Specification Index", "CroppingSpecificationIndex",  "US", "1-n" },    { Tag(0x0070, 0x1206),
+          "Compositing Method", "CompositingMethod",  "CS", "1" },    { Tag(0x0070, 0x1207),
+          "Volumetric Presentation Input Number", "VolumetricPresentationInputNumber",  "US", "1" },    { Tag(0x0070, 0x1208),
+          "Image Volume Geometry", "ImageVolumeGeometry",  "CS", "1" },    { Tag(0x0070, 0x1301),
+          "Volume Cropping Sequence", "VolumeCroppingSequence",  "SQ", "1" },    { Tag(0x0070, 0x1302),
+          "Volume Cropping Method", "VolumeCroppingMethod",  "CS", "1" },    { Tag(0x0070, 0x1303),
+          "Bounding Box Crop", "BoundingBoxCrop",  "FD", "6" },    { Tag(0x0070, 0x1304),
+          "Oblique Cropping Plane Sequence", "ObliqueCroppingPlaneSequence",  "SQ", "1" },    { Tag(0x0070, 0x1305),
+          "Plane", "Plane",  "FD", "4" },    { Tag(0x0070, 0x1306),
+          "Plane Normal", "PlaneNormal",  "FD", "3" },    { Tag(0x0070, 0x1309),
+          "Cropping Specification Number", "CroppingSpecificationNumber",  "US", "1" },    { Tag(0x0070, 0x1501),
+          "Multi-Planar Reconstruction Style", "MultiPlanarReconstructionStyle",  "CS", "1" },    { Tag(0x0070, 0x1502),
+          "MPR Thickness Type", "MPRThicknessType",  "CS", "1" },    { Tag(0x0070, 0x1503),
+          "MPR Slab Thickness", "MPRSlabThickness",  "FD", "1" },    { Tag(0x0070, 0x1505),
+          "MPR Top Left Hand Corner", "MPRTopLeftHandCorner",  "FD", "3" },    { Tag(0x0070, 0x1507),
+          "MPR View Width Direction", "MPRViewWidthDirection",  "FD", "3" },    { Tag(0x0070, 0x1508),
+          "MPR View Width", "MPRViewWidth",  "FD", "1" },    { Tag(0x0070, 0x150c),
+          "Number of Volumetric Curve Points", "NumberOfVolumetricCurvePoints",  "UL", "1" },    { Tag(0x0070, 0x150d),
+          "Volumetric Curve Points", "VolumetricCurvePoints",  "OD", "1" },    { Tag(0x0070, 0x1511),
+          "MPR View Height Direction", "MPRViewHeightDirection",  "FD", "3" },    { Tag(0x0070, 0x1512),
+          "MPR View Height", "MPRViewHeight",  "FD", "1" },    { Tag(0x0070, 0x1801),
+          "Presentation State Classification Component Sequence", "PresentationStateClassificationComponentSequence",  "SQ", "1" },    { Tag(0x0070, 0x1802),
+          "Component Type", "ComponentType",  "CS", "1" },    { Tag(0x0070, 0x1803),
+          "Component Input Sequence", "ComponentInputSequence",  "SQ", "1" },    { Tag(0x0070, 0x1804),
+          "Volumetric Presentation Input Index", "VolumetricPresentationInputIndex",  "US", "1" },    { Tag(0x0070, 0x1805),
+          "Presentation State Compositor Component Sequence", "PresentationStateCompositorComponentSequence",  "SQ", "1" },    { Tag(0x0070, 0x1806),
+          "Weighting Transfer Function Sequence", "WeightingTransferFunctionSequence",  "SQ", "1" },    { Tag(0x0070, 0x1807),
+          "Weighting Lookup Table Descriptor", "WeightingLookupTableDescriptor",  "US", "3" },    { Tag(0x0070, 0x1808),
+          "Weighting Lookup Table Data", "WeightingLookupTableData",  "OB", "1" },    { Tag(0x0070, 0x1901),
+          "Volumetric Annotation Sequence", "VolumetricAnnotationSequence",  "SQ", "1" },    { Tag(0x0070, 0x1903),
+          "Referenced Structured Context Sequence", "ReferencedStructuredContextSequence",  "SQ", "1" },    { Tag(0x0070, 0x1904),
+          "Referenced Content Item", "ReferencedContentItem",  "UI", "1" },    { Tag(0x0070, 0x1905),
+          "Volumetric Presentation Input Annotation Sequence", "VolumetricPresentationInputAnnotationSequence",  "SQ", "1" },    { Tag(0x0070, 0x1907),
+          "Annotation Clipping", "AnnotationClipping",  "CS", "1" },    { Tag(0x0070, 0x1a01),
+          "Presentation Animation Style", "PresentationAnimationStyle",  "CS", "1" },    { Tag(0x0070, 0x1a03),
+          "Recommended Animation Rate", "RecommendedAnimationRate",  "FD", "1" },    { Tag(0x0070, 0x1a04),
+          "Animation Curve Sequence", "AnimationCurveSequence",  "SQ", "1" },    { Tag(0x0070, 0x1a05),
+          "Animation Step Size", "AnimationStepSize",  "FD", "1" },    { Tag(0x0072, 0x0002),
+          "Hanging Protocol Name", "HangingProtocolName",  "SH", "1" },    { Tag(0x0072, 0x0004),
+          "Hanging Protocol Description", "HangingProtocolDescription",  "LO", "1" },    { Tag(0x0072, 0x0006),
+          "Hanging Protocol Level", "HangingProtocolLevel",  "CS", "1" },    { Tag(0x0072, 0x0008),
+          "Hanging Protocol Creator", "HangingProtocolCreator",  "LO", "1" },    { Tag(0x0072, 0x000a),
+          "Hanging Protocol Creation DateTime", "HangingProtocolCreationDateTime",  "DT", "1" },    { Tag(0x0072, 0x000c),
+          "Hanging Protocol Definition Sequence", "HangingProtocolDefinitionSequence",  "SQ", "1" },    { Tag(0x0072, 0x000e),
+          "Hanging Protocol User Identification Code Sequence", "HangingProtocolUserIdentificationCodeSequence",  "SQ", "1" },    { Tag(0x0072, 0x0010),
+          "Hanging Protocol User Group Name", "HangingProtocolUserGroupName",  "LO", "1" },    { Tag(0x0072, 0x0012),
+          "Source Hanging Protocol Sequence", "SourceHangingProtocolSequence",  "SQ", "1" },    { Tag(0x0072, 0x0014),
+          "Number of Priors Referenced", "NumberOfPriorsReferenced",  "US", "1" },    { Tag(0x0072, 0x0020),
+          "Image Sets Sequence", "ImageSetsSequence",  "SQ", "1" },    { Tag(0x0072, 0x0022),
+          "Image Set Selector Sequence", "ImageSetSelectorSequence",  "SQ", "1" },    { Tag(0x0072, 0x0024),
+          "Image Set Selector Usage Flag", "ImageSetSelectorUsageFlag",  "CS", "1" },    { Tag(0x0072, 0x0026),
+          "Selector Attribute", "SelectorAttribute",  "AT", "1" },    { Tag(0x0072, 0x0028),
+          "Selector Value Number", "SelectorValueNumber",  "US", "1" },    { Tag(0x0072, 0x0030),
+          "Time Based Image Sets Sequence", "TimeBasedImageSetsSequence",  "SQ", "1" },    { Tag(0x0072, 0x0032),
+          "Image Set Number", "ImageSetNumber",  "US", "1" },    { Tag(0x0072, 0x0034),
+          "Image Set Selector Category", "ImageSetSelectorCategory",  "CS", "1" },    { Tag(0x0072, 0x0038),
+          "Relative Time", "RelativeTime",  "US", "2" },    { Tag(0x0072, 0x003a),
+          "Relative Time Units", "RelativeTimeUnits",  "CS", "1" },    { Tag(0x0072, 0x003c),
+          "Abstract Prior Value", "AbstractPriorValue",  "SS", "2" },    { Tag(0x0072, 0x003e),
+          "Abstract Prior Code Sequence", "AbstractPriorCodeSequence",  "SQ", "1" },    { Tag(0x0072, 0x0040),
+          "Image Set Label", "ImageSetLabel",  "LO", "1" },    { Tag(0x0072, 0x0050),
+          "Selector Attribute VR", "SelectorAttributeVR",  "CS", "1" },    { Tag(0x0072, 0x0052),
+          "Selector Sequence Pointer", "SelectorSequencePointer",  "AT", "1-n" },    { Tag(0x0072, 0x0054),
+          "Selector Sequence Pointer Private Creator", "SelectorSequencePointerPrivateCreator",  "LO", "1-n" },    { Tag(0x0072, 0x0056),
+          "Selector Attribute Private Creator", "SelectorAttributePrivateCreator",  "LO", "1" },    { Tag(0x0072, 0x005e),
+          "Selector AE Value", "SelectorAEValue",  "AE", "1-n" },    { Tag(0x0072, 0x005f),
+          "Selector AS Value", "SelectorASValue",  "AS", "1-n" },    { Tag(0x0072, 0x0060),
+          "Selector AT Value", "SelectorATValue",  "AT", "1-n" },    { Tag(0x0072, 0x0061),
+          "Selector DA Value", "SelectorDAValue",  "DA", "1-n" },    { Tag(0x0072, 0x0062),
+          "Selector CS Value", "SelectorCSValue",  "CS", "1-n" },    { Tag(0x0072, 0x0063),
+          "Selector DT Value", "SelectorDTValue",  "DT", "1-n" },    { Tag(0x0072, 0x0064),
+          "Selector IS Value", "SelectorISValue",  "IS", "1-n" },    { Tag(0x0072, 0x0065),
+          "Selector OB Value", "SelectorOBValue",  "OB", "1" },    { Tag(0x0072, 0x0066),
+          "Selector LO Value", "SelectorLOValue",  "LO", "1-n" },    { Tag(0x0072, 0x0067),
+          "Selector OF Value", "SelectorOFValue",  "OF", "1" },    { Tag(0x0072, 0x0068),
+          "Selector LT Value", "SelectorLTValue",  "LT", "1" },    { Tag(0x0072, 0x0069),
+          "Selector OW Value", "SelectorOWValue",  "OW", "1" },    { Tag(0x0072, 0x006a),
+          "Selector PN Value", "SelectorPNValue",  "PN", "1-n" },    { Tag(0x0072, 0x006b),
+          "Selector TM Value", "SelectorTMValue",  "TM", "1-n" },    { Tag(0x0072, 0x006c),
+          "Selector SH Value", "SelectorSHValue",  "SH", "1-n" },    { Tag(0x0072, 0x006d),
+          "Selector UN Value", "SelectorUNValue",  "UN", "1" },    { Tag(0x0072, 0x006e),
+          "Selector ST Value", "SelectorSTValue",  "ST", "1" },    { Tag(0x0072, 0x006f),
+          "Selector UC Value", "SelectorUCValue",  "UC", "1-n" },    { Tag(0x0072, 0x0070),
+          "Selector UT Value", "SelectorUTValue",  "UT", "1" },    { Tag(0x0072, 0x0071),
+          "Selector UR Value", "SelectorURValue",  "UR", "1" },    { Tag(0x0072, 0x0072),
+          "Selector DS Value", "SelectorDSValue",  "DS", "1-n" },    { Tag(0x0072, 0x0073),
+          "Selector OD Value", "SelectorODValue",  "OD", "1" },    { Tag(0x0072, 0x0074),
+          "Selector FD Value", "SelectorFDValue",  "FD", "1-n" },    { Tag(0x0072, 0x0075),
+          "Selector OL Value", "SelectorOLValue",  "OL", "1" },    { Tag(0x0072, 0x0076),
+          "Selector FL Value", "SelectorFLValue",  "FL", "1-n" },    { Tag(0x0072, 0x0078),
+          "Selector UL Value", "SelectorULValue",  "UL", "1-n" },    { Tag(0x0072, 0x007a),
+          "Selector US Value", "SelectorUSValue",  "US", "1-n" },    { Tag(0x0072, 0x007c),
+          "Selector SL Value", "SelectorSLValue",  "SL", "1-n" },    { Tag(0x0072, 0x007e),
+          "Selector SS Value", "SelectorSSValue",  "SS", "1-n" },    { Tag(0x0072, 0x007f),
+          "Selector UI Value", "SelectorUIValue",  "UI", "1-n" },    { Tag(0x0072, 0x0080),
+          "Selector Code Sequence Value", "SelectorCodeSequenceValue",  "SQ", "1" },    { Tag(0x0072, 0x0100),
+          "Number of Screens", "NumberOfScreens",  "US", "1" },    { Tag(0x0072, 0x0102),
+          "Nominal Screen Definition Sequence", "NominalScreenDefinitionSequence",  "SQ", "1" },    { Tag(0x0072, 0x0104),
+          "Number of Vertical Pixels", "NumberOfVerticalPixels",  "US", "1" },    { Tag(0x0072, 0x0106),
+          "Number of Horizontal Pixels", "NumberOfHorizontalPixels",  "US", "1" },    { Tag(0x0072, 0x0108),
+          "Display Environment Spatial Position", "DisplayEnvironmentSpatialPosition",  "FD", "4" },    { Tag(0x0072, 0x010a),
+          "Screen Minimum Grayscale Bit Depth", "ScreenMinimumGrayscaleBitDepth",  "US", "1" },    { Tag(0x0072, 0x010c),
+          "Screen Minimum Color Bit Depth", "ScreenMinimumColorBitDepth",  "US", "1" },    { Tag(0x0072, 0x010e),
+          "Application Maximum Repaint Time", "ApplicationMaximumRepaintTime",  "US", "1" },    { Tag(0x0072, 0x0200),
+          "Display Sets Sequence", "DisplaySetsSequence",  "SQ", "1" },    { Tag(0x0072, 0x0202),
+          "Display Set Number", "DisplaySetNumber",  "US", "1" },    { Tag(0x0072, 0x0203),
+          "Display Set Label", "DisplaySetLabel",  "LO", "1" },    { Tag(0x0072, 0x0204),
+          "Display Set Presentation Group", "DisplaySetPresentationGroup",  "US", "1" },    { Tag(0x0072, 0x0206),
+          "Display Set Presentation Group Description", "DisplaySetPresentationGroupDescription",  "LO", "1" },    { Tag(0x0072, 0x0208),
+          "Partial Data Display Handling", "PartialDataDisplayHandling",  "CS", "1" },    { Tag(0x0072, 0x0210),
+          "Synchronized Scrolling Sequence", "SynchronizedScrollingSequence",  "SQ", "1" },    { Tag(0x0072, 0x0212),
+          "Display Set Scrolling Group", "DisplaySetScrollingGroup",  "US", "2-n" },    { Tag(0x0072, 0x0214),
+          "Navigation Indicator Sequence", "NavigationIndicatorSequence",  "SQ", "1" },    { Tag(0x0072, 0x0216),
+          "Navigation Display Set", "NavigationDisplaySet",  "US", "1" },    { Tag(0x0072, 0x0218),
+          "Reference Display Sets", "ReferenceDisplaySets",  "US", "1-n" },    { Tag(0x0072, 0x0300),
+          "Image Boxes Sequence", "ImageBoxesSequence",  "SQ", "1" },    { Tag(0x0072, 0x0302),
+          "Image Box Number", "ImageBoxNumber",  "US", "1" },    { Tag(0x0072, 0x0304),
+          "Image Box Layout Type", "ImageBoxLayoutType",  "CS", "1" },    { Tag(0x0072, 0x0306),
+          "Image Box Tile Horizontal Dimension", "ImageBoxTileHorizontalDimension",  "US", "1" },    { Tag(0x0072, 0x0308),
+          "Image Box Tile Vertical Dimension", "ImageBoxTileVerticalDimension",  "US", "1" },    { Tag(0x0072, 0x0310),
+          "Image Box Scroll Direction", "ImageBoxScrollDirection",  "CS", "1" },    { Tag(0x0072, 0x0312),
+          "Image Box Small Scroll Type", "ImageBoxSmallScrollType",  "CS", "1" },    { Tag(0x0072, 0x0314),
+          "Image Box Small Scroll Amount", "ImageBoxSmallScrollAmount",  "US", "1" },    { Tag(0x0072, 0x0316),
+          "Image Box Large Scroll Type", "ImageBoxLargeScrollType",  "CS", "1" },    { Tag(0x0072, 0x0318),
+          "Image Box Large Scroll Amount", "ImageBoxLargeScrollAmount",  "US", "1" },    { Tag(0x0072, 0x0320),
+          "Image Box Overlap Priority", "ImageBoxOverlapPriority",  "US", "1" },    { Tag(0x0072, 0x0330),
+          "Cine Relative to Real-Time", "CineRelativeToRealTime",  "FD", "1" },    { Tag(0x0072, 0x0400),
+          "Filter Operations Sequence", "FilterOperationsSequence",  "SQ", "1" },    { Tag(0x0072, 0x0402),
+          "Filter-by Category", "FilterByCategory",  "CS", "1" },    { Tag(0x0072, 0x0404),
+          "Filter-by Attribute Presence", "FilterByAttributePresence",  "CS", "1" },    { Tag(0x0072, 0x0406),
+          "Filter-by Operator", "FilterByOperator",  "CS", "1" },    { Tag(0x0072, 0x0420),
+          "Structured Display Background CIELab Value", "StructuredDisplayBackgroundCIELabValue",  "US", "3" },    { Tag(0x0072, 0x0421),
+          "Empty Image Box CIELab Value", "EmptyImageBoxCIELabValue",  "US", "3" },    { Tag(0x0072, 0x0422),
+          "Structured Display Image Box Sequence", "StructuredDisplayImageBoxSequence",  "SQ", "1" },    { Tag(0x0072, 0x0424),
+          "Structured Display Text Box Sequence", "StructuredDisplayTextBoxSequence",  "SQ", "1" },    { Tag(0x0072, 0x0427),
+          "Referenced First Frame Sequence", "ReferencedFirstFrameSequence",  "SQ", "1" },    { Tag(0x0072, 0x0430),
+          "Image Box Synchronization Sequence", "ImageBoxSynchronizationSequence",  "SQ", "1" },    { Tag(0x0072, 0x0432),
+          "Synchronized Image Box List", "SynchronizedImageBoxList",  "US", "2-n" },    { Tag(0x0072, 0x0434),
+          "Type of Synchronization", "TypeOfSynchronization",  "CS", "1" },    { Tag(0x0072, 0x0500),
+          "Blending Operation Type", "BlendingOperationType",  "CS", "1" },    { Tag(0x0072, 0x0510),
+          "Reformatting Operation Type", "ReformattingOperationType",  "CS", "1" },    { Tag(0x0072, 0x0512),
+          "Reformatting Thickness", "ReformattingThickness",  "FD", "1" },    { Tag(0x0072, 0x0514),
+          "Reformatting Interval", "ReformattingInterval",  "FD", "1" },    { Tag(0x0072, 0x0516),
+          "Reformatting Operation Initial View Direction", "ReformattingOperationInitialViewDirection",  "CS", "1" },    { Tag(0x0072, 0x0520),
+          "3D Rendering Type", "ThreeDRenderingType",  "CS", "1-n" },    { Tag(0x0072, 0x0600),
+          "Sorting Operations Sequence", "SortingOperationsSequence",  "SQ", "1" },    { Tag(0x0072, 0x0602),
+          "Sort-by Category", "SortByCategory",  "CS", "1" },    { Tag(0x0072, 0x0604),
+          "Sorting Direction", "SortingDirection",  "CS", "1" },    { Tag(0x0072, 0x0700),
+          "Display Set Patient Orientation", "DisplaySetPatientOrientation",  "CS", "2" },    { Tag(0x0072, 0x0702),
+          "VOI Type", "VOIType",  "CS", "1" },    { Tag(0x0072, 0x0704),
+          "Pseudo-Color Type", "PseudoColorType",  "CS", "1" },    { Tag(0x0072, 0x0705),
+          "Pseudo-Color Palette Instance Reference Sequence", "PseudoColorPaletteInstanceReferenceSequence",  "SQ", "1" },    { Tag(0x0072, 0x0706),
+          "Show Grayscale Inverted", "ShowGrayscaleInverted",  "CS", "1" },    { Tag(0x0072, 0x0710),
+          "Show Image True Size Flag", "ShowImageTrueSizeFlag",  "CS", "1" },    { Tag(0x0072, 0x0712),
+          "Show Graphic Annotation Flag", "ShowGraphicAnnotationFlag",  "CS", "1" },    { Tag(0x0072, 0x0714),
+          "Show Patient Demographics Flag", "ShowPatientDemographicsFlag",  "CS", "1" },    { Tag(0x0072, 0x0716),
+          "Show Acquisition Techniques Flag", "ShowAcquisitionTechniquesFlag",  "CS", "1" },    { Tag(0x0072, 0x0717),
+          "Display Set Horizontal Justification", "DisplaySetHorizontalJustification",  "CS", "1" },    { Tag(0x0072, 0x0718),
+          "Display Set Vertical Justification", "DisplaySetVerticalJustification",  "CS", "1" },    { Tag(0x0074, 0x0120),
+          "Continuation Start Meterset", "ContinuationStartMeterset",  "FD", "1" },    { Tag(0x0074, 0x0121),
+          "Continuation End Meterset", "ContinuationEndMeterset",  "FD", "1" },    { Tag(0x0074, 0x1000),
+          "Procedure Step State", "ProcedureStepState",  "CS", "1" },    { Tag(0x0074, 0x1002),
+          "Procedure Step Progress Information Sequence", "ProcedureStepProgressInformationSequence",  "SQ", "1" },    { Tag(0x0074, 0x1004),
+          "Procedure Step Progress", "ProcedureStepProgress",  "DS", "1" },    { Tag(0x0074, 0x1006),
+          "Procedure Step Progress Description", "ProcedureStepProgressDescription",  "ST", "1" },    { Tag(0x0074, 0x1008),
+          "Procedure Step Communications URI Sequence", "ProcedureStepCommunicationsURISequence",  "SQ", "1" },    { Tag(0x0074, 0x100a),
+          "Contact URI", "ContactURI",  "UR", "1" },    { Tag(0x0074, 0x100c),
+          "Contact Display Name", "ContactDisplayName",  "LO", "1" },    { Tag(0x0074, 0x100e),
+          "Procedure Step Discontinuation Reason Code Sequence", "ProcedureStepDiscontinuationReasonCodeSequence",  "SQ", "1" },    { Tag(0x0074, 0x1020),
+          "Beam Task Sequence", "BeamTaskSequence",  "SQ", "1" },    { Tag(0x0074, 0x1022),
+          "Beam Task Type", "BeamTaskType",  "CS", "1" },    { Tag(0x0074, 0x1024),
+          "Beam Order Index (Trial)", "BeamOrderIndexTrial",  "IS", "1" },    { Tag(0x0074, 0x1025),
+          "Autosequence Flag", "AutosequenceFlag",  "CS", "1" },    { Tag(0x0074, 0x1026),
+          "Table Top Vertical Adjusted Position", "TableTopVerticalAdjustedPosition",  "FD", "1" },    { Tag(0x0074, 0x1027),
+          "Table Top Longitudinal Adjusted Position", "TableTopLongitudinalAdjustedPosition",  "FD", "1" },    { Tag(0x0074, 0x1028),
+          "Table Top Lateral Adjusted Position", "TableTopLateralAdjustedPosition",  "FD", "1" },    { Tag(0x0074, 0x102a),
+          "Patient Support Adjusted Angle", "PatientSupportAdjustedAngle",  "FD", "1" },    { Tag(0x0074, 0x102b),
+          "Table Top Eccentric Adjusted Angle", "TableTopEccentricAdjustedAngle",  "FD", "1" },    { Tag(0x0074, 0x102c),
+          "Table Top Pitch Adjusted Angle", "TableTopPitchAdjustedAngle",  "FD", "1" },    { Tag(0x0074, 0x102d),
+          "Table Top Roll Adjusted Angle", "TableTopRollAdjustedAngle",  "FD", "1" },    { Tag(0x0074, 0x1030),
+          "Delivery Verification Image Sequence", "DeliveryVerificationImageSequence",  "SQ", "1" },    { Tag(0x0074, 0x1032),
+          "Verification Image Timing", "VerificationImageTiming",  "CS", "1" },    { Tag(0x0074, 0x1034),
+          "Double Exposure Flag", "DoubleExposureFlag",  "CS", "1" },    { Tag(0x0074, 0x1036),
+          "Double Exposure Ordering", "DoubleExposureOrdering",  "CS", "1" },    { Tag(0x0074, 0x1038),
+          "Double Exposure Meterset (Trial)", "DoubleExposureMetersetTrial",  "DS", "1" },    { Tag(0x0074, 0x103a),
+          "Double Exposure Field Delta (Trial)", "DoubleExposureFieldDeltaTrial",  "DS", "4" },    { Tag(0x0074, 0x1040),
+          "Related Reference RT Image Sequence", "RelatedReferenceRTImageSequence",  "SQ", "1" },    { Tag(0x0074, 0x1042),
+          "General Machine Verification Sequence", "GeneralMachineVerificationSequence",  "SQ", "1" },    { Tag(0x0074, 0x1044),
+          "Conventional Machine Verification Sequence", "ConventionalMachineVerificationSequence",  "SQ", "1" },    { Tag(0x0074, 0x1046),
+          "Ion Machine Verification Sequence", "IonMachineVerificationSequence",  "SQ", "1" },    { Tag(0x0074, 0x1048),
+          "Failed Attributes Sequence", "FailedAttributesSequence",  "SQ", "1" },    { Tag(0x0074, 0x104a),
+          "Overridden Attributes Sequence", "OverriddenAttributesSequence",  "SQ", "1" },    { Tag(0x0074, 0x104c),
+          "Conventional Control Point Verification Sequence", "ConventionalControlPointVerificationSequence",  "SQ", "1" },    { Tag(0x0074, 0x104e),
+          "Ion Control Point Verification Sequence", "IonControlPointVerificationSequence",  "SQ", "1" },    { Tag(0x0074, 0x1050),
+          "Attribute Occurrence Sequence", "AttributeOccurrenceSequence",  "SQ", "1" },    { Tag(0x0074, 0x1052),
+          "Attribute Occurrence Pointer", "AttributeOccurrencePointer",  "AT", "1" },    { Tag(0x0074, 0x1054),
+          "Attribute Item Selector", "AttributeItemSelector",  "UL", "1" },    { Tag(0x0074, 0x1056),
+          "Attribute Occurrence Private Creator", "AttributeOccurrencePrivateCreator",  "LO", "1" },    { Tag(0x0074, 0x1057),
+          "Selector Sequence Pointer Items", "SelectorSequencePointerItems",  "IS", "1-n" },    { Tag(0x0074, 0x1200),
+          "Scheduled Procedure Step Priority", "ScheduledProcedureStepPriority",  "CS", "1" },    { Tag(0x0074, 0x1202),
+          "Worklist Label", "WorklistLabel",  "LO", "1" },    { Tag(0x0074, 0x1204),
+          "Procedure Step Label", "ProcedureStepLabel",  "LO", "1" },    { Tag(0x0074, 0x1210),
+          "Scheduled Processing Parameters Sequence", "ScheduledProcessingParametersSequence",  "SQ", "1" },    { Tag(0x0074, 0x1212),
+          "Performed Processing Parameters Sequence", "PerformedProcessingParametersSequence",  "SQ", "1" },    { Tag(0x0074, 0x1216),
+          "Unified Procedure Step Performed Procedure Sequence", "UnifiedProcedureStepPerformedProcedureSequence",  "SQ", "1" },    { Tag(0x0074, 0x1220),
+          "Related Procedure Step Sequence", "RelatedProcedureStepSequence",  "SQ", "1" },    { Tag(0x0074, 0x1222),
+          "Procedure Step Relationship Type", "ProcedureStepRelationshipType",  "LO", "1" },    { Tag(0x0074, 0x1224),
+          "Replaced Procedure Step Sequence", "ReplacedProcedureStepSequence",  "SQ", "1" },    { Tag(0x0074, 0x1230),
+          "Deletion Lock", "DeletionLock",  "LO", "1" },    { Tag(0x0074, 0x1234),
+          "Receiving AE", "ReceivingAE",  "AE", "1" },    { Tag(0x0074, 0x1236),
+          "Requesting AE", "RequestingAE",  "AE", "1" },    { Tag(0x0074, 0x1238),
+          "Reason for Cancellation", "ReasonForCancellation",  "LT", "1" },    { Tag(0x0074, 0x1242),
+          "SCP Status", "SCPStatus",  "CS", "1" },    { Tag(0x0074, 0x1244),
+          "Subscription List Status", "SubscriptionListStatus",  "CS", "1" },    { Tag(0x0074, 0x1246),
+          "Unified Procedure Step List Status", "UnifiedProcedureStepListStatus",  "CS", "1" },    { Tag(0x0074, 0x1324),
+          "Beam Order Index", "BeamOrderIndex",  "UL", "1" },    { Tag(0x0074, 0x1338),
+          "Double Exposure Meterset", "DoubleExposureMeterset",  "FD", "1" },    { Tag(0x0074, 0x133a),
+          "Double Exposure Field Delta", "DoubleExposureFieldDelta",  "FD", "4" },    { Tag(0x0074, 0x1401),
+          "Brachy Task Sequence", "BrachyTaskSequence",  "SQ", "1" },    { Tag(0x0074, 0x1402),
+          "Continuation Start Total Reference Air Kerma", "ContinuationStartTotalReferenceAirKerma",  "DS", "1" },    { Tag(0x0074, 0x1403),
+          "Continuation End Total Reference Air Kerma", "ContinuationEndTotalReferenceAirKerma",  "DS", "1" },    { Tag(0x0074, 0x1404),
+          "Continuation Pulse Number", "ContinuationPulseNumber",  "IS", "1" },    { Tag(0x0074, 0x1405),
+          "Channel Delivery Order Sequence", "ChannelDeliveryOrderSequence",  "SQ", "1" },    { Tag(0x0074, 0x1406),
+          "Referenced Channel Number", "ReferencedChannelNumber",  "IS", "1" },    { Tag(0x0074, 0x1407),
+          "Start Cumulative Time Weight", "StartCumulativeTimeWeight",  "DS", "1" },    { Tag(0x0074, 0x1408),
+          "End Cumulative Time Weight", "EndCumulativeTimeWeight",  "DS", "1" },    { Tag(0x0074, 0x1409),
+          "Omitted Channel Sequence", "OmittedChannelSequence",  "SQ", "1" },    { Tag(0x0074, 0x140a),
+          "Reason for Channel Omission", "ReasonForChannelOmission",  "CS", "1" },    { Tag(0x0074, 0x140b),
+          "Reason for Channel Omission Description", "ReasonForChannelOmissionDescription",  "LO", "1" },    { Tag(0x0074, 0x140c),
+          "Channel Delivery Order Index", "ChannelDeliveryOrderIndex",  "IS", "1" },    { Tag(0x0074, 0x140d),
+          "Channel Delivery Continuation Sequence", "ChannelDeliveryContinuationSequence",  "SQ", "1" },    { Tag(0x0074, 0x140e),
+          "Omitted Application Setup Sequence", "OmittedApplicationSetupSequence",  "SQ", "1" },    { Tag(0x0076, 0x0001),
+          "Implant Assembly Template Name", "ImplantAssemblyTemplateName",  "LO", "1" },    { Tag(0x0076, 0x0003),
+          "Implant Assembly Template Issuer", "ImplantAssemblyTemplateIssuer",  "LO", "1" },    { Tag(0x0076, 0x0006),
+          "Implant Assembly Template Version", "ImplantAssemblyTemplateVersion",  "LO", "1" },    { Tag(0x0076, 0x0008),
+          "Replaced Implant Assembly Template Sequence", "ReplacedImplantAssemblyTemplateSequence",  "SQ", "1" },    { Tag(0x0076, 0x000a),
+          "Implant Assembly Template Type", "ImplantAssemblyTemplateType",  "CS", "1" },    { Tag(0x0076, 0x000c),
+          "Original Implant Assembly Template Sequence", "OriginalImplantAssemblyTemplateSequence",  "SQ", "1" },    { Tag(0x0076, 0x000e),
+          "Derivation Implant Assembly Template Sequence", "DerivationImplantAssemblyTemplateSequence",  "SQ", "1" },    { Tag(0x0076, 0x0010),
+          "Implant Assembly Template Target Anatomy Sequence", "ImplantAssemblyTemplateTargetAnatomySequence",  "SQ", "1" },    { Tag(0x0076, 0x0020),
+          "Procedure Type Code Sequence", "ProcedureTypeCodeSequence",  "SQ", "1" },    { Tag(0x0076, 0x0030),
+          "Surgical Technique", "SurgicalTechnique",  "LO", "1" },    { Tag(0x0076, 0x0032),
+          "Component Types Sequence", "ComponentTypesSequence",  "SQ", "1" },    { Tag(0x0076, 0x0034),
+          "Component Type Code Sequence", "ComponentTypeCodeSequence",  "CS", "1" },    { Tag(0x0076, 0x0036),
+          "Exclusive Component Type", "ExclusiveComponentType",  "CS", "1" },    { Tag(0x0076, 0x0038),
+          "Mandatory Component Type", "MandatoryComponentType",  "CS", "1" },    { Tag(0x0076, 0x0040),
+          "Component Sequence", "ComponentSequence",  "SQ", "1" },    { Tag(0x0076, 0x0055),
+          "Component ID", "ComponentID",  "US", "1" },    { Tag(0x0076, 0x0060),
+          "Component Assembly Sequence", "ComponentAssemblySequence",  "SQ", "1" },    { Tag(0x0076, 0x0070),
+          "Component 1 Referenced ID", "Component1ReferencedID",  "US", "1" },    { Tag(0x0076, 0x0080),
+          "Component 1 Referenced Mating Feature Set ID", "Component1ReferencedMatingFeatureSetID",  "US", "1" },    { Tag(0x0076, 0x0090),
+          "Component 1 Referenced Mating Feature ID", "Component1ReferencedMatingFeatureID",  "US", "1" },    { Tag(0x0076, 0x00a0),
+          "Component 2 Referenced ID", "Component2ReferencedID",  "US", "1" },    { Tag(0x0076, 0x00b0),
+          "Component 2 Referenced Mating Feature Set ID", "Component2ReferencedMatingFeatureSetID",  "US", "1" },    { Tag(0x0076, 0x00c0),
+          "Component 2 Referenced Mating Feature ID", "Component2ReferencedMatingFeatureID",  "US", "1" },    { Tag(0x0078, 0x0001),
+          "Implant Template Group Name", "ImplantTemplateGroupName",  "LO", "1" },    { Tag(0x0078, 0x0010),
+          "Implant Template Group Description", "ImplantTemplateGroupDescription",  "ST", "1" },    { Tag(0x0078, 0x0020),
+          "Implant Template Group Issuer", "ImplantTemplateGroupIssuer",  "LO", "1" },    { Tag(0x0078, 0x0024),
+          "Implant Template Group Version", "ImplantTemplateGroupVersion",  "LO", "1" },    { Tag(0x0078, 0x0026),
+          "Replaced Implant Template Group Sequence", "ReplacedImplantTemplateGroupSequence",  "SQ", "1" },    { Tag(0x0078, 0x0028),
+          "Implant Template Group Target Anatomy Sequence", "ImplantTemplateGroupTargetAnatomySequence",  "SQ", "1" },    { Tag(0x0078, 0x002a),
+          "Implant Template Group Members Sequence", "ImplantTemplateGroupMembersSequence",  "SQ", "1" },    { Tag(0x0078, 0x002e),
+          "Implant Template Group Member ID", "ImplantTemplateGroupMemberID",  "US", "1" },    { Tag(0x0078, 0x0050),
+          "3D Implant Template Group Member Matching Point", "ThreeDImplantTemplateGroupMemberMatchingPoint",  "FD", "3" },    { Tag(0x0078, 0x0060),
+          "3D Implant Template Group Member Matching Axes", "ThreeDImplantTemplateGroupMemberMatchingAxes",  "FD", "9" },    { Tag(0x0078, 0x0070),
+          "Implant Template Group Member Matching 2D Coordinates Sequence", "ImplantTemplateGroupMemberMatching2DCoordinatesSequence",  "SQ", "1" },    { Tag(0x0078, 0x0090),
+          "2D Implant Template Group Member Matching Point", "TwoDImplantTemplateGroupMemberMatchingPoint",  "FD", "2" },    { Tag(0x0078, 0x00a0),
+          "2D Implant Template Group Member Matching Axes", "TwoDImplantTemplateGroupMemberMatchingAxes",  "FD", "4" },    { Tag(0x0078, 0x00b0),
+          "Implant Template Group Variation Dimension Sequence", "ImplantTemplateGroupVariationDimensionSequence",  "SQ", "1" },    { Tag(0x0078, 0x00b2),
+          "Implant Template Group Variation Dimension Name", "ImplantTemplateGroupVariationDimensionName",  "LO", "1" },    { Tag(0x0078, 0x00b4),
+          "Implant Template Group Variation Dimension Rank Sequence", "ImplantTemplateGroupVariationDimensionRankSequence",  "SQ", "1" },    { Tag(0x0078, 0x00b6),
+          "Referenced Implant Template Group Member ID", "ReferencedImplantTemplateGroupMemberID",  "US", "1" },    { Tag(0x0078, 0x00b8),
+          "Implant Template Group Variation Dimension Rank", "ImplantTemplateGroupVariationDimensionRank",  "US", "1" },    { Tag(0x0080, 0x0001),
+          "Surface Scan Acquisition Type Code Sequence", "SurfaceScanAcquisitionTypeCodeSequence",  "SQ", "1" },    { Tag(0x0080, 0x0002),
+          "Surface Scan Mode Code Sequence", "SurfaceScanModeCodeSequence",  "SQ", "1" },    { Tag(0x0080, 0x0003),
+          "Registration Method Code Sequence", "RegistrationMethodCodeSequence",  "SQ", "1" },    { Tag(0x0080, 0x0004),
+          "Shot Duration Time", "ShotDurationTime",  "FD", "1" },    { Tag(0x0080, 0x0005),
+          "Shot Offset Time", "ShotOffsetTime",  "FD", "1" },    { Tag(0x0080, 0x0006),
+          "Surface Point Presentation Value Data", "SurfacePointPresentationValueData",  "US", "1-n" },    { Tag(0x0080, 0x0007),
+          "Surface Point Color CIELab Value Data", "SurfacePointColorCIELabValueData",  "US", "3-3n" },    { Tag(0x0080, 0x0008),
+          "UV Mapping Sequence", "UVMappingSequence",  "SQ", "1" },    { Tag(0x0080, 0x0009),
+          "Texture Label", "TextureLabel",  "SH", "1" },    { Tag(0x0080, 0x0010),
+          "U Value Data", "UValueData",  "OF", "1-n" },    { Tag(0x0080, 0x0011),
+          "V Value Data", "VValueData",  "OF", "1-n" },    { Tag(0x0080, 0x0012),
+          "Referenced Texture Sequence", "ReferencedTextureSequence",  "SQ", "1" },    { Tag(0x0080, 0x0013),
+          "Referenced Surface Data Sequence", "ReferencedSurfaceDataSequence",  "SQ", "1" },    { Tag(0x0082, 0x0001),
+          "Assessment Summary", "AssessmentSummary",  "CS", "1" },    { Tag(0x0082, 0x0003),
+          "Assessment Summary Description", "AssessmentSummaryDescription",  "UT", "1" },    { Tag(0x0082, 0x0004),
+          "Assessed SOP Instance Sequence", "AssessedSOPInstanceSequence",  "SQ", "1" },    { Tag(0x0082, 0x0005),
+          "Referenced Comparison SOP Instance Sequence", "ReferencedComparisonSOPInstanceSequence",  "SQ", "1" },    { Tag(0x0082, 0x0006),
+          "Number of Assessment Observations", "NumberOfAssessmentObservations",  "UL", "1" },    { Tag(0x0082, 0x0007),
+          "Assessment Observations Sequence", "AssessmentObservationsSequence",  "SQ", "1" },    { Tag(0x0082, 0x0008),
+          "Observation Significance", "ObservationSignificance",  "CS", "1" },    { Tag(0x0082, 0x000a),
+          "Observation Description", "ObservationDescription",  "UT", "1" },    { Tag(0x0082, 0x000c),
+          "Structured Constraint Observation Sequence", "StructuredContraintObservationSequence",  "SQ", "1" },    { Tag(0x0082, 0x0010),
+          "Assessed Attribute Value Sequence", "AssessedAttributeValueSequence",  "SQ", "1" },    { Tag(0x0082, 0x0016),
+          "Assessment Set ID", "AssessmentSetID",  "LO", "1" },    { Tag(0x0082, 0x0017),
+          "Assessment Requester Sequence", "AssessmentRequesterSequence",  "SQ", "1" },    { Tag(0x0082, 0x0018),
+          "Selector Attribute Name", "SelectorAttributeName",  "LO", "1" },    { Tag(0x0082, 0x0019),
+          "Selector Attribute Keyword", "SelectorAttributeKeyword",  "LO", "1" },    { Tag(0x0082, 0x0021),
+          "Assessment Type Code Sequence", "AssessmentTypeCodeSequence",  "SQ", "1" },    { Tag(0x0082, 0x0022),
+          "Observation Basis Code Sequence", "ObservationBasisCodeSequence",  "SQ", "1" },    { Tag(0x0082, 0x0023),
+          "Assessment Label", "AssessmentLabel",  "LO", "1" },    { Tag(0x0082, 0x0032),
+          "Constraint Type", "ConstraintType",  "CS", "1" },    { Tag(0x0082, 0x0033),
+          "Specification Selection Guidance", "SpecificationSelectionGuidance",  "UT", "1" },    { Tag(0x0082, 0x0034),
+          "Constraint Value Sequence", "ConstraintValueSequence",  "SQ", "1" },    { Tag(0x0082, 0x0035),
+          "Recommended Default Value Sequence", "RecommendedDefaultValueSequence",  "SQ", "1" },    { Tag(0x0082, 0x0036),
+          "Constraint Violation Significance", "ConstraintViolationSignificance",  "CS", "1" },    { Tag(0x0082, 0x0037),
+          "Constraint Violation Condition", "ConstraintViolationCondition",  "UT", "1" },    { Tag(0x0088, 0x0130),
+          "Storage Media File-set ID", "StorageMediaFileSetID",  "SH", "1" },    { Tag(0x0088, 0x0140),
+          "Storage Media File-set UID", "StorageMediaFileSetUID",  "UI", "1" },    { Tag(0x0088, 0x0200),
+          "Icon Image Sequence", "IconImageSequence",  "SQ", "1" },    { Tag(0x0088, 0x0904),
+          "Topic Title", "TopicTitle",  "LO", "1" },    { Tag(0x0088, 0x0906),
+          "Topic Subject", "TopicSubject",  "ST", "1" },    { Tag(0x0088, 0x0910),
+          "Topic Author", "TopicAuthor",  "LO", "1" },    { Tag(0x0088, 0x0912),
+          "Topic Keywords", "TopicKeywords",  "LO", "1-32" },    { Tag(0x0100, 0x0410),
+          "SOP Instance Status", "SOPInstanceStatus",  "CS", "1" },    { Tag(0x0100, 0x0420),
+          "SOP Authorization DateTime", "SOPAuthorizationDateTime",  "DT", "1" },    { Tag(0x0100, 0x0424),
+          "SOP Authorization Comment", "SOPAuthorizationComment",  "LT", "1" },    { Tag(0x0100, 0x0426),
+          "Authorization Equipment Certification Number", "AuthorizationEquipmentCertificationNumber",  "LO", "1" },    { Tag(0x0400, 0x0005),
+          "MAC ID Number", "MACIDNumber",  "US", "1" },    { Tag(0x0400, 0x0010),
+          "MAC Calculation Transfer Syntax UID", "MACCalculationTransferSyntaxUID",  "UI", "1" },    { Tag(0x0400, 0x0015),
+          "MAC Algorithm", "MACAlgorithm",  "CS", "1" },    { Tag(0x0400, 0x0020),
+          "Data Elements Signed", "DataElementsSigned",  "AT", "1-n" },    { Tag(0x0400, 0x0100),
+          "Digital Signature UID", "DigitalSignatureUID",  "UI", "1" },    { Tag(0x0400, 0x0105),
+          "Digital Signature DateTime", "DigitalSignatureDateTime",  "DT", "1" },    { Tag(0x0400, 0x0110),
+          "Certificate Type", "CertificateType",  "CS", "1" },    { Tag(0x0400, 0x0115),
+          "Certificate of Signer", "CertificateOfSigner",  "OB", "1" },    { Tag(0x0400, 0x0120),
+          "Signature", "Signature",  "OB", "1" },    { Tag(0x0400, 0x0305),
+          "Certified Timestamp Type", "CertifiedTimestampType",  "CS", "1" },    { Tag(0x0400, 0x0310),
+          "Certified Timestamp", "CertifiedTimestamp",  "OB", "1" },    { Tag(0x0400, 0x0401),
+          "Digital Signature Purpose Code Sequence", "DigitalSignaturePurposeCodeSequence",  "SQ", "1" },    { Tag(0x0400, 0x0402),
+          "Referenced Digital Signature Sequence", "ReferencedDigitalSignatureSequence",  "SQ", "1" },    { Tag(0x0400, 0x0403),
+          "Referenced SOP Instance MAC Sequence", "ReferencedSOPInstanceMACSequence",  "SQ", "1" },    { Tag(0x0400, 0x0404),
+          "MAC", "MAC",  "OB", "1" },    { Tag(0x0400, 0x0500),
+          "Encrypted Attributes Sequence", "EncryptedAttributesSequence",  "SQ", "1" },    { Tag(0x0400, 0x0510),
+          "Encrypted Content Transfer Syntax UID", "EncryptedContentTransferSyntaxUID",  "UI", "1" },    { Tag(0x0400, 0x0520),
+          "Encrypted Content", "EncryptedContent",  "OB", "1" },    { Tag(0x0400, 0x0550),
+          "Modified Attributes Sequence", "ModifiedAttributesSequence",  "SQ", "1" },    { Tag(0x0400, 0x0561),
+          "Original Attributes Sequence", "OriginalAttributesSequence",  "SQ", "1" },    { Tag(0x0400, 0x0562),
+          "Attribute Modification DateTime", "AttributeModificationDateTime",  "DT", "1" },    { Tag(0x0400, 0x0563),
+          "Modifying System", "ModifyingSystem",  "LO", "1" },    { Tag(0x0400, 0x0564),
+          "Source of Previous Values", "SourceOfPreviousValues",  "LO", "1" },    { Tag(0x0400, 0x0565),
+          "Reason for the Attribute Modification", "ReasonForTheAttributeModification",  "CS", "1" },                                { Tag(0x2000, 0x0010),
+          "Number of Copies", "NumberOfCopies",  "IS", "1" },    { Tag(0x2000, 0x001e),
+          "Printer Configuration Sequence", "PrinterConfigurationSequence",  "SQ", "1" },    { Tag(0x2000, 0x0020),
+          "Print Priority", "PrintPriority",  "CS", "1" },    { Tag(0x2000, 0x0030),
+          "Medium Type", "MediumType",  "CS", "1" },    { Tag(0x2000, 0x0040),
+          "Film Destination", "FilmDestination",  "CS", "1" },    { Tag(0x2000, 0x0050),
+          "Film Session Label", "FilmSessionLabel",  "LO", "1" },    { Tag(0x2000, 0x0060),
+          "Memory Allocation", "MemoryAllocation",  "IS", "1" },    { Tag(0x2000, 0x0061),
+          "Maximum Memory Allocation", "MaximumMemoryAllocation",  "IS", "1" },    { Tag(0x2000, 0x0062),
+          "Color Image Printing Flag", "ColorImagePrintingFlag",  "CS", "1" },    { Tag(0x2000, 0x0063),
+          "Collation Flag", "CollationFlag",  "CS", "1" },    { Tag(0x2000, 0x0065),
+          "Annotation Flag", "AnnotationFlag",  "CS", "1" },    { Tag(0x2000, 0x0067),
+          "Image Overlay Flag", "ImageOverlayFlag",  "CS", "1" },    { Tag(0x2000, 0x0069),
+          "Presentation LUT Flag", "PresentationLUTFlag",  "CS", "1" },    { Tag(0x2000, 0x006a),
+          "Image Box Presentation LUT Flag", "ImageBoxPresentationLUTFlag",  "CS", "1" },    { Tag(0x2000, 0x00a0),
+          "Memory Bit Depth", "MemoryBitDepth",  "US", "1" },    { Tag(0x2000, 0x00a1),
+          "Printing Bit Depth", "PrintingBitDepth",  "US", "1" },    { Tag(0x2000, 0x00a2),
+          "Media Installed Sequence", "MediaInstalledSequence",  "SQ", "1" },    { Tag(0x2000, 0x00a4),
+          "Other Media Available Sequence", "OtherMediaAvailableSequence",  "SQ", "1" },    { Tag(0x2000, 0x00a8),
+          "Supported Image Display Formats Sequence", "SupportedImageDisplayFormatsSequence",  "SQ", "1" },    { Tag(0x2000, 0x0500),
+          "Referenced Film Box Sequence", "ReferencedFilmBoxSequence",  "SQ", "1" },    { Tag(0x2000, 0x0510),
+          "Referenced Stored Print Sequence", "ReferencedStoredPrintSequence",  "SQ", "1" },    { Tag(0x2010, 0x0010),
+          "Image Display Format", "ImageDisplayFormat",  "ST", "1" },    { Tag(0x2010, 0x0030),
+          "Annotation Display Format ID", "AnnotationDisplayFormatID",  "CS", "1" },    { Tag(0x2010, 0x0040),
+          "Film Orientation", "FilmOrientation",  "CS", "1" },    { Tag(0x2010, 0x0050),
+          "Film Size ID", "FilmSizeID",  "CS", "1" },    { Tag(0x2010, 0x0052),
+          "Printer Resolution ID", "PrinterResolutionID",  "CS", "1" },    { Tag(0x2010, 0x0054),
+          "Default Printer Resolution ID", "DefaultPrinterResolutionID",  "CS", "1" },    { Tag(0x2010, 0x0060),
+          "Magnification Type", "MagnificationType",  "CS", "1" },    { Tag(0x2010, 0x0080),
+          "Smoothing Type", "SmoothingType",  "CS", "1" },    { Tag(0x2010, 0x00a6),
+          "Default Magnification Type", "DefaultMagnificationType",  "CS", "1" },    { Tag(0x2010, 0x00a7),
+          "Other Magnification Types Available", "OtherMagnificationTypesAvailable",  "CS", "1-n" },    { Tag(0x2010, 0x00a8),
+          "Default Smoothing Type", "DefaultSmoothingType",  "CS", "1" },    { Tag(0x2010, 0x00a9),
+          "Other Smoothing Types Available", "OtherSmoothingTypesAvailable",  "CS", "1-n" },    { Tag(0x2010, 0x0100),
+          "Border Density", "BorderDensity",  "CS", "1" },    { Tag(0x2010, 0x0110),
+          "Empty Image Density", "EmptyImageDensity",  "CS", "1" },    { Tag(0x2010, 0x0120),
+          "Min Density", "MinDensity",  "US", "1" },    { Tag(0x2010, 0x0130),
+          "Max Density", "MaxDensity",  "US", "1" },    { Tag(0x2010, 0x0140),
+          "Trim", "Trim",  "CS", "1" },    { Tag(0x2010, 0x0150),
+          "Configuration Information", "ConfigurationInformation",  "ST", "1" },    { Tag(0x2010, 0x0152),
+          "Configuration Information Description", "ConfigurationInformationDescription",  "LT", "1" },    { Tag(0x2010, 0x0154),
+          "Maximum Collated Films", "MaximumCollatedFilms",  "IS", "1" },    { Tag(0x2010, 0x015e),
+          "Illumination", "Illumination",  "US", "1" },    { Tag(0x2010, 0x0160),
+          "Reflected Ambient Light", "ReflectedAmbientLight",  "US", "1" },    { Tag(0x2010, 0x0376),
+          "Printer Pixel Spacing", "PrinterPixelSpacing",  "DS", "2" },    { Tag(0x2010, 0x0500),
+          "Referenced Film Session Sequence", "ReferencedFilmSessionSequence",  "SQ", "1" },    { Tag(0x2010, 0x0510),
+          "Referenced Image Box Sequence", "ReferencedImageBoxSequence",  "SQ", "1" },    { Tag(0x2010, 0x0520),
+          "Referenced Basic Annotation Box Sequence", "ReferencedBasicAnnotationBoxSequence",  "SQ", "1" },    { Tag(0x2020, 0x0010),
+          "Image Box Position", "ImageBoxPosition",  "US", "1" },    { Tag(0x2020, 0x0020),
+          "Polarity", "Polarity",  "CS", "1" },    { Tag(0x2020, 0x0030),
+          "Requested Image Size", "RequestedImageSize",  "DS", "1" },    { Tag(0x2020, 0x0040),
+          "Requested Decimate/Crop Behavior", "RequestedDecimateCropBehavior",  "CS", "1" },    { Tag(0x2020, 0x0050),
+          "Requested Resolution ID", "RequestedResolutionID",  "CS", "1" },    { Tag(0x2020, 0x00a0),
+          "Requested Image Size Flag", "RequestedImageSizeFlag",  "CS", "1" },    { Tag(0x2020, 0x00a2),
+          "Decimate/Crop Result", "DecimateCropResult",  "CS", "1" },    { Tag(0x2020, 0x0110),
+          "Basic Grayscale Image Sequence", "BasicGrayscaleImageSequence",  "SQ", "1" },    { Tag(0x2020, 0x0111),
+          "Basic Color Image Sequence", "BasicColorImageSequence",  "SQ", "1" },    { Tag(0x2020, 0x0130),
+          "Referenced Image Overlay Box Sequence", "ReferencedImageOverlayBoxSequence",  "SQ", "1" },    { Tag(0x2020, 0x0140),
+          "Referenced VOI LUT Box Sequence", "ReferencedVOILUTBoxSequence",  "SQ", "1" },    { Tag(0x2030, 0x0010),
+          "Annotation Position", "AnnotationPosition",  "US", "1" },    { Tag(0x2030, 0x0020),
+          "Text String", "TextString",  "LO", "1" },    { Tag(0x2040, 0x0010),
+          "Referenced Overlay Plane Sequence", "ReferencedOverlayPlaneSequence",  "SQ", "1" },    { Tag(0x2040, 0x0011),
+          "Referenced Overlay Plane Groups", "ReferencedOverlayPlaneGroups",  "US", "1-99" },    { Tag(0x2040, 0x0020),
+          "Overlay Pixel Data Sequence", "OverlayPixelDataSequence",  "SQ", "1" },    { Tag(0x2040, 0x0060),
+          "Overlay Magnification Type", "OverlayMagnificationType",  "CS", "1" },    { Tag(0x2040, 0x0070),
+          "Overlay Smoothing Type", "OverlaySmoothingType",  "CS", "1" },    { Tag(0x2040, 0x0072),
+          "Overlay or Image Magnification", "OverlayOrImageMagnification",  "CS", "1" },    { Tag(0x2040, 0x0074),
+          "Magnify to Number of Columns", "MagnifyToNumberOfColumns",  "US", "1" },    { Tag(0x2040, 0x0080),
+          "Overlay Foreground Density", "OverlayForegroundDensity",  "CS", "1" },    { Tag(0x2040, 0x0082),
+          "Overlay Background Density", "OverlayBackgroundDensity",  "CS", "1" },    { Tag(0x2040, 0x0090),
+          "Overlay Mode", "OverlayMode",  "CS", "1" },    { Tag(0x2040, 0x0100),
+          "Threshold Density", "ThresholdDensity",  "CS", "1" },    { Tag(0x2040, 0x0500),
+          "Referenced Image Box Sequence (Retired)", "ReferencedImageBoxSequenceRetired",  "SQ", "1" },    { Tag(0x2050, 0x0010),
+          "Presentation LUT Sequence", "PresentationLUTSequence",  "SQ", "1" },    { Tag(0x2050, 0x0020),
+          "Presentation LUT Shape", "PresentationLUTShape",  "CS", "1" },    { Tag(0x2050, 0x0500),
+          "Referenced Presentation LUT Sequence", "ReferencedPresentationLUTSequence",  "SQ", "1" },    { Tag(0x2100, 0x0010),
+          "Print Job ID", "PrintJobID",  "SH", "1" },    { Tag(0x2100, 0x0020),
+          "Execution Status", "ExecutionStatus",  "CS", "1" },    { Tag(0x2100, 0x0030),
+          "Execution Status Info", "ExecutionStatusInfo",  "CS", "1" },    { Tag(0x2100, 0x0040),
+          "Creation Date", "CreationDate",  "DA", "1" },    { Tag(0x2100, 0x0050),
+          "Creation Time", "CreationTime",  "TM", "1" },    { Tag(0x2100, 0x0070),
+          "Originator", "Originator",  "AE", "1" },    { Tag(0x2100, 0x0140),
+          "Destination AE", "DestinationAE",  "AE", "1" },    { Tag(0x2100, 0x0160),
+          "Owner ID", "OwnerID",  "SH", "1" },    { Tag(0x2100, 0x0170),
+          "Number of Films", "NumberOfFilms",  "IS", "1" },    { Tag(0x2100, 0x0500),
+          "Referenced Print Job Sequence (Pull Stored Print)", "ReferencedPrintJobSequencePullStoredPrint",  "SQ", "1" },    { Tag(0x2110, 0x0010),
+          "Printer Status", "PrinterStatus",  "CS", "1" },    { Tag(0x2110, 0x0020),
+          "Printer Status Info", "PrinterStatusInfo",  "CS", "1" },    { Tag(0x2110, 0x0030),
+          "Printer Name", "PrinterName",  "LO", "1" },    { Tag(0x2110, 0x0099),
+          "Print Queue ID", "PrintQueueID",  "SH", "1" },    { Tag(0x2120, 0x0010),
+          "Queue Status", "QueueStatus",  "CS", "1" },    { Tag(0x2120, 0x0050),
+          "Print Job Description Sequence", "PrintJobDescriptionSequence",  "SQ", "1" },    { Tag(0x2120, 0x0070),
+          "Referenced Print Job Sequence", "ReferencedPrintJobSequence",  "SQ", "1" },    { Tag(0x2130, 0x0010),
+          "Print Management Capabilities Sequence", "PrintManagementCapabilitiesSequence",  "SQ", "1" },    { Tag(0x2130, 0x0015),
+          "Printer Characteristics Sequence", "PrinterCharacteristicsSequence",  "SQ", "1" },    { Tag(0x2130, 0x0030),
+          "Film Box Content Sequence", "FilmBoxContentSequence",  "SQ", "1" },    { Tag(0x2130, 0x0040),
+          "Image Box Content Sequence", "ImageBoxContentSequence",  "SQ", "1" },    { Tag(0x2130, 0x0050),
+          "Annotation Content Sequence", "AnnotationContentSequence",  "SQ", "1" },    { Tag(0x2130, 0x0060),
+          "Image Overlay Box Content Sequence", "ImageOverlayBoxContentSequence",  "SQ", "1" },    { Tag(0x2130, 0x0080),
+          "Presentation LUT Content Sequence", "PresentationLUTContentSequence",  "SQ", "1" },    { Tag(0x2130, 0x00a0),
+          "Proposed Study Sequence", "ProposedStudySequence",  "SQ", "1" },    { Tag(0x2130, 0x00c0),
+          "Original Image Sequence", "OriginalImageSequence",  "SQ", "1" },    { Tag(0x2200, 0x0001),
+          "Label Using Information Extracted From Instances", "LabelUsingInformationExtractedFromInstances",  "CS", "1" },    { Tag(0x2200, 0x0002),
+          "Label Text", "LabelText",  "UT", "1" },    { Tag(0x2200, 0x0003),
+          "Label Style Selection", "LabelStyleSelection",  "CS", "1" },    { Tag(0x2200, 0x0004),
+          "Media Disposition", "MediaDisposition",  "LT", "1" },    { Tag(0x2200, 0x0005),
+          "Barcode Value", "BarcodeValue",  "LT", "1" },    { Tag(0x2200, 0x0006),
+          "Barcode Symbology", "BarcodeSymbology",  "CS", "1" },    { Tag(0x2200, 0x0007),
+          "Allow Media Splitting", "AllowMediaSplitting",  "CS", "1" },    { Tag(0x2200, 0x0008),
+          "Include Non-DICOM Objects", "IncludeNonDICOMObjects",  "CS", "1" },    { Tag(0x2200, 0x0009),
+          "Include Display Application", "IncludeDisplayApplication",  "CS", "1" },    { Tag(0x2200, 0x000a),
+          "Preserve Composite Instances After Media Creation", "PreserveCompositeInstancesAfterMediaCreation",  "CS", "1" },    { Tag(0x2200, 0x000b),
+          "Total Number of Pieces of Media Created", "TotalNumberOfPiecesOfMediaCreated",  "US", "1" },    { Tag(0x2200, 0x000c),
+          "Requested Media Application Profile", "RequestedMediaApplicationProfile",  "LO", "1" },    { Tag(0x2200, 0x000d),
+          "Referenced Storage Media Sequence", "ReferencedStorageMediaSequence",  "SQ", "1" },    { Tag(0x2200, 0x000e),
+          "Failure Attributes", "FailureAttributes",  "AT", "1-n" },    { Tag(0x2200, 0x000f),
+          "Allow Lossy Compression", "AllowLossyCompression",  "CS", "1" },    { Tag(0x2200, 0x0020),
+          "Request Priority", "RequestPriority",  "CS", "1" },    { Tag(0x3002, 0x0002),
+          "RT Image Label", "RTImageLabel",  "SH", "1" },    { Tag(0x3002, 0x0003),
+          "RT Image Name", "RTImageName",  "LO", "1" },    { Tag(0x3002, 0x0004),
+          "RT Image Description", "RTImageDescription",  "ST", "1" },    { Tag(0x3002, 0x000a),
+          "Reported Values Origin", "ReportedValuesOrigin",  "CS", "1" },    { Tag(0x3002, 0x000c),
+          "RT Image Plane", "RTImagePlane",  "CS", "1" },    { Tag(0x3002, 0x000d),
+          "X-Ray Image Receptor Translation", "XRayImageReceptorTranslation",  "DS", "3" },    { Tag(0x3002, 0x000e),
+          "X-Ray Image Receptor Angle", "XRayImageReceptorAngle",  "DS", "1" },    { Tag(0x3002, 0x0010),
+          "RT Image Orientation", "RTImageOrientation",  "DS", "6" },    { Tag(0x3002, 0x0011),
+          "Image Plane Pixel Spacing", "ImagePlanePixelSpacing",  "DS", "2" },    { Tag(0x3002, 0x0012),
+          "RT Image Position", "RTImagePosition",  "DS", "2" },    { Tag(0x3002, 0x0020),
+          "Radiation Machine Name", "RadiationMachineName",  "SH", "1" },    { Tag(0x3002, 0x0022),
+          "Radiation Machine SAD", "RadiationMachineSAD",  "DS", "1" },    { Tag(0x3002, 0x0024),
+          "Radiation Machine SSD", "RadiationMachineSSD",  "DS", "1" },    { Tag(0x3002, 0x0026),
+          "RT Image SID", "RTImageSID",  "DS", "1" },    { Tag(0x3002, 0x0028),
+          "Source to Reference Object Distance", "SourceToReferenceObjectDistance",  "DS", "1" },    { Tag(0x3002, 0x0029),
+          "Fraction Number", "FractionNumber",  "IS", "1" },    { Tag(0x3002, 0x0030),
+          "Exposure Sequence", "ExposureSequence",  "SQ", "1" },    { Tag(0x3002, 0x0032),
+          "Meterset Exposure", "MetersetExposure",  "DS", "1" },    { Tag(0x3002, 0x0034),
+          "Diaphragm Position", "DiaphragmPosition",  "DS", "4" },    { Tag(0x3002, 0x0040),
+          "Fluence Map Sequence", "FluenceMapSequence",  "SQ", "1" },    { Tag(0x3002, 0x0041),
+          "Fluence Data Source", "FluenceDataSource",  "CS", "1" },    { Tag(0x3002, 0x0042),
+          "Fluence Data Scale", "FluenceDataScale",  "DS", "1" },    { Tag(0x3002, 0x0050),
+          "Primary Fluence Mode Sequence", "PrimaryFluenceModeSequence",  "SQ", "1" },    { Tag(0x3002, 0x0051),
+          "Fluence Mode", "FluenceMode",  "CS", "1" },    { Tag(0x3002, 0x0052),
+          "Fluence Mode ID", "FluenceModeID",  "SH", "1" },    { Tag(0x3004, 0x0001),
+          "DVH Type", "DVHType",  "CS", "1" },    { Tag(0x3004, 0x0002),
+          "Dose Units", "DoseUnits",  "CS", "1" },    { Tag(0x3004, 0x0004),
+          "Dose Type", "DoseType",  "CS", "1" },    { Tag(0x3004, 0x0005),
+          "Spatial Transform of Dose", "SpatialTransformOfDose",  "CS", "1" },    { Tag(0x3004, 0x0006),
+          "Dose Comment", "DoseComment",  "LO", "1" },    { Tag(0x3004, 0x0008),
+          "Normalization Point", "NormalizationPoint",  "DS", "3" },    { Tag(0x3004, 0x000a),
+          "Dose Summation Type", "DoseSummationType",  "CS", "1" },    { Tag(0x3004, 0x000c),
+          "Grid Frame Offset Vector", "GridFrameOffsetVector",  "DS", "2-n" },    { Tag(0x3004, 0x000e),
+          "Dose Grid Scaling", "DoseGridScaling",  "DS", "1" },    { Tag(0x3004, 0x0010),
+          "RT Dose ROI Sequence", "RTDoseROISequence",  "SQ", "1" },    { Tag(0x3004, 0x0012),
+          "Dose Value", "DoseValue",  "DS", "1" },    { Tag(0x3004, 0x0014),
+          "Tissue Heterogeneity Correction", "TissueHeterogeneityCorrection",  "CS", "1-3" },    { Tag(0x3004, 0x0040),
+          "DVH Normalization Point", "DVHNormalizationPoint",  "DS", "3" },    { Tag(0x3004, 0x0042),
+          "DVH Normalization Dose Value", "DVHNormalizationDoseValue",  "DS", "1" },    { Tag(0x3004, 0x0050),
+          "DVH Sequence", "DVHSequence",  "SQ", "1" },    { Tag(0x3004, 0x0052),
+          "DVH Dose Scaling", "DVHDoseScaling",  "DS", "1" },    { Tag(0x3004, 0x0054),
+          "DVH Volume Units", "DVHVolumeUnits",  "CS", "1" },    { Tag(0x3004, 0x0056),
+          "DVH Number of Bins", "DVHNumberOfBins",  "IS", "1" },    { Tag(0x3004, 0x0058),
+          "DVH Data", "DVHData",  "DS", "2-2n" },    { Tag(0x3004, 0x0060),
+          "DVH Referenced ROI Sequence", "DVHReferencedROISequence",  "SQ", "1" },    { Tag(0x3004, 0x0062),
+          "DVH ROI Contribution Type", "DVHROIContributionType",  "CS", "1" },    { Tag(0x3004, 0x0070),
+          "DVH Minimum Dose", "DVHMinimumDose",  "DS", "1" },    { Tag(0x3004, 0x0072),
+          "DVH Maximum Dose", "DVHMaximumDose",  "DS", "1" },    { Tag(0x3004, 0x0074),
+          "DVH Mean Dose", "DVHMeanDose",  "DS", "1" },    { Tag(0x3006, 0x0002),
+          "Structure Set Label", "StructureSetLabel",  "SH", "1" },    { Tag(0x3006, 0x0004),
+          "Structure Set Name", "StructureSetName",  "LO", "1" },    { Tag(0x3006, 0x0006),
+          "Structure Set Description", "StructureSetDescription",  "ST", "1" },    { Tag(0x3006, 0x0008),
+          "Structure Set Date", "StructureSetDate",  "DA", "1" },    { Tag(0x3006, 0x0009),
+          "Structure Set Time", "StructureSetTime",  "TM", "1" },    { Tag(0x3006, 0x0010),
+          "Referenced Frame of Reference Sequence", "ReferencedFrameOfReferenceSequence",  "SQ", "1" },    { Tag(0x3006, 0x0012),
+          "RT Referenced Study Sequence", "RTReferencedStudySequence",  "SQ", "1" },    { Tag(0x3006, 0x0014),
+          "RT Referenced Series Sequence", "RTReferencedSeriesSequence",  "SQ", "1" },    { Tag(0x3006, 0x0016),
+          "Contour Image Sequence", "ContourImageSequence",  "SQ", "1" },    { Tag(0x3006, 0x0018),
+          "Predecessor Structure Set Sequence", "PredecessorStructureSetSequence",  "SQ", "1" },    { Tag(0x3006, 0x0020),
+          "Structure Set ROI Sequence", "StructureSetROISequence",  "SQ", "1" },    { Tag(0x3006, 0x0022),
+          "ROI Number", "ROINumber",  "IS", "1" },    { Tag(0x3006, 0x0024),
+          "Referenced Frame of Reference UID", "ReferencedFrameOfReferenceUID",  "UI", "1" },    { Tag(0x3006, 0x0026),
+          "ROI Name", "ROIName",  "LO", "1" },    { Tag(0x3006, 0x0028),
+          "ROI Description", "ROIDescription",  "ST", "1" },    { Tag(0x3006, 0x002a),
+          "ROI Display Color", "ROIDisplayColor",  "IS", "3" },    { Tag(0x3006, 0x002c),
+          "ROI Volume", "ROIVolume",  "DS", "1" },    { Tag(0x3006, 0x0030),
+          "RT Related ROI Sequence", "RTRelatedROISequence",  "SQ", "1" },    { Tag(0x3006, 0x0033),
+          "RT ROI Relationship", "RTROIRelationship",  "CS", "1" },    { Tag(0x3006, 0x0036),
+          "ROI Generation Algorithm", "ROIGenerationAlgorithm",  "CS", "1" },    { Tag(0x3006, 0x0038),
+          "ROI Generation Description", "ROIGenerationDescription",  "LO", "1" },    { Tag(0x3006, 0x0039),
+          "ROI Contour Sequence", "ROIContourSequence",  "SQ", "1" },    { Tag(0x3006, 0x0040),
+          "Contour Sequence", "ContourSequence",  "SQ", "1" },    { Tag(0x3006, 0x0042),
+          "Contour Geometric Type", "ContourGeometricType",  "CS", "1" },    { Tag(0x3006, 0x0044),
+          "Contour Slab Thickness", "ContourSlabThickness",  "DS", "1" },    { Tag(0x3006, 0x0045),
+          "Contour Offset Vector", "ContourOffsetVector",  "DS", "3" },    { Tag(0x3006, 0x0046),
+          "Number of Contour Points", "NumberOfContourPoints",  "IS", "1" },    { Tag(0x3006, 0x0048),
+          "Contour Number", "ContourNumber",  "IS", "1" },    { Tag(0x3006, 0x0049),
+          "Attached Contours", "AttachedContours",  "IS", "1-n" },    { Tag(0x3006, 0x0050),
+          "Contour Data", "ContourData",  "DS", "3-3n" },    { Tag(0x3006, 0x0080),
+          "RT ROI Observations Sequence", "RTROIObservationsSequence",  "SQ", "1" },    { Tag(0x3006, 0x0082),
+          "Observation Number", "ObservationNumber",  "IS", "1" },    { Tag(0x3006, 0x0084),
+          "Referenced ROI Number", "ReferencedROINumber",  "IS", "1" },    { Tag(0x3006, 0x0085),
+          "ROI Observation Label", "ROIObservationLabel",  "SH", "1" },    { Tag(0x3006, 0x0086),
+          "RT ROI Identification Code Sequence", "RTROIIdentificationCodeSequence",  "SQ", "1" },    { Tag(0x3006, 0x0088),
+          "ROI Observation Description", "ROIObservationDescription",  "ST", "1" },    { Tag(0x3006, 0x00a0),
+          "Related RT ROI Observations Sequence", "RelatedRTROIObservationsSequence",  "SQ", "1" },    { Tag(0x3006, 0x00a4),
+          "RT ROI Interpreted Type", "RTROIInterpretedType",  "CS", "1" },    { Tag(0x3006, 0x00a6),
+          "ROI Interpreter", "ROIInterpreter",  "PN", "1" },    { Tag(0x3006, 0x00b0),
+          "ROI Physical Properties Sequence", "ROIPhysicalPropertiesSequence",  "SQ", "1" },    { Tag(0x3006, 0x00b2),
+          "ROI Physical Property", "ROIPhysicalProperty",  "CS", "1" },    { Tag(0x3006, 0x00b4),
+          "ROI Physical Property Value", "ROIPhysicalPropertyValue",  "DS", "1" },    { Tag(0x3006, 0x00b6),
+          "ROI Elemental Composition Sequence", "ROIElementalCompositionSequence",  "SQ", "1" },    { Tag(0x3006, 0x00b7),
+          "ROI Elemental Composition Atomic Number", "ROIElementalCompositionAtomicNumber",  "US", "1" },    { Tag(0x3006, 0x00b8),
+          "ROI Elemental Composition Atomic Mass Fraction", "ROIElementalCompositionAtomicMassFraction",  "FL", "1" },    { Tag(0x3006, 0x00b9),
+          "Additional RT ROI Identification Code Sequence", "AdditionalRTROIIdentificationCodeSequence",  "SQ", "1" },    { Tag(0x3006, 0x00c0),
+          "Frame of Reference Relationship Sequence", "FrameOfReferenceRelationshipSequence",  "SQ", "1" },    { Tag(0x3006, 0x00c2),
+          "Related Frame of Reference UID", "RelatedFrameOfReferenceUID",  "UI", "1" },    { Tag(0x3006, 0x00c4),
+          "Frame of Reference Transformation Type", "FrameOfReferenceTransformationType",  "CS", "1" },    { Tag(0x3006, 0x00c6),
+          "Frame of Reference Transformation Matrix", "FrameOfReferenceTransformationMatrix",  "DS", "16" },    { Tag(0x3006, 0x00c8),
+          "Frame of Reference Transformation Comment", "FrameOfReferenceTransformationComment",  "LO", "1" },    { Tag(0x3008, 0x0010),
+          "Measured Dose Reference Sequence", "MeasuredDoseReferenceSequence",  "SQ", "1" },    { Tag(0x3008, 0x0012),
+          "Measured Dose Description", "MeasuredDoseDescription",  "ST", "1" },    { Tag(0x3008, 0x0014),
+          "Measured Dose Type", "MeasuredDoseType",  "CS", "1" },    { Tag(0x3008, 0x0016),
+          "Measured Dose Value", "MeasuredDoseValue",  "DS", "1" },    { Tag(0x3008, 0x0020),
+          "Treatment Session Beam Sequence", "TreatmentSessionBeamSequence",  "SQ", "1" },    { Tag(0x3008, 0x0021),
+          "Treatment Session Ion Beam Sequence", "TreatmentSessionIonBeamSequence",  "SQ", "1" },    { Tag(0x3008, 0x0022),
+          "Current Fraction Number", "CurrentFractionNumber",  "IS", "1" },    { Tag(0x3008, 0x0024),
+          "Treatment Control Point Date", "TreatmentControlPointDate",  "DA", "1" },    { Tag(0x3008, 0x0025),
+          "Treatment Control Point Time", "TreatmentControlPointTime",  "TM", "1" },    { Tag(0x3008, 0x002a),
+          "Treatment Termination Status", "TreatmentTerminationStatus",  "CS", "1" },    { Tag(0x3008, 0x002b),
+          "Treatment Termination Code", "TreatmentTerminationCode",  "SH", "1" },    { Tag(0x3008, 0x002c),
+          "Treatment Verification Status", "TreatmentVerificationStatus",  "CS", "1" },    { Tag(0x3008, 0x0030),
+          "Referenced Treatment Record Sequence", "ReferencedTreatmentRecordSequence",  "SQ", "1" },    { Tag(0x3008, 0x0032),
+          "Specified Primary Meterset", "SpecifiedPrimaryMeterset",  "DS", "1" },    { Tag(0x3008, 0x0033),
+          "Specified Secondary Meterset", "SpecifiedSecondaryMeterset",  "DS", "1" },    { Tag(0x3008, 0x0036),
+          "Delivered Primary Meterset", "DeliveredPrimaryMeterset",  "DS", "1" },    { Tag(0x3008, 0x0037),
+          "Delivered Secondary Meterset", "DeliveredSecondaryMeterset",  "DS", "1" },    { Tag(0x3008, 0x003a),
+          "Specified Treatment Time", "SpecifiedTreatmentTime",  "DS", "1" },    { Tag(0x3008, 0x003b),
+          "Delivered Treatment Time", "DeliveredTreatmentTime",  "DS", "1" },    { Tag(0x3008, 0x0040),
+          "Control Point Delivery Sequence", "ControlPointDeliverySequence",  "SQ", "1" },    { Tag(0x3008, 0x0041),
+          "Ion Control Point Delivery Sequence", "IonControlPointDeliverySequence",  "SQ", "1" },    { Tag(0x3008, 0x0042),
+          "Specified Meterset", "SpecifiedMeterset",  "DS", "1" },    { Tag(0x3008, 0x0044),
+          "Delivered Meterset", "DeliveredMeterset",  "DS", "1" },    { Tag(0x3008, 0x0045),
+          "Meterset Rate Set", "MetersetRateSet",  "FL", "1" },    { Tag(0x3008, 0x0046),
+          "Meterset Rate Delivered", "MetersetRateDelivered",  "FL", "1" },    { Tag(0x3008, 0x0047),
+          "Scan Spot Metersets Delivered", "ScanSpotMetersetsDelivered",  "FL", "1-n" },    { Tag(0x3008, 0x0048),
+          "Dose Rate Delivered", "DoseRateDelivered",  "DS", "1" },    { Tag(0x3008, 0x0050),
+          "Treatment Summary Calculated Dose Reference Sequence", "TreatmentSummaryCalculatedDoseReferenceSequence",  "SQ", "1" },    { Tag(0x3008, 0x0052),
+          "Cumulative Dose to Dose Reference", "CumulativeDoseToDoseReference",  "DS", "1" },    { Tag(0x3008, 0x0054),
+          "First Treatment Date", "FirstTreatmentDate",  "DA", "1" },    { Tag(0x3008, 0x0056),
+          "Most Recent Treatment Date", "MostRecentTreatmentDate",  "DA", "1" },    { Tag(0x3008, 0x005a),
+          "Number of Fractions Delivered", "NumberOfFractionsDelivered",  "IS", "1" },    { Tag(0x3008, 0x0060),
+          "Override Sequence", "OverrideSequence",  "SQ", "1" },    { Tag(0x3008, 0x0061),
+          "Parameter Sequence Pointer", "ParameterSequencePointer",  "AT", "1" },    { Tag(0x3008, 0x0062),
+          "Override Parameter Pointer", "OverrideParameterPointer",  "AT", "1" },    { Tag(0x3008, 0x0063),
+          "Parameter Item Index", "ParameterItemIndex",  "IS", "1" },    { Tag(0x3008, 0x0064),
+          "Measured Dose Reference Number", "MeasuredDoseReferenceNumber",  "IS", "1" },    { Tag(0x3008, 0x0065),
+          "Parameter Pointer", "ParameterPointer",  "AT", "1" },    { Tag(0x3008, 0x0066),
+          "Override Reason", "OverrideReason",  "ST", "1" },    { Tag(0x3008, 0x0068),
+          "Corrected Parameter Sequence", "CorrectedParameterSequence",  "SQ", "1" },    { Tag(0x3008, 0x006a),
+          "Correction Value", "CorrectionValue",  "FL", "1" },    { Tag(0x3008, 0x0070),
+          "Calculated Dose Reference Sequence", "CalculatedDoseReferenceSequence",  "SQ", "1" },    { Tag(0x3008, 0x0072),
+          "Calculated Dose Reference Number", "CalculatedDoseReferenceNumber",  "IS", "1" },    { Tag(0x3008, 0x0074),
+          "Calculated Dose Reference Description", "CalculatedDoseReferenceDescription",  "ST", "1" },    { Tag(0x3008, 0x0076),
+          "Calculated Dose Reference Dose Value", "CalculatedDoseReferenceDoseValue",  "DS", "1" },    { Tag(0x3008, 0x0078),
+          "Start Meterset", "StartMeterset",  "DS", "1" },    { Tag(0x3008, 0x007a),
+          "End Meterset", "EndMeterset",  "DS", "1" },    { Tag(0x3008, 0x0080),
+          "Referenced Measured Dose Reference Sequence", "ReferencedMeasuredDoseReferenceSequence",  "SQ", "1" },    { Tag(0x3008, 0x0082),
+          "Referenced Measured Dose Reference Number", "ReferencedMeasuredDoseReferenceNumber",  "IS", "1" },    { Tag(0x3008, 0x0090),
+          "Referenced Calculated Dose Reference Sequence", "ReferencedCalculatedDoseReferenceSequence",  "SQ", "1" },    { Tag(0x3008, 0x0092),
+          "Referenced Calculated Dose Reference Number", "ReferencedCalculatedDoseReferenceNumber",  "IS", "1" },    { Tag(0x3008, 0x00a0),
+          "Beam Limiting Device Leaf Pairs Sequence", "BeamLimitingDeviceLeafPairsSequence",  "SQ", "1" },    { Tag(0x3008, 0x00b0),
+          "Recorded Wedge Sequence", "RecordedWedgeSequence",  "SQ", "1" },    { Tag(0x3008, 0x00c0),
+          "Recorded Compensator Sequence", "RecordedCompensatorSequence",  "SQ", "1" },    { Tag(0x3008, 0x00d0),
+          "Recorded Block Sequence", "RecordedBlockSequence",  "SQ", "1" },    { Tag(0x3008, 0x00e0),
+          "Treatment Summary Measured Dose Reference Sequence", "TreatmentSummaryMeasuredDoseReferenceSequence",  "SQ", "1" },    { Tag(0x3008, 0x00f0),
+          "Recorded Snout Sequence", "RecordedSnoutSequence",  "SQ", "1" },    { Tag(0x3008, 0x00f2),
+          "Recorded Range Shifter Sequence", "RecordedRangeShifterSequence",  "SQ", "1" },    { Tag(0x3008, 0x00f4),
+          "Recorded Lateral Spreading Device Sequence", "RecordedLateralSpreadingDeviceSequence",  "SQ", "1" },    { Tag(0x3008, 0x00f6),
+          "Recorded Range Modulator Sequence", "RecordedRangeModulatorSequence",  "SQ", "1" },    { Tag(0x3008, 0x0100),
+          "Recorded Source Sequence", "RecordedSourceSequence",  "SQ", "1" },    { Tag(0x3008, 0x0105),
+          "Source Serial Number", "SourceSerialNumber",  "LO", "1" },    { Tag(0x3008, 0x0110),
+          "Treatment Session Application Setup Sequence", "TreatmentSessionApplicationSetupSequence",  "SQ", "1" },    { Tag(0x3008, 0x0116),
+          "Application Setup Check", "ApplicationSetupCheck",  "CS", "1" },    { Tag(0x3008, 0x0120),
+          "Recorded Brachy Accessory Device Sequence", "RecordedBrachyAccessoryDeviceSequence",  "SQ", "1" },    { Tag(0x3008, 0x0122),
+          "Referenced Brachy Accessory Device Number", "ReferencedBrachyAccessoryDeviceNumber",  "IS", "1" },    { Tag(0x3008, 0x0130),
+          "Recorded Channel Sequence", "RecordedChannelSequence",  "SQ", "1" },    { Tag(0x3008, 0x0132),
+          "Specified Channel Total Time", "SpecifiedChannelTotalTime",  "DS", "1" },    { Tag(0x3008, 0x0134),
+          "Delivered Channel Total Time", "DeliveredChannelTotalTime",  "DS", "1" },    { Tag(0x3008, 0x0136),
+          "Specified Number of Pulses", "SpecifiedNumberOfPulses",  "IS", "1" },    { Tag(0x3008, 0x0138),
+          "Delivered Number of Pulses", "DeliveredNumberOfPulses",  "IS", "1" },    { Tag(0x3008, 0x013a),
+          "Specified Pulse Repetition Interval", "SpecifiedPulseRepetitionInterval",  "DS", "1" },    { Tag(0x3008, 0x013c),
+          "Delivered Pulse Repetition Interval", "DeliveredPulseRepetitionInterval",  "DS", "1" },    { Tag(0x3008, 0x0140),
+          "Recorded Source Applicator Sequence", "RecordedSourceApplicatorSequence",  "SQ", "1" },    { Tag(0x3008, 0x0142),
+          "Referenced Source Applicator Number", "ReferencedSourceApplicatorNumber",  "IS", "1" },    { Tag(0x3008, 0x0150),
+          "Recorded Channel Shield Sequence", "RecordedChannelShieldSequence",  "SQ", "1" },    { Tag(0x3008, 0x0152),
+          "Referenced Channel Shield Number", "ReferencedChannelShieldNumber",  "IS", "1" },    { Tag(0x3008, 0x0160),
+          "Brachy Control Point Delivered Sequence", "BrachyControlPointDeliveredSequence",  "SQ", "1" },    { Tag(0x3008, 0x0162),
+          "Safe Position Exit Date", "SafePositionExitDate",  "DA", "1" },    { Tag(0x3008, 0x0164),
+          "Safe Position Exit Time", "SafePositionExitTime",  "TM", "1" },    { Tag(0x3008, 0x0166),
+          "Safe Position Return Date", "SafePositionReturnDate",  "DA", "1" },    { Tag(0x3008, 0x0168),
+          "Safe Position Return Time", "SafePositionReturnTime",  "TM", "1" },    { Tag(0x3008, 0x0171),
+          "Pulse Specific Brachy Control Point Delivered Sequence", "PulseSpecificBrachyControlPointDeliveredSequence",  "SQ", "1" },    { Tag(0x3008, 0x0172),
+          "Pulse Number", "PulseNumber",  "US", "1" },    { Tag(0x3008, 0x0173),
+          "Brachy Pulse Control Point Delivered Sequence", "BrachyPulseControlPointDeliveredSequence",  "SQ", "1" },    { Tag(0x3008, 0x0200),
+          "Current Treatment Status", "CurrentTreatmentStatus",  "CS", "1" },    { Tag(0x3008, 0x0202),
+          "Treatment Status Comment", "TreatmentStatusComment",  "ST", "1" },    { Tag(0x3008, 0x0220),
+          "Fraction Group Summary Sequence", "FractionGroupSummarySequence",  "SQ", "1" },    { Tag(0x3008, 0x0223),
+          "Referenced Fraction Number", "ReferencedFractionNumber",  "IS", "1" },    { Tag(0x3008, 0x0224),
+          "Fraction Group Type", "FractionGroupType",  "CS", "1" },    { Tag(0x3008, 0x0230),
+          "Beam Stopper Position", "BeamStopperPosition",  "CS", "1" },    { Tag(0x3008, 0x0240),
+          "Fraction Status Summary Sequence", "FractionStatusSummarySequence",  "SQ", "1" },    { Tag(0x3008, 0x0250),
+          "Treatment Date", "TreatmentDate",  "DA", "1" },    { Tag(0x3008, 0x0251),
+          "Treatment Time", "TreatmentTime",  "TM", "1" },    { Tag(0x300a, 0x0002),
+          "RT Plan Label", "RTPlanLabel",  "SH", "1" },    { Tag(0x300a, 0x0003),
+          "RT Plan Name", "RTPlanName",  "LO", "1" },    { Tag(0x300a, 0x0004),
+          "RT Plan Description", "RTPlanDescription",  "ST", "1" },    { Tag(0x300a, 0x0006),
+          "RT Plan Date", "RTPlanDate",  "DA", "1" },    { Tag(0x300a, 0x0007),
+          "RT Plan Time", "RTPlanTime",  "TM", "1" },    { Tag(0x300a, 0x0009),
+          "Treatment Protocols", "TreatmentProtocols",  "LO", "1-n" },    { Tag(0x300a, 0x000a),
+          "Plan Intent", "PlanIntent",  "CS", "1" },    { Tag(0x300a, 0x000b),
+          "Treatment Sites", "TreatmentSites",  "LO", "1-n" },    { Tag(0x300a, 0x000c),
+          "RT Plan Geometry", "RTPlanGeometry",  "CS", "1" },    { Tag(0x300a, 0x000e),
+          "Prescription Description", "PrescriptionDescription",  "ST", "1" },    { Tag(0x300a, 0x0010),
+          "Dose Reference Sequence", "DoseReferenceSequence",  "SQ", "1" },    { Tag(0x300a, 0x0012),
+          "Dose Reference Number", "DoseReferenceNumber",  "IS", "1" },    { Tag(0x300a, 0x0013),
+          "Dose Reference UID", "DoseReferenceUID",  "UI", "1" },    { Tag(0x300a, 0x0014),
+          "Dose Reference Structure Type", "DoseReferenceStructureType",  "CS", "1" },    { Tag(0x300a, 0x0015),
+          "Nominal Beam Energy Unit", "NominalBeamEnergyUnit",  "CS", "1" },    { Tag(0x300a, 0x0016),
+          "Dose Reference Description", "DoseReferenceDescription",  "LO", "1" },    { Tag(0x300a, 0x0018),
+          "Dose Reference Point Coordinates", "DoseReferencePointCoordinates",  "DS", "3" },    { Tag(0x300a, 0x001a),
+          "Nominal Prior Dose", "NominalPriorDose",  "DS", "1" },    { Tag(0x300a, 0x0020),
+          "Dose Reference Type", "DoseReferenceType",  "CS", "1" },    { Tag(0x300a, 0x0021),
+          "Constraint Weight", "ConstraintWeight",  "DS", "1" },    { Tag(0x300a, 0x0022),
+          "Delivery Warning Dose", "DeliveryWarningDose",  "DS", "1" },    { Tag(0x300a, 0x0023),
+          "Delivery Maximum Dose", "DeliveryMaximumDose",  "DS", "1" },    { Tag(0x300a, 0x0025),
+          "Target Minimum Dose", "TargetMinimumDose",  "DS", "1" },    { Tag(0x300a, 0x0026),
+          "Target Prescription Dose", "TargetPrescriptionDose",  "DS", "1" },    { Tag(0x300a, 0x0027),
+          "Target Maximum Dose", "TargetMaximumDose",  "DS", "1" },    { Tag(0x300a, 0x0028),
+          "Target Underdose Volume Fraction", "TargetUnderdoseVolumeFraction",  "DS", "1" },    { Tag(0x300a, 0x002a),
+          "Organ at Risk Full-volume Dose", "OrganAtRiskFullVolumeDose",  "DS", "1" },    { Tag(0x300a, 0x002b),
+          "Organ at Risk Limit Dose", "OrganAtRiskLimitDose",  "DS", "1" },    { Tag(0x300a, 0x002c),
+          "Organ at Risk Maximum Dose", "OrganAtRiskMaximumDose",  "DS", "1" },    { Tag(0x300a, 0x002d),
+          "Organ at Risk Overdose Volume Fraction", "OrganAtRiskOverdoseVolumeFraction",  "DS", "1" },    { Tag(0x300a, 0x0040),
+          "Tolerance Table Sequence", "ToleranceTableSequence",  "SQ", "1" },    { Tag(0x300a, 0x0042),
+          "Tolerance Table Number", "ToleranceTableNumber",  "IS", "1" },    { Tag(0x300a, 0x0043),
+          "Tolerance Table Label", "ToleranceTableLabel",  "SH", "1" },    { Tag(0x300a, 0x0044),
+          "Gantry Angle Tolerance", "GantryAngleTolerance",  "DS", "1" },    { Tag(0x300a, 0x0046),
+          "Beam Limiting Device Angle Tolerance", "BeamLimitingDeviceAngleTolerance",  "DS", "1" },    { Tag(0x300a, 0x0048),
+          "Beam Limiting Device Tolerance Sequence", "BeamLimitingDeviceToleranceSequence",  "SQ", "1" },    { Tag(0x300a, 0x004a),
+          "Beam Limiting Device Position Tolerance", "BeamLimitingDevicePositionTolerance",  "DS", "1" },    { Tag(0x300a, 0x004b),
+          "Snout Position Tolerance", "SnoutPositionTolerance",  "FL", "1" },    { Tag(0x300a, 0x004c),
+          "Patient Support Angle Tolerance", "PatientSupportAngleTolerance",  "DS", "1" },    { Tag(0x300a, 0x004e),
+          "Table Top Eccentric Angle Tolerance", "TableTopEccentricAngleTolerance",  "DS", "1" },    { Tag(0x300a, 0x004f),
+          "Table Top Pitch Angle Tolerance", "TableTopPitchAngleTolerance",  "FL", "1" },    { Tag(0x300a, 0x0050),
+          "Table Top Roll Angle Tolerance", "TableTopRollAngleTolerance",  "FL", "1" },    { Tag(0x300a, 0x0051),
+          "Table Top Vertical Position Tolerance", "TableTopVerticalPositionTolerance",  "DS", "1" },    { Tag(0x300a, 0x0052),
+          "Table Top Longitudinal Position Tolerance", "TableTopLongitudinalPositionTolerance",  "DS", "1" },    { Tag(0x300a, 0x0053),
+          "Table Top Lateral Position Tolerance", "TableTopLateralPositionTolerance",  "DS", "1" },    { Tag(0x300a, 0x0055),
+          "RT Plan Relationship", "RTPlanRelationship",  "CS", "1" },    { Tag(0x300a, 0x0070),
+          "Fraction Group Sequence", "FractionGroupSequence",  "SQ", "1" },    { Tag(0x300a, 0x0071),
+          "Fraction Group Number", "FractionGroupNumber",  "IS", "1" },    { Tag(0x300a, 0x0072),
+          "Fraction Group Description", "FractionGroupDescription",  "LO", "1" },    { Tag(0x300a, 0x0078),
+          "Number of Fractions Planned", "NumberOfFractionsPlanned",  "IS", "1" },    { Tag(0x300a, 0x0079),
+          "Number of Fraction Pattern Digits Per Day", "NumberOfFractionPatternDigitsPerDay",  "IS", "1" },    { Tag(0x300a, 0x007a),
+          "Repeat Fraction Cycle Length", "RepeatFractionCycleLength",  "IS", "1" },    { Tag(0x300a, 0x007b),
+          "Fraction Pattern", "FractionPattern",  "LT", "1" },    { Tag(0x300a, 0x0080),
+          "Number of Beams", "NumberOfBeams",  "IS", "1" },    { Tag(0x300a, 0x0082),
+          "Beam Dose Specification Point", "BeamDoseSpecificationPoint",  "DS", "3" },    { Tag(0x300a, 0x0084),
+          "Beam Dose", "BeamDose",  "DS", "1" },    { Tag(0x300a, 0x0086),
+          "Beam Meterset", "BeamMeterset",  "DS", "1" },    { Tag(0x300a, 0x0088),
+          "Beam Dose Point Depth", "BeamDosePointDepth",  "FL", "1" },    { Tag(0x300a, 0x0089),
+          "Beam Dose Point Equivalent Depth", "BeamDosePointEquivalentDepth",  "FL", "1" },    { Tag(0x300a, 0x008a),
+          "Beam Dose Point SSD", "BeamDosePointSSD",  "FL", "1" },    { Tag(0x300a, 0x008b),
+          "Beam Dose Meaning", "BeamDoseMeaning",  "CS", "1" },    { Tag(0x300a, 0x008c),
+          "Beam Dose Verification Control Point Sequence", "BeamDoseVerificationControlPointSequence",  "SQ", "1" },    { Tag(0x300a, 0x008d),
+          "Average Beam Dose Point Depth", "AverageBeamDosePointDepth",  "FL", "1" },    { Tag(0x300a, 0x008e),
+          "Average Beam Dose Point Equivalent Depth", "AverageBeamDosePointEquivalentDepth",  "FL", "1" },    { Tag(0x300a, 0x008f),
+          "Average Beam Dose Point SSD", "AverageBeamDosePointSSD",  "FL", "1" },    { Tag(0x300a, 0x0090),
+          "Beam Dose Type", "BeamDoseType",  "CS", "1" },    { Tag(0x300a, 0x0091),
+          "Alternate Beam Dose", "AlternateBeamDose",  "DS", "1" },    { Tag(0x300a, 0x0092),
+          "Alternate Beam Dose Type", "AlternateBeamDoseType",  "CS", "1" },    { Tag(0x300a, 0x00a0),
+          "Number of Brachy Application Setups", "NumberOfBrachyApplicationSetups",  "IS", "1" },    { Tag(0x300a, 0x00a2),
+          "Brachy Application Setup Dose Specification Point", "BrachyApplicationSetupDoseSpecificationPoint",  "DS", "3" },    { Tag(0x300a, 0x00a4),
+          "Brachy Application Setup Dose", "BrachyApplicationSetupDose",  "DS", "1" },    { Tag(0x300a, 0x00b0),
+          "Beam Sequence", "BeamSequence",  "SQ", "1" },    { Tag(0x300a, 0x00b2),
+          "Treatment Machine Name", "TreatmentMachineName",  "SH", "1" },    { Tag(0x300a, 0x00b3),
+          "Primary Dosimeter Unit", "PrimaryDosimeterUnit",  "CS", "1" },    { Tag(0x300a, 0x00b4),
+          "Source-Axis Distance", "SourceAxisDistance",  "DS", "1" },    { Tag(0x300a, 0x00b6),
+          "Beam Limiting Device Sequence", "BeamLimitingDeviceSequence",  "SQ", "1" },    { Tag(0x300a, 0x00b8),
+          "RT Beam Limiting Device Type", "RTBeamLimitingDeviceType",  "CS", "1" },    { Tag(0x300a, 0x00ba),
+          "Source to Beam Limiting Device Distance", "SourceToBeamLimitingDeviceDistance",  "DS", "1" },    { Tag(0x300a, 0x00bb),
+          "Isocenter to Beam Limiting Device Distance", "IsocenterToBeamLimitingDeviceDistance",  "FL", "1" },    { Tag(0x300a, 0x00bc),
+          "Number of Leaf/Jaw Pairs", "NumberOfLeafJawPairs",  "IS", "1" },    { Tag(0x300a, 0x00be),
+          "Leaf Position Boundaries", "LeafPositionBoundaries",  "DS", "3-n" },    { Tag(0x300a, 0x00c0),
+          "Beam Number", "BeamNumber",  "IS", "1" },    { Tag(0x300a, 0x00c2),
+          "Beam Name", "BeamName",  "LO", "1" },    { Tag(0x300a, 0x00c3),
+          "Beam Description", "BeamDescription",  "ST", "1" },    { Tag(0x300a, 0x00c4),
+          "Beam Type", "BeamType",  "CS", "1" },    { Tag(0x300a, 0x00c5),
+          "Beam Delivery Duration Limit", "BeamDeliveryDurationLimit",  "FD", "1" },    { Tag(0x300a, 0x00c6),
+          "Radiation Type", "RadiationType",  "CS", "1" },    { Tag(0x300a, 0x00c7),
+          "High-Dose Technique Type", "HighDoseTechniqueType",  "CS", "1" },    { Tag(0x300a, 0x00c8),
+          "Reference Image Number", "ReferenceImageNumber",  "IS", "1" },    { Tag(0x300a, 0x00ca),
+          "Planned Verification Image Sequence", "PlannedVerificationImageSequence",  "SQ", "1" },    { Tag(0x300a, 0x00cc),
+          "Imaging Device-Specific Acquisition Parameters", "ImagingDeviceSpecificAcquisitionParameters",  "LO", "1-n" },    { Tag(0x300a, 0x00ce),
+          "Treatment Delivery Type", "TreatmentDeliveryType",  "CS", "1" },    { Tag(0x300a, 0x00d0),
+          "Number of Wedges", "NumberOfWedges",  "IS", "1" },    { Tag(0x300a, 0x00d1),
+          "Wedge Sequence", "WedgeSequence",  "SQ", "1" },    { Tag(0x300a, 0x00d2),
+          "Wedge Number", "WedgeNumber",  "IS", "1" },    { Tag(0x300a, 0x00d3),
+          "Wedge Type", "WedgeType",  "CS", "1" },    { Tag(0x300a, 0x00d4),
+          "Wedge ID", "WedgeID",  "SH", "1" },    { Tag(0x300a, 0x00d5),
+          "Wedge Angle", "WedgeAngle",  "IS", "1" },    { Tag(0x300a, 0x00d6),
+          "Wedge Factor", "WedgeFactor",  "DS", "1" },    { Tag(0x300a, 0x00d7),
+          "Total Wedge Tray Water-Equivalent Thickness", "TotalWedgeTrayWaterEquivalentThickness",  "FL", "1" },    { Tag(0x300a, 0x00d8),
+          "Wedge Orientation", "WedgeOrientation",  "DS", "1" },    { Tag(0x300a, 0x00d9),
+          "Isocenter to Wedge Tray Distance", "IsocenterToWedgeTrayDistance",  "FL", "1" },    { Tag(0x300a, 0x00da),
+          "Source to Wedge Tray Distance", "SourceToWedgeTrayDistance",  "DS", "1" },    { Tag(0x300a, 0x00db),
+          "Wedge Thin Edge Position", "WedgeThinEdgePosition",  "FL", "1" },    { Tag(0x300a, 0x00dc),
+          "Bolus ID", "BolusID",  "SH", "1" },    { Tag(0x300a, 0x00dd),
+          "Bolus Description", "BolusDescription",  "ST", "1" },    { Tag(0x300a, 0x00de),
+          "Effective Wedge Angle", "EffectiveWedgeAngle",  "DS", "1" },    { Tag(0x300a, 0x00e0),
+          "Number of Compensators", "NumberOfCompensators",  "IS", "1" },    { Tag(0x300a, 0x00e1),
+          "Material ID", "MaterialID",  "SH", "1" },    { Tag(0x300a, 0x00e2),
+          "Total Compensator Tray Factor", "TotalCompensatorTrayFactor",  "DS", "1" },    { Tag(0x300a, 0x00e3),
+          "Compensator Sequence", "CompensatorSequence",  "SQ", "1" },    { Tag(0x300a, 0x00e4),
+          "Compensator Number", "CompensatorNumber",  "IS", "1" },    { Tag(0x300a, 0x00e5),
+          "Compensator ID", "CompensatorID",  "SH", "1" },    { Tag(0x300a, 0x00e6),
+          "Source to Compensator Tray Distance", "SourceToCompensatorTrayDistance",  "DS", "1" },    { Tag(0x300a, 0x00e7),
+          "Compensator Rows", "CompensatorRows",  "IS", "1" },    { Tag(0x300a, 0x00e8),
+          "Compensator Columns", "CompensatorColumns",  "IS", "1" },    { Tag(0x300a, 0x00e9),
+          "Compensator Pixel Spacing", "CompensatorPixelSpacing",  "DS", "2" },    { Tag(0x300a, 0x00ea),
+          "Compensator Position", "CompensatorPosition",  "DS", "2" },    { Tag(0x300a, 0x00eb),
+          "Compensator Transmission Data", "CompensatorTransmissionData",  "DS", "1-n" },    { Tag(0x300a, 0x00ec),
+          "Compensator Thickness Data", "CompensatorThicknessData",  "DS", "1-n" },    { Tag(0x300a, 0x00ed),
+          "Number of Boli", "NumberOfBoli",  "IS", "1" },    { Tag(0x300a, 0x00ee),
+          "Compensator Type", "CompensatorType",  "CS", "1" },    { Tag(0x300a, 0x00ef),
+          "Compensator Tray ID", "CompensatorTrayID",  "SH", "1" },    { Tag(0x300a, 0x00f0),
+          "Number of Blocks", "NumberOfBlocks",  "IS", "1" },    { Tag(0x300a, 0x00f2),
+          "Total Block Tray Factor", "TotalBlockTrayFactor",  "DS", "1" },    { Tag(0x300a, 0x00f3),
+          "Total Block Tray Water-Equivalent Thickness", "TotalBlockTrayWaterEquivalentThickness",  "FL", "1" },    { Tag(0x300a, 0x00f4),
+          "Block Sequence", "BlockSequence",  "SQ", "1" },    { Tag(0x300a, 0x00f5),
+          "Block Tray ID", "BlockTrayID",  "SH", "1" },    { Tag(0x300a, 0x00f6),
+          "Source to Block Tray Distance", "SourceToBlockTrayDistance",  "DS", "1" },    { Tag(0x300a, 0x00f7),
+          "Isocenter to Block Tray Distance", "IsocenterToBlockTrayDistance",  "FL", "1" },    { Tag(0x300a, 0x00f8),
+          "Block Type", "BlockType",  "CS", "1" },    { Tag(0x300a, 0x00f9),
+          "Accessory Code", "AccessoryCode",  "LO", "1" },    { Tag(0x300a, 0x00fa),
+          "Block Divergence", "BlockDivergence",  "CS", "1" },    { Tag(0x300a, 0x00fb),
+          "Block Mounting Position", "BlockMountingPosition",  "CS", "1" },    { Tag(0x300a, 0x00fc),
+          "Block Number", "BlockNumber",  "IS", "1" },    { Tag(0x300a, 0x00fe),
+          "Block Name", "BlockName",  "LO", "1" },    { Tag(0x300a, 0x0100),
+          "Block Thickness", "BlockThickness",  "DS", "1" },    { Tag(0x300a, 0x0102),
+          "Block Transmission", "BlockTransmission",  "DS", "1" },    { Tag(0x300a, 0x0104),
+          "Block Number of Points", "BlockNumberOfPoints",  "IS", "1" },    { Tag(0x300a, 0x0106),
+          "Block Data", "BlockData",  "DS", "2-2n" },    { Tag(0x300a, 0x0107),
+          "Applicator Sequence", "ApplicatorSequence",  "SQ", "1" },    { Tag(0x300a, 0x0108),
+          "Applicator ID", "ApplicatorID",  "SH", "1" },    { Tag(0x300a, 0x0109),
+          "Applicator Type", "ApplicatorType",  "CS", "1" },    { Tag(0x300a, 0x010a),
+          "Applicator Description", "ApplicatorDescription",  "LO", "1" },    { Tag(0x300a, 0x010c),
+          "Cumulative Dose Reference Coefficient", "CumulativeDoseReferenceCoefficient",  "DS", "1" },    { Tag(0x300a, 0x010e),
+          "Final Cumulative Meterset Weight", "FinalCumulativeMetersetWeight",  "DS", "1" },    { Tag(0x300a, 0x0110),
+          "Number of Control Points", "NumberOfControlPoints",  "IS", "1" },    { Tag(0x300a, 0x0111),
+          "Control Point Sequence", "ControlPointSequence",  "SQ", "1" },    { Tag(0x300a, 0x0112),
+          "Control Point Index", "ControlPointIndex",  "IS", "1" },    { Tag(0x300a, 0x0114),
+          "Nominal Beam Energy", "NominalBeamEnergy",  "DS", "1" },    { Tag(0x300a, 0x0115),
+          "Dose Rate Set", "DoseRateSet",  "DS", "1" },    { Tag(0x300a, 0x0116),
+          "Wedge Position Sequence", "WedgePositionSequence",  "SQ", "1" },    { Tag(0x300a, 0x0118),
+          "Wedge Position", "WedgePosition",  "CS", "1" },    { Tag(0x300a, 0x011a),
+          "Beam Limiting Device Position Sequence", "BeamLimitingDevicePositionSequence",  "SQ", "1" },    { Tag(0x300a, 0x011c),
+          "Leaf/Jaw Positions", "LeafJawPositions",  "DS", "2-2n" },    { Tag(0x300a, 0x011e),
+          "Gantry Angle", "GantryAngle",  "DS", "1" },    { Tag(0x300a, 0x011f),
+          "Gantry Rotation Direction", "GantryRotationDirection",  "CS", "1" },    { Tag(0x300a, 0x0120),
+          "Beam Limiting Device Angle", "BeamLimitingDeviceAngle",  "DS", "1" },    { Tag(0x300a, 0x0121),
+          "Beam Limiting Device Rotation Direction", "BeamLimitingDeviceRotationDirection",  "CS", "1" },    { Tag(0x300a, 0x0122),
+          "Patient Support Angle", "PatientSupportAngle",  "DS", "1" },    { Tag(0x300a, 0x0123),
+          "Patient Support Rotation Direction", "PatientSupportRotationDirection",  "CS", "1" },    { Tag(0x300a, 0x0124),
+          "Table Top Eccentric Axis Distance", "TableTopEccentricAxisDistance",  "DS", "1" },    { Tag(0x300a, 0x0125),
+          "Table Top Eccentric Angle", "TableTopEccentricAngle",  "DS", "1" },    { Tag(0x300a, 0x0126),
+          "Table Top Eccentric Rotation Direction", "TableTopEccentricRotationDirection",  "CS", "1" },    { Tag(0x300a, 0x0128),
+          "Table Top Vertical Position", "TableTopVerticalPosition",  "DS", "1" },    { Tag(0x300a, 0x0129),
+          "Table Top Longitudinal Position", "TableTopLongitudinalPosition",  "DS", "1" },    { Tag(0x300a, 0x012a),
+          "Table Top Lateral Position", "TableTopLateralPosition",  "DS", "1" },    { Tag(0x300a, 0x012c),
+          "Isocenter Position", "IsocenterPosition",  "DS", "3" },    { Tag(0x300a, 0x012e),
+          "Surface Entry Point", "SurfaceEntryPoint",  "DS", "3" },    { Tag(0x300a, 0x0130),
+          "Source to Surface Distance", "SourceToSurfaceDistance",  "DS", "1" },    { Tag(0x300a, 0x0131),
+          "Average Beam Dose Point Source to External Contour Distance", "AverageBeamDosePointSourceToExternalContourDistance",  "FL", "1" },    { Tag(0x300a, 0x0132),
+          "Source to External Contour Distance", "SourceToExternalContourDistance",  "FL", "1" },    { Tag(0x300a, 0x0133),
+          "External Contour Entry Point", "ExternalContourEntryPoint",  "FL", "3" },    { Tag(0x300a, 0x0134),
+          "Cumulative Meterset Weight", "CumulativeMetersetWeight",  "DS", "1" },    { Tag(0x300a, 0x0140),
+          "Table Top Pitch Angle", "TableTopPitchAngle",  "FL", "1" },    { Tag(0x300a, 0x0142),
+          "Table Top Pitch Rotation Direction", "TableTopPitchRotationDirection",  "CS", "1" },    { Tag(0x300a, 0x0144),
+          "Table Top Roll Angle", "TableTopRollAngle",  "FL", "1" },    { Tag(0x300a, 0x0146),
+          "Table Top Roll Rotation Direction", "TableTopRollRotationDirection",  "CS", "1" },    { Tag(0x300a, 0x0148),
+          "Head Fixation Angle", "HeadFixationAngle",  "FL", "1" },    { Tag(0x300a, 0x014a),
+          "Gantry Pitch Angle", "GantryPitchAngle",  "FL", "1" },    { Tag(0x300a, 0x014c),
+          "Gantry Pitch Rotation Direction", "GantryPitchRotationDirection",  "CS", "1" },    { Tag(0x300a, 0x014e),
+          "Gantry Pitch Angle Tolerance", "GantryPitchAngleTolerance",  "FL", "1" },    { Tag(0x300a, 0x0150),
+          "Fixation Eye", "FixationEye",  "CS", "1" },    { Tag(0x300a, 0x0151),
+          "Chair Head Frame Position", "ChairHeadFramePosition",  "DS", "1" },    { Tag(0x300a, 0x0152),
+          "Head Fixation Angle Tolerance", "HeadFixationAngleTolerance",  "DS", "1" },    { Tag(0x300a, 0x0153),
+          "Chair Head Frame Position Tolerance", "ChairHeadFramePositionTolerance",  "DS", "1" },    { Tag(0x300a, 0x0154),
+          "Fixation Light Azimuthal Angle Tolerance", "FixationLightAzimuthalAngleTolerance",  "DS", "1" },    { Tag(0x300a, 0x0155),
+          "Fixation Light Polar Angle Tolerance", "FixationLightPolarAngleTolerance",  "DS", "1" },    { Tag(0x300a, 0x0180),
+          "Patient Setup Sequence", "PatientSetupSequence",  "SQ", "1" },    { Tag(0x300a, 0x0182),
+          "Patient Setup Number", "PatientSetupNumber",  "IS", "1" },    { Tag(0x300a, 0x0183),
+          "Patient Setup Label", "PatientSetupLabel",  "LO", "1" },    { Tag(0x300a, 0x0184),
+          "Patient Additional Position", "PatientAdditionalPosition",  "LO", "1" },    { Tag(0x300a, 0x0190),
+          "Fixation Device Sequence", "FixationDeviceSequence",  "SQ", "1" },    { Tag(0x300a, 0x0192),
+          "Fixation Device Type", "FixationDeviceType",  "CS", "1" },    { Tag(0x300a, 0x0194),
+          "Fixation Device Label", "FixationDeviceLabel",  "SH", "1" },    { Tag(0x300a, 0x0196),
+          "Fixation Device Description", "FixationDeviceDescription",  "ST", "1" },    { Tag(0x300a, 0x0198),
+          "Fixation Device Position", "FixationDevicePosition",  "SH", "1" },    { Tag(0x300a, 0x0199),
+          "Fixation Device Pitch Angle", "FixationDevicePitchAngle",  "FL", "1" },    { Tag(0x300a, 0x019a),
+          "Fixation Device Roll Angle", "FixationDeviceRollAngle",  "FL", "1" },    { Tag(0x300a, 0x01a0),
+          "Shielding Device Sequence", "ShieldingDeviceSequence",  "SQ", "1" },    { Tag(0x300a, 0x01a2),
+          "Shielding Device Type", "ShieldingDeviceType",  "CS", "1" },    { Tag(0x300a, 0x01a4),
+          "Shielding Device Label", "ShieldingDeviceLabel",  "SH", "1" },    { Tag(0x300a, 0x01a6),
+          "Shielding Device Description", "ShieldingDeviceDescription",  "ST", "1" },    { Tag(0x300a, 0x01a8),
+          "Shielding Device Position", "ShieldingDevicePosition",  "SH", "1" },    { Tag(0x300a, 0x01b0),
+          "Setup Technique", "SetupTechnique",  "CS", "1" },    { Tag(0x300a, 0x01b2),
+          "Setup Technique Description", "SetupTechniqueDescription",  "ST", "1" },    { Tag(0x300a, 0x01b4),
+          "Setup Device Sequence", "SetupDeviceSequence",  "SQ", "1" },    { Tag(0x300a, 0x01b6),
+          "Setup Device Type", "SetupDeviceType",  "CS", "1" },    { Tag(0x300a, 0x01b8),
+          "Setup Device Label", "SetupDeviceLabel",  "SH", "1" },    { Tag(0x300a, 0x01ba),
+          "Setup Device Description", "SetupDeviceDescription",  "ST", "1" },    { Tag(0x300a, 0x01bc),
+          "Setup Device Parameter", "SetupDeviceParameter",  "DS", "1" },    { Tag(0x300a, 0x01d0),
+          "Setup Reference Description", "SetupReferenceDescription",  "ST", "1" },    { Tag(0x300a, 0x01d2),
+          "Table Top Vertical Setup Displacement", "TableTopVerticalSetupDisplacement",  "DS", "1" },    { Tag(0x300a, 0x01d4),
+          "Table Top Longitudinal Setup Displacement", "TableTopLongitudinalSetupDisplacement",  "DS", "1" },    { Tag(0x300a, 0x01d6),
+          "Table Top Lateral Setup Displacement", "TableTopLateralSetupDisplacement",  "DS", "1" },    { Tag(0x300a, 0x0200),
+          "Brachy Treatment Technique", "BrachyTreatmentTechnique",  "CS", "1" },    { Tag(0x300a, 0x0202),
+          "Brachy Treatment Type", "BrachyTreatmentType",  "CS", "1" },    { Tag(0x300a, 0x0206),
+          "Treatment Machine Sequence", "TreatmentMachineSequence",  "SQ", "1" },    { Tag(0x300a, 0x0210),
+          "Source Sequence", "SourceSequence",  "SQ", "1" },    { Tag(0x300a, 0x0212),
+          "Source Number", "SourceNumber",  "IS", "1" },    { Tag(0x300a, 0x0214),
+          "Source Type", "SourceType",  "CS", "1" },    { Tag(0x300a, 0x0216),
+          "Source Manufacturer", "SourceManufacturer",  "LO", "1" },    { Tag(0x300a, 0x0218),
+          "Active Source Diameter", "ActiveSourceDiameter",  "DS", "1" },    { Tag(0x300a, 0x021a),
+          "Active Source Length", "ActiveSourceLength",  "DS", "1" },    { Tag(0x300a, 0x021b),
+          "Source Model ID", "SourceModelID",  "SH", "1" },    { Tag(0x300a, 0x021c),
+          "Source Description", "SourceDescription",  "LO", "1" },    { Tag(0x300a, 0x0222),
+          "Source Encapsulation Nominal Thickness", "SourceEncapsulationNominalThickness",  "DS", "1" },    { Tag(0x300a, 0x0224),
+          "Source Encapsulation Nominal Transmission", "SourceEncapsulationNominalTransmission",  "DS", "1" },    { Tag(0x300a, 0x0226),
+          "Source Isotope Name", "SourceIsotopeName",  "LO", "1" },    { Tag(0x300a, 0x0228),
+          "Source Isotope Half Life", "SourceIsotopeHalfLife",  "DS", "1" },    { Tag(0x300a, 0x0229),
+          "Source Strength Units", "SourceStrengthUnits",  "CS", "1" },    { Tag(0x300a, 0x022a),
+          "Reference Air Kerma Rate", "ReferenceAirKermaRate",  "DS", "1" },    { Tag(0x300a, 0x022b),
+          "Source Strength", "SourceStrength",  "DS", "1" },    { Tag(0x300a, 0x022c),
+          "Source Strength Reference Date", "SourceStrengthReferenceDate",  "DA", "1" },    { Tag(0x300a, 0x022e),
+          "Source Strength Reference Time", "SourceStrengthReferenceTime",  "TM", "1" },    { Tag(0x300a, 0x0230),
+          "Application Setup Sequence", "ApplicationSetupSequence",  "SQ", "1" },    { Tag(0x300a, 0x0232),
+          "Application Setup Type", "ApplicationSetupType",  "CS", "1" },    { Tag(0x300a, 0x0234),
+          "Application Setup Number", "ApplicationSetupNumber",  "IS", "1" },    { Tag(0x300a, 0x0236),
+          "Application Setup Name", "ApplicationSetupName",  "LO", "1" },    { Tag(0x300a, 0x0238),
+          "Application Setup Manufacturer", "ApplicationSetupManufacturer",  "LO", "1" },    { Tag(0x300a, 0x0240),
+          "Template Number", "TemplateNumber",  "IS", "1" },    { Tag(0x300a, 0x0242),
+          "Template Type", "TemplateType",  "SH", "1" },    { Tag(0x300a, 0x0244),
+          "Template Name", "TemplateName",  "LO", "1" },    { Tag(0x300a, 0x0250),
+          "Total Reference Air Kerma", "TotalReferenceAirKerma",  "DS", "1" },    { Tag(0x300a, 0x0260),
+          "Brachy Accessory Device Sequence", "BrachyAccessoryDeviceSequence",  "SQ", "1" },    { Tag(0x300a, 0x0262),
+          "Brachy Accessory Device Number", "BrachyAccessoryDeviceNumber",  "IS", "1" },    { Tag(0x300a, 0x0263),
+          "Brachy Accessory Device ID", "BrachyAccessoryDeviceID",  "SH", "1" },    { Tag(0x300a, 0x0264),
+          "Brachy Accessory Device Type", "BrachyAccessoryDeviceType",  "CS", "1" },    { Tag(0x300a, 0x0266),
+          "Brachy Accessory Device Name", "BrachyAccessoryDeviceName",  "LO", "1" },    { Tag(0x300a, 0x026a),
+          "Brachy Accessory Device Nominal Thickness", "BrachyAccessoryDeviceNominalThickness",  "DS", "1" },    { Tag(0x300a, 0x026c),
+          "Brachy Accessory Device Nominal Transmission", "BrachyAccessoryDeviceNominalTransmission",  "DS", "1" },    { Tag(0x300a, 0x0280),
+          "Channel Sequence", "ChannelSequence",  "SQ", "1" },    { Tag(0x300a, 0x0282),
+          "Channel Number", "ChannelNumber",  "IS", "1" },    { Tag(0x300a, 0x0284),
+          "Channel Length", "ChannelLength",  "DS", "1" },    { Tag(0x300a, 0x0286),
+          "Channel Total Time", "ChannelTotalTime",  "DS", "1" },    { Tag(0x300a, 0x0288),
+          "Source Movement Type", "SourceMovementType",  "CS", "1" },    { Tag(0x300a, 0x028a),
+          "Number of Pulses", "NumberOfPulses",  "IS", "1" },    { Tag(0x300a, 0x028c),
+          "Pulse Repetition Interval", "PulseRepetitionInterval",  "DS", "1" },    { Tag(0x300a, 0x0290),
+          "Source Applicator Number", "SourceApplicatorNumber",  "IS", "1" },    { Tag(0x300a, 0x0291),
+          "Source Applicator ID", "SourceApplicatorID",  "SH", "1" },    { Tag(0x300a, 0x0292),
+          "Source Applicator Type", "SourceApplicatorType",  "CS", "1" },    { Tag(0x300a, 0x0294),
+          "Source Applicator Name", "SourceApplicatorName",  "LO", "1" },    { Tag(0x300a, 0x0296),
+          "Source Applicator Length", "SourceApplicatorLength",  "DS", "1" },    { Tag(0x300a, 0x0298),
+          "Source Applicator Manufacturer", "SourceApplicatorManufacturer",  "LO", "1" },    { Tag(0x300a, 0x029c),
+          "Source Applicator Wall Nominal Thickness", "SourceApplicatorWallNominalThickness",  "DS", "1" },    { Tag(0x300a, 0x029e),
+          "Source Applicator Wall Nominal Transmission", "SourceApplicatorWallNominalTransmission",  "DS", "1" },    { Tag(0x300a, 0x02a0),
+          "Source Applicator Step Size", "SourceApplicatorStepSize",  "DS", "1" },    { Tag(0x300a, 0x02a2),
+          "Transfer Tube Number", "TransferTubeNumber",  "IS", "1" },    { Tag(0x300a, 0x02a4),
+          "Transfer Tube Length", "TransferTubeLength",  "DS", "1" },    { Tag(0x300a, 0x02b0),
+          "Channel Shield Sequence", "ChannelShieldSequence",  "SQ", "1" },    { Tag(0x300a, 0x02b2),
+          "Channel Shield Number", "ChannelShieldNumber",  "IS", "1" },    { Tag(0x300a, 0x02b3),
+          "Channel Shield ID", "ChannelShieldID",  "SH", "1" },    { Tag(0x300a, 0x02b4),
+          "Channel Shield Name", "ChannelShieldName",  "LO", "1" },    { Tag(0x300a, 0x02b8),
+          "Channel Shield Nominal Thickness", "ChannelShieldNominalThickness",  "DS", "1" },    { Tag(0x300a, 0x02ba),
+          "Channel Shield Nominal Transmission", "ChannelShieldNominalTransmission",  "DS", "1" },    { Tag(0x300a, 0x02c8),
+          "Final Cumulative Time Weight", "FinalCumulativeTimeWeight",  "DS", "1" },    { Tag(0x300a, 0x02d0),
+          "Brachy Control Point Sequence", "BrachyControlPointSequence",  "SQ", "1" },    { Tag(0x300a, 0x02d2),
+          "Control Point Relative Position", "ControlPointRelativePosition",  "DS", "1" },    { Tag(0x300a, 0x02d4),
+          "Control Point 3D Position", "ControlPoint3DPosition",  "DS", "3" },    { Tag(0x300a, 0x02d6),
+          "Cumulative Time Weight", "CumulativeTimeWeight",  "DS", "1" },    { Tag(0x300a, 0x02e0),
+          "Compensator Divergence", "CompensatorDivergence",  "CS", "1" },    { Tag(0x300a, 0x02e1),
+          "Compensator Mounting Position", "CompensatorMountingPosition",  "CS", "1" },    { Tag(0x300a, 0x02e2),
+          "Source to Compensator Distance", "SourceToCompensatorDistance",  "DS", "1-n" },    { Tag(0x300a, 0x02e3),
+          "Total Compensator Tray Water-Equivalent Thickness", "TotalCompensatorTrayWaterEquivalentThickness",  "FL", "1" },    { Tag(0x300a, 0x02e4),
+          "Isocenter to Compensator Tray Distance", "IsocenterToCompensatorTrayDistance",  "FL", "1" },    { Tag(0x300a, 0x02e5),
+          "Compensator Column Offset", "CompensatorColumnOffset",  "FL", "1" },    { Tag(0x300a, 0x02e6),
+          "Isocenter to Compensator Distances", "IsocenterToCompensatorDistances",  "FL", "1-n" },    { Tag(0x300a, 0x02e7),
+          "Compensator Relative Stopping Power Ratio", "CompensatorRelativeStoppingPowerRatio",  "FL", "1" },    { Tag(0x300a, 0x02e8),
+          "Compensator Milling Tool Diameter", "CompensatorMillingToolDiameter",  "FL", "1" },    { Tag(0x300a, 0x02ea),
+          "Ion Range Compensator Sequence", "IonRangeCompensatorSequence",  "SQ", "1" },    { Tag(0x300a, 0x02eb),
+          "Compensator Description", "CompensatorDescription",  "LT", "1" },    { Tag(0x300a, 0x0302),
+          "Radiation Mass Number", "RadiationMassNumber",  "IS", "1" },    { Tag(0x300a, 0x0304),
+          "Radiation Atomic Number", "RadiationAtomicNumber",  "IS", "1" },    { Tag(0x300a, 0x0306),
+          "Radiation Charge State", "RadiationChargeState",  "SS", "1" },    { Tag(0x300a, 0x0308),
+          "Scan Mode", "ScanMode",  "CS", "1" },    { Tag(0x300a, 0x0309),
+          "Modulated Scan Mode Type", "ModulatedScanModeType",  "CS", "1" },    { Tag(0x300a, 0x030a),
+          "Virtual Source-Axis Distances", "VirtualSourceAxisDistances",  "FL", "2" },    { Tag(0x300a, 0x030c),
+          "Snout Sequence", "SnoutSequence",  "SQ", "1" },    { Tag(0x300a, 0x030d),
+          "Snout Position", "SnoutPosition",  "FL", "1" },    { Tag(0x300a, 0x030f),
+          "Snout ID", "SnoutID",  "SH", "1" },    { Tag(0x300a, 0x0312),
+          "Number of Range Shifters", "NumberOfRangeShifters",  "IS", "1" },    { Tag(0x300a, 0x0314),
+          "Range Shifter Sequence", "RangeShifterSequence",  "SQ", "1" },    { Tag(0x300a, 0x0316),
+          "Range Shifter Number", "RangeShifterNumber",  "IS", "1" },    { Tag(0x300a, 0x0318),
+          "Range Shifter ID", "RangeShifterID",  "SH", "1" },    { Tag(0x300a, 0x0320),
+          "Range Shifter Type", "RangeShifterType",  "CS", "1" },    { Tag(0x300a, 0x0322),
+          "Range Shifter Description", "RangeShifterDescription",  "LO", "1" },    { Tag(0x300a, 0x0330),
+          "Number of Lateral Spreading Devices", "NumberOfLateralSpreadingDevices",  "IS", "1" },    { Tag(0x300a, 0x0332),
+          "Lateral Spreading Device Sequence", "LateralSpreadingDeviceSequence",  "SQ", "1" },    { Tag(0x300a, 0x0334),
+          "Lateral Spreading Device Number", "LateralSpreadingDeviceNumber",  "IS", "1" },    { Tag(0x300a, 0x0336),
+          "Lateral Spreading Device ID", "LateralSpreadingDeviceID",  "SH", "1" },    { Tag(0x300a, 0x0338),
+          "Lateral Spreading Device Type", "LateralSpreadingDeviceType",  "CS", "1" },    { Tag(0x300a, 0x033a),
+          "Lateral Spreading Device Description", "LateralSpreadingDeviceDescription",  "LO", "1" },    { Tag(0x300a, 0x033c),
+          "Lateral Spreading Device Water Equivalent Thickness", "LateralSpreadingDeviceWaterEquivalentThickness",  "FL", "1" },    { Tag(0x300a, 0x0340),
+          "Number of Range Modulators", "NumberOfRangeModulators",  "IS", "1" },    { Tag(0x300a, 0x0342),
+          "Range Modulator Sequence", "RangeModulatorSequence",  "SQ", "1" },    { Tag(0x300a, 0x0344),
+          "Range Modulator Number", "RangeModulatorNumber",  "IS", "1" },    { Tag(0x300a, 0x0346),
+          "Range Modulator ID", "RangeModulatorID",  "SH", "1" },    { Tag(0x300a, 0x0348),
+          "Range Modulator Type", "RangeModulatorType",  "CS", "1" },    { Tag(0x300a, 0x034a),
+          "Range Modulator Description", "RangeModulatorDescription",  "LO", "1" },    { Tag(0x300a, 0x034c),
+          "Beam Current Modulation ID", "BeamCurrentModulationID",  "SH", "1" },    { Tag(0x300a, 0x0350),
+          "Patient Support Type", "PatientSupportType",  "CS", "1" },    { Tag(0x300a, 0x0352),
+          "Patient Support ID", "PatientSupportID",  "SH", "1" },    { Tag(0x300a, 0x0354),
+          "Patient Support Accessory Code", "PatientSupportAccessoryCode",  "LO", "1" },    { Tag(0x300a, 0x0355),
+          "Tray Accessory Code", "TrayAccessoryCode",  "LO", "1" },    { Tag(0x300a, 0x0356),
+          "Fixation Light Azimuthal Angle", "FixationLightAzimuthalAngle",  "FL", "1" },    { Tag(0x300a, 0x0358),
+          "Fixation Light Polar Angle", "FixationLightPolarAngle",  "FL", "1" },    { Tag(0x300a, 0x035a),
+          "Meterset Rate", "MetersetRate",  "FL", "1" },    { Tag(0x300a, 0x0360),
+          "Range Shifter Settings Sequence", "RangeShifterSettingsSequence",  "SQ", "1" },    { Tag(0x300a, 0x0362),
+          "Range Shifter Setting", "RangeShifterSetting",  "LO", "1" },    { Tag(0x300a, 0x0364),
+          "Isocenter to Range Shifter Distance", "IsocenterToRangeShifterDistance",  "FL", "1" },    { Tag(0x300a, 0x0366),
+          "Range Shifter Water Equivalent Thickness", "RangeShifterWaterEquivalentThickness",  "FL", "1" },    { Tag(0x300a, 0x0370),
+          "Lateral Spreading Device Settings Sequence", "LateralSpreadingDeviceSettingsSequence",  "SQ", "1" },    { Tag(0x300a, 0x0372),
+          "Lateral Spreading Device Setting", "LateralSpreadingDeviceSetting",  "LO", "1" },    { Tag(0x300a, 0x0374),
+          "Isocenter to Lateral Spreading Device Distance", "IsocenterToLateralSpreadingDeviceDistance",  "FL", "1" },    { Tag(0x300a, 0x0380),
+          "Range Modulator Settings Sequence", "RangeModulatorSettingsSequence",  "SQ", "1" },    { Tag(0x300a, 0x0382),
+          "Range Modulator Gating Start Value", "RangeModulatorGatingStartValue",  "FL", "1" },    { Tag(0x300a, 0x0384),
+          "Range Modulator Gating Stop Value", "RangeModulatorGatingStopValue",  "FL", "1" },    { Tag(0x300a, 0x0386),
+          "Range Modulator Gating Start Water Equivalent Thickness", "RangeModulatorGatingStartWaterEquivalentThickness",  "FL", "1" },    { Tag(0x300a, 0x0388),
+          "Range Modulator Gating Stop Water Equivalent Thickness", "RangeModulatorGatingStopWaterEquivalentThickness",  "FL", "1" },    { Tag(0x300a, 0x038a),
+          "Isocenter to Range Modulator Distance", "IsocenterToRangeModulatorDistance",  "FL", "1" },    { Tag(0x300a, 0x0390),
+          "Scan Spot Tune ID", "ScanSpotTuneID",  "SH", "1" },    { Tag(0x300a, 0x0392),
+          "Number of Scan Spot Positions", "NumberOfScanSpotPositions",  "IS", "1" },    { Tag(0x300a, 0x0394),
+          "Scan Spot Position Map", "ScanSpotPositionMap",  "FL", "1-n" },    { Tag(0x300a, 0x0396),
+          "Scan Spot Meterset Weights", "ScanSpotMetersetWeights",  "FL", "1-n" },    { Tag(0x300a, 0x0398),
+          "Scanning Spot Size", "ScanningSpotSize",  "FL", "2" },    { Tag(0x300a, 0x039a),
+          "Number of Paintings", "NumberOfPaintings",  "IS", "1" },    { Tag(0x300a, 0x03a0),
+          "Ion Tolerance Table Sequence", "IonToleranceTableSequence",  "SQ", "1" },    { Tag(0x300a, 0x03a2),
+          "Ion Beam Sequence", "IonBeamSequence",  "SQ", "1" },    { Tag(0x300a, 0x03a4),
+          "Ion Beam Limiting Device Sequence", "IonBeamLimitingDeviceSequence",  "SQ", "1" },    { Tag(0x300a, 0x03a6),
+          "Ion Block Sequence", "IonBlockSequence",  "SQ", "1" },    { Tag(0x300a, 0x03a8),
+          "Ion Control Point Sequence", "IonControlPointSequence",  "SQ", "1" },    { Tag(0x300a, 0x03aa),
+          "Ion Wedge Sequence", "IonWedgeSequence",  "SQ", "1" },    { Tag(0x300a, 0x03ac),
+          "Ion Wedge Position Sequence", "IonWedgePositionSequence",  "SQ", "1" },    { Tag(0x300a, 0x0401),
+          "Referenced Setup Image Sequence", "ReferencedSetupImageSequence",  "SQ", "1" },    { Tag(0x300a, 0x0402),
+          "Setup Image Comment", "SetupImageComment",  "ST", "1" },    { Tag(0x300a, 0x0410),
+          "Motion Synchronization Sequence", "MotionSynchronizationSequence",  "SQ", "1" },    { Tag(0x300a, 0x0412),
+          "Control Point Orientation", "ControlPointOrientation",  "FL", "3" },    { Tag(0x300a, 0x0420),
+          "General Accessory Sequence", "GeneralAccessorySequence",  "SQ", "1" },    { Tag(0x300a, 0x0421),
+          "General Accessory ID", "GeneralAccessoryID",  "SH", "1" },    { Tag(0x300a, 0x0422),
+          "General Accessory Description", "GeneralAccessoryDescription",  "ST", "1" },    { Tag(0x300a, 0x0423),
+          "General Accessory Type", "GeneralAccessoryType",  "CS", "1" },    { Tag(0x300a, 0x0424),
+          "General Accessory Number", "GeneralAccessoryNumber",  "IS", "1" },    { Tag(0x300a, 0x0425),
+          "Source to General Accessory Distance", "SourceToGeneralAccessoryDistance",  "FL", "1" },    { Tag(0x300a, 0x0431),
+          "Applicator Geometry Sequence", "ApplicatorGeometrySequence",  "SQ", "1" },    { Tag(0x300a, 0x0432),
+          "Applicator Aperture Shape", "ApplicatorApertureShape",  "CS", "1" },    { Tag(0x300a, 0x0433),
+          "Applicator Opening", "ApplicatorOpening",  "FL", "1" },    { Tag(0x300a, 0x0434),
+          "Applicator Opening X", "ApplicatorOpeningX",  "FL", "1" },    { Tag(0x300a, 0x0435),
+          "Applicator Opening Y", "ApplicatorOpeningY",  "FL", "1" },    { Tag(0x300a, 0x0436),
+          "Source to Applicator Mounting Position Distance", "SourceToApplicatorMountingPositionDistance",  "FL", "1" },    { Tag(0x300a, 0x0440),
+          "Number of Block Slab Items", "NumberOfBlockSlabItems",  "IS", "1" },    { Tag(0x300a, 0x0441),
+          "Block Slab Sequence", "BlockSlabSequence",  "SQ", "1" },    { Tag(0x300a, 0x0442),
+          "Block Slab Thickness", "BlockSlabThickness",  "DS", "1" },    { Tag(0x300a, 0x0443),
+          "Block Slab Number", "BlockSlabNumber",  "US", "1" },    { Tag(0x300a, 0x0450),
+          "Device Motion Control Sequence", "DeviceMotionControlSequence",  "SQ", "1" },    { Tag(0x300a, 0x0451),
+          "Device Motion Execution Mode", "DeviceMotionExecutionMode",  "CS", "1" },    { Tag(0x300a, 0x0452),
+          "Device Motion Observation Mode", "DeviceMotionObservationMode",  "CS", "1" },    { Tag(0x300a, 0x0453),
+          "Device Motion Parameter Code Sequence", "DeviceMotionParameterCodeSequence",  "SQ", "1" },    { Tag(0x300a, 0x0501),
+          "Distal Depth Fraction", "DistalDepthFraction",  "FL", "1" },    { Tag(0x300a, 0x0502),
+          "Distal Depth", "DistalDepth",  "FL", "1" },    { Tag(0x300a, 0x0503),
+          "Nominal Range Modulation Fractions", "NominalRangeModulationFractions",  "FL", "2" },    { Tag(0x300a, 0x0504),
+          "Nominal Range Modulated Region Depths", "NominalRangeModulatedRegionDepths",  "FL", "2" },    { Tag(0x300a, 0x0505),
+          "Depth Dose Parameters Sequence", "DepthDoseParametersSequence",  "SQ", "1" },    { Tag(0x300a, 0x0506),
+          "Delivered Depth Dose Parameters Sequence", "DeliveredDepthDoseParametersSequence",  "SQ", "1" },    { Tag(0x300a, 0x0507),
+          "Delivered Distal Depth Fraction", "DeliveredDistalDepthFraction",  "FL", "1" },    { Tag(0x300a, 0x0508),
+          "Delivered Distal Depth", "DeliveredDistalDepth",  "FL", "1" },    { Tag(0x300a, 0x0509),
+          "Delivered Nominal Range Modulation Fractions", "DeliveredNominalRangeModulationFractions",  "FL", "2" },    { Tag(0x300a, 0x0510),
+          "Delivered Nominal Range Modulated Region Depths", "DeliveredNominalRangeModulatedRegionDepths",  "FL", "2" },    { Tag(0x300a, 0x0511),
+          "Delivered Reference Dose Definition", "DeliveredReferenceDoseDefinition",  "CS", "1" },    { Tag(0x300a, 0x0512),
+          "Reference Dose Definition", "ReferenceDoseDefinition",  "CS", "1" },    { Tag(0x300c, 0x0002),
+          "Referenced RT Plan Sequence", "ReferencedRTPlanSequence",  "SQ", "1" },    { Tag(0x300c, 0x0004),
+          "Referenced Beam Sequence", "ReferencedBeamSequence",  "SQ", "1" },    { Tag(0x300c, 0x0006),
+          "Referenced Beam Number", "ReferencedBeamNumber",  "IS", "1" },    { Tag(0x300c, 0x0007),
+          "Referenced Reference Image Number", "ReferencedReferenceImageNumber",  "IS", "1" },    { Tag(0x300c, 0x0008),
+          "Start Cumulative Meterset Weight", "StartCumulativeMetersetWeight",  "DS", "1" },    { Tag(0x300c, 0x0009),
+          "End Cumulative Meterset Weight", "EndCumulativeMetersetWeight",  "DS", "1" },    { Tag(0x300c, 0x000a),
+          "Referenced Brachy Application Setup Sequence", "ReferencedBrachyApplicationSetupSequence",  "SQ", "1" },    { Tag(0x300c, 0x000c),
+          "Referenced Brachy Application Setup Number", "ReferencedBrachyApplicationSetupNumber",  "IS", "1" },    { Tag(0x300c, 0x000e),
+          "Referenced Source Number", "ReferencedSourceNumber",  "IS", "1" },    { Tag(0x300c, 0x0020),
+          "Referenced Fraction Group Sequence", "ReferencedFractionGroupSequence",  "SQ", "1" },    { Tag(0x300c, 0x0022),
+          "Referenced Fraction Group Number", "ReferencedFractionGroupNumber",  "IS", "1" },    { Tag(0x300c, 0x0040),
+          "Referenced Verification Image Sequence", "ReferencedVerificationImageSequence",  "SQ", "1" },    { Tag(0x300c, 0x0042),
+          "Referenced Reference Image Sequence", "ReferencedReferenceImageSequence",  "SQ", "1" },    { Tag(0x300c, 0x0050),
+          "Referenced Dose Reference Sequence", "ReferencedDoseReferenceSequence",  "SQ", "1" },    { Tag(0x300c, 0x0051),
+          "Referenced Dose Reference Number", "ReferencedDoseReferenceNumber",  "IS", "1" },    { Tag(0x300c, 0x0055),
+          "Brachy Referenced Dose Reference Sequence", "BrachyReferencedDoseReferenceSequence",  "SQ", "1" },    { Tag(0x300c, 0x0060),
+          "Referenced Structure Set Sequence", "ReferencedStructureSetSequence",  "SQ", "1" },    { Tag(0x300c, 0x006a),
+          "Referenced Patient Setup Number", "ReferencedPatientSetupNumber",  "IS", "1" },    { Tag(0x300c, 0x0080),
+          "Referenced Dose Sequence", "ReferencedDoseSequence",  "SQ", "1" },    { Tag(0x300c, 0x00a0),
+          "Referenced Tolerance Table Number", "ReferencedToleranceTableNumber",  "IS", "1" },    { Tag(0x300c, 0x00b0),
+          "Referenced Bolus Sequence", "ReferencedBolusSequence",  "SQ", "1" },    { Tag(0x300c, 0x00c0),
+          "Referenced Wedge Number", "ReferencedWedgeNumber",  "IS", "1" },    { Tag(0x300c, 0x00d0),
+          "Referenced Compensator Number", "ReferencedCompensatorNumber",  "IS", "1" },    { Tag(0x300c, 0x00e0),
+          "Referenced Block Number", "ReferencedBlockNumber",  "IS", "1" },    { Tag(0x300c, 0x00f0),
+          "Referenced Control Point Index", "ReferencedControlPointIndex",  "IS", "1" },    { Tag(0x300c, 0x00f2),
+          "Referenced Control Point Sequence", "ReferencedControlPointSequence",  "SQ", "1" },    { Tag(0x300c, 0x00f4),
+          "Referenced Start Control Point Index", "ReferencedStartControlPointIndex",  "IS", "1" },    { Tag(0x300c, 0x00f6),
+          "Referenced Stop Control Point Index", "ReferencedStopControlPointIndex",  "IS", "1" },    { Tag(0x300c, 0x0100),
+          "Referenced Range Shifter Number", "ReferencedRangeShifterNumber",  "IS", "1" },    { Tag(0x300c, 0x0102),
+          "Referenced Lateral Spreading Device Number", "ReferencedLateralSpreadingDeviceNumber",  "IS", "1" },    { Tag(0x300c, 0x0104),
+          "Referenced Range Modulator Number", "ReferencedRangeModulatorNumber",  "IS", "1" },    { Tag(0x300c, 0x0111),
+          "Omitted Beam Task Sequence", "OmittedBeamTaskSequence",  "SQ", "1" },    { Tag(0x300c, 0x0112),
+          "Reason for Omission", "ReasonForOmission",  "CS", "1" },    { Tag(0x300c, 0x0113),
+          "Reason for Omission Description", "ReasonForOmissionDescription",  "LO", "1" },    { Tag(0x300e, 0x0002),
+          "Approval Status", "ApprovalStatus",  "CS", "1" },    { Tag(0x300e, 0x0004),
+          "Review Date", "ReviewDate",  "DA", "1" },    { Tag(0x300e, 0x0005),
+          "Review Time", "ReviewTime",  "TM", "1" },    { Tag(0x300e, 0x0008),
+          "Reviewer Name", "ReviewerName",  "PN", "1" },    { Tag(0x4000, 0x0010),
+          "Arbitrary", "Arbitrary",  "LT", "1" },    { Tag(0x4000, 0x4000),
+          "Text Comments", "TextComments",  "LT", "1" },    { Tag(0x4008, 0x0040),
+          "Results ID", "ResultsID",  "SH", "1" },    { Tag(0x4008, 0x0042),
+          "Results ID Issuer", "ResultsIDIssuer",  "LO", "1" },    { Tag(0x4008, 0x0050),
+          "Referenced Interpretation Sequence", "ReferencedInterpretationSequence",  "SQ", "1" },    { Tag(0x4008, 0x00ff),
+          "Report Production Status (Trial)", "ReportProductionStatusTrial",  "CS", "1" },    { Tag(0x4008, 0x0100),
+          "Interpretation Recorded Date", "InterpretationRecordedDate",  "DA", "1" },    { Tag(0x4008, 0x0101),
+          "Interpretation Recorded Time", "InterpretationRecordedTime",  "TM", "1" },    { Tag(0x4008, 0x0102),
+          "Interpretation Recorder", "InterpretationRecorder",  "PN", "1" },    { Tag(0x4008, 0x0103),
+          "Reference to Recorded Sound", "ReferenceToRecordedSound",  "LO", "1" },    { Tag(0x4008, 0x0108),
+          "Interpretation Transcription Date", "InterpretationTranscriptionDate",  "DA", "1" },    { Tag(0x4008, 0x0109),
+          "Interpretation Transcription Time", "InterpretationTranscriptionTime",  "TM", "1" },    { Tag(0x4008, 0x010a),
+          "Interpretation Transcriber", "InterpretationTranscriber",  "PN", "1" },    { Tag(0x4008, 0x010b),
+          "Interpretation Text", "InterpretationText",  "ST", "1" },    { Tag(0x4008, 0x010c),
+          "Interpretation Author", "InterpretationAuthor",  "PN", "1" },    { Tag(0x4008, 0x0111),
+          "Interpretation Approver Sequence", "InterpretationApproverSequence",  "SQ", "1" },    { Tag(0x4008, 0x0112),
+          "Interpretation Approval Date", "InterpretationApprovalDate",  "DA", "1" },    { Tag(0x4008, 0x0113),
+          "Interpretation Approval Time", "InterpretationApprovalTime",  "TM", "1" },    { Tag(0x4008, 0x0114),
+          "Physician Approving Interpretation", "PhysicianApprovingInterpretation",  "PN", "1" },    { Tag(0x4008, 0x0115),
+          "Interpretation Diagnosis Description", "InterpretationDiagnosisDescription",  "LT", "1" },    { Tag(0x4008, 0x0117),
+          "Interpretation Diagnosis Code Sequence", "InterpretationDiagnosisCodeSequence",  "SQ", "1" },    { Tag(0x4008, 0x0118),
+          "Results Distribution List Sequence", "ResultsDistributionListSequence",  "SQ", "1" },    { Tag(0x4008, 0x0119),
+          "Distribution Name", "DistributionName",  "PN", "1" },    { Tag(0x4008, 0x011a),
+          "Distribution Address", "DistributionAddress",  "LO", "1" },    { Tag(0x4008, 0x0200),
+          "Interpretation ID", "InterpretationID",  "SH", "1" },    { Tag(0x4008, 0x0202),
+          "Interpretation ID Issuer", "InterpretationIDIssuer",  "LO", "1" },    { Tag(0x4008, 0x0210),
+          "Interpretation Type ID", "InterpretationTypeID",  "CS", "1" },    { Tag(0x4008, 0x0212),
+          "Interpretation Status ID", "InterpretationStatusID",  "CS", "1" },    { Tag(0x4008, 0x0300),
+          "Impressions", "Impressions",  "ST", "1" },    { Tag(0x4008, 0x4000),
+          "Results Comments", "ResultsComments",  "ST", "1" },    { Tag(0x4010, 0x0001),
+          "Low Energy Detectors", "LowEnergyDetectors",  "CS", "1" },    { Tag(0x4010, 0x0002),
+          "High Energy Detectors", "HighEnergyDetectors",  "CS", "1" },    { Tag(0x4010, 0x0004),
+          "Detector Geometry Sequence", "DetectorGeometrySequence",  "SQ", "1" },    { Tag(0x4010, 0x1001),
+          "Threat ROI Voxel Sequence", "ThreatROIVoxelSequence",  "SQ", "1" },    { Tag(0x4010, 0x1004),
+          "Threat ROI Base", "ThreatROIBase",  "FL", "3" },    { Tag(0x4010, 0x1005),
+          "Threat ROI Extents", "ThreatROIExtents",  "FL", "3" },    { Tag(0x4010, 0x1006),
+          "Threat ROI Bitmap", "ThreatROIBitmap",  "OB", "1" },    { Tag(0x4010, 0x1007),
+          "Route Segment ID", "RouteSegmentID",  "SH", "1" },    { Tag(0x4010, 0x1008),
+          "Gantry Type", "GantryType",  "CS", "1" },    { Tag(0x4010, 0x1009),
+          "OOI Owner Type", "OOIOwnerType",  "CS", "1" },    { Tag(0x4010, 0x100a),
+          "Route Segment Sequence", "RouteSegmentSequence",  "SQ", "1" },    { Tag(0x4010, 0x1010),
+          "Potential Threat Object ID", "PotentialThreatObjectID",  "US", "1" },    { Tag(0x4010, 0x1011),
+          "Threat Sequence", "ThreatSequence",  "SQ", "1" },    { Tag(0x4010, 0x1012),
+          "Threat Category", "ThreatCategory",  "CS", "1" },    { Tag(0x4010, 0x1013),
+          "Threat Category Description", "ThreatCategoryDescription",  "LT", "1" },    { Tag(0x4010, 0x1014),
+          "ATD Ability Assessment", "ATDAbilityAssessment",  "CS", "1" },    { Tag(0x4010, 0x1015),
+          "ATD Assessment Flag", "ATDAssessmentFlag",  "CS", "1" },    { Tag(0x4010, 0x1016),
+          "ATD Assessment Probability", "ATDAssessmentProbability",  "FL", "1" },    { Tag(0x4010, 0x1017),
+          "Mass", "Mass",  "FL", "1" },    { Tag(0x4010, 0x1018),
+          "Density", "Density",  "FL", "1" },    { Tag(0x4010, 0x1019),
+          "Z Effective", "ZEffective",  "FL", "1" },    { Tag(0x4010, 0x101a),
+          "Boarding Pass ID", "BoardingPassID",  "SH", "1" },    { Tag(0x4010, 0x101b),
+          "Center of Mass", "CenterOfMass",  "FL", "3" },    { Tag(0x4010, 0x101c),
+          "Center of PTO", "CenterOfPTO",  "FL", "3" },    { Tag(0x4010, 0x101d),
+          "Bounding Polygon", "BoundingPolygon",  "FL", "6-n" },    { Tag(0x4010, 0x101e),
+          "Route Segment Start Location ID", "RouteSegmentStartLocationID",  "SH", "1" },    { Tag(0x4010, 0x101f),
+          "Route Segment End Location ID", "RouteSegmentEndLocationID",  "SH", "1" },    { Tag(0x4010, 0x1020),
+          "Route Segment Location ID Type", "RouteSegmentLocationIDType",  "CS", "1" },    { Tag(0x4010, 0x1021),
+          "Abort Reason", "AbortReason",  "CS", "1-n" },    { Tag(0x4010, 0x1023),
+          "Volume of PTO", "VolumeOfPTO",  "FL", "1" },    { Tag(0x4010, 0x1024),
+          "Abort Flag", "AbortFlag",  "CS", "1" },    { Tag(0x4010, 0x1025),
+          "Route Segment Start Time", "RouteSegmentStartTime",  "DT", "1" },    { Tag(0x4010, 0x1026),
+          "Route Segment End Time", "RouteSegmentEndTime",  "DT", "1" },    { Tag(0x4010, 0x1027),
+          "TDR Type", "TDRType",  "CS", "1" },    { Tag(0x4010, 0x1028),
+          "International Route Segment", "InternationalRouteSegment",  "CS", "1" },    { Tag(0x4010, 0x1029),
+          "Threat Detection Algorithm and Version", "ThreatDetectionAlgorithmandVersion",  "LO", "1-n" },    { Tag(0x4010, 0x102a),
+          "Assigned Location", "AssignedLocation",  "SH", "1" },    { Tag(0x4010, 0x102b),
+          "Alarm Decision Time", "AlarmDecisionTime",  "DT", "1" },    { Tag(0x4010, 0x1031),
+          "Alarm Decision", "AlarmDecision",  "CS", "1" },    { Tag(0x4010, 0x1033),
+          "Number of Total Objects", "NumberOfTotalObjects",  "US", "1" },    { Tag(0x4010, 0x1034),
+          "Number of Alarm Objects", "NumberOfAlarmObjects",  "US", "1" },    { Tag(0x4010, 0x1037),
+          "PTO Representation Sequence", "PTORepresentationSequence",  "SQ", "1" },    { Tag(0x4010, 0x1038),
+          "ATD Assessment Sequence", "ATDAssessmentSequence",  "SQ", "1" },    { Tag(0x4010, 0x1039),
+          "TIP Type", "TIPType",  "CS", "1" },    { Tag(0x4010, 0x103a),
+          "DICOS Version", "DICOSVersion",  "CS", "1" },    { Tag(0x4010, 0x1041),
+          "OOI Owner Creation Time", "OOIOwnerCreationTime",  "DT", "1" },    { Tag(0x4010, 0x1042),
+          "OOI Type", "OOIType",  "CS", "1" },    { Tag(0x4010, 0x1043),
+          "OOI Size", "OOISize",  "FL", "3" },    { Tag(0x4010, 0x1044),
+          "Acquisition Status", "AcquisitionStatus",  "CS", "1" },    { Tag(0x4010, 0x1045),
+          "Basis Materials Code Sequence", "BasisMaterialsCodeSequence",  "SQ", "1" },    { Tag(0x4010, 0x1046),
+          "Phantom Type", "PhantomType",  "CS", "1" },    { Tag(0x4010, 0x1047),
+          "OOI Owner Sequence", "OOIOwnerSequence",  "SQ", "1" },    { Tag(0x4010, 0x1048),
+          "Scan Type", "ScanType",  "CS", "1" },    { Tag(0x4010, 0x1051),
+          "Itinerary ID", "ItineraryID",  "LO", "1" },    { Tag(0x4010, 0x1052),
+          "Itinerary ID Type", "ItineraryIDType",  "SH", "1" },    { Tag(0x4010, 0x1053),
+          "Itinerary ID Assigning Authority", "ItineraryIDAssigningAuthority",  "LO", "1" },    { Tag(0x4010, 0x1054),
+          "Route ID", "RouteID",  "SH", "1" },    { Tag(0x4010, 0x1055),
+          "Route ID Assigning Authority", "RouteIDAssigningAuthority",  "SH", "1" },    { Tag(0x4010, 0x1056),
+          "Inbound Arrival Type", "InboundArrivalType",  "CS", "1" },    { Tag(0x4010, 0x1058),
+          "Carrier ID", "CarrierID",  "SH", "1" },    { Tag(0x4010, 0x1059),
+          "Carrier ID Assigning Authority", "CarrierIDAssigningAuthority",  "CS", "1" },    { Tag(0x4010, 0x1060),
+          "Source Orientation", "SourceOrientation",  "FL", "3" },    { Tag(0x4010, 0x1061),
+          "Source Position", "SourcePosition",  "FL", "3" },    { Tag(0x4010, 0x1062),
+          "Belt Height", "BeltHeight",  "FL", "1" },    { Tag(0x4010, 0x1064),
+          "Algorithm Routing Code Sequence", "AlgorithmRoutingCodeSequence",  "SQ", "1" },    { Tag(0x4010, 0x1067),
+          "Transport Classification", "TransportClassification",  "CS", "1" },    { Tag(0x4010, 0x1068),
+          "OOI Type Descriptor", "OOITypeDescriptor",  "LT", "1" },    { Tag(0x4010, 0x1069),
+          "Total Processing Time", "TotalProcessingTime",  "FL", "1" },    { Tag(0x4010, 0x106c),
+          "Detector Calibration Data", "DetectorCalibrationData",  "OB", "1" },    { Tag(0x4010, 0x106d),
+          "Additional Screening Performed", "AdditionalScreeningPerformed",  "CS", "1" },    { Tag(0x4010, 0x106e),
+          "Additional Inspection Selection Criteria", "AdditionalInspectionSelectionCriteria",  "CS", "1" },    { Tag(0x4010, 0x106f),
+          "Additional Inspection Method Sequence", "AdditionalInspectionMethodSequence",  "SQ", "1" },    { Tag(0x4010, 0x1070),
+          "AIT Device Type", "AITDeviceType",  "CS", "1" },    { Tag(0x4010, 0x1071),
+          "QR Measurements Sequence", "QRMeasurementsSequence",  "SQ", "1" },    { Tag(0x4010, 0x1072),
+          "Target Material Sequence", "TargetMaterialSequence",  "SQ", "1" },    { Tag(0x4010, 0x1073),
+          "SNR Threshold", "SNRThreshold",  "FD", "1" },    { Tag(0x4010, 0x1075),
+          "Image Scale Representation", "ImageScaleRepresentation",  "DS", "1" },    { Tag(0x4010, 0x1076),
+          "Referenced PTO Sequence", "ReferencedPTOSequence",  "SQ", "1" },    { Tag(0x4010, 0x1077),
+          "Referenced TDR Instance Sequence", "ReferencedTDRInstanceSequence",  "SQ", "1" },    { Tag(0x4010, 0x1078),
+          "PTO Location Description", "PTOLocationDescription",  "ST", "1" },    { Tag(0x4010, 0x1079),
+          "Anomaly Locator Indicator Sequence", "AnomalyLocatorIndicatorSequence",  "SQ", "1" },    { Tag(0x4010, 0x107a),
+          "Anomaly Locator Indicator", "AnomalyLocatorIndicator",  "FL", "3" },    { Tag(0x4010, 0x107b),
+          "PTO Region Sequence", "PTORegionSequence",  "SQ", "1" },    { Tag(0x4010, 0x107c),
+          "Inspection Selection Criteria", "InspectionSelectionCriteria",  "CS", "1" },    { Tag(0x4010, 0x107d),
+          "Secondary Inspection Method Sequence", "SecondaryInspectionMethodSequence",  "SQ", "1" },    { Tag(0x4010, 0x107e),
+          "PRCS to RCS Orientation", "PRCSToRCSOrientation",  "DS", "6" },    { Tag(0x4ffe, 0x0001),
+          "MAC Parameters Sequence", "MACParametersSequence",  "SQ", "1" },                                                                                                            { Tag(0x5200, 0x9229),
+          "Shared Functional Groups Sequence", "SharedFunctionalGroupsSequence",  "SQ", "1" },    { Tag(0x5200, 0x9230),
+          "Per-frame Functional Groups Sequence", "PerFrameFunctionalGroupsSequence",  "SQ", "1" },    { Tag(0x5400, 0x0100),
+          "Waveform Sequence", "WaveformSequence",  "SQ", "1" },    { Tag(0x5400, 0x0110),
+          "Channel Minimum Value", "ChannelMinimumValue",  "OB or OW", "1" },    { Tag(0x5400, 0x0112),
+          "Channel Maximum Value", "ChannelMaximumValue",  "OB or OW", "1" },    { Tag(0x5400, 0x1004),
+          "Waveform Bits Allocated", "WaveformBitsAllocated",  "US", "1" },    { Tag(0x5400, 0x1006),
+          "Waveform Sample Interpretation", "WaveformSampleInterpretation",  "CS", "1" },    { Tag(0x5400, 0x100a),
+          "Waveform Padding Value", "WaveformPaddingValue",  "OB or OW", "1" },    { Tag(0x5400, 0x1010),
+          "Waveform Data", "WaveformData",  "OB or OW", "1" },    { Tag(0x5600, 0x0010),
+          "First Order Phase Correction Angle", "FirstOrderPhaseCorrectionAngle",  "OF", "1" },    { Tag(0x5600, 0x0020),
+          "Spectroscopy Data", "SpectroscopyData",  "OF", "1" },                                                                                                                                                                    { Tag(0x7fe0, 0x0008),
+          "Float Pixel Data", "FloatPixelData",  "OF", "1" },    { Tag(0x7fe0, 0x0009),
+          "Double Float Pixel Data", "DoubleFloatPixelData",  "OD", "1" },    { Tag(0x7fe0, 0x0010),
+          "Pixel Data", "PixelData",  "OB or OW", "1" },    { Tag(0x7fe0, 0x0020),
+          "Coefficients SDVN", "CoefficientsSDVN",  "OW", "1" },    { Tag(0x7fe0, 0x0030),
+          "Coefficients SDHN", "CoefficientsSDHN",  "OW", "1" },    { Tag(0x7fe0, 0x0040),
+          "Coefficients SDDN", "CoefficientsSDDN",  "OW", "1" },                        { Tag(0xfffa, 0xfffa),
+          "Digital Signatures Sequence", "DigitalSignaturesSequence",  "SQ", "1" },    { Tag(0xfffc, 0xfffc),
+          "Data Set Trailing Padding", "DataSetTrailingPadding",  "OB", "1" },    { Tag(0xfffe, 0xe000),
+          "Item", "Item",  "See Note ", "1" },    { Tag(0xfffe, 0xe00d),
+          "Item Delimitation Item", "ItemDelimitationItem",  "See Note ", "1" },    { Tag(0xfffe, 0xe0dd),
+          "Sequence Delimitation Item", "SequenceDelimitationItem",  "See Note ", "1" },    };
+
+    std::map<std::string, odil::Tag> public_tags;
+
+    unsigned long const count = sizeof(raw_entries)/sizeof(RawElementsDictionaryEntry);
+    for(unsigned long i=0; i<count; ++i)
+    {
+        RawElementsDictionaryEntry const & raw_entry = raw_entries[i];
+        public_tags.insert(std::make_pair(raw_entry.keyword, raw_entry.key.get_tag()));
+    }
+
+    return public_tags;
+}
+
 struct RawUIDsDictionaryEntry
 {
     char const * uid;
@@ -8559,6 +12714,7 @@ UIDsDictionary create_uids_dictionary()
         { "1.2.840.10008.5.1.4.1.1.88.69", "Colon CAD SR Storage", "ColonCADSRStorage",  "SOP Class" },
         { "1.2.840.10008.5.1.4.1.1.88.70", "Implantation Plan SR Storage", "ImplantationPlanSRStorage",  "SOP Class" },
         { "1.2.840.10008.5.1.4.1.1.88.71", "Acquisition Context SR Storage", "AcquisitionContextSRStorage",  "SOP Class" },
+        { "1.2.840.10008.5.1.4.1.1.90.1", "Content Assessment Results Storage", "ContentAssessmentResultsStorage",  "SOP Class" },
         { "1.2.840.10008.5.1.4.1.1.104.1", "Encapsulated PDF Storage", "EncapsulatedPDFStorage",  "SOP Class" },
         { "1.2.840.10008.5.1.4.1.1.104.2", "Encapsulated CDA Storage", "EncapsulatedCDAStorage",  "SOP Class" },
         { "1.2.840.10008.5.1.4.1.1.128", "Positron Emission Tomography Image Storage", "PositronEmissionTomographyImageStorage",  "SOP Class" },
@@ -8710,4 +12866,5 @@ UIDsDictionary create_uids_dictionary()
 }
 
 odil::ElementsDictionary odil::registry::public_dictionary=odil::registry::create_public_dictionary();
+std::map<std::string, odil::Tag> odil::registry::public_tags=odil::registry::create_public_tags();
 odil::UIDsDictionary odil::registry::uids_dictionary=odil::registry::create_uids_dictionary();
\ No newline at end of file
diff --git a/src/odil/registry.h b/src/odil/registry.h
index 5a35c71..56ba225 100644
--- a/src/odil/registry.h
+++ b/src/odil/registry.h
@@ -9,6 +9,10 @@
 #ifndef _afc7b2d7_0869_4fea_9a9b_7fe6228baca9
 #define _afc7b2d7_0869_4fea_9a9b_7fe6228baca9
 
+#include <map>
+#include <string>
+
+#include "odil/odil.h"
 #include "odil/ElementsDictionary.h"
 #include "odil/Tag.h"
 #include "odil/UIDsDictionary.h"
@@ -277,6 +281,9 @@ Tag const GroupOfPatientsIdentificationSequence(0x0010, 0x0027);
 Tag const SubjectRelativePositionInImage(0x0010, 0x0028);
 Tag const PatientBirthDate(0x0010, 0x0030);
 Tag const PatientBirthTime(0x0010, 0x0032);
+Tag const PatientBirthDateInAlternativeCalendar(0x0010, 0x0033);
+Tag const PatientDeathDateInAlternativeCalendar(0x0010, 0x0034);
+Tag const PatientAlternativeCalendar(0x0010, 0x0035);
 Tag const PatientSex(0x0010, 0x0040);
 Tag const PatientInsurancePlanCodeSequence(0x0010, 0x0050);
 Tag const PatientPrimaryLanguageCodeSequence(0x0010, 0x0101);
@@ -723,6 +730,8 @@ Tag const ReceiveCoilName(0x0018, 0x1250);
 Tag const TransmitCoilName(0x0018, 0x1251);
 Tag const PlateType(0x0018, 0x1260);
 Tag const PhosphorType(0x0018, 0x1261);
+Tag const WaterEquivalentDiameter(0x0018, 0x1271);
+Tag const WaterEquivalentDiameterCalculationMethodCodeSequence(0x0018, 0x1272);
 Tag const ScanVelocity(0x0018, 0x1300);
 Tag const WholeBodyTechnique(0x0018, 0x1301);
 Tag const ScanLength(0x0018, 0x1302);
@@ -2908,17 +2917,30 @@ Tag const SelectorAttributeVR(0x0072, 0x0050);
 Tag const SelectorSequencePointer(0x0072, 0x0052);
 Tag const SelectorSequencePointerPrivateCreator(0x0072, 0x0054);
 Tag const SelectorAttributePrivateCreator(0x0072, 0x0056);
+Tag const SelectorAEValue(0x0072, 0x005e);
+Tag const SelectorASValue(0x0072, 0x005f);
 Tag const SelectorATValue(0x0072, 0x0060);
+Tag const SelectorDAValue(0x0072, 0x0061);
 Tag const SelectorCSValue(0x0072, 0x0062);
+Tag const SelectorDTValue(0x0072, 0x0063);
 Tag const SelectorISValue(0x0072, 0x0064);
+Tag const SelectorOBValue(0x0072, 0x0065);
 Tag const SelectorLOValue(0x0072, 0x0066);
+Tag const SelectorOFValue(0x0072, 0x0067);
 Tag const SelectorLTValue(0x0072, 0x0068);
+Tag const SelectorOWValue(0x0072, 0x0069);
 Tag const SelectorPNValue(0x0072, 0x006a);
+Tag const SelectorTMValue(0x0072, 0x006b);
 Tag const SelectorSHValue(0x0072, 0x006c);
+Tag const SelectorUNValue(0x0072, 0x006d);
 Tag const SelectorSTValue(0x0072, 0x006e);
+Tag const SelectorUCValue(0x0072, 0x006f);
 Tag const SelectorUTValue(0x0072, 0x0070);
+Tag const SelectorURValue(0x0072, 0x0071);
 Tag const SelectorDSValue(0x0072, 0x0072);
+Tag const SelectorODValue(0x0072, 0x0073);
 Tag const SelectorFDValue(0x0072, 0x0074);
+Tag const SelectorOLValue(0x0072, 0x0075);
 Tag const SelectorFLValue(0x0072, 0x0076);
 Tag const SelectorULValue(0x0072, 0x0078);
 Tag const SelectorUSValue(0x0072, 0x007a);
@@ -3116,6 +3138,29 @@ Tag const UValueData(0x0080, 0x0010);
 Tag const VValueData(0x0080, 0x0011);
 Tag const ReferencedTextureSequence(0x0080, 0x0012);
 Tag const ReferencedSurfaceDataSequence(0x0080, 0x0013);
+Tag const AssessmentSummary(0x0082, 0x0001);
+Tag const AssessmentSummaryDescription(0x0082, 0x0003);
+Tag const AssessedSOPInstanceSequence(0x0082, 0x0004);
+Tag const ReferencedComparisonSOPInstanceSequence(0x0082, 0x0005);
+Tag const NumberOfAssessmentObservations(0x0082, 0x0006);
+Tag const AssessmentObservationsSequence(0x0082, 0x0007);
+Tag const ObservationSignificance(0x0082, 0x0008);
+Tag const ObservationDescription(0x0082, 0x000a);
+Tag const StructuredContraintObservationSequence(0x0082, 0x000c);
+Tag const AssessedAttributeValueSequence(0x0082, 0x0010);
+Tag const AssessmentSetID(0x0082, 0x0016);
+Tag const AssessmentRequesterSequence(0x0082, 0x0017);
+Tag const SelectorAttributeName(0x0082, 0x0018);
+Tag const SelectorAttributeKeyword(0x0082, 0x0019);
+Tag const AssessmentTypeCodeSequence(0x0082, 0x0021);
+Tag const ObservationBasisCodeSequence(0x0082, 0x0022);
+Tag const AssessmentLabel(0x0082, 0x0023);
+Tag const ConstraintType(0x0082, 0x0032);
+Tag const SpecificationSelectionGuidance(0x0082, 0x0033);
+Tag const ConstraintValueSequence(0x0082, 0x0034);
+Tag const RecommendedDefaultValueSequence(0x0082, 0x0035);
+Tag const ConstraintViolationSignificance(0x0082, 0x0036);
+Tag const ConstraintViolationCondition(0x0082, 0x0037);
 Tag const StorageMediaFileSetID(0x0088, 0x0130);
 Tag const StorageMediaFileSetUID(0x0088, 0x0140);
 Tag const IconImageSequence(0x0088, 0x0200);
@@ -3651,6 +3696,12 @@ Tag const HeadFixationAngle(0x300a, 0x0148);
 Tag const GantryPitchAngle(0x300a, 0x014a);
 Tag const GantryPitchRotationDirection(0x300a, 0x014c);
 Tag const GantryPitchAngleTolerance(0x300a, 0x014e);
+Tag const FixationEye(0x300a, 0x0150);
+Tag const ChairHeadFramePosition(0x300a, 0x0151);
+Tag const HeadFixationAngleTolerance(0x300a, 0x0152);
+Tag const ChairHeadFramePositionTolerance(0x300a, 0x0153);
+Tag const FixationLightAzimuthalAngleTolerance(0x300a, 0x0154);
+Tag const FixationLightPolarAngleTolerance(0x300a, 0x0155);
 Tag const PatientSetupSequence(0x300a, 0x0180);
 Tag const PatientSetupNumber(0x300a, 0x0182);
 Tag const PatientSetupLabel(0x300a, 0x0183);
@@ -4344,6 +4395,7 @@ std::string const RadiopharmaceuticalRadiationDoseSRStorage("1.2.840.10008.5.1.4
 std::string const ColonCADSRStorage("1.2.840.10008.5.1.4.1.1.88.69");
 std::string const ImplantationPlanSRStorage("1.2.840.10008.5.1.4.1.1.88.70");
 std::string const AcquisitionContextSRStorage("1.2.840.10008.5.1.4.1.1.88.71");
+std::string const ContentAssessmentResultsStorage("1.2.840.10008.5.1.4.1.1.90.1");
 std::string const EncapsulatedPDFStorage("1.2.840.10008.5.1.4.1.1.104.1");
 std::string const EncapsulatedCDAStorage("1.2.840.10008.5.1.4.1.1.104.2");
 std::string const PositronEmissionTomographyImageStorage("1.2.840.10008.5.1.4.1.1.128");
@@ -4475,8 +4527,9 @@ std::string const dicomUniqueAETitle("1.2.840.10008.15.0.4.7");
 std::string const dicomTransferCapability("1.2.840.10008.15.0.4.8");
 std::string const UniversalCoordinatedTime("1.2.840.10008.15.1.1");
 
-extern ElementsDictionary public_dictionary;
-extern UIDsDictionary uids_dictionary;
+extern ODIL_API ElementsDictionary public_dictionary;
+extern ODIL_API std::map<std::string, Tag> public_tags;
+extern ODIL_API UIDsDictionary uids_dictionary;
 }
 
 }
diff --git a/src/odil/xml_converter.cpp b/src/odil/xml_converter.cpp
index 187497d..a97ce16 100644
--- a/src/odil/xml_converter.cpp
+++ b/src/odil/xml_converter.cpp
@@ -17,6 +17,7 @@
 namespace odil
 {
 
+/// @brief Element visitor converting to XML.
 struct ToXMLVisitor
 {
     typedef boost::property_tree::ptree result_type;
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 2541e6e..64b23aa 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -24,7 +24,7 @@ foreach(test_file ${tests})
 
     add_executable(test_${test} ${test_file} ${headers})
     target_link_libraries(test_${test} libodil ${Boost_LIBRARIES})
-    set_target_properties(test_${test} PROPERTIES OUTPUT_NAME ${test})
+    set_target_properties(test_${test} PROPERTIES OUTPUT_NAME ${test} FOLDER "Tests")
 
     file(READ ${test_file} content)
 
diff --git a/tests/code/EchoSCP.cpp b/tests/code/EchoSCP.cpp
index 8b29f65..799fc40 100644
--- a/tests/code/EchoSCP.cpp
+++ b/tests/code/EchoSCP.cpp
@@ -62,7 +62,7 @@ void run_server(Status * status)
 
 void run_client(Status * status, bool use_abort)
 {
-    std::string command = "echoscu";
+    std::string command = "echoscu -ll error";
     if(use_abort)
     {
         command += " --abort";
diff --git a/tests/code/GetSCP.cpp b/tests/code/GetSCP.cpp
index f1588f7..1c0a9e3 100644
--- a/tests/code/GetSCP.cpp
+++ b/tests/code/GetSCP.cpp
@@ -128,6 +128,7 @@ void run_server(Status * status)
 void run_client(Status * status)
 {
     std::string command = "getscu "
+        "-ll error "
         "-P -k QueryRetrieveLevel=PATIENT "
         "-k PatientID=* -k PatientName "
         "+B "
diff --git a/tests/code/GetSCU.cpp b/tests/code/GetSCU.cpp
index c71014b..97f47fd 100644
--- a/tests/code/GetSCU.cpp
+++ b/tests/code/GetSCU.cpp
@@ -9,7 +9,8 @@
 
 struct Fixture: public PeerFixtureBase
 {
-    static bool called;
+    static bool store_callback_called;
+    static bool get_callback_called;
 
     odil::DataSet query;
 
@@ -25,20 +26,27 @@ struct Fixture: public PeerFixtureBase
             }
         })
     {
-        Fixture::called = false;
+        Fixture::store_callback_called = false;
+        Fixture::get_callback_called = false;
 
         this->query.add("QueryRetrieveLevel", {"PATIENT"});
         this->query.add("PatientName", {"Doe^John"});
     }
 
 
-    static void callback(odil::DataSet const &)
+    static void store_callback(odil::DataSet const &)
     {
-        Fixture::called = true;
+        Fixture::store_callback_called = true;
+    }
+
+    static void get_callback(odil::message::CGetResponse const &)
+    {
+        Fixture::get_callback_called = true;
     }
 };
 
-bool Fixture::called = false;
+bool Fixture::store_callback_called = false;
+bool Fixture::get_callback_called = false;
 
 BOOST_FIXTURE_TEST_CASE(Get, Fixture)
 {
@@ -55,14 +63,26 @@ BOOST_FIXTURE_TEST_CASE(Get, Fixture)
                 {"2.25.95090344942250266709587559073467305647"}));
 }
 
-BOOST_FIXTURE_TEST_CASE(GetCallback, Fixture)
+BOOST_FIXTURE_TEST_CASE(GetBothCallbacks, Fixture)
 {
     odil::GetSCU scu(this->association);
 
     scu.set_affected_sop_class(
         odil::registry::PatientRootQueryRetrieveInformationModelGET);
-    scu.get(this->query, Fixture::callback);
+    scu.get(this->query, Fixture::store_callback, Fixture::get_callback);
 
-    BOOST_CHECK(Fixture::called);
+    BOOST_CHECK(Fixture::store_callback_called);
+    BOOST_CHECK(Fixture::get_callback_called);
 }
 
+BOOST_FIXTURE_TEST_CASE(GetOnlyStoreCallback, Fixture)
+{
+    odil::GetSCU scu(this->association);
+
+    scu.set_affected_sop_class(
+        odil::registry::PatientRootQueryRetrieveInformationModelGET);
+    scu.get(this->query, Fixture::store_callback);
+
+    BOOST_CHECK(Fixture::store_callback_called);
+    BOOST_CHECK(!Fixture::get_callback_called);
+}
diff --git a/tests/code/MoveSCP.cpp b/tests/code/MoveSCP.cpp
index 18fb15e..e6f261d 100644
--- a/tests/code/MoveSCP.cpp
+++ b/tests/code/MoveSCP.cpp
@@ -165,6 +165,7 @@ void run_server(Status * status)
 void run_client(Status * status)
 {
     std::string command = "movescu "
+        "-ll error "
         "-P -k QueryRetrieveLevel=PATIENT "
         "-k PatientID=* -k PatientName "
         "+P 11114 127.0.0.1 11113";
diff --git a/tests/code/MoveSCU.cpp b/tests/code/MoveSCU.cpp
index 598c043..59c8fec 100644
--- a/tests/code/MoveSCU.cpp
+++ b/tests/code/MoveSCU.cpp
@@ -9,7 +9,8 @@
 
 struct Fixture: public PeerFixtureBase
 {
-    static bool called;
+    static bool store_callback_called;
+    static bool move_callback_called;
 
     odil::DataSet query;
 
@@ -25,24 +26,32 @@ struct Fixture: public PeerFixtureBase
             }
         })
     {
-        Fixture::called = false;
+        Fixture::store_callback_called = false;
+        Fixture::move_callback_called = false;
 
         this->query.add("QueryRetrieveLevel", {"PATIENT"});
         this->query.add("PatientName", {"Doe^John"});
     }
 
-    static void callback(odil::DataSet const &)
+    static void store_callback(odil::DataSet const &)
     {
-        Fixture::called = true;
+        Fixture::store_callback_called = true;
+    }
+
+    static void move_callback(odil::message::CMoveResponse const &)
+    {
+        Fixture::move_callback_called = true;
     }
 };
 
-bool Fixture::called = false;
+bool Fixture::store_callback_called = false;
+bool Fixture::move_callback_called = false;
 
 BOOST_FIXTURE_TEST_CASE(DefaultConstructor, Fixture)
 {
     odil::MoveSCU const scu(this->association);
     BOOST_CHECK_EQUAL(scu.get_move_destination(), "");
+    BOOST_CHECK_EQUAL(scu.get_incoming_port(), 0);
 }
 
 BOOST_FIXTURE_TEST_CASE(MoveDestination, Fixture)
@@ -52,10 +61,18 @@ BOOST_FIXTURE_TEST_CASE(MoveDestination, Fixture)
     BOOST_CHECK_EQUAL(scu.get_move_destination(), "remote");
 }
 
+BOOST_FIXTURE_TEST_CASE(IncomingPort, Fixture)
+{
+    odil::MoveSCU scu(this->association);
+    scu.set_incoming_port(11113);
+    BOOST_CHECK_EQUAL(scu.get_incoming_port(), 11113);
+}
+
 BOOST_FIXTURE_TEST_CASE(Move, Fixture)
 {
     odil::MoveSCU scu(this->association);
     scu.set_move_destination("LOCAL");
+    scu.set_incoming_port(11113);
 
     scu.set_affected_sop_class(
         odil::registry::PatientRootQueryRetrieveInformationModelMOVE);
@@ -67,14 +84,31 @@ BOOST_FIXTURE_TEST_CASE(Move, Fixture)
             odil::Value::Strings{"2.25.95090344942250266709587559073467305647"});
 }
 
-BOOST_FIXTURE_TEST_CASE(MoveCallback, Fixture)
+BOOST_FIXTURE_TEST_CASE(MoveBothCallback, Fixture)
+{
+    odil::MoveSCU scu(this->association);
+    scu.set_move_destination("LOCAL");
+    scu.set_incoming_port(11113);
+
+    scu.set_affected_sop_class(
+        odil::registry::PatientRootQueryRetrieveInformationModelMOVE);
+    scu.move(this->query, Fixture::store_callback, Fixture::move_callback);
+
+    BOOST_CHECK(Fixture::store_callback_called);
+    BOOST_CHECK(Fixture::move_callback_called);
+}
+
+BOOST_FIXTURE_TEST_CASE(MoveOnlyStoreCallback, Fixture)
 {
     odil::MoveSCU scu(this->association);
     scu.set_move_destination("LOCAL");
+    scu.set_incoming_port(11113);
 
     scu.set_affected_sop_class(
         odil::registry::PatientRootQueryRetrieveInformationModelMOVE);
-    scu.move(this->query, Fixture::callback);
+    scu.move(
+        this->query, Fixture::store_callback, odil::MoveSCU::MoveCallback());
 
-    BOOST_CHECK(Fixture::called);
+    BOOST_CHECK(Fixture::store_callback_called);
+    BOOST_CHECK(!Fixture::move_callback_called);
 }
diff --git a/tests/code/SCPDispatcher.cpp b/tests/code/SCPDispatcher.cpp
index f1d746c..3280232 100644
--- a/tests/code/SCPDispatcher.cpp
+++ b/tests/code/SCPDispatcher.cpp
@@ -68,7 +68,7 @@ void run_server(Status * status, bool with_echo)
 
 void run_echo_client(Status * status)
 {
-    std::string command = "echoscu";
+    std::string command = "echoscu -ll error";
     command += " 127.0.0.1 11113";
     status->client = system(command.c_str());
 }
diff --git a/tests/run b/tests/run
index a2737e9..c41e6d4 100755
--- a/tests/run
+++ b/tests/run
@@ -53,9 +53,10 @@ def main():
     environment["ODIL_PEER_HOST_NAME"] = "127.0.0.1"
     environment["ODIL_PEER_PORT"] = "11112"
     environment["ODIL_PEER_AET"] = "REMOTE"
-    environment["PATH"] = os.pathsep.join(["tests/tools", environment["PATH"]])
+    environment["PATH"] = os.pathsep.join(
+        [os.path.abspath("tests/tools"), environment["PATH"]])
     environment["PYTHONPATH"] = os.pathsep.join(
-        ["wrappers", environment.get("PYTHONPATH", "")])
+        [os.path.abspath("wrappers"), environment.get("PYTHONPATH", "")])
 
     source_directory = None
     with open("CMakeCache.txt") as fd:
@@ -122,6 +123,7 @@ AETable END
             stdin=read)
         subprocess.check_call([
             "storescu",
+            "-ll", "error",
             "-aet", "LOCAL", "-aec", "REMOTE",
             "localhost", "11112",
             os.path.join(directory, "data.dcm")])
diff --git a/tests/wrappers/test_data_set.py b/tests/wrappers/test_data_set.py
index c43e533..d0ca2ac 100644
--- a/tests/wrappers/test_data_set.py
+++ b/tests/wrappers/test_data_set.py
@@ -9,19 +9,6 @@ class TestDataSet(unittest.TestCase):
         self.assertEqual(data_set.size(), 0)
         self.assertEqual(len(data_set), 0)
 
-    def test_empty_element(self):
-        tag = odil.registry.PatientName
-        data_set = odil.DataSet()
-        data_set.add(tag, odil.Element())
-
-        self.assertFalse(data_set.empty())
-        self.assertEqual(data_set.size(), 1)
-        self.assertEqual(len(data_set), 1)
-
-        self.assertEqual(data_set.get_vr(tag), odil.VR.INVALID)
-        self.assertTrue(data_set.empty(tag))
-        self.assertEqual(data_set.size(tag), 0)
-
     def test_empty_element_tag(self):
         tag = odil.registry.PatientName
         data_set = odil.DataSet()
@@ -39,7 +26,7 @@ class TestDataSet(unittest.TestCase):
         tag = odil.registry.SelectorUSValue
         value = [1, 2, 3]
         data_set = odil.DataSet()
-        data_set.add(tag, odil.Value.Integers(value))
+        data_set.add(tag, value)
 
         self.assertFalse(data_set.empty())
         self.assertEqual(data_set.size(), 1)
@@ -49,13 +36,26 @@ class TestDataSet(unittest.TestCase):
         self.assertFalse(data_set.empty(tag))
         self.assertEqual(data_set.size(tag), 3)
         self.assertTrue(data_set.is_int(tag))
-        self.assertEqual([x for x in data_set.as_int(tag)], value)
+        self.assertSequenceEqual(data_set.as_int(tag), value)
+
+        value = [4, 5]
+        data_set.set(tag, value)
+
+        self.assertFalse(data_set.empty())
+        self.assertEqual(data_set.size(), 1)
+        self.assertEqual(len(data_set), 1)
+
+        self.assertEqual(data_set.get_vr(tag), odil.VR.US)
+        self.assertFalse(data_set.empty(tag))
+        self.assertEqual(data_set.size(tag), len(value))
+        self.assertTrue(data_set.is_int(tag))
+        self.assertSequenceEqual(data_set.as_int(tag), value)
 
     def test_real_element(self):
         tag = odil.registry.SelectorFLValue
         value = [1.1, 2, 3.3]
         data_set = odil.DataSet()
-        data_set.add(tag, odil.Value.Reals(value))
+        data_set.add(tag, value)
 
         self.assertFalse(data_set.empty())
         self.assertEqual(data_set.size(), 1)
@@ -65,13 +65,26 @@ class TestDataSet(unittest.TestCase):
         self.assertFalse(data_set.empty(tag))
         self.assertEqual(data_set.size(tag), 3)
         self.assertTrue(data_set.is_real(tag))
-        self.assertEqual([x for x in data_set.as_real(tag)], value)
+        self.assertSequenceEqual(data_set.as_real(tag), value)
+
+        value = [4.4, 5]
+        data_set.set(tag, value)
+
+        self.assertFalse(data_set.empty())
+        self.assertEqual(data_set.size(), 1)
+        self.assertEqual(len(data_set), 1)
+
+        self.assertEqual(data_set.get_vr(tag), odil.VR.FL)
+        self.assertFalse(data_set.empty(tag))
+        self.assertEqual(data_set.size(tag), len(value))
+        self.assertTrue(data_set.is_real(tag))
+        self.assertSequenceEqual(data_set.as_real(tag), value)
 
     def test_string_element(self):
         tag = odil.registry.SelectorCSValue
         value = ["foo", "bar"]
         data_set = odil.DataSet()
-        data_set.add(tag, odil.Value.Strings(value))
+        data_set.add(tag, value)
 
         self.assertFalse(data_set.empty())
         self.assertEqual(data_set.size(), 1)
@@ -81,14 +94,26 @@ class TestDataSet(unittest.TestCase):
         self.assertFalse(data_set.empty(tag))
         self.assertEqual(data_set.size(tag), 2)
         self.assertTrue(data_set.is_string(tag))
-        self.assertEqual([x for x in data_set.as_string(tag)], value)
+        self.assertSequenceEqual(data_set.as_string(tag), value)
+
+        value = ["baz"]
+        data_set.set(tag, value)
+
+        self.assertFalse(data_set.empty())
+        self.assertEqual(data_set.size(), 1)
+        self.assertEqual(len(data_set), 1)
+
+        self.assertEqual(data_set.get_vr(tag), odil.VR.CS)
+        self.assertFalse(data_set.empty(tag))
+        self.assertEqual(data_set.size(tag), len(value))
+        self.assertTrue(data_set.is_string(tag))
+        self.assertSequenceEqual(data_set.as_string(tag), value)
 
     def test_data_set_element(self):
         tag = odil.registry.SelectorCodeSequenceValue
         value = [odil.DataSet(), odil.DataSet()]
         data_set = odil.DataSet()
-        data_set.add(
-            tag, odil.Value.DataSets(value))
+        data_set.add(tag, value)
 
         self.assertFalse(data_set.empty())
         self.assertEqual(data_set.size(), 1)
@@ -98,13 +123,26 @@ class TestDataSet(unittest.TestCase):
         self.assertFalse(data_set.empty(tag))
         self.assertEqual(data_set.size(tag), 2)
         self.assertTrue(data_set.is_data_set(tag))
-        self.assertEqual([x for x in data_set.as_data_set(tag)], value)
+        self.assertSequenceEqual(data_set.as_data_set(tag), value)
+
+        value = [odil.DataSet()]
+        data_set.set(tag, value)
 
-    def test_string_binary(self):
+        self.assertFalse(data_set.empty())
+        self.assertEqual(data_set.size(), 1)
+        self.assertEqual(len(data_set), 1)
+
+        self.assertEqual(data_set.get_vr(tag), odil.VR.SQ)
+        self.assertFalse(data_set.empty(tag))
+        self.assertEqual(data_set.size(tag), len(value))
+        self.assertTrue(data_set.is_data_set(tag))
+        self.assertSequenceEqual(data_set.as_data_set(tag), value)
+
+    def test_binary_element(self):
         tag = odil.registry.RedPaletteColorLookupTableData
-        value = [odil.Value.BinaryItem("\x01\x02")]
+        value = [bytearray("\x01\x02\x03")]
         data_set = odil.DataSet()
-        data_set.add(tag, odil.Value.Binary(value))
+        data_set.add(tag, value)
 
         self.assertFalse(data_set.empty())
         self.assertEqual(data_set.size(), 1)
@@ -114,53 +152,67 @@ class TestDataSet(unittest.TestCase):
         self.assertFalse(data_set.empty(tag))
         self.assertEqual(data_set.size(tag), 1)
         self.assertTrue(data_set.is_binary(tag))
-        self.assertEqual(
-            [x for x in data_set.as_binary(tag)[0]], [x for x in value[0]])
+        self.assertSequenceEqual(
+            [bytearray([x for x in item]) for item in data_set.as_binary(tag)],
+            value)
+
+        value = [bytearray("\x04\x05")]
+        data_set.set(tag, value)
+
+        self.assertFalse(data_set.empty())
+        self.assertEqual(data_set.size(), 1)
+        self.assertEqual(len(data_set), 1)
+
+        self.assertEqual(data_set.get_vr(tag), odil.VR.OW)
+        self.assertFalse(data_set.empty(tag))
+        self.assertEqual(data_set.size(tag), len(value))
+        self.assertTrue(data_set.is_binary(tag))
+        self.assertSequenceEqual(
+            [bytearray([x for x in item]) for item in data_set.as_binary(tag)],
+            value)
 
     def test_getitem(self):
         data_set = odil.DataSet()
-        data_set.add(odil.registry.PatientName, odil.Value.Strings(["Doe^John"]))
-        self.assertEqual(
-            [x for x in data_set[odil.registry.PatientName].as_string()],
-            ["Doe^John"])
-        self.assertRaises(Exception, lambda x: data_set[odil.registry.PatientID])
+        data_set.add("PatientName", ["Doe^John"])
+        self.assertSequenceEqual(
+            data_set["PatientName"].as_string(), ["Doe^John"])
+        self.assertRaises(Exception, lambda x: data_set["PatientID"])
 
     def test_iter(self):
         data_set = odil.DataSet()
-        data_set.add(odil.registry.PatientName, odil.Value.Strings(["Doe^John"]))
-        data_set.add(odil.registry.PatientID, odil.Value.Strings(["DJ123"]))
+        data_set.add("PatientName", ["Doe^John"])
+        data_set.add("PatientID", ["DJ123"])
         self.assertEqual(
             [x.get_name() for x in data_set],
             ["PatientName", "PatientID"])
 
     def test_keys(self):
         data_set = odil.DataSet()
-        data_set.add(odil.registry.PatientName, odil.Value.Strings(["Doe^John"]))
-        data_set.add(odil.registry.PatientID, odil.Value.Strings(["DJ123"]))
+        data_set.add("PatientName", ["Doe^John"])
+        data_set.add("PatientID", ["DJ123"])
         self.assertEqual(
             [x.get_name() for x in data_set.keys()],
             ["PatientName", "PatientID"])
 
     def test_values(self):
         data_set = odil.DataSet()
-        data_set.add(odil.registry.PatientName, odil.Value.Strings(["Doe^John"]))
-        data_set.add(odil.registry.PatientID, odil.Value.Strings(["DJ123"]))
+        data_set.add("PatientName", ["Doe^John"])
+        data_set.add("PatientID", ["DJ123"])
         self.assertEqual(
             [
-                [item for item in element.as_string()] 
+                [item for item in element.as_string()]
                 for element in data_set.values()],
             [["Doe^John"], ["DJ123"]])
 
     def test_items(self):
         data_set = odil.DataSet()
-        data_set.add(odil.registry.PatientName, odil.Value.Strings(["Doe^John"]))
-        data_set.add(odil.registry.PatientID, odil.Value.Strings(["DJ123"]))
-        self.assertEqual(
+        data_set.add("PatientName", ["Doe^John"])
+        data_set.add("PatientID", ["DJ123"])
+        self.assertSequenceEqual(
             [
-                [tag.get_name(), [item for item in element.as_string()]] 
+                [tag.get_name(), [item for item in element.as_string()]]
                 for tag, element in data_set.items()],
             [["PatientName", ["Doe^John"]], ["PatientID", ["DJ123"]]])
 
 if __name__ == "__main__":
     unittest.main()
-
diff --git a/tests/wrappers/test_echo_scp.py b/tests/wrappers/test_echo_scp.py
new file mode 100644
index 0000000..dbf9bc5
--- /dev/null
+++ b/tests/wrappers/test_echo_scp.py
@@ -0,0 +1,72 @@
+import multiprocessing
+import subprocess
+import time
+import unittest
+
+import odil
+
+class TestEchoSCP(unittest.TestCase):
+    def test_echo_scp_release(self):
+        process = multiprocessing.Process(target=lambda: self.run_server(False))
+        process.start()
+        time.sleep(0.5)
+        client_code = self.run_client(False)
+        process.join(2)
+        server_code = process.exitcode
+        
+        self.assertEqual(client_code, 0)
+        self.assertEqual(server_code, 0)
+    
+    def test_echo_scp_abort(self):
+        process = multiprocessing.Process(target=lambda: self.run_server(True))
+        process.start()
+        time.sleep(0.5)
+        client_code = self.run_client(True)
+        process.join(2)
+        server_code = process.exitcode
+        
+        self.assertEqual(client_code, 0)
+        self.assertEqual(server_code, 0)
+    
+    def run_client(self, use_abort):
+        command = ["echoscu", "-q"]
+        if use_abort:
+            command.append("--abort")
+        command.extend(["localhost", "11113"])
+        
+        return subprocess.call(command)
+
+    def run_server(self, use_abort):
+        called = False
+        def echo_callback(message):
+            called = True
+            return 0
+
+        association = odil.Association()
+        association.set_tcp_timeout(1)
+        association.receive_association("v4", 11113)
+
+        echo_scp = odil.EchoSCP(association)
+        echo_scp.set_callback(echo_callback)
+
+        message = association.receive_message()
+        echo_scp(message)
+        
+        termination_ok = False
+
+        try:
+            association.receive_message()
+        except odil.AssociationReleased:
+            if not use_abort:
+                termination_ok = True
+        except odil.AssociationAborted:
+            if use_abort:
+                termination_ok = True
+        
+        if called and termination_ok:
+            return 0
+        else:
+            return 1
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/tests/wrappers/test_element.py b/tests/wrappers/test_element.py
index 1fcbe74..01cac2c 100644
--- a/tests/wrappers/test_element.py
+++ b/tests/wrappers/test_element.py
@@ -12,41 +12,42 @@ class TestElement(unittest.TestCase):
 
     def test_integers_constructor(self):
         items = [1, 2, 3]
-        element = odil.Element(odil.Value.Integers(items), odil.VR.US)
-        self.assertEqual([x for x in element.as_int()], items)
+        element = odil.Element(items, odil.VR.US)
+        self.assertSequenceEqual(element.as_int(), items)
         self.assertEqual(element.vr, odil.VR.US)
         self.assertEqual(element.size(), 3)
         self.assertEqual(len(element), 3)
 
     def test_reals_constructor(self):
         items = [1.1, 2, 3.3]
-        element = odil.Element(odil.Value.Reals(items), odil.VR.FL)
-        self.assertEqual([x for x in element.as_real()], items)
+        element = odil.Element(items, odil.VR.FL)
+        self.assertSequenceEqual(element.as_real(), items)
         self.assertEqual(element.vr, odil.VR.FL)
         self.assertEqual(element.size(), 3)
         self.assertEqual(len(element), 3)
 
     def test_strings_constructor(self):
         items = ["foo", "bar"]
-        element = odil.Element(odil.Value.Strings(items), odil.VR.CS)
-        self.assertEqual([x for x in element.as_string()], items)
+        element = odil.Element(items, odil.VR.CS)
+        self.assertSequenceEqual(element.as_string(), items)
         self.assertEqual(element.vr, odil.VR.CS)
         self.assertEqual(element.size(), 2)
         self.assertEqual(len(element), 2)
 
     def test_data_sets_constructor(self):
         items = [odil.DataSet(), odil.DataSet()]
-        element = odil.Element(odil.Value.DataSets(items), odil.VR.SQ)
-        self.assertEqual([x for x in element.as_data_set()], items)
+        element = odil.Element(items, odil.VR.SQ)
+        self.assertSequenceEqual(element.as_data_set(), items)
         self.assertEqual(element.vr, odil.VR.SQ)
         self.assertEqual(element.size(), 2)
         self.assertEqual(len(element), 2)
 
     def test_binary_constructor(self):
-        items = [odil.Value.BinaryItem("\x01\x02\x03")]
-        element = odil.Element(odil.Value.Binary(items), odil.VR.OB)
-        self.assertEqual(
-            [x for x in element.as_binary()[0]], [x for x in items[0]])
+        items = [bytearray("\x01\x02\x03")]
+        element = odil.Element(items, odil.VR.OB)
+        self.assertSequenceEqual(
+            [bytearray([x for x in item]) for item in element.as_binary()], 
+            items)
         self.assertEqual(element.vr, odil.VR.OB)
         self.assertEqual(element.size(), 1)
         self.assertEqual(len(element), 1)
diff --git a/tests/wrappers/test_exception.py b/tests/wrappers/test_exception.py
new file mode 100644
index 0000000..9c4f561
--- /dev/null
+++ b/tests/wrappers/test_exception.py
@@ -0,0 +1,25 @@
+import unittest
+
+import odil
+
+class TestException(unittest.TestCase):
+    def test_python_generic(self):
+        with self.assertRaises(Exception):
+            raise odil.Exception()
+    
+    def test_python_specific(self):
+        with self.assertRaises(odil.Exception):
+            raise odil.Exception()
+
+    def test_cpp_generic(self):
+        tag = odil.Tag(0xdead, 0xbeef)
+        with self.assertRaises(Exception):
+            tag.get_name()
+    
+    def test_cpp_specific(self):
+        tag = odil.Tag(0xdead, 0xbeef)
+        with self.assertRaises(odil.Exception):
+            tag.get_name()
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/tests/wrappers/test_find_scp.py b/tests/wrappers/test_find_scp.py
new file mode 100644
index 0000000..9194fde
--- /dev/null
+++ b/tests/wrappers/test_find_scp.py
@@ -0,0 +1,109 @@
+import glob
+import multiprocessing
+import os
+import subprocess
+import time
+import unittest
+
+import odil
+
+class Generator(odil.FindSCP.DataSetGenerator):
+    def __init__(self):
+        odil.FindSCP.DataSetGenerator.__init__(self)
+        self._responses = []
+        self._response_index = None
+        
+    def initialize(self, message):
+        data_set_1 = odil.DataSet()
+        data_set_1.add("PatientName", ["Hello^World"])
+        data_set_1.add("PatientID", ["1234"])
+        self._responses.append(data_set_1)
+        
+        data_set_2 = odil.DataSet()
+        data_set_2.add("PatientName", ["Doe^John"])
+        data_set_2.add("PatientID", ["5678"])
+        self._responses.append(data_set_2)
+        
+        self._response_index = 0
+    
+    def done(self):
+        return (self._response_index == len(self._responses))
+    
+    def next(self):
+        self._response_index += 1
+    
+    def get(self):
+        return self._responses[self._response_index]
+
+class TestFindSCP(unittest.TestCase):
+    def test_find_scp_release(self):
+        process = multiprocessing.Process(target=self.run_server)
+        process.start()
+        time.sleep(0.5)
+        data_sets = self.run_client()
+        process.join(2)
+        server_code = process.exitcode
+        
+        self.assertEqual(server_code, 0)
+        
+        self.assertEqual(len(data_sets), 2)
+        
+        self.assertEqual(len(data_sets[0]), 2)
+        
+        self.assertSequenceEqual(
+            data_sets[0].as_string("PatientName"), ["Hello^World"])
+        self.assertSequenceEqual(data_sets[0].as_string("PatientID"), ["1234"])
+        
+        self.assertSequenceEqual(
+            data_sets[1].as_string("PatientName"), ["Doe^John"])
+        self.assertSequenceEqual(data_sets[1].as_string("PatientID"), ["5678"])
+    
+    def run_client(self):
+        command = [
+            "findscu",
+            "-P", "-k", "QueryRetrieveLevel=PATIENT",
+            "-k", "PatientID=*", "-k", "PatientName",
+            "-q", "-X",
+            "localhost", "11113"]
+        
+        retcode = subprocess.call(command)
+        if retcode != 0:
+            return []
+        
+        files = sorted(glob.glob("rsp*"))
+        data_sets = [odil.read(x)[1] for x in files]
+        for file_ in files:
+            os.remove(file_)
+        
+        return data_sets
+
+    def run_server(self):
+        called = False
+
+        association = odil.Association()
+        association.set_tcp_timeout(1)
+        association.receive_association("v4", 11113)
+
+        find_scp = odil.FindSCP(association)
+        generator = Generator()
+        find_scp.set_generator(generator)
+
+        message = association.receive_message()
+        find_scp(message)
+        
+        termination_ok = False
+
+        try:
+            association.receive_message()
+        except odil.AssociationReleased:
+            termination_ok = True
+        except odil.AssociationAborted:
+            pass
+        
+        if called and termination_ok:
+            return 0
+        else:
+            return 1
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/tests/wrappers/test_find_scu.py b/tests/wrappers/test_find_scu.py
index 40eb177..a5f0a80 100644
--- a/tests/wrappers/test_find_scu.py
+++ b/tests/wrappers/test_find_scu.py
@@ -19,9 +19,9 @@ class TestFindSCU(PeerFixtureBase):
         )
 
         self.query = odil.DataSet()
-        self.query.add(odil.registry.PatientName, odil.Value.Strings(["Doe^John"]))
-        self.query.add(odil.registry.QueryRetrieveLevel, odil.Value.Strings(["PATIENT"]))
-        self.query.add(odil.registry.PatientID)
+        self.query.add("PatientName", ["Doe^John"])
+        self.query.add("QueryRetrieveLevel", ["PATIENT"])
+        self.query.add("PatientID")
 
     def test_without_callback(self):
         find = odil.FindSCU(self.association)
@@ -29,9 +29,8 @@ class TestFindSCU(PeerFixtureBase):
         data_sets = find.find(self.query)
 
         self.assertEqual(len(data_sets), 1)
-        self.assertEqual(
-            [x for x in data_sets[0].as_string(odil.registry.PatientID)],
-            ["DJ001"])
+        self.assertSequenceEqual(
+            data_sets[0].as_string("PatientID"), ["DJ001"])
 
     def test_with_callback(self):
         data_sets = []
@@ -43,9 +42,8 @@ class TestFindSCU(PeerFixtureBase):
         find.find(self.query, callback)
 
         self.assertEqual(len(data_sets), 1)
-        self.assertEqual(
-            [x for x in data_sets[0].as_string(odil.registry.PatientID)],
-            ["DJ001"])
+        self.assertSequenceEqual(
+            data_sets[0].as_string("PatientID"), ["DJ001"])
 
 if __name__ == "__main__":
     unittest.main()
diff --git a/tests/wrappers/test_get_scp.py b/tests/wrappers/test_get_scp.py
new file mode 100644
index 0000000..96f2b2e
--- /dev/null
+++ b/tests/wrappers/test_get_scp.py
@@ -0,0 +1,133 @@
+import glob
+import multiprocessing
+import os
+import subprocess
+import time
+import unittest
+
+import odil
+
+class Generator(odil.GetSCP.DataSetGenerator):
+    def __init__(self):
+        odil.GetSCP.DataSetGenerator.__init__(self)
+        self._responses = []
+        self._response_index = None
+        
+    def initialize(self, message):
+        data_set_1 = odil.DataSet()
+        data_set_1.add("SOPClassUID", [odil.registry.RawDataStorage])
+        data_set_1.add(
+            "SOPInstanceUID", 
+            ["1.2.826.0.1.3680043.9.5560.3127449359877365688774406533090568532"])
+        data_set_1.add("PatientName", ["Hello^World"])
+        data_set_1.add("PatientID", ["1234"])
+        self._responses.append(data_set_1)
+        
+        data_set_2 = odil.DataSet()
+        data_set_2.add("SOPClassUID", [odil.registry.RawDataStorage])
+        data_set_2.add(
+            "SOPInstanceUID", 
+            ["1.2.826.0.1.3680043.9.5560.3221615743193123463515381981101110692"])
+        data_set_2.add("PatientName", ["Doe^John"])
+        data_set_2.add("PatientID", ["5678"])
+        self._responses.append(data_set_2)
+        
+        self._response_index = 0
+    
+    def done(self):
+        return (self._response_index == len(self._responses))
+    
+    def next(self):
+        self._response_index += 1
+    
+    def get(self):
+        return self._responses[self._response_index]
+    
+    def count(self):
+        return 2
+
+class TestGetSCP(unittest.TestCase):
+    def test_get_scp_release(self):
+        process = multiprocessing.Process(target=self.run_server)
+        process.start()
+        time.sleep(0.5)
+        data_sets = self.run_client()
+        process.join(2)
+        server_code = process.exitcode
+        
+        self.assertEqual(server_code, 0)
+        
+        self.assertEqual(len(data_sets), 2)
+        
+        self.assertEqual(len(data_sets[0]), 4)
+        
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPClassUID"), 
+            [odil.registry.RawDataStorage])
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPInstanceUID"), 
+            ["1.2.826.0.1.3680043.9.5560.3127449359877365688774406533090568532"])
+        self.assertSequenceEqual(
+            data_sets[0].as_string("PatientName"), ["Hello^World"])
+        self.assertSequenceEqual(data_sets[0].as_string("PatientID"), ["1234"])
+        
+        self.assertSequenceEqual(
+            data_sets[1].as_string("SOPClassUID"), 
+            [odil.registry.RawDataStorage])
+        self.assertSequenceEqual(
+            data_sets[1].as_string("SOPInstanceUID"), 
+            ["1.2.826.0.1.3680043.9.5560.3221615743193123463515381981101110692"])
+        self.assertSequenceEqual(
+            data_sets[1].as_string("PatientName"), ["Doe^John"])
+        self.assertSequenceEqual(data_sets[1].as_string("PatientID"), ["5678"])
+    
+    def run_client(self):
+        command = [
+            "getscu", 
+            "-ll", "error",
+            "-P", "-k", "QueryRetrieveLevel=PATIENT",
+            "-k", "PatientID=*", "-k", "PatientName",
+            "+B",
+            "localhost", "11113"]
+        
+        retcode = subprocess.call(command)
+        if retcode != 0:
+            return []
+        
+        files = sorted(glob.glob("{}*".format(odil.uid_prefix)))
+        data_sets = [odil.read(x)[1] for x in files]
+        for file_ in files:
+            os.remove(file_)
+        
+        return data_sets
+
+    def run_server(self):
+        called = False
+
+        association = odil.Association()
+        association.set_tcp_timeout(1)
+        association.receive_association("v4", 11113)
+
+        get_scp = odil.GetSCP(association)
+        generator = Generator()
+        get_scp.set_generator(generator)
+
+        message = association.receive_message()
+        get_scp(message)
+        
+        termination_ok = False
+
+        try:
+            association.receive_message()
+        except odil.AssociationReleased:
+            termination_ok = True
+        except odil.AssociationAborted:
+            pass
+        
+        if called and termination_ok:
+            return 0
+        else:
+            return 1
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/tests/wrappers/test_get_scu.py b/tests/wrappers/test_get_scu.py
index 7d2dd35..2940aa7 100644
--- a/tests/wrappers/test_get_scu.py
+++ b/tests/wrappers/test_get_scu.py
@@ -23,8 +23,8 @@ class TestGetSCU(PeerFixtureBase):
             ])
 
         self.query = odil.DataSet()
-        self.query.add(odil.registry.PatientName, odil.Value.Strings(["Doe^John"]))
-        self.query.add(odil.registry.QueryRetrieveLevel, odil.Value.Strings(["PATIENT"]))
+        self.query.add("PatientName", ["Doe^John"])
+        self.query.add("QueryRetrieveLevel", ["PATIENT"])
 
     def test_without_callback(self):
         get = odil.GetSCU(self.association)
@@ -32,22 +32,58 @@ class TestGetSCU(PeerFixtureBase):
         data_sets = get.get(self.query)
 
         self.assertEqual(len(data_sets), 1)
-        self.assertEqual(
-            [x for x in data_sets[0].as_string(odil.registry.SOPInstanceUID)],
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPInstanceUID"),
             ["2.25.95090344942250266709587559073467305647"])
 
-    def test_with_callback(self):
+    def test_both_callbacks(self):
         data_sets = []
-        def callback(data_set):
+        messages = []
+        def store_callback(data_set):
             data_sets.append(data_set)
+        def get_callback(message):
+            messages.append(message)
 
         get = odil.GetSCU(self.association)
-        get.set_affected_sop_class(odil.registry.PatientRootQueryRetrieveInformationModelGET)
-        get.get(self.query, callback)
+        get.set_affected_sop_class(
+            odil.registry.PatientRootQueryRetrieveInformationModelGET)
+        get.get(self.query, store_callback, get_callback)
 
         self.assertEqual(len(data_sets), 1)
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPInstanceUID"),
+            ["2.25.95090344942250266709587559073467305647"])
+
+        self.assertEqual(len(messages), 2)
+
+        self.assertEqual(
+            messages[0].get_number_of_remaining_sub_operations(), 0)
+        self.assertEqual(
+            messages[0].get_number_of_completed_sub_operations(), 1)
+        self.assertEqual(messages[0].get_number_of_failed_sub_operations(), 0)
+        self.assertEqual(messages[0].get_number_of_warning_sub_operations(), 0)
+
+        self.assertFalse(messages[1].has_number_of_remaining_sub_operations())
+        self.assertEqual(
+            messages[1].has_number_of_completed_sub_operations(), 1)
         self.assertEqual(
-            [x for x in data_sets[0].as_string(odil.registry.SOPInstanceUID)],
+            messages[1].get_number_of_failed_sub_operations(), 0)
+        self.assertEqual(
+            messages[1].get_number_of_warning_sub_operations(), 0)
+
+    def test_only_store_callback(self):
+        data_sets = []
+        def store_callback(data_set):
+            data_sets.append(data_set)
+
+        get = odil.GetSCU(self.association)
+        get.set_affected_sop_class(
+            odil.registry.PatientRootQueryRetrieveInformationModelGET)
+        get.get(self.query, store_callback)
+
+        self.assertEqual(len(data_sets), 1)
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPInstanceUID"),
             ["2.25.95090344942250266709587559073467305647"])
 
 if __name__ == "__main__":
diff --git a/tests/wrappers/test_move_scp.py b/tests/wrappers/test_move_scp.py
new file mode 100644
index 0000000..d1e2067
--- /dev/null
+++ b/tests/wrappers/test_move_scp.py
@@ -0,0 +1,157 @@
+import glob
+import multiprocessing
+import os
+import subprocess
+import time
+import unittest
+
+import odil
+
+class Generator(odil.MoveSCP.DataSetGenerator):
+    def __init__(self, association):
+        odil.MoveSCP.DataSetGenerator.__init__(self)
+        self._association = association
+        self._responses = []
+        self._response_index = None
+        
+    def initialize(self, message):
+        data_set_1 = odil.DataSet()
+        data_set_1.add("SOPClassUID", [odil.registry.RawDataStorage])
+        data_set_1.add(
+            "SOPInstanceUID", 
+            ["1.2.826.0.1.3680043.9.5560.3127449359877365688774406533090568532"])
+        data_set_1.add("PatientName", ["Hello^World"])
+        data_set_1.add("PatientID", ["1234"])
+        self._responses.append(data_set_1)
+        
+        data_set_2 = odil.DataSet()
+        data_set_2.add("SOPClassUID", [odil.registry.RawDataStorage])
+        data_set_2.add(
+            "SOPInstanceUID", 
+            ["1.2.826.0.1.3680043.9.5560.3221615743193123463515381981101110692"])
+        data_set_2.add("PatientName", ["Doe^John"])
+        data_set_2.add("PatientID", ["5678"])
+        self._responses.append(data_set_2)
+        
+        self._response_index = 0
+    
+    def done(self):
+        return (self._response_index == len(self._responses))
+    
+    def next(self):
+        self._response_index += 1
+    
+    def get(self):
+        return self._responses[self._response_index]
+    
+    def count(self):
+        return 2
+    
+    def get_association(self, request):
+        move_association = odil.Association()
+        move_association.set_peer_host(self._association.get_peer_host())
+        move_association.set_peer_port(11114)
+        
+        presentation_contexts = []
+        for entry in odil.registry.uids_dictionary:
+            if entry.data().name[-7:] == "Storage":
+                presentation_context = odil.AssociationParameters.PresentationContext(
+                    1+2*len(presentation_contexts),
+                    entry.key(),
+                    [odil.registry.ImplicitVRLittleEndian],
+                    True, False)
+                presentation_contexts.append(presentation_context)
+        
+        move_association.update_parameters()\
+            .set_calling_ae_title(
+                self._association.get_negotiated_parameters().get_called_ae_title())\
+            .set_called_ae_title(request.get_move_destination())\
+            .set_presentation_contexts(presentation_contexts)
+
+        return move_association
+
+class TestMoveSCP(unittest.TestCase):
+    def test_move_scp_release(self):
+        process = multiprocessing.Process(target=self.run_server)
+        process.start()
+        time.sleep(0.5)
+        data_sets = self.run_client()
+        process.join(2)
+        server_code = process.exitcode
+        
+        self.assertEqual(server_code, 0)
+        
+        self.assertEqual(len(data_sets), 2)
+        
+        self.assertEqual(len(data_sets[0]), 4)
+        
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPClassUID"), 
+            [odil.registry.RawDataStorage])
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPInstanceUID"), 
+            ["1.2.826.0.1.3680043.9.5560.3127449359877365688774406533090568532"])
+        self.assertSequenceEqual(
+            data_sets[0].as_string("PatientName"), ["Hello^World"])
+        self.assertSequenceEqual(data_sets[0].as_string("PatientID"), ["1234"])
+        
+        self.assertSequenceEqual(
+            data_sets[1].as_string("SOPClassUID"), 
+            [odil.registry.RawDataStorage])
+        self.assertSequenceEqual(
+            data_sets[1].as_string("SOPInstanceUID"), 
+            ["1.2.826.0.1.3680043.9.5560.3221615743193123463515381981101110692"])
+        self.assertSequenceEqual(
+            data_sets[1].as_string("PatientName"), ["Doe^John"])
+        self.assertSequenceEqual(data_sets[1].as_string("PatientID"), ["5678"])
+    
+    def run_client(self):
+        command = [
+            "movescu", 
+            "-ll", "error",
+            "-P", "-k", "QueryRetrieveLevel=PATIENT",
+            "-k", "PatientID=*", "-k", "PatientName",
+            "+P", "11114",
+            "localhost", "11113"]
+        
+        retcode = subprocess.call(command)
+        if retcode != 0:
+            return []
+        
+        files = sorted(glob.glob("RAW*"))
+        data_sets = [odil.read(x)[1] for x in files]
+        for file_ in files:
+            os.remove(file_)
+        
+        return data_sets
+
+    def run_server(self):
+        called = False
+
+        association = odil.Association()
+        association.set_tcp_timeout(1)
+        association.receive_association("v4", 11113)
+
+        move_scp = odil.MoveSCP(association)
+        generator = Generator(association)
+        move_scp.set_generator(generator)
+
+        message = association.receive_message()
+        move_scp(message)
+        
+        termination_ok = False
+
+        try:
+            association.receive_message()
+        except odil.AssociationReleased:
+            termination_ok = True
+        except odil.AssociationAborted:
+            pass
+        
+        if called and termination_ok:
+            return 0
+        else:
+            return 1
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/tests/wrappers/test_move_scu.py b/tests/wrappers/test_move_scu.py
index 0092a57..870f909 100644
--- a/tests/wrappers/test_move_scu.py
+++ b/tests/wrappers/test_move_scu.py
@@ -10,7 +10,7 @@ from peer_fixture_base import PeerFixtureBase
 class TestMoveSCU(PeerFixtureBase):
     def setUp(self):
         PeerFixtureBase.setUp(
-            self, 
+            self,
             [
                 odil.AssociationParameters.PresentationContext(
                     1, odil.registry.PatientRootQueryRetrieveInformationModelMOVE,
@@ -23,42 +23,86 @@ class TestMoveSCU(PeerFixtureBase):
             ])
 
         self.query = odil.DataSet()
-        self.query.add(odil.registry.PatientName, odil.Value.Strings(["Doe^John"]))
-        self.query.add(odil.registry.QueryRetrieveLevel, odil.Value.Strings(["PATIENT"]))
-    
+        self.query.add("PatientName", ["Doe^John"])
+        self.query.add("QueryRetrieveLevel", ["PATIENT"])
+
     def test_default_constructor(self):
         move = odil.MoveSCU(self.association)
         self.assertEqual(move.get_move_destination(), "")
-        
+        self.assertEqual(move.get_incoming_port(), 0)
+
     def test_move_destination(self):
         move = odil.MoveSCU(self.association)
         move.set_move_destination("remote")
         self.assertEqual(move.get_move_destination(), "remote")
 
+    def test_incoming_port(self):
+        move = odil.MoveSCU(self.association)
+        move.set_incoming_port(11113)
+        self.assertEqual(move.get_incoming_port(), 11113)
+
     def test_without_callback(self):
         move = odil.MoveSCU(self.association)
         move.set_affected_sop_class(odil.registry.PatientRootQueryRetrieveInformationModelMOVE)
         move.set_move_destination("LOCAL")
+        move.set_incoming_port(11113)
         data_sets = move.move(self.query)
 
         self.assertEqual(len(data_sets), 1)
-        self.assertEqual(
-            [x for x in data_sets[0].as_string(odil.registry.SOPInstanceUID)],
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPInstanceUID"),
             ["2.25.95090344942250266709587559073467305647"])
 
-    def test_with_callback(self):
+    def test_both_callback(self):
         data_sets = []
-        def callback(data_set):
+        messages = []
+        def store_callback(data_set):
             data_sets.append(data_set)
+        def move_callback(message):
+            messages.append(message)
 
         move = odil.MoveSCU(self.association)
         move.set_affected_sop_class(odil.registry.PatientRootQueryRetrieveInformationModelMOVE)
         move.set_move_destination("LOCAL")
-        move.move(self.query, callback)
+        move.set_incoming_port(11113)
+        move.move(self.query, store_callback, move_callback)
 
         self.assertEqual(len(data_sets), 1)
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPInstanceUID"),
+            ["2.25.95090344942250266709587559073467305647"])
+
+        self.assertEqual(len(messages), 2)
+
+        self.assertEqual(
+            messages[0].get_number_of_remaining_sub_operations(), 0)
+        self.assertEqual(
+            messages[0].get_number_of_completed_sub_operations(), 1)
+        self.assertEqual(messages[0].get_number_of_failed_sub_operations(), 0)
+        self.assertEqual(messages[0].get_number_of_warning_sub_operations(), 0)
+
+        self.assertFalse(messages[1].has_number_of_remaining_sub_operations())
         self.assertEqual(
-            [x for x in data_sets[0].as_string(odil.registry.SOPInstanceUID)],
+            messages[1].has_number_of_completed_sub_operations(), 1)
+        self.assertEqual(
+            messages[1].get_number_of_failed_sub_operations(), 0)
+        self.assertEqual(
+            messages[1].get_number_of_warning_sub_operations(), 0)
+
+    def test_store_only_callback(self):
+        data_sets = []
+        def store_callback(data_set):
+            data_sets.append(data_set)
+
+        move = odil.MoveSCU(self.association)
+        move.set_affected_sop_class(odil.registry.PatientRootQueryRetrieveInformationModelMOVE)
+        move.set_move_destination("LOCAL")
+        move.set_incoming_port(11113)
+        move.move(self.query, store_callback, None)
+
+        self.assertEqual(len(data_sets), 1)
+        self.assertSequenceEqual(
+            data_sets[0].as_string("SOPInstanceUID"),
             ["2.25.95090344942250266709587559073467305647"])
 
 if __name__ == "__main__":
diff --git a/tests/wrappers/test_store_scu.py b/tests/wrappers/test_store_scu.py
index 20bb4fb..74c784f 100644
--- a/tests/wrappers/test_store_scu.py
+++ b/tests/wrappers/test_store_scu.py
@@ -19,23 +19,18 @@ class TestStoreSCU(PeerFixtureBase):
             ])
 
         self.data_set = odil.DataSet()
+        self.data_set.add("ImageType", ["ORIGINAL", "PRIMARY", "OTHER"])
+        self.data_set.add("PatientID", ["1234"])
         self.data_set.add(
-            odil.registry.ImageType,
-            odil.Value.Strings(["ORIGINAL", "PRIMARY", "OTHER"]))
+            "StudyInstanceUID",
+            ["2.25.386726390606491051215227596277040710"])
         self.data_set.add(
-            odil.registry.PatientID, odil.Value.Strings(["1234"]))
+            "SeriesInstanceUID",
+            ["2.25.235367796740370588607388995952651763168"])
+        self.data_set.add("SOPClassUID", [odil.registry.RawDataStorage])
         self.data_set.add(
-            odil.registry.StudyInstanceUID,
-            odil.Value.Strings(["2.25.386726390606491051215227596277040710"]))
-        self.data_set.add(
-            odil.registry.SeriesInstanceUID,
-            odil.Value.Strings(["2.25.235367796740370588607388995952651763168"]))
-        self.data_set.add(
-            odil.registry.SOPClassUID,
-            odil.Value.Strings([odil.registry.RawDataStorage]))
-        self.data_set.add(
-            odil.registry.SOPInstanceUID,
-            odil.Value.Strings(["2.25.294312554735929033890522327215919068328"]))
+            "SOPInstanceUID",
+            ["2.25.294312554735929033890522327215919068328"])
     
     def test_affected_sop_class_uid(self):
         store = odil.StoreSCU(self.association)
diff --git a/tests/wrappers/test_value.py b/tests/wrappers/test_value.py
index 035b972..f4b2f79 100644
--- a/tests/wrappers/test_value.py
+++ b/tests/wrappers/test_value.py
@@ -5,33 +5,40 @@ import odil
 class TestValue(unittest.TestCase):
     def test_empty_constructor(self):
         value = odil.Value()
-        self.assertTrue(value.empty())
-
+        self.assertEqual(value.type, odil.Value.Type.Empty)
+        self.assertTrue(value.empty)
+        
     def test_integers_constructor(self):
         items = [1, 2, 3]
-        value = odil.Value(odil.Value.Integers(items))
-        self.assertEqual([x for x in value.as_integers()], items)
-
+        value = odil.Value(items)
+        self.assertEqual(value.type, odil.Value.Type.Integers)
+        self.assertSequenceEqual(value.as_integers(), items)
+    
     def test_reals_constructor(self):
-        items = [1.1, 2, 3.3]
-        value = odil.Value(odil.Value.Reals(items))
-        self.assertEqual([x for x in value.as_reals()], items)
-
+        items = [1.1, 2., 3.3]
+        value = odil.Value(items)
+        self.assertEqual(value.type, odil.Value.Type.Reals)
+        self.assertSequenceEqual(value.as_reals(), items)
+    
     def test_strings_constructor(self):
         items = ["foo", "bar"]
-        value = odil.Value(odil.Value.Strings(items))
-        self.assertEqual([x for x in value.as_strings()], items)
-
+        value = odil.Value(items)
+        self.assertEqual(value.type, odil.Value.Type.Strings)
+        self.assertSequenceEqual(value.as_strings(), items)
+    
     def test_data_sets_constructor(self):
         items = [odil.DataSet(), odil.DataSet()]
-        value = odil.Value(odil.Value.DataSets(items))
-        self.assertEqual([x for x in value.as_data_sets()], items)
-
+        value = odil.Value(items)
+        self.assertEqual(value.type, odil.Value.Type.DataSets)
+        self.assertSequenceEqual(value.as_data_sets(), items)
+    
     def test_binary_constructor(self):
-        items = [odil.Value.BinaryItem("\x01\x02\x03")]
-        value = odil.Value(odil.Value.Binary(items))
-        self.assertEqual(
-            [x for x in value.as_binary()[0]], [x for x in items[0]])
+        items = [bytearray("\x01\x02\x03")]
+        value = odil.Value(items)
+        self.assertEqual(value.type, odil.Value.Type.Binary)
+        self.assertSequenceEqual(
+            [bytearray([x for x in item]) for item in value.as_binary()], 
+            items)
 
 class TestValueIntegers(unittest.TestCase):
     def test_empty_constructor(self):
@@ -85,4 +92,3 @@ class TestValueBinary(unittest.TestCase):
 
 if __name__ == "__main__":
     unittest.main()
-
diff --git a/tests/wrappers/test_vr_finder.py b/tests/wrappers/test_vr_finder.py
new file mode 100644
index 0000000..4aa9570
--- /dev/null
+++ b/tests/wrappers/test_vr_finder.py
@@ -0,0 +1,16 @@
+import unittest
+
+import odil
+
+class TestVRFinder(unittest.TestCase):
+    def test_default_finder(self):
+        finder = odil.VRFinder()
+        data_set = odil.DataSet()
+        data_set.add(odil.registry.BitsAllocated, [8])
+        vr = finder(
+            odil.Tag(0x7fe0, 0x0010), data_set,
+            odil.registry.ExplicitVRLittleEndian)
+        self.assertEqual(vr, odil.VR.OB)
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/wrappers/Assocation.cpp b/wrappers/Assocation.cpp
index 9188ce5..50872b0 100644
--- a/wrappers/Assocation.cpp
+++ b/wrappers/Assocation.cpp
@@ -6,15 +6,66 @@
  * for details.
  ************************************************************************/
 
+#include <boost/asio.hpp>
 #include <boost/python.hpp>
 
 #include "odil/Association.h"
 
+#include "exception_factory.h"
+
+namespace
+{
+
+PyObject * wrapped_AssociationReleased;
+PyObject * wrapped_AssociationAborted;
+
+void receive_association(
+    odil::Association & association, std::string protocol, unsigned short port)
+{
+    if(protocol == "v4")
+    {
+        association.receive_association(boost::asio::ip::tcp::v4(), port);
+    }
+}
+
+void released_translator(odil::AssociationReleased const & e)
+{
+    PyErr_SetString(wrapped_AssociationReleased, e.what());
+}
+
+void aborted_translator(odil::AssociationAborted const & e)
+{
+    PyErr_SetString(wrapped_AssociationAborted, e.what());
+}
+
+float get_tcp_timeout(odil::Association const & association)
+{
+    return association.get_tcp_timeout().total_microseconds()/1000000.;
+}
+
+void set_tcp_timeout(odil::Association & association, float seconds)
+{
+    association.set_tcp_timeout(
+        boost::posix_time::microseconds(seconds*1000000.));
+}
+
+}
+
 void wrap_Association()
 {
     using namespace boost::python;
     using namespace odil;
-
+    
+    object wrapped_exception = scope().attr("Exception");
+    
+    wrapped_AssociationReleased = exception_factory(
+        "AssociationReleased", wrapped_exception.ptr());
+    register_exception_translator<AssociationReleased>(released_translator);
+    
+    wrapped_AssociationAborted = exception_factory(
+        "AssociationAborted", wrapped_exception.ptr());
+    register_exception_translator<AssociationAborted>(aborted_translator);
+    
     scope association_scope = class_<Association>("Association", init<>())
         .def("get_peer_host", &Association::get_peer_host,
             return_value_policy<copy_const_reference>())
@@ -41,15 +92,18 @@ void wrap_Association()
             &Association::get_negotiated_parameters, 
             return_value_policy<reference_existing_object>()
         )
-        // TCP timeout
+        .def("get_tcp_timeout", &get_tcp_timeout)
+        .def("set_tcp_timeout", &set_tcp_timeout)
         // Message timeout
         .def("is_associated", &Association::is_associated)
         .def("associate", &Association::associate)
         // Receive association
+        .def("receive_association", &receive_association)
         //.def("reject", &Association::reject)
         .def("release", &Association::release)
         .def("abort", &Association::abort)
         // Receive message
+        .def("receive_message", &Association::receive_message)
         // Send message
         .def("next_message_id", &Association::next_message_id)
     ;
diff --git a/wrappers/BasicDirectoryCreator.cpp b/wrappers/BasicDirectoryCreator.cpp
new file mode 100644
index 0000000..85d22f8
--- /dev/null
+++ b/wrappers/BasicDirectoryCreator.cpp
@@ -0,0 +1,130 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <string>
+#include <vector>
+
+#include <boost/python.hpp>
+#include <boost/shared_ptr.hpp>
+
+#include "odil/BasicDirectoryCreator.h"
+
+namespace
+{
+
+boost::python::list get_files(odil::BasicDirectoryCreator const & creator)
+{
+    boost::python::list result;
+    for(auto const & file: creator.files)
+    {
+        result.append(file);
+    }
+
+    return result;
+}
+
+void set_files(
+    odil::BasicDirectoryCreator & creator, 
+    boost::python::list const & files_python)
+{
+    std::vector<std::string> files_cpp(boost::python::len(files_python));
+    for(int i = 0; i<boost::python::len(files_python); ++i)
+    {
+        files_cpp[i] = boost::python::extract<std::string>(files_python[i]);
+    }
+    creator.files = files_cpp;
+}
+
+boost::python::dict 
+get_extra_record_keys(odil::BasicDirectoryCreator const & creator)
+{
+    boost::python::dict result;
+    for(auto const & item: creator.extra_record_keys)
+    {
+        boost::python::list values;
+        for(auto const & value_cpp: item.second)
+        {
+            boost::python::list value_python;
+            value_python.append(value_cpp.first);
+            value_python.append(value_cpp.second);
+            values.append(value_python);
+        }
+        result[item.first] = values;
+    }
+    return result;
+}
+
+void 
+set_extra_record_keys(
+    odil::BasicDirectoryCreator & creator, 
+    boost::python::dict const & extra_record_keys_python)
+{
+    odil::BasicDirectoryCreator::RecordKeyMap extra_record_keys_cpp;
+    
+    auto items = extra_record_keys_python.items();
+    for(int item_index=0; item_index<boost::python::len(items); ++item_index)
+    {
+        auto item = items[item_index];
+        
+        auto key_python = item[0];
+        std::string const key_cpp = boost::python::extract<std::string>(key_python);
+        
+        auto value_python = item[1];
+        std::vector<odil::BasicDirectoryCreator::RecordKey> value_cpp;
+        for(int value_index=0; value_index<boost::python::len(value_python); ++value_index)
+        {
+            auto record_key_python = value_python[value_index];
+            
+            auto tag_python = record_key_python[0];
+            odil::Tag const tag_cpp = boost::python::extract<odil::Tag>(tag_python);
+            
+            auto type_python = record_key_python[1];
+            int const type_cpp = boost::python::extract<int>(type_python);
+            
+            value_cpp.push_back(
+                odil::BasicDirectoryCreator::RecordKey(tag_cpp, type_cpp));
+        }
+        
+        extra_record_keys_cpp[key_cpp] = value_cpp;
+    }
+    
+    creator.extra_record_keys = extra_record_keys_cpp;
+}
+    
+boost::shared_ptr<odil::BasicDirectoryCreator>
+constructor(
+    std::string const & root, boost::python::list const & files, 
+    boost::python::dict const & extra_record_keys=boost::python::dict())
+{
+    // Old versions of Boost.Python (Debian 7, Ubuntu 12.04) do not like 
+    // std::shared_ptr
+    auto creator = new odil::BasicDirectoryCreator(root);
+    set_files(*creator, files);
+    set_extra_record_keys(*creator, extra_record_keys);
+    return boost::shared_ptr<odil::BasicDirectoryCreator>(creator);    
+}
+
+}
+
+void wrap_BasicDirectoryCreator()
+{
+    using namespace boost::python;
+    using namespace odil;
+
+    class_<BasicDirectoryCreator>("BasicDirectoryCreator", no_init)
+        .def(
+            "__init__", 
+            make_constructor(constructor, default_call_policies(), 
+            (arg("root"), arg("files"), arg("extra_record_keys")=dict())))
+        .def_readwrite("root", &BasicDirectoryCreator::root)
+        .add_property("files", &get_files, &set_files)
+        .add_property(
+            "extra_record_keys", &get_extra_record_keys, &set_extra_record_keys)
+        .def("__call__", &BasicDirectoryCreator::operator())
+    ;
+}
diff --git a/wrappers/CEchoRequest.cpp b/wrappers/CEchoRequest.cpp
new file mode 100644
index 0000000..a8078fe
--- /dev/null
+++ b/wrappers/CEchoRequest.cpp
@@ -0,0 +1,30 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <boost/python.hpp>
+
+#include "odil/message/CEchoRequest.h"
+
+void wrap_CEchoRequest()
+{
+    using namespace boost::python;
+    using namespace odil;
+    using namespace odil::message;
+
+    class_<CEchoRequest, bases<Request>>(
+            "CEchoRequest", init<Value::Integer, Value::String const &>())
+        .def(init<Message const &>())
+        .def(
+            "get_affected_sop_class_uid",
+            &CEchoRequest::get_affected_sop_class_uid,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_affected_sop_class_uid",
+            &CEchoRequest::set_affected_sop_class_uid)
+    ;
+}
diff --git a/wrappers/CFindRequest.cpp b/wrappers/CFindRequest.cpp
new file mode 100644
index 0000000..378c3c4
--- /dev/null
+++ b/wrappers/CFindRequest.cpp
@@ -0,0 +1,38 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <boost/python.hpp>
+
+#include "odil/message/CFindRequest.h"
+
+void wrap_CFindRequest()
+{
+    using namespace boost::python;
+    using namespace odil;
+    using namespace odil::message;
+
+    class_<CFindRequest, bases<Request>>(
+            "CFindRequest",
+            init<
+                Value::Integer, Value::String const &, Value::Integer,
+                DataSet const &
+            >())
+        .def(init<Message>())
+        .def(
+            "get_affected_sop_class_uid",
+            &CFindRequest::get_affected_sop_class_uid,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_affected_sop_class_uid",
+            &CFindRequest::set_affected_sop_class_uid)
+        .def(
+            "get_priority", &CFindRequest::get_priority,
+            return_value_policy<copy_const_reference>())
+        .def("set_priority", &CFindRequest::set_priority)
+    ;
+}
diff --git a/wrappers/CGetRequest.cpp b/wrappers/CGetRequest.cpp
new file mode 100644
index 0000000..6798749
--- /dev/null
+++ b/wrappers/CGetRequest.cpp
@@ -0,0 +1,38 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <boost/python.hpp>
+
+#include "odil/message/CGetRequest.h"
+
+void wrap_CGetRequest()
+{
+    using namespace boost::python;
+    using namespace odil;
+    using namespace odil::message;
+
+    class_<CGetRequest, bases<Request>>(
+            "CGetRequest",
+            init<
+                Value::Integer, Value::String const &, Value::Integer,
+                DataSet const &
+            >())
+        .def(init<Message>())
+        .def(
+            "get_affected_sop_class_uid",
+            &CGetRequest::get_affected_sop_class_uid,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_affected_sop_class_uid",
+            &CGetRequest::set_affected_sop_class_uid)
+        .def(
+            "get_priority", &CGetRequest::get_priority,
+            return_value_policy<copy_const_reference>())
+        .def("set_priority", &CGetRequest::set_priority)
+    ;
+}
diff --git a/wrappers/CGetResponse.cpp b/wrappers/CGetResponse.cpp
new file mode 100644
index 0000000..40f5334
--- /dev/null
+++ b/wrappers/CGetResponse.cpp
@@ -0,0 +1,79 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <boost/python.hpp>
+
+#include "odil/message/CGetResponse.h"
+
+void wrap_CGetResponse()
+{
+    using namespace boost::python;
+    using namespace odil;
+    using namespace odil::message;
+
+    class_<CGetResponse, bases<Response>>(
+            "CGetResponse", init<Value::Integer, Value::Integer>())
+        .def(init<Value::Integer, Value::Integer, DataSet const &>())
+        .def(init<Message>())
+        .def("has_message_id", &CGetResponse::has_message_id)
+        .def(
+            "get_message_id", &CGetResponse::get_message_id,
+            return_value_policy<copy_const_reference>())
+        .def("set_message_id", &CGetResponse::set_message_id)
+        .def(
+            "has_affected_sop_class_uid",
+            &CGetResponse::has_affected_sop_class_uid)
+        .def(
+            "get_affected_sop_class_uid",
+            &CGetResponse::get_affected_sop_class_uid,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_affected_sop_class_uid",
+            &CGetResponse::set_affected_sop_class_uid)
+        .def(
+            "has_number_of_remaining_sub_operations",
+            &CGetResponse::has_number_of_remaining_sub_operations)
+        .def(
+            "get_number_of_remaining_sub_operations",
+            &CGetResponse::get_number_of_remaining_sub_operations,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_number_of_remaining_sub_operations",
+            &CGetResponse::set_number_of_remaining_sub_operations)
+        .def(
+            "has_number_of_completed_sub_operations",
+            &CGetResponse::has_number_of_completed_sub_operations)
+        .def(
+            "get_number_of_completed_sub_operations",
+            &CGetResponse::get_number_of_completed_sub_operations,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_number_of_completed_sub_operations",
+            &CGetResponse::set_number_of_completed_sub_operations)
+        .def(
+            "has_number_of_failed_sub_operations",
+            &CGetResponse::has_number_of_failed_sub_operations)
+        .def(
+            "get_number_of_failed_sub_operations",
+            &CGetResponse::get_number_of_failed_sub_operations,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_number_of_failed_sub_operations",
+            &CGetResponse::set_number_of_failed_sub_operations)
+        .def(
+            "has_number_of_warning_sub_operations",
+            &CGetResponse::has_number_of_warning_sub_operations)
+        .def(
+            "get_number_of_warning_sub_operations",
+            &CGetResponse::get_number_of_warning_sub_operations,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_number_of_warning_sub_operations",
+            &CGetResponse::set_number_of_warning_sub_operations)
+    ;
+}
diff --git a/wrappers/CMakeLists.txt b/wrappers/CMakeLists.txt
index a5a0de3..d5ab3b8 100644
--- a/wrappers/CMakeLists.txt
+++ b/wrappers/CMakeLists.txt
@@ -10,7 +10,7 @@ link_directories(${Boost_LIBRARY_DIRS})
 file(GLOB_RECURSE files "*.cpp")
 python_add_module(pyodil SHARED ${files})
 set_target_properties(
-    pyodil PROPERTIES OUTPUT_NAME odil)
+    pyodil PROPERTIES OUTPUT_NAME odil FOLDER "Wrappers")
 if(APPLE)
     set_target_properties(pyodil PROPERTIES SUFFIX ".so")
 endif()
diff --git a/wrappers/CMoveRequest.cpp b/wrappers/CMoveRequest.cpp
new file mode 100644
index 0000000..fee337c
--- /dev/null
+++ b/wrappers/CMoveRequest.cpp
@@ -0,0 +1,42 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <boost/python.hpp>
+
+#include "odil/message/CMoveRequest.h"
+
+void wrap_CMoveRequest()
+{
+    using namespace boost::python;
+    using namespace odil;
+    using namespace odil::message;
+
+    class_<CMoveRequest, bases<Request>>(
+            "CMoveRequest",
+            init<
+                Value::Integer, Value::String const &, Value::Integer,
+                Value::String const &, DataSet const &
+            >())
+        .def(init<Message>())
+        .def(
+            "get_affected_sop_class_uid",
+            &CMoveRequest::get_affected_sop_class_uid,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_affected_sop_class_uid",
+            &CMoveRequest::set_affected_sop_class_uid)
+        .def(
+            "get_priority", &CMoveRequest::get_priority,
+            return_value_policy<copy_const_reference>())
+        .def("set_priority", &CMoveRequest::set_priority)
+        .def(
+            "get_move_destination", &CMoveRequest::get_move_destination,
+            return_value_policy<copy_const_reference>())
+        .def("set_move_destination", &CMoveRequest::set_move_destination)
+    ;
+}
diff --git a/wrappers/CMoveResponse.cpp b/wrappers/CMoveResponse.cpp
new file mode 100644
index 0000000..278aadd
--- /dev/null
+++ b/wrappers/CMoveResponse.cpp
@@ -0,0 +1,79 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <boost/python.hpp>
+
+#include "odil/message/CMoveResponse.h"
+
+void wrap_CMoveResponse()
+{
+    using namespace boost::python;
+    using namespace odil;
+    using namespace odil::message;
+
+    class_<CMoveResponse, bases<Response>>(
+            "CMoveResponse", init<Value::Integer, Value::Integer>())
+        .def(init<Value::Integer, Value::Integer, DataSet const &>())
+        .def(init<Message>())
+        .def("has_message_id", &CMoveResponse::has_message_id)
+        .def(
+            "get_message_id", &CMoveResponse::get_message_id,
+            return_value_policy<copy_const_reference>())
+        .def("set_message_id", &CMoveResponse::set_message_id)
+        .def(
+            "has_affected_sop_class_uid",
+            &CMoveResponse::has_affected_sop_class_uid)
+        .def(
+            "get_affected_sop_class_uid",
+            &CMoveResponse::get_affected_sop_class_uid,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_affected_sop_class_uid",
+            &CMoveResponse::set_affected_sop_class_uid)
+        .def(
+            "has_number_of_remaining_sub_operations",
+            &CMoveResponse::has_number_of_remaining_sub_operations)
+        .def(
+            "get_number_of_remaining_sub_operations",
+            &CMoveResponse::get_number_of_remaining_sub_operations,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_number_of_remaining_sub_operations",
+            &CMoveResponse::set_number_of_remaining_sub_operations)
+        .def(
+            "has_number_of_completed_sub_operations",
+            &CMoveResponse::has_number_of_completed_sub_operations)
+        .def(
+            "get_number_of_completed_sub_operations",
+            &CMoveResponse::get_number_of_completed_sub_operations,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_number_of_completed_sub_operations",
+            &CMoveResponse::set_number_of_completed_sub_operations)
+        .def(
+            "has_number_of_failed_sub_operations",
+            &CMoveResponse::has_number_of_failed_sub_operations)
+        .def(
+            "get_number_of_failed_sub_operations",
+            &CMoveResponse::get_number_of_failed_sub_operations,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_number_of_failed_sub_operations",
+            &CMoveResponse::set_number_of_failed_sub_operations)
+        .def(
+            "has_number_of_warning_sub_operations",
+            &CMoveResponse::has_number_of_warning_sub_operations)
+        .def(
+            "get_number_of_warning_sub_operations",
+            &CMoveResponse::get_number_of_warning_sub_operations,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_number_of_warning_sub_operations",
+            &CMoveResponse::set_number_of_warning_sub_operations)
+    ;
+}
diff --git a/wrappers/CStoreRequest.cpp b/wrappers/CStoreRequest.cpp
new file mode 100644
index 0000000..dc73715
--- /dev/null
+++ b/wrappers/CStoreRequest.cpp
@@ -0,0 +1,65 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <boost/python.hpp>
+
+#include "odil/message/CStoreRequest.h"
+
+void wrap_CStoreRequest()
+{
+    using namespace boost::python;
+    using namespace odil;
+    using namespace odil::message;
+
+    class_<CStoreRequest, bases<Request>>(
+            "CStoreRequest",
+            init<
+                Value::Integer, Value::String const &, Value::String const &,
+                Value::Integer, DataSet const &
+            >())
+        .def(init<Message>())
+        .def(
+            "get_affected_sop_class_uid",
+            &CStoreRequest::get_affected_sop_class_uid,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_affected_sop_class_uid",
+            &CStoreRequest::set_affected_sop_class_uid)
+        .def(
+            "get_affected_sop_instance_uid",
+            &CStoreRequest::get_affected_sop_instance_uid,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_affected_sop_instance_uid",
+            &CStoreRequest::set_affected_sop_instance_uid)
+        .def(
+            "get_priority", &CStoreRequest::get_priority,
+            return_value_policy<copy_const_reference>())
+        .def("set_priority", &CStoreRequest::set_priority)
+        .def(
+            "has_move_originator_ae_title",
+            &CStoreRequest::has_move_originator_ae_title)
+        .def(
+            "get_move_originator_ae_title",
+            &CStoreRequest::get_move_originator_ae_title,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_move_originator_ae_title",
+            &CStoreRequest::set_move_originator_ae_title)
+        .def(
+            "has_move_originator_message_id",
+            &CStoreRequest::has_move_originator_message_id)
+        .def(
+            "get_move_originator_message_id",
+            &CStoreRequest::get_move_originator_message_id,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_move_originator_message_id",
+            &CStoreRequest::set_move_originator_message_id)
+    ;
+}
diff --git a/wrappers/DataSet.cpp b/wrappers/DataSet.cpp
index 8d079fe..d84cdb3 100644
--- a/wrappers/DataSet.cpp
+++ b/wrappers/DataSet.cpp
@@ -13,12 +13,55 @@
 
 #include "odil/DataSet.h"
 
-BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(add_overloads_2, odil::DataSet::add, 1, 2);
-BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(add_overloads_3, odil::DataSet::add, 2, 3);
+#include "value_constructor.h"
 
 namespace
 {
 
+void add(
+    odil::DataSet & data_set, odil::Tag const & tag,
+    boost::python::object value_python, odil::VR vr=odil::VR::UNKNOWN)
+{
+    auto const value_cpp = value_constructor(value_python);
+    if(vr == odil::VR::UNKNOWN)
+    {
+        vr = as_vr(tag);
+    }
+    data_set.add(tag, odil::Element(*value_cpp, vr));
+}
+
+void set(
+    odil::DataSet & data_set, odil::Tag const & tag,
+    boost::python::object value_python)
+{
+    auto const value_cpp = value_constructor(value_python);
+    if(value_cpp->get_type() == odil::Value::Type::Integers)
+    {
+        data_set.as_int(tag) = value_cpp->as_integers();
+    }
+    else if(value_cpp->get_type() == odil::Value::Type::Reals)
+    {
+        data_set.as_real(tag) = value_cpp->as_reals();
+    }
+    else if(value_cpp->get_type() == odil::Value::Type::Strings)
+    {
+        data_set.as_string(tag) = value_cpp->as_strings();
+    }
+    else if(value_cpp->get_type() == odil::Value::Type::DataSets)
+    {
+        data_set.as_data_set(tag) = value_cpp->as_data_sets();
+    }
+    else if(value_cpp->get_type() == odil::Value::Type::Binary)
+    {
+        data_set.as_binary(tag) = value_cpp->as_binary();
+    }
+    else
+    {
+        throw odil::Exception("Unknown value type");
+    }
+}
+
+
 class ConstIteratorAdapter
 {
 public:
@@ -124,6 +167,10 @@ boost::python::list items(odil::DataSet const & data_set)
 
 }
 
+BOOST_PYTHON_FUNCTION_OVERLOADS(add_overloads, add, 3, 4);
+BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(
+    add_overloads_member, odil::DataSet::add, 1, 2);
+
 void wrap_DataSet()
 {
     using namespace boost::python;
@@ -132,86 +179,59 @@ void wrap_DataSet()
 
     class_<DataSet>("DataSet", init<>())
         .def(
-            "add", 
-            static_cast<void (DataSet::*)(Tag const &, Element const &)>(
-                &DataSet::add))
-        .def(
-            "add", 
+            "add",
             static_cast<void (DataSet::*)(Tag const &, VR)>(&DataSet::add),
-            add_overloads_2())
-        .def(
-            "add", 
-            static_cast<void (DataSet::*)(Tag const &, Value::Integers const &, VR)>(
-                &DataSet::add),
-            add_overloads_3())
-        .def(
-            "add", 
-            static_cast<void (DataSet::*)(Tag const &, Value::Reals const &, VR)>(
-                &DataSet::add),
-            add_overloads_3())
-        .def(
-            "add", 
-            static_cast<void (DataSet::*)(Tag const &, Value::Strings const &, VR)>(
-                &DataSet::add),
-            add_overloads_3())
-        .def(
-            "add", 
-            static_cast<void (DataSet::*)(Tag const &, Value::DataSets const &, VR)>(
-                &DataSet::add),
-            add_overloads_3())
-        .def(
-            "add", 
-            static_cast<void (DataSet::*)(Tag const &, Value::Binary const &, VR)>(
-                &DataSet::add),
-            add_overloads_3())
+            add_overloads_member())
+        .def("add", add, add_overloads())
         .def("remove", &DataSet::remove)
         .def("has", &DataSet::has)
         .def("empty", static_cast<bool (DataSet::*)() const>(&DataSet::empty))
         .def(
-            "size", 
+            "size",
             static_cast<std::size_t (DataSet::*)() const>(&DataSet::size))
         .def("get_vr", &DataSet::get_vr)
         .def(
-            "empty", 
+            "empty",
             static_cast<bool (DataSet::*)(Tag const &) const>(&DataSet::empty))
         .def(
-            "size", 
+            "size",
             static_cast<std::size_t (DataSet::*)(Tag const &) const>(
                 &DataSet::size))
         .def(
-            "__getitem__", 
+            "__getitem__",
             static_cast<Element & (DataSet::*)(Tag const&)>(&DataSet::operator[]),
             return_value_policy<reference_existing_object>())
         .def("is_int", &DataSet::is_int)
         .def(
-            "as_int", 
+            "as_int",
             static_cast<Value::Integers & (DataSet::*)(Tag const &)>(
-                &DataSet::as_int), 
+                &DataSet::as_int),
             return_value_policy<reference_existing_object>())
         .def("is_real", &DataSet::is_real)
         .def(
-            "as_real", 
+            "as_real",
             static_cast<Value::Reals & (DataSet::*)(Tag const &)>(
-                &DataSet::as_real), 
+                &DataSet::as_real),
             return_value_policy<reference_existing_object>())
         .def("is_string", &DataSet::is_string)
         .def(
-            "as_string", 
+            "as_string",
             static_cast<Value::Strings & (DataSet::*)(Tag const &)>(
-                &DataSet::as_string), 
+                &DataSet::as_string),
             return_value_policy<reference_existing_object>())
         .def("is_data_set", &DataSet::is_data_set)
         .def(
-            "as_data_set", 
+            "as_data_set",
             static_cast<Value::DataSets & (DataSet::*)(Tag const &)>(
-                &DataSet::as_data_set), 
+                &DataSet::as_data_set),
             return_value_policy<reference_existing_object>())
         .def("is_binary", &DataSet::is_binary)
         .def(
-            "as_binary", 
+            "as_binary",
             static_cast<Value::Binary & (DataSet::*)(Tag const &)>(
-                &DataSet::as_binary), 
+                &DataSet::as_binary),
             return_value_policy<reference_existing_object>())
+        .def("set", &set)
         .def("keys", &keys)
         .def("__iter__", range(&begin, &end))
         .def("values", &values)
@@ -219,7 +239,7 @@ void wrap_DataSet()
         .def(self == self)
         .def(self != self)
         .def(
-            "__len__", 
-            static_cast<std::size_t (DataSet::*)() const>(&DataSet::size)) 
+            "__len__",
+            static_cast<std::size_t (DataSet::*)() const>(&DataSet::size))
     ;
 }
diff --git a/wrappers/DataSetGeneratorWrapper.h b/wrappers/DataSetGeneratorWrapper.h
new file mode 100644
index 0000000..7e77869
--- /dev/null
+++ b/wrappers/DataSetGeneratorWrapper.h
@@ -0,0 +1,52 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#ifndef _8971f17b_e958_4aa3_9d36_640aaa018f56
+#define _8971f17b_e958_4aa3_9d36_640aaa018f56
+
+#include <boost/python.hpp>
+#include "odil/message/Request.h"
+
+template<typename TDataSetGenerator>
+class DataSetGeneratorWrapper:
+    public TDataSetGenerator, public boost::python::wrapper<TDataSetGenerator>
+{
+public:
+    DataSetGeneratorWrapper()
+    : TDataSetGenerator(), boost::python::wrapper<TDataSetGenerator>()
+    {
+        // Nothing else.
+    }
+
+    virtual ~DataSetGeneratorWrapper()
+    {
+        // Nothing to do.
+    }
+
+    virtual void initialize(odil::message::Request const & request)
+    {
+        this->get_override("initialize")(request);
+    }
+
+    virtual bool done() const
+    {
+        return this->get_override("done")();
+    }
+
+    virtual void next()
+    {
+        this->get_override("next")();
+    }
+
+    virtual odil::DataSet get() const
+    {
+        return this->get_override("get")();
+    }
+};
+
+#endif // _8971f17b_e958_4aa3_9d36_640aaa018f56
diff --git a/wrappers/Exception.cpp b/wrappers/EchoSCP.cpp
similarity index 51%
copy from wrappers/Exception.cpp
copy to wrappers/EchoSCP.cpp
index cc6085c..e6ee791 100644
--- a/wrappers/Exception.cpp
+++ b/wrappers/EchoSCP.cpp
@@ -8,18 +8,31 @@
 
 #include <boost/python.hpp>
 
-#include "odil/Exception.h"
+#include "odil/EchoSCP.h"
 
-void translator(odil::Exception const & e)
+namespace
 {
-    PyErr_SetString(PyExc_UserWarning, e.what());
+
+void 
+set_callback(odil::EchoSCP & scp, boost::python::object const & f)
+{
+    scp.set_callback(
+        [f](odil::message::CEchoRequest const & message) 
+        { 
+            return boost::python::call<odil::Value::Integer>(f.ptr(), message);
+        }
+    );
 }
 
-void wrap_Exception()
+}
+
+void wrap_EchoSCP()
 {
     using namespace boost::python;
     using namespace odil;
 
-    register_exception_translator<Exception>(translator);
+    class_<EchoSCP>("EchoSCP", init<Association &>())
+        .def("set_callback", &set_callback)
+        .def("__call__", &EchoSCP::operator())
+    ;
 }
-
diff --git a/wrappers/Element.cpp b/wrappers/Element.cpp
index 55e01d2..bcf24ec 100644
--- a/wrappers/Element.cpp
+++ b/wrappers/Element.cpp
@@ -12,6 +12,26 @@
 #include "odil/Element.h"
 #include "odil/Value.h"
 
+#include "value_constructor.h"
+
+namespace
+{
+
+boost::shared_ptr<odil::Element>
+constructor(
+    boost::python::object const & value_python, odil::VR vr=odil::VR::INVALID)
+{
+    auto value_cpp = value_constructor(value_python);
+    
+    odil::Element * element = new odil::Element(*value_cpp, vr);
+    
+    // Old versions of Boost.Python (Debian 7, Ubuntu 12.04) do not like 
+    // std::shared_ptr
+    return boost::shared_ptr<odil::Element>(element);
+}
+
+}
+
 void wrap_Element()
 {
     using namespace boost::python;
@@ -25,12 +45,7 @@ void wrap_Element()
 
     class_<Element>("Element", init<>())
         .def_readwrite("vr", &Element::vr)
-        .def(init<Value, optional<VR>>())
-        .def(init<Value::Integers, optional<VR>>())
-        .def(init<Value::Reals, optional<VR>>())
-        .def(init<Value::Strings, optional<VR>>())
-        .def(init<Value::DataSets, optional<VR>>())
-        .def(init<Value::Binary, optional<VR>>())
+        .def("__init__", make_constructor(constructor))
         .def("empty", &Element::empty)
         .def("size", &Element::size)
         .def(
diff --git a/wrappers/Exception.cpp b/wrappers/Exception.cpp
index cc6085c..834280c 100644
--- a/wrappers/Exception.cpp
+++ b/wrappers/Exception.cpp
@@ -10,16 +10,22 @@
 
 #include "odil/Exception.h"
 
+#include "exception_factory.h"
+
+namespace
+{
+
+PyObject * wrapped_Exception;
+
 void translator(odil::Exception const & e)
 {
-    PyErr_SetString(PyExc_UserWarning, e.what());
+    PyErr_SetString(wrapped_Exception, e.what());
+}
+
 }
 
 void wrap_Exception()
 {
-    using namespace boost::python;
-    using namespace odil;
-
-    register_exception_translator<Exception>(translator);
+    wrapped_Exception = exception_factory("Exception");
+    boost::python::register_exception_translator<odil::Exception>(translator);
 }
-
diff --git a/wrappers/FindSCP.cpp b/wrappers/FindSCP.cpp
new file mode 100644
index 0000000..6a5809c
--- /dev/null
+++ b/wrappers/FindSCP.cpp
@@ -0,0 +1,48 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <memory>
+
+#include <boost/python.hpp>
+
+#include "odil/message/CFindRequest.h"
+#include "odil/FindSCP.h"
+
+#include "DataSetGeneratorWrapper.h"
+
+namespace
+{
+
+void set_generator(
+    odil::FindSCP & find_scp, 
+    DataSetGeneratorWrapper<odil::FindSCP::DataSetGenerator> generator)
+{
+    auto cpp_generator = 
+        std::make_shared<
+            DataSetGeneratorWrapper<odil::FindSCP::DataSetGenerator>
+        >(generator);
+    find_scp.set_generator(cpp_generator);
+}
+
+}
+
+void wrap_FindSCP()
+{
+    using namespace boost::python;
+    using namespace odil;
+    
+    scope find_scp_scope = class_<FindSCP>("FindSCP", init<Association &>())
+        .def("set_generator", &set_generator)
+        .def("__call__", &FindSCP::operator())
+    ;
+    
+    class_<
+        DataSetGeneratorWrapper<FindSCP::DataSetGenerator>, 
+        boost::noncopyable
+    >("DataSetGenerator", init<>());
+}
diff --git a/wrappers/GetSCP.cpp b/wrappers/GetSCP.cpp
new file mode 100644
index 0000000..26a8cb2
--- /dev/null
+++ b/wrappers/GetSCP.cpp
@@ -0,0 +1,63 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <memory>
+
+#include <boost/python.hpp>
+
+#include "odil/message/CGetRequest.h"
+#include "odil/GetSCP.h"
+
+#include "DataSetGeneratorWrapper.h"
+
+namespace
+{
+    
+class DataSetGeneratorWrapperGet: 
+    public DataSetGeneratorWrapper<odil::GetSCP::DataSetGenerator>
+{
+public:
+    DataSetGeneratorWrapperGet()
+    : DataSetGeneratorWrapper<odil::GetSCP::DataSetGenerator>()
+    {
+        // Nothing else
+    }
+    
+    virtual ~DataSetGeneratorWrapperGet()
+    {
+        // Nothing to do.
+    }
+    
+    virtual unsigned int count() const
+    {
+        return this->get_override("count")();
+    }
+};
+
+void set_generator(odil::GetSCP & get_scp, DataSetGeneratorWrapperGet generator)
+{
+    auto cpp_generator = 
+        std::make_shared<DataSetGeneratorWrapperGet>(generator);
+    get_scp.set_generator(cpp_generator);
+}
+
+}
+
+void wrap_GetSCP()
+{
+    using namespace boost::python;
+    using namespace odil;
+    
+    scope get_scp_scope = class_<GetSCP>("GetSCP", init<Association &>())
+        .def("set_generator", &set_generator)
+        .def("__call__", &odil::GetSCP::operator())
+    ;
+    
+    class_<DataSetGeneratorWrapperGet, boost::noncopyable>(
+        "DataSetGenerator", init<>());
+}
diff --git a/wrappers/GetSCU.cpp b/wrappers/GetSCU.cpp
index b954ad4..a02af98 100644
--- a/wrappers/GetSCU.cpp
+++ b/wrappers/GetSCU.cpp
@@ -16,15 +16,29 @@ namespace
 void 
 get_with_python_callback(
     odil::GetSCU const & scu, 
-    odil::DataSet const & query, boost::python::object const & f)
+    odil::DataSet const & query,
+    boost::python::object const & store_callback,
+    boost::python::object const & get_callback)
 {
-    scu.get(
-        query, 
-        [f](odil::DataSet const & data_set) 
-        { 
-            boost::python::call<void>(f.ptr(), data_set); 
-        }
-    );
+    odil::GetSCU::StoreCallback store_callback_cpp;
+    if(!store_callback.is_none())
+    {
+        store_callback_cpp = [store_callback](odil::DataSet const & data_set)
+        {
+            boost::python::call<void>(store_callback.ptr(), data_set);
+        };
+    }
+
+    odil::GetSCU::GetCallback get_callback_cpp;
+    if(!get_callback.is_none())
+    {
+        get_callback_cpp = [get_callback](odil::message::CGetResponse const & message)
+        {
+            boost::python::call<void>(get_callback.ptr(), message);
+        };
+    }
+
+    scu.get(query, store_callback_cpp, get_callback_cpp);
 }
 
 }
@@ -37,7 +51,11 @@ void wrap_GetSCU()
     class_<GetSCU>("GetSCU", init<Association &>())
         .def(
             "get",
-            &get_with_python_callback
+            &get_with_python_callback,
+            (
+                arg("scu"), arg("query"), arg("store_callback"),
+                arg("get_callback")=object()
+            )
         )
         .def(
             "get", 
diff --git a/wrappers/Message.cpp b/wrappers/Message.cpp
new file mode 100644
index 0000000..655069f
--- /dev/null
+++ b/wrappers/Message.cpp
@@ -0,0 +1,35 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <boost/python.hpp>
+
+#include "odil/DataSet.h"
+#include "odil/message/Message.h"
+
+void wrap_Message()
+{
+    using namespace boost::python;
+    using namespace odil;
+    using namespace odil::message;
+
+    class_<Message>("Message", init<>())
+        .def(init<DataSet const &>())
+        .def(init<DataSet const &, DataSet const &>())
+        .def(
+            "get_command_set", &Message::get_command_set,
+            return_value_policy<copy_const_reference>())
+        .def("has_data_set", &Message::has_data_set)
+        .def(
+            "get_data_set", &Message::get_data_set,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "get_command_field", &Message::get_command_field,
+            return_value_policy<copy_const_reference>())
+        .def("set_command_field", &Message::set_command_field)
+    ;
+}
diff --git a/wrappers/MoveSCP.cpp b/wrappers/MoveSCP.cpp
new file mode 100644
index 0000000..e51bbab
--- /dev/null
+++ b/wrappers/MoveSCP.cpp
@@ -0,0 +1,70 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <memory>
+
+#include <boost/python.hpp>
+
+#include "odil/message/CMoveRequest.h"
+#include "odil/MoveSCP.h"
+
+#include "DataSetGeneratorWrapper.h"
+
+namespace
+{
+
+class DataSetGeneratorWrapperMove: 
+    public DataSetGeneratorWrapper<odil::MoveSCP::DataSetGenerator>
+{
+public:
+    DataSetGeneratorWrapperMove()
+    : DataSetGeneratorWrapper<odil::MoveSCP::DataSetGenerator>()
+    {
+        // Nothing else
+    }
+    
+    virtual ~DataSetGeneratorWrapperMove()
+    {
+        // Nothing to do.
+    }
+    
+    virtual unsigned int count() const
+    {
+        return this->get_override("count")();
+    }
+    
+    virtual odil::Association 
+        get_association(odil::message::CMoveRequest const & request) const
+    {
+        return this->get_override("get_association")(request);
+    }
+};
+
+void set_generator(
+    odil::MoveSCP & move_scp, DataSetGeneratorWrapperMove generator)
+{
+    auto cpp_generator = 
+        std::make_shared<DataSetGeneratorWrapperMove>(generator);
+    move_scp.set_generator(cpp_generator);
+}
+
+}
+
+void wrap_MoveSCP()
+{
+    using namespace boost::python;
+    using namespace odil;
+    
+    scope move_scp_scope = class_<MoveSCP>("MoveSCP", init<Association &>())
+        .def("set_generator", &set_generator)
+        .def("__call__", &odil::MoveSCP::operator())
+    ;
+    
+    class_<DataSetGeneratorWrapperMove, boost::noncopyable>(
+        "DataSetGenerator", init<>());
+}
diff --git a/wrappers/MoveSCU.cpp b/wrappers/MoveSCU.cpp
index 565c47d..43579ec 100644
--- a/wrappers/MoveSCU.cpp
+++ b/wrappers/MoveSCU.cpp
@@ -8,23 +8,38 @@
 
 #include <boost/python.hpp>
 
+#include "odil/message/CMoveResponse.h"
 #include "odil/MoveSCU.h"
 
 namespace
 {
 
-void 
+void
 move_with_python_callback(
-    odil::MoveSCU const & scu, 
-    odil::DataSet const & query, boost::python::object const & f)
+    odil::MoveSCU const & scu,
+    odil::DataSet const & query,
+    boost::python::object const & store_callback,
+    boost::python::object const & move_callback)
 {
-    scu.move(
-        query, 
-        [f](odil::DataSet const & data_set) 
-        { 
-            boost::python::call<void>(f.ptr(), data_set); 
-        }
-    );
+    odil::MoveSCU::StoreCallback store_callback_cpp;
+    if(!store_callback.is_none())
+    {
+        store_callback_cpp = [store_callback](odil::DataSet const & data_set)
+        {
+            boost::python::call<void>(store_callback.ptr(), data_set);
+        };
+    }
+
+    odil::MoveSCU::MoveCallback move_callback_cpp;
+    if(!move_callback.is_none())
+    {
+        move_callback_cpp = [move_callback](odil::message::CMoveResponse const & message)
+        {
+            boost::python::call<void>(move_callback.ptr(), message);
+        };
+    }
+
+    scu.move(query, store_callback_cpp, move_callback_cpp);
 }
 
 }
@@ -45,11 +60,23 @@ void wrap_MoveSCU()
             &MoveSCU::set_move_destination
         )
         .def(
+            "get_incoming_port",
+            &MoveSCU::get_incoming_port
+        )
+        .def(
+            "set_incoming_port",
+            &MoveSCU::set_incoming_port
+        )
+        .def(
             "move",
-            &move_with_python_callback
+            &move_with_python_callback,
+            (
+                arg("scu"), arg("query"), arg("store_callback"),
+                arg("move_callback")
+            )
         )
         .def(
-            "move", 
+            "move",
             static_cast<
                 std::vector<DataSet> (MoveSCU::*)(DataSet const &) const
             >(&MoveSCU::move)
diff --git a/wrappers/Exception.cpp b/wrappers/Request.cpp
similarity index 56%
copy from wrappers/Exception.cpp
copy to wrappers/Request.cpp
index cc6085c..571d71c 100644
--- a/wrappers/Exception.cpp
+++ b/wrappers/Request.cpp
@@ -8,18 +8,19 @@
 
 #include <boost/python.hpp>
 
-#include "odil/Exception.h"
+#include "odil/message/Request.h"
 
-void translator(odil::Exception const & e)
-{
-    PyErr_SetString(PyExc_UserWarning, e.what());
-}
-
-void wrap_Exception()
+void wrap_Request()
 {
     using namespace boost::python;
     using namespace odil;
+    using namespace odil::message;
 
-    register_exception_translator<Exception>(translator);
+    class_<Request, bases<Message>>("Request", init<Value::Integer>())
+        .def(init<Message const &>())
+        .def(
+            "get_message_id", &Request::get_message_id,
+            return_value_policy<copy_const_reference>())
+        .def("set_message_id", &Request::set_message_id)
+    ;
 }
-
diff --git a/wrappers/Response.cpp b/wrappers/Response.cpp
new file mode 100644
index 0000000..492c57e
--- /dev/null
+++ b/wrappers/Response.cpp
@@ -0,0 +1,43 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include <boost/python.hpp>
+
+#include "odil/message/Response.h"
+
+void wrap_Response()
+{
+    using namespace boost::python;
+    using namespace odil;
+    using namespace odil::message;
+
+    class_<Response, bases<Message>>(
+            "Response", init<Value::Integer, Value::Integer>())
+        .def(init<Message const &>())
+        .def(
+            "get_message_id_being_responded_to",
+            &Response::get_message_id_being_responded_to,
+            return_value_policy<copy_const_reference>())
+        .def(
+            "set_message_id_being_responded_to",
+            &Response::set_message_id_being_responded_to)
+        .def(
+            "get_status", &Response::get_status,
+            return_value_policy<copy_const_reference>())
+        .def("set_status", &Response::set_status)
+        .def(
+            "is_pending",
+            static_cast<bool (Response::*)() const>(&Response::is_pending))
+        .def(
+            "is_warning",
+            static_cast<bool (Response::*)() const>(&Response::is_warning))
+        .def(
+            "is_failure",
+            static_cast<bool (Response::*)() const>(&Response::is_failure))
+    ;
+}
diff --git a/wrappers/Exception.cpp b/wrappers/StoreSCP.cpp
similarity index 51%
copy from wrappers/Exception.cpp
copy to wrappers/StoreSCP.cpp
index cc6085c..3e6d0af 100644
--- a/wrappers/Exception.cpp
+++ b/wrappers/StoreSCP.cpp
@@ -8,18 +8,31 @@
 
 #include <boost/python.hpp>
 
-#include "odil/Exception.h"
+#include "odil/StoreSCP.h"
 
-void translator(odil::Exception const & e)
+namespace
 {
-    PyErr_SetString(PyExc_UserWarning, e.what());
+
+void 
+set_callback(odil::StoreSCP & scp, boost::python::object const & f)
+{
+    scp.set_callback(
+        [f](odil::message::CStoreRequest const & message) 
+        { 
+            return boost::python::call<odil::Value::Integer>(f.ptr(), message);
+        }
+    );
 }
 
-void wrap_Exception()
+}
+
+void wrap_StoreSCP()
 {
     using namespace boost::python;
     using namespace odil;
 
-    register_exception_translator<Exception>(translator);
+    class_<StoreSCP>("StoreSCP", init<Association &>())
+        .def("set_callback", &set_callback)
+        .def("__call__", &StoreSCP::operator())
+    ;
 }
-
diff --git a/wrappers/Tag.cpp b/wrappers/Tag.cpp
index cf49c4e..e201419 100644
--- a/wrappers/Tag.cpp
+++ b/wrappers/Tag.cpp
@@ -30,4 +30,5 @@ void wrap_Tag()
         .def(self >= self)
         .def("__str__", &Tag::operator std::string)
     ;
+    implicitly_convertible<std::string, Tag>();
 }
diff --git a/wrappers/Exception.cpp b/wrappers/VRFinder.cpp
similarity index 70%
copy from wrappers/Exception.cpp
copy to wrappers/VRFinder.cpp
index cc6085c..8514387 100644
--- a/wrappers/Exception.cpp
+++ b/wrappers/VRFinder.cpp
@@ -8,18 +8,14 @@
 
 #include <boost/python.hpp>
 
-#include "odil/Exception.h"
+#include "odil/VRFinder.h"
 
-void translator(odil::Exception const & e)
-{
-    PyErr_SetString(PyExc_UserWarning, e.what());
-}
-
-void wrap_Exception()
+void wrap_VRFinder()
 {
     using namespace boost::python;
     using namespace odil;
-
-    register_exception_translator<Exception>(translator);
+    
+    class_<VRFinder>("VRFinder", init<>())
+        .def("__call__", &VRFinder::operator())
+    ;
 }
-
diff --git a/wrappers/Value.cpp b/wrappers/Value.cpp
index f689294..92a7751 100644
--- a/wrappers/Value.cpp
+++ b/wrappers/Value.cpp
@@ -13,6 +13,11 @@
 #include "odil/DataSet.h"
 #include "odil/Value.h"
 
+#include "value_constructor.h"
+
+namespace
+{
+
 template<typename T, typename python_type=typename T::value_type>
 boost::shared_ptr<T> create_value(boost::python::object const & sequence)
 {
@@ -30,6 +35,8 @@ boost::shared_ptr<T> create_value(boost::python::object const & sequence)
     return boost::shared_ptr<T>(new T(values));
 }
 
+}
+
 void wrap_Value()
 {
     using namespace boost::python;
@@ -43,12 +50,8 @@ void wrap_Value()
 
     // Define scope to enclose Integers, Reals, etc. in Value
     scope value_scope = class_<Value>("Value", init<>())
-        .def(init<Value::Integers>())
-        .def(init<Value::Reals>())
-        .def(init<Value::Strings>())
-        .def(init<Value::DataSets>())
-        .def(init<Value::Binary>())
-        .def("get_type", &Value::get_type)
+        .def("__init__", make_constructor(value_constructor))
+        .add_property("type", &Value::get_type)
         .def("empty", &Value::empty)
         .def(
             "as_integers", AsIntegers(&Value::as_integers), 
@@ -68,6 +71,15 @@ void wrap_Value()
         .def(self == self)
         .def(self != self)
     ;
+    
+    enum_<Value::Type>("Type")
+        .value("Empty", Value::Type::Empty)
+        .value("Integers", Value::Type::Integers)
+        .value("Reals", Value::Type::Reals)
+        .value("Strings", Value::Type::Strings)
+        .value("DataSets", Value::Type::DataSets)
+        .value("Binary", Value::Type::Binary)
+    ;
 
     class_<Value::Integers>("Integers")
         .def(init<>())
@@ -107,4 +119,3 @@ void wrap_Value()
         .def(vector_indexing_suite<Value::Binary>())
     ;
 }
-
diff --git a/wrappers/exception_factory.cpp b/wrappers/exception_factory.cpp
new file mode 100644
index 0000000..3046433
--- /dev/null
+++ b/wrappers/exception_factory.cpp
@@ -0,0 +1,26 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include "exception_factory.h"
+
+#include <string>
+#include <boost/python.hpp>
+
+PyObject * exception_factory(std::string const & name, PyObject * parent)
+{
+    auto scope = boost::python::scope();
+    std::string const scope_name = 
+        boost::python::extract<std::string>(scope.attr("__name__"));
+    auto const qualified_name = scope_name + "." + name;
+    PyObject * wrapped_type = 
+        PyErr_NewException(
+            const_cast<char*>(qualified_name.c_str()), parent, NULL);
+    scope.attr(name.c_str()) = 
+        boost::python::handle<>(boost::python::borrowed(wrapped_type));
+    return wrapped_type;
+}
diff --git a/wrappers/Exception.cpp b/wrappers/exception_factory.h
similarity index 57%
copy from wrappers/Exception.cpp
copy to wrappers/exception_factory.h
index cc6085c..1d7d1f1 100644
--- a/wrappers/Exception.cpp
+++ b/wrappers/exception_factory.h
@@ -6,20 +6,14 @@
  * for details.
  ************************************************************************/
 
-#include <boost/python.hpp>
-
-#include "odil/Exception.h"
+#ifndef _b6181a9c_09a7_46c9_a514_ff5989ea780b
+#define _b6181a9c_09a7_46c9_a514_ff5989ea780b
 
-void translator(odil::Exception const & e)
-{
-    PyErr_SetString(PyExc_UserWarning, e.what());
-}
-
-void wrap_Exception()
-{
-    using namespace boost::python;
-    using namespace odil;
+#include <string>
+#include <boost/python.hpp>
 
-    register_exception_translator<Exception>(translator);
-}
+/// @brief Create a new Python exception type, in the current scope.
+PyObject * exception_factory(
+    std::string const & name, PyObject * parent=PyExc_Exception);
 
+#endif // _b6181a9c_09a7_46c9_a514_ff5989ea780b
diff --git a/wrappers/json_converter.cpp b/wrappers/json_converter.cpp
index 9f271fe..8503719 100644
--- a/wrappers/json_converter.cpp
+++ b/wrappers/json_converter.cpp
@@ -34,11 +34,20 @@ std::string as_json(odil::DataSet const & data_set, bool pretty_print)
     return string;
 }
 
+odil::DataSet from_json(std::string const & json_string)
+{
+    std::istringstream stream(json_string);
+    Json::Value json_value;
+    stream >> json_value;
+    return odil::as_dataset(json_value);
+}
+
 }
 
 void wrap_json_converter()
 {
     using namespace boost::python;
 
-    def("as_json", &as_json);
+    def("as_json", &as_json, (arg("data_set"), arg("pretty_print")=false));
+    def("from_json", &from_json);
 }
diff --git a/wrappers/odil.cpp b/wrappers/odil.cpp
index 1fea1e8..b2890e6 100644
--- a/wrappers/odil.cpp
+++ b/wrappers/odil.cpp
@@ -10,49 +10,86 @@
 
 void wrap_Association();
 void wrap_AssociationParameters();
+void wrap_BasicDirectoryCreator();
 void wrap_DataSet();
+void wrap_EchoSCP();
 void wrap_EchoSCU();
 void wrap_Element();
 void wrap_ElementsDictionary();
 void wrap_Exception();
+void wrap_FindSCP();
 void wrap_FindSCU();
+void wrap_GetSCP();
 void wrap_GetSCU();
 void wrap_json_converter();
+void wrap_MoveSCP();
 void wrap_MoveSCU();
 void wrap_read();
 void wrap_StoreSCU();
+void wrap_StoreSCP();
 void wrap_Tag();
 void wrap_uid();
 void wrap_UIDsDictionary();
 void wrap_Value();
 void wrap_VR();
+void wrap_VRFinder();
 void wrap_write();
 void wrap_xml_converter();
 
 void wrap_registry();
 
+void wrap_Message();
+void wrap_Request();
+void wrap_Response();
+void wrap_CEchoRequest();
+void wrap_CFindRequest();
+void wrap_CGetRequest();
+void wrap_CGetResponse();
+void wrap_CMoveRequest();
+void wrap_CMoveResponse();
+void wrap_CStoreRequest();
+
 BOOST_PYTHON_MODULE(odil)
 {
+    wrap_Exception();
+
     wrap_Association();
     wrap_AssociationParameters();
+    wrap_BasicDirectoryCreator();
     wrap_DataSet();
+    wrap_EchoSCP();
     wrap_EchoSCU();
     wrap_Element();
     wrap_ElementsDictionary();
-    wrap_Exception();
+    wrap_FindSCP();
     wrap_FindSCU();
+    wrap_GetSCP();
     wrap_GetSCU();
     wrap_json_converter();
+    wrap_MoveSCP();
     wrap_MoveSCU();
     wrap_read();
+    wrap_StoreSCP();
     wrap_StoreSCU();
     wrap_Tag();
     wrap_uid();
     wrap_UIDsDictionary();
     wrap_Value();
     wrap_VR();
+    wrap_VRFinder();
     wrap_write();
     wrap_xml_converter();
 
     wrap_registry();
+
+    wrap_Message();
+    wrap_Request();
+    wrap_Response();
+    wrap_CEchoRequest();
+    wrap_CFindRequest();
+    wrap_CGetRequest();
+    wrap_CGetResponse();
+    wrap_CMoveRequest();
+    wrap_CMoveResponse();
+    wrap_CStoreRequest();
 }
diff --git a/wrappers/value_constructor.cpp b/wrappers/value_constructor.cpp
new file mode 100644
index 0000000..0206074
--- /dev/null
+++ b/wrappers/value_constructor.cpp
@@ -0,0 +1,81 @@
+/*************************************************************************
+ * odil - Copyright (C) Universite de Strasbourg
+ * Distributed under the terms of the CeCILL-B license, as published by
+ * the CEA-CNRS-INRIA. Refer to the LICENSE file or to
+ * http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.html
+ * for details.
+ ************************************************************************/
+
+#include "value_constructor.h"
+
+#include <boost/python.hpp>
+#include <boost/python/stl_iterator.hpp>
+
+#include "odil/DataSet.h"
+#include "odil/Value.h"
+
+boost::shared_ptr<odil::Value>
+value_constructor(boost::python::object const & source)
+{
+    odil::Value * result = nullptr;
+    if(boost::python::len(source) == 0)
+    {
+        result = new odil::Value();
+    }
+    else
+    {
+        boost::python::object first = source[0];
+        PyObject * first_ptr = first.ptr();
+        
+        if(PyInt_Check(first_ptr))
+        {
+            boost::python::stl_input_iterator<odil::Value::Integer> 
+                begin(source), end;
+            result = new odil::Value(odil::Value::Integers(begin, end));
+        }
+        else if(PyFloat_Check(first_ptr))
+        {
+            boost::python::stl_input_iterator<odil::Value::Real> 
+                begin(source), end;
+            result = new odil::Value(odil::Value::Reals(begin, end));
+        }
+        else if(PyString_Check(first_ptr))
+        {
+            boost::python::stl_input_iterator<odil::Value::String> 
+                begin(source), end;
+            result = new odil::Value(odil::Value::Strings(begin, end));
+        }
+        else if(PyByteArray_Check(first_ptr))
+        {
+            boost::python::stl_input_iterator<PyObject*> it(source), end;
+            odil::Value::Binary binary;
+            for(int i=0; i<boost::python::len(source); ++i)
+            {
+                boost::python::object python_item = source[i];
+                PyObject * python_ptr = python_item.ptr();
+                
+                auto buffer = PyByteArray_AsString(python_ptr);
+                auto const length = PyObject_Length(python_ptr);
+                
+                odil::Value::Binary::value_type const item(buffer, buffer+length);
+                binary.push_back(item);
+            }
+            result = new odil::Value(binary);
+        }
+        else
+        {
+            auto odil_module = boost::python::import("odil");
+            boost::python::object DataSetType = odil_module.attr("DataSet");
+            if(PyObject_IsInstance(first_ptr, DataSetType.ptr()))
+            {
+                boost::python::stl_input_iterator<odil::DataSet> 
+                    begin(source), end;
+                result = new odil::Value(odil::Value::DataSets(begin, end));
+            }
+        }
+    }
+    
+    // Old versions of Boost.Python (Debian 7, Ubuntu 12.04) do not like 
+    // std::shared_ptr
+    return boost::shared_ptr<odil::Value>(result);
+}
diff --git a/wrappers/Exception.cpp b/wrappers/value_constructor.h
similarity index 61%
copy from wrappers/Exception.cpp
copy to wrappers/value_constructor.h
index cc6085c..77ae0c8 100644
--- a/wrappers/Exception.cpp
+++ b/wrappers/value_constructor.h
@@ -8,18 +8,7 @@
 
 #include <boost/python.hpp>
 
-#include "odil/Exception.h"
-
-void translator(odil::Exception const & e)
-{
-    PyErr_SetString(PyExc_UserWarning, e.what());
-}
-
-void wrap_Exception()
-{
-    using namespace boost::python;
-    using namespace odil;
-
-    register_exception_translator<Exception>(translator);
-}
+#include "odil/Value.h"
 
+boost::shared_ptr<odil::Value>
+value_constructor(boost::python::object const & source);
diff --git a/wrappers/xml_converter.cpp b/wrappers/xml_converter.cpp
index 1b0054a..b79765f 100644
--- a/wrappers/xml_converter.cpp
+++ b/wrappers/xml_converter.cpp
@@ -8,6 +8,7 @@
 
 #include <boost/property_tree/xml_parser.hpp>
 #include <boost/python.hpp>
+#include <boost/version.hpp>
 
 #include "odil/DataSet.h"
 #include "odil/xml_converter.h"

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



More information about the debian-med-commit mailing list