%%
%% This is file `pdfmanagement-testphase.ltx',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% pdfmanagement-testphase.dtx  (with options: `header')
%% l3pdfdict.dtx  (with options: `package')
%% l3pdfmanagement.dtx  (with options: `package')
%% ltdocinit.dtx  (with options: `package')
%% l3pdfannot.dtx  (with options: `package')
%% l3pdfxform.dtx  (with options: `package')
%% l3pdfmeta.dtx  (with options: `package')
%% l3pdftools.dtx  (with options: `package')
%% l3pdffile.dtx  (with options: `package')
%% 
%% Copyright (C) 2019-2021 The LaTeX Project
%% 
%% It may be distributed and/or modified under the conditions of
%% the LaTeX Project Public License (LPPL), either version 1.3c of
%% this license or (at your option) any later version.  The latest
%% version of this license is in the file:
%% 
%%    https://www.latex-project.org/lppl.txt
%% 
%% This file is part of the "LaTeX PDF management testphase bundle" (The Work in LPPL)
%% and all files in that bundle must be distributed together.
%% 
%% File: pdfmanagement-testphase.dtx
\ProvidesExplFile{pdfmanagement-testphase.ltx}{2023-03-09}{0.95x}
  {PDF~management~code~(testphase)}
%% File: l3pdfdict.dtx
\cs_new:Npn \__pdfdict_get_type:n #1
  {
    \str_case_e:nn { \str_head:n{#1} }
     {
       {g}{global}
       {l}{local}
     }
  }
\msg_new:nnn  { pdfdict } { show-dict }
  { %#1: name of the dictionary
    %#2: expanded content
    %#3: type
    The~#3~dictionary~'#1'~
    \tl_if_empty:nTF {#2}
      { is~empty \\>~ . }
      { contains~the~pairs~(without~outer~braces): #2 . }
  }
\msg_new:nnn  { pdfdict } { unknown-dict }
  {
    The~dictionary~'#1'~is~unknown.
  }
\msg_new:nnn  { pdfdict } { dict-already-defined  }
  {
    The~#2~dictionary~'#1'~is~already~defined.
  }
\msg_new:nnn  { pdfdict } { empty-value }
              { The~value~#1~for~#2~is~blank~and~will~be~ignored }

\msg_new:nnn  { pdfdict } { invalid-name }
              { Name~'#1'~is~not~valid\\
                Names~of~dictionaries~should~start~with~'g_'~or~'l_' }


\seq_new:N \g__pdfdict_lnames_seq
\seq_new:N \g__pdfdict_gnames_seq
\cs_new:Npn \__pdfdict_name:n #1  % #1 dictionary name
  {
    \str_head:n{#1}__pdfdict_/#1_prop
  }
\cs_set_eq:NN \__kernel_pdfdict_name:n \__pdfdict_name:n

\cs_new_protected:Npn \__pdfdict_new:n #1
  {
    \__pdfdict_if_exist:nTF { #1 }
      {
        \msg_error:nnxx
          { pdfdict }
          { dict-already-defined }
          { \tl_to_str:n {#1} }
          { \__pdfdict_get_type:n{#1} }
       }
       {
         \str_case_e:nnF { \str_head:n{#1} }
           {
             {g}
             {
                 \prop_new:c  { \__pdfdict_name:n { #1 } }
                 \seq_gput_right:cn {g__pdfdict_gnames_seq} { #1 }
             }
             {l}
             {
                 \prop_new:c  { \__pdfdict_name:n { #1 } }
                 \seq_gput_right:cn {g__pdfdict_lnames_seq} { #1 }
             }
           }
           {
             \msg_error:nnx{pdfdict}{invalid-name}{\tl_to_str:n{#1}}
           }
       }
  }

\cs_set_eq:NN \pdfdict_new:n \__pdfdict_new:n
\cs_new_protected:Npn \__pdfdict_set_eq:nn #1 #2
  {
    \__pdfdict_if_exist:nTF  { #2 }
      {
        \__pdfdict_if_exist:nF { #1 }
          {
            \__pdfdict_new:n { #1 }
          }
        \prop_set_eq:cc { \__pdfdict_name:n {#1} }{ \__pdfdict_name:n {#2} }
      }
      {
         \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
      }
  }

\cs_set_eq:NN \pdfdict_set_eq:nn \__pdfdict_set_eq:nn

\cs_new_protected:Npn \__pdfdict_gset_eq:nn #1 #2
  {
    \__pdfdict_if_exist:nTF { #2 }
      {
        \__pdfdict_if_exist:nF { #1 }
          {
            \__pdfdict_new:n { #1 }
          }
        \prop_gset_eq:cc { \__pdfdict_name:n {#1} }{ \__pdfdict_name:n {#2} }
      }
      {
         \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
      }
  }

\cs_set_eq:NN \pdfdict_gset_eq:nn \__pdfdict_gset_eq:nn
\prg_new_conditional:Npnn \__pdfdict_if_exist:n #1 { p , T , F , TF }
  {
    \prop_if_exist:cTF
      { \__pdfdict_name:n { #1 }  }
      { \prg_return_true:  }
      { \prg_return_false: }
  }
\prg_set_eq_conditional:NNn
  \pdfdict_if_exist:n \__pdfdict_if_exist:n { p , T , F , TF }
\prg_new_conditional:Npnn \__pdfdict_if_empty:n #1 { p , T , F , TF }
  {
    \prop_if_empty:cTF
      { \__pdfdict_name:n { #1 } }
      { \prg_return_true:  }
      { \prg_return_false: }
  }

\prg_set_eq_conditional:NNn
  \pdfdict_if_empty:n \__pdfdict_if_empty:n { p , T , F , TF }
\cs_new_protected:Npn \__pdfdict_put:nnn #1 #2 #3  %#1 (local) dict, #2 name, #3 value
  {
    \tl_if_blank:nTF { #3 }
      {
        \msg_warning:nnnn { pdfdict }{ empty-value }{ #2 } { #1 }
      }
      {
        \__pdfdict_if_exist:nTF  { #1 }
          {
            \exp_args:Nnx \prop_put:cnn
              { \__pdfdict_name:n { #1 } }{ \str_convert_pdfname:n { #2 } } { #3 }
          }
          {
            \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
          }
      }
  }

\cs_set_eq:NN \pdfdict_put:nnn \__pdfdict_put:nnn
\cs_generate_variant:Nn \pdfdict_put:nnn {nnx,nno}

\cs_new_protected:Npn \__pdfdict_gput:nnn #1 #2 #3  %#1 global dict, #2 name, #3 value
  {
    \tl_if_empty:nTF { #3 }
      {
        \msg_warning:nnnn { pdfdict }{ empty-value }{ #2 } { #1 }
      }
      {
        \__pdfdict_if_exist:nTF { #1 }
          {
            \exp_args:Nnx \prop_gput:cnn
              { \__pdfdict_name:n { #1 } }{ \str_convert_pdfname:n { #2 } } { #3 }
          }
          {
            \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
          }
      }
  }

\cs_set_eq:NN \pdfdict_gput:nnn \__pdfdict_gput:nnn
\cs_generate_variant:Nn \pdfdict_gput:nnn {nnx,nno}
\cs_new_protected:Npn \__pdfdict_get:nnN  #1 #2 #3 %dict,key,macro
  {
    \__pdfdict_if_exist:nTF { #1 }
      {
        \exp_args:Nnx \prop_get:cnN
          { \__pdfdict_name:n { #1 } }
          { \str_convert_pdfname:n { #2 } } #3
      }
      {
        \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
      }
  }

\cs_set_eq:NN \pdfdict_get:nnN \__pdfdict_get:nnN
\cs_new_protected:Npn \__pdfdict_remove:nn #1 #2 %dict,name
  {
    \__pdfdict_if_exist:nTF { #1 }
      {
        \exp_args:Nnx \prop_remove:cn
          { \__pdfdict_name:n  { #1 } }{ \str_convert_pdfname:n { #2 } }
      }
      {
        \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
      }
  }
\cs_set_eq:NN \pdfdict_remove:nn \__pdfdict_remove:nn

\cs_new_protected:Npn \__pdfdict_gremove:nn #1 #2 %dict,name
  {
    \__pdfdict_if_exist:nTF  { #1 }
       {
         \exp_args:Nnx \prop_gremove:cn
           { \__pdfdict_name:n  { #1 } }{ \str_convert_pdfname:n { #2 } }
       }
       {
         \msg_error:nnn { pdfdict } { unknown-dict } { #1 }
       }
  }

\cs_set_eq:NN \pdfdict_gremove:nn \__pdfdict_gremove:nn
\cs_new_protected:Npn \__pdfdict_show:Nn #1#2 %#1 message command, #2 dict
  {
    \prop_if_exist:cTF { \__pdfdict_name:n { #2 } }
       {
         #1
            { pdfdict }
            { show-dict }
            { \tl_to_str:n {#2}  }
            { \prop_map_function:cN {\__pdfdict_name:n { #2 }} \msg_show_item:nn }
            { \__pdfdict_get_type:n{#2} }
            { }
       }
       {
         #1 { pdfdict } { unknown-dict } { #2 } {}{}{}
       }
  }
\cs_new_protected:Npn \pdfdict_show:n #1
  {
    \__pdfdict_show:Nn \msg_show:nnxxxx {#1}
  }
\cs_new:Npn \__pdfdict_item:nn #1 #2 %#1 name, #2 value
  {
    \tl_if_blank:nF {#2} { /#1~#2~ }
  }
\cs_generate_variant:Nn \__pdfdict_item:nn {ne}
\cs_set_eq:NN \pdfdict_item:nn \__pdfdict_item:nn
\cs_generate_variant:Nn \pdfdict_item:nn {ne}
\cs_new:Npn \__pdfdict_use:n #1  %#1 dict
  {
    \prop_map_function:cN { \__pdfdict_name:n { #1 } } \__pdfdict_item:ne
  }

\cs_set_eq:NN \pdfdict_use:n \__pdfdict_use:n
%% File: l3pdfmanagement.dtx


\msg_new:nnn  { pdfmanagement } { unknown-dict }
              { The~PDF~management~resource~'#1'~is~unknown. }

\msg_new:nnn  { pdfmanagement } { empty-value }
              { The~value~for~#1~is~empty~and~will~be~ignored }

\msg_new:nnn  { pdfmanagement } { no-removal }
              { It~is~not~possible~to~remove~values~from~'#1'.}

\msg_new:nnn  { pdfmanagement } { no-show }
              { It~is~not~possible~to~show~the~content~of~'#1'.}

\msg_new:nnn  { pdfmanagement } { name-exist }
              { The~name~'#1'~has~already~been~used~for~name~tree~'#2'.}

\msg_new:nnn  { pdfmanagement } { show-dict }
  {
    The~PDF~resource~'#1'~
    \tl_if_empty:nTF {#2}
      { is~empty \\>~ . }
      { contains~the~pairs~(without~outer~braces): #2 . }
  }
\msg_new:nnn  { pdfmanagement } { dict-already-defined  }
  {
    The~path~'#1'~is~already~defined.
  }
\msg_new:nnn  { pdfmanagement } { inactive  }
  {
    The~PDF~resources~management~is~not~active\\
    command~'#1'~ignored.
  }
\tl_new:N \l__pdfmanagement_tmpa_tl
\tl_new:N \l__pdfmanagement_tmpb_tl
\seq_new:N \l__pdfmanagement_tmpa_seq

\bool_new:N \g__pdfmanagement_active_bool
\prg_new_conditional:Npnn \__pdfmanagement_if_active:  { p , T , F , TF }
  {
    \bool_if:NTF \g__pdfmanagement_active_bool
      { \prg_return_true:  }
      { \prg_return_false: }
  }
\prg_set_eq_conditional:NNn
  \pdfmanagement_if_active: \__pdfmanagement_if_active: { p , T , F , TF }

\cs_set_eq:NN \IfPDFManagementActiveTF\pdfmanagement_if_active:TF
\hook_new:n {pdfmanagement/add}
\cs_new_protected:Npn \pdfmanagement_add:nnn #1 #2 #3
  {
    \__pdfmanagement_if_active:TF
      {
        \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
          {
            \hook_gput_code:nnn
              {pdfmanagement/add}
              {pdfmanagement}
              {
                \__pdfmanagement_handler_gput:nnn { #1 }{ #2 }{ #3 }
              }
          }
          {
            \msg_error:nnn{pdfmanagement}{unknown-dict}{#1}
          }
      }
      {
        \msg_warning:nnx {pdfmanagement}{inactive}
          {\tl_to_str:n {\pdfmanagement_add:nnn}}
      }
  }

\cs_generate_variant:Nn \pdfmanagement_add:nnn {nnx,nxx,xxx}
\cs_set_eq:NN \PDFManagementAdd \pdfmanagement_add:xxx
\tl_new:N \g__kernel_pdfmanagement_thispage_shipout_code_tl
\tl_new:N \g__kernel_pdfmanagement_lastpage_shipout_code_tl
\tl_new:N \g__kernel_pdfmanagement_end_run_code_tl
\tl_gset:Nn \g__kernel_pdfmanagement_thispage_shipout_code_tl
  {
     \bool_if:NT \g__pdfmanagement_active_bool
       {
         \exp_args:NV \__pdf_backend_ThisPage_gpush:n      { \g_shipout_readonly_int }
         \exp_args:NV \__pdf_backend_PageResources_gpush:n { \g_shipout_readonly_int }
       }
  }

\tl_gset:Nn \g__kernel_pdfmanagement_end_run_code_tl
  {
    \bool_if:NT \g__pdfmanagement_active_bool
       {
         \__pdf_backend_PageResources_obj_gpush:          %ExtGState etc
         \__pdfmanagement_Pages_gpush:            %pagesattr
         \__pdfmanagement_Info_gpush:             %pdfinfo
         \__pdfmanagement_Catalog_gpush:
       }
  }



\cs_new_protected:Npn \__pdfmanagement_handler_gput:nnn #1 #2 #3  %#1 dict, #2 name, #3 value
  {
    \tl_if_empty:nTF { #3 }
      {
        \msg_none:nnn { pdfmanagement }{ empty-value }{ /#1/#2 }
      }
      {
        \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
          {
            \cs_if_exist:cTF
              { __pdfmanagement_handler/#1/?_gput:nn } %general, name independant handler
              { \use:c {__pdfmanagement_handler/#1/?_gput:nn} {#2} {#3} }
              {
                \cs_if_exist:cTF
                  { __pdfmanagement_handler/#1/#2_gput:n }
                  { \use:c {__pdfmanagement_handler/#1/#2_gput:n} {#3} } %special handler
                  {
                    \exp_args:Nnx
                    \prop_gput:cnn
                      { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
                      { \str_convert_pdfname:n { #2 } }
                      { #3 }
                  }
              }
          }
          {
            \msg_error:nnn { pdfmanagement } { unknown-dict } { #1 }
          }
      }
  }

\cs_generate_variant:Nn \__pdfmanagement_handler_gput:nnn {nxx}

\cs_new_protected:Npn \__pdfmanagement_get:nnN  #1 #2 #3 %path,key,macro
  {
    \exp_args:Nnx
    \prop_get:cnN
      { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
      { \str_convert_pdfname:n {#2} } #3
  }

\cs_new_protected:Npn \__pdfmanagement_handler_gremove:nn #1 #2 %path,key
  {
    \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
          {
            \cs_if_exist:cTF
              { __pdfmanagement_handler/#1/?_gremove:n } %general, name independant handler
              { \use:c {__pdfmanagement_handler/#1/?_gremove:n} {#2} }
              {
                \cs_if_exist:cTF
                  { __pdfmanagement_handler/#1/#2_gremove: }
                  { \use:c {__pdfmanagement_handler/#1/#2_gremove:} } %special handler
                  {
                    \exp_args:Nnx
                    \prop_gremove:cn
                      { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
                      { \str_convert_pdfname:n {#2} }
                  }
              }
          }
          {
            \msg_error:nnn { pdfmanagement } { unknown-dict } { #1 }
          }
  }

\cs_new_protected:Npn \__pdfmanagement_gremove:nn #1 #2 %path,key
  {
    \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
          {
            \exp_args:Nnx
            \prop_gremove:cn
              { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
              { \str_convert_pdfname:n{#2} }
          }
          {
            \msg_error:nnn { pdfmanagement } { unknown-dict } { #1 }
          }
  }

\cs_new_protected:Npn \__pdfmanagement_show:Nn #1#2
  {
    \cs_if_exist:cTF
      { __pdfmanagement_handler/#2/?_show: } %general, name independant handler
      { \use:c {__pdfmanagement_handler/#2/?_show:} }
      {
        \prop_if_exist:cTF { \__kernel_pdfdict_name:n { g__pdf_Core/#2 } }
          {
             #1
               { pdfmanagement } { show-dict }
               { \tl_to_str:n {#2} }
               {
                 \prop_map_function:cN
                  {\__kernel_pdfdict_name:n { g__pdf_Core/#2 }}
                  \msg_show_item:nn
               }
               { } { }
          }
          {
            #1 { pdfmanagement } { unknown-dict } {#2}{}{}{}
          }
       }
  }

\cs_new_protected:Npn \__pdfmanagement_show:n #1  %path
  {
    \prop_show:c { \__kernel_pdfdict_name:n { g__pdf_Core/#1 } }
  }
\cs_new_protected:Npn \pdfmanagement_show:n #1
  {
    \__pdfmanagement_show:Nn \msg_show:nnxxxx {#1}
  }
\cs_new_protected:Npn \pdfmanagement_remove:nn #1 #2
  {
    \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
      {
        \__pdfmanagement_handler_gremove:nn { #1 }{ #2 }
      }
      {
        \msg_error:nnn{pdfmanagement}{unknown-dict}{#1}
      }
  }
\cs_new_protected:Npn \pdfmanagement_get:nnN #1 #2 #3
  {
    \pdfdict_if_exist:nTF { g__pdf_Core/#1 }
      {
        \__pdfmanagement_get:nnN { #1 }{ #2 } #3
      }
      {
        \msg_error:nnn{pdfmanagement}{unknown-dict}{#1}
      }
  }
\pdfdict_new:n { g__pdf_Core/Info}
\cs_new_protected:Npn \__pdfmanagement_Info_gpush:
  {
    \prop_map_function:cN
      { \__kernel_pdfdict_name:n { g__pdf_Core/Info} }
      \__pdf_backend_info_gput:nn
    \prop_gclear:c { \__kernel_pdfdict_name:n { g__pdf_Core/Info} }
  }
\pdfdict_new:n { g__pdf_Core/Pages}
\cs_new_protected:Npn \__pdfmanagement_Pages_gpush:
  {
    \pdfdict_if_empty:nF { g__pdf_Core/Pages}
      {
        \exp_args:Nx \__pdf_backend_Pages_primitive:n
          {
            \pdfdict_use:n { g__pdf_Core/Pages}
          }
      }
  }

\pdfdict_new:n { g__pdf_Core/Page }
\pdfdict_new:n { g__pdf_Core/ThisPage }

\cs_new_protected:cpn { __pdfmanagement_handler/Page/?_gput:nn } #1 #2
  {
    \__pdf_backend_Page_gput:nn { #1 }{ #2 }
  }
\cs_new_protected:cpn { __pdfmanagement_handler/Page/?_gremove:n } #1
  {
    \__pdf_backend_Page_gremove:n { #1 }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/ThisPage/?_gput:nn } #1 #2
  {
    \prop_gput:cnn  { \__kernel_pdfdict_name:n { g__pdf_Core/ThisPage } }{ #1 } { #2 }
    \bool_if:NT \g__pdfmanagement_active_bool
      {
        \__pdf_backend_ThisPage_gput:nn { #1 }{ #2 }
      }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/ThisPage/?_gremove:n } #1
  {
    \msg_warning:nnn { pdfmanagement } { no-removal }{ThisPage}
  }

\cs_new_protected:cpn { __pdfmanagement_handler/ThisPage/?_show: }
  {
    \msg_warning:nnn { pdfmanagement } { no-show }{ThisPage}
  }

\clist_const:Nn \c__pdfmanagement_PageResources_clist
  {
    ExtGState,
    ColorSpace,
    Pattern,
    Shading,
  }

\clist_map_inline:Nn \c__pdfmanagement_PageResources_clist
  {
    \pdfdict_new:n { g__pdf_Core/Page/Resources/#1}
  }
\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/ExtGState/?_gput:nn } #1 #2
  {
    \__pdf_backend_PageResources_gput:nnn {ExtGState} { #1 }{ #2 }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/ColorSpace/?_gput:nn } #1 #2
  {
    \__pdf_backend_PageResources_gput:nnn {ColorSpace} { #1 }{ #2 }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/Shading/?_gput:nn } #1 #2
  {
    \__pdf_backend_PageResources_gput:nnn {Shading} { #1 }{ #2 }
  }

\cs_new_protected:cpn { __pdfmanagement_handler/Page/Resources/Pattern/?_gput:nn } #1 #2
  {
    \__pdf_backend_PageResources_gput:nnn {Pattern} { #1 }{ #2 }
  }
\pdfdict_new:n { g__pdf_Core/Catalog}

\clist_const:Nn \c__pdfmanagement_Catalog_toplevel_clist
  {
    Collection,
    DPartRoot,
    Lang,
    Legal,
    Metadata,
    NeedsRendering,
    OCProperties/D,
    OpenAction,
    PageLabels,
    PageLayout,
    PageMode,
    Perms,
    PieceInfo,
    SpiderInfo,
    StructTreeRoot,
    Threads,
    URI,
    Version
  }

\clist_const:Nn \c__pdfmanagement_Catalog_sub_clist
  {
    AA,
    AcroForm,
    AcroForm/DR,
    AcroForm/DR/Font,
    MarkInfo,
    ViewerPreferences,
    OCProperties
  }

\clist_map_inline:Nn \c__pdfmanagement_Catalog_sub_clist
  {
    \pdfdict_new:n { g__pdf_Core/Catalog/#1}
  }

\clist_const:Nn \c__pdfmanagement_Catalog_seq_clist
  {
    AF,
    OCProperties/OCGs,
    OCProperties/Configs,
    OutputIntents,
    Requirements,
    AcroForm/Fields,
    AcroForm/CO
  }

\clist_const:Nn \c__pdfmanagement_Catalog_nametree_clist
  {
    AP,
    JavaScript,
  }
\clist_map_inline:Nn \c__pdfmanagement_Catalog_seq_clist
 {
   \seq_new:c { g__pdfmanagement_/Catalog/#1_seq } % new name later
   \cs_new_protected:cpn { __pdfmanagement_handler/Catalog/#1_gput:n } ##1
     {
       \seq_gput_right:cn { g__pdfmanagement_/Catalog/#1_seq } {  ##1  }
     }
 }

\cs_new_protected:cpn { __pdfmanagement_handler/Catalog/OCProperties/D_gput:n } #1
  {
    \seq_gput_left:cn
      { g__pdfmanagement_/Catalog/OCProperties/Configs_seq }
      {  #1  }
  }
\cs_new_protected:Npn \__pdfmanagement_nametree_add_aux:nnn #1 #2 #3
  %#1 name tree, #2 sanitized name #3 value
  {
     \prop_get:coNTF
       { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/Names/#1 }}
       { #2 }
       \l__pdfmanagement_tmpb_tl
       {
         \msg_error:nnnn{pdfmanagement}{name-exist}{#2}{#1}
       }
       {
         \prop_gput:con
           { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/Names/#1 }}
           { #2 }
           { #3 }
       }
  }
\clist_map_inline:Nn \c__pdfmanagement_Catalog_nametree_clist
 {
   \pdfdict_new:n { g__pdf_Core/Catalog/Names/#1}
   \cs_new_protected:cpn { __pdfmanagement_handler/Catalog/Names/#1/?_gput:nn } ##1 ##2
     {
       \pdf_string_from_unicode:nnN {utf8/string}{##1}\l__pdfmanagement_tmpa_tl
       \exp_args:Nno
         \__pdfmanagement_nametree_add_aux:nnn {#1}{\l__pdfmanagement_tmpa_tl}{##2}
     }
 }
\pdfdict_new:n { g__pdf_Core/Catalog/Names/EmbeddedFiles}
\cs_new_protected:cpn { __pdfmanagement_handler/Catalog/Names/EmbeddedFiles/?_gput:nn } #1 #2
  {
    \pdf_string_from_unicode:nnN {utf8/string}{#1}\l__pdfmanagement_tmpa_tl
    \exp_args:Nno
    \__pdfmanagement_nametree_add_aux:nnn
      {EmbeddedFiles}{\l__pdfmanagement_tmpa_tl}{#2}
    \exp_args:No
    \__pdf_backend_NamesEmbeddedFiles_add:nn {\l__pdfmanagement_tmpa_tl}{#2}
  }
\cs_new_protected:Npn \__pdfmanagement_Catalog_gpush:
  {
    \use:c { __pdfmanagement_/Catalog/AA_gpush: }
    \use:c { __pdfmanagement_/Catalog/AcroForm_gpush: }
    \use:c { __pdfmanagement_/Catalog/AF_gpush: }
    \use:c { __pdfmanagement_/Catalog/MarkInfo_gpush: }
    \pdfmeta_standard_verify:nT {Catalog_no_OCProperties}
      {
        \use:c { __pdfmanagement_/Catalog/OCProperties_gpush: }
      }
    \use:c { __pdfmanagement_/Catalog/OutputIntents_gpush: }
    \use:c { __pdfmanagement_/Catalog/Requirements_gpush: }
    \use:c { __pdfmanagement_/Catalog/ViewerPreferences_gpush: }
    % output the single values:
    \prop_map_function:cN
      { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog} }
      \__pdf_backend_catalog_gput:nn
    % output names tree:
    \use:c{ __pdfmanagement_/Catalog/Names_gpush:n } {EmbeddedFiles}
    \clist_map_inline:Nn \c__pdfmanagement_Catalog_nametree_clist
     {
      \use:c{ __pdfmanagement_/Catalog/Names_gpush:n } {##1}
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/AA_gpush: }
  {
    \prop_if_empty:cF
     { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AA } }
     {
       \pdf_object_new:n  { __pdfmanagement/Catalog/AA }
       \pdf_object_write:nnx
            { __pdfmanagement/Catalog/AA }{ dict }
            { \pdfdict_use:n { g__pdf_Core/Catalog/AA } }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {AA}
           {
             \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AA }
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/AcroForm_gpush: }
  {
    \seq_if_empty:cF { g__pdfmanagement_/Catalog/AcroForm/Fields_seq }
      {
        \pdf_object_new:n  { __pdfmanagement/Catalog/AcroForm/Fields }
        \pdf_object_write:nnx
            { __pdfmanagement/Catalog/AcroForm/Fields } { array }
            { \seq_use:cn { g__pdfmanagement_/Catalog/AcroForm/Fields_seq } {~} }
        \exp_args:Nnnx
          \prop_gput:cnn %we have to use \prop here to avoid the handler ...
            { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm } }
            { Fields }
            { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm/Fields } }
      }
    \seq_if_empty:cF { g__pdfmanagement_/Catalog/AcroForm/CO_seq }
      {
        \pdf_object_new:n  { __pdfmanagement/Catalog/AcroForm/CO }
        \pdf_object_write:nnx
            { __pdfmanagement/Catalog/AcroForm/CO } { array }
            { \seq_use:cn { g__pdfmanagement_/Catalog/AcroForm/CO_seq } {~} }
        \exp_args:Nnnx
          \prop_gput:cnn %we have to use \prop here to avoid the handler ...
            { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm } }
            { CO }
            { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm/CO } }
      }
     \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm/DR/Font}}
       {
         \pdf_object_new:n { __pdfmanagement/Catalog/AcroForm/DR/Font }
         \pdf_object_write:nnx
             { __pdfmanagement/Catalog/AcroForm/DR/Font } { dict }
             { \pdfdict_use:n { g__pdf_Core/Catalog/AcroForm/DR/Font } }
         \exp_args:Nnnx
           \prop_gput:cnn %we have to use \prop here to avoid the handler ...
             { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm/DR } }
             { Font }
             { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm/DR/Font } }
       }
     \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm/DR}}
       {
         \pdf_object_new:n { __pdfmanagement/Catalog/AcroForm/DR }
         \pdf_object_write:nnx
             { __pdfmanagement/Catalog/AcroForm/DR } { dict }
             { \pdfdict_use:n { g__pdf_Core/Catalog/AcroForm/DR } }
         \exp_args:Nnnx
           \prop_gput:cnn %we have to use \prop here to avoid the handler ...
             { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm } }
             { DR }
             { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm/DR } }
       }
     \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/AcroForm} }
       {
         \pdf_object_new:n { __pdfmanagement/Catalog/AcroForm }
         \pdf_object_write:nnx
             { __pdfmanagement/Catalog/AcroForm } { dict }
             { \pdfdict_use:n { g__pdf_Core/Catalog/AcroForm } }
         \exp_args:Nnnx
           \__pdfmanagement_handler_gput:nnn
             { Catalog }
             { AcroForm }
             { \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/AcroForm } }
       }
  }

\cs_new_protected:cpn { __pdfmanagement_/Catalog/AF_gpush: }
  {
    \seq_if_empty:cF
     { g__pdfmanagement_/Catalog/AF_seq }
     {
       \pdf_object_new:n  { __pdfmanagement/Catalog/AF }
       \pdf_object_write:nnx
            { __pdfmanagement/Catalog/AF } { array }
            { \seq_use:cn { g__pdfmanagement_/Catalog/AF_seq } {~} }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {AF}
           {
             \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/AF}
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/MarkInfo_gpush: }
  {
    \prop_if_empty:cF
     { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/MarkInfo } }
     {
       \pdf_object_new:n  { __pdfmanagement/Catalog/MarkInfo }
       \pdf_object_write:nnx
          { __pdfmanagement/Catalog/MarkInfo } { dict }
          { \pdfdict_use:n { g__pdf_Core/Catalog/MarkInfo } }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {MarkInfo}
           {
             \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/MarkInfo}
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/OCProperties_gpush: }
  {
   \int_compare:nNnT
      {
        ( \seq_count:c { g__pdfmanagement_/Catalog/OCProperties/OCGs_seq }  )*
        ( \seq_count:c { g__pdfmanagement_/Catalog/OCProperties/Configs_seq } )
      }
      >
      { 0 }
      {
        \pdf_object_new:n  { __pdfmanagement/Catalog/OCProperties }
        \seq_gpop_left:cN { g__pdfmanagement_/Catalog/OCProperties/Configs_seq} \l__pdfmanagement_tmpa_tl
        \pdf_object_write:nnx {__pdfmanagement/Catalog/OCProperties} {dict}
           {
              /OCGs~[ \seq_use:cn { g__pdfmanagement_/Catalog/OCProperties/OCGs_seq } {~} ]
              /D~\l__pdfmanagement_tmpa_tl~
              \seq_if_empty:cF { g__pdfmanagement_/Catalog/OCProperties/Configs_seq }
                {
                  /Configs~
                  [ \seq_use:cn { g__pdfmanagement_/Catalog/OCProperties/Configs_seq} {~} ]
                }
           }
        \exp_args:Nnx
          \__pdf_backend_catalog_gput:nn
            { OCProperties }
            { \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/OCProperties} }
      }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/OutputIntents_gpush: }
  {
    \seq_if_empty:cF
     { g__pdfmanagement_/Catalog/OutputIntents_seq }
     {
       \pdf_object_new:n  { __pdfmanagement/Catalog/OutputIntents }
       \pdf_object_write:nnx
            { __pdfmanagement/Catalog/OutputIntents } { array }
            { \seq_use:cn { g__pdfmanagement_/Catalog/OutputIntents_seq } {~} }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {OutputIntents}
           {
             \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/OutputIntents}
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/Requirements_gpush: }
  {
    \seq_if_empty:cF
     { g__pdfmanagement_/Catalog/Requirements_seq }
     {
       \pdf_object_new:n  { __pdfmanagement/Catalog/Requirements }
       \pdf_object_write:nnx
            { __pdfmanagement/Catalog/Requirements } { array }
            { \seq_use:cn { g__pdfmanagement_/Catalog/Requirements_seq } {~} }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {Requirements}
           {
             \__pdf_backend_object_ref:n { __pdfmanagement/Catalog/Requirements }
           }
     }
  }
\cs_new_protected:cpn { __pdfmanagement_/Catalog/ViewerPreferences_gpush: }
  {
    \prop_if_empty:cF
     { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/ViewerPreferences } }
     {
       \pdf_object_new:n  { __pdfmanagement/Catalog/ViewerPreferences }
       \pdf_object_write:nnx
            { __pdfmanagement/Catalog/ViewerPreferences } { dict }
            { \pdfdict_use:n { g__pdf_Core/Catalog/ViewerPreferences } }
       \exp_args:Nnx
         \__pdf_backend_catalog_gput:nn
           {ViewerPreferences}
           {
             \__pdf_backend_object_ref:n {__pdfmanagement/Catalog/ViewerPreferences}
           }
     }
  }
\int_new:N \g__pdfmanagement_EmbeddedFiles_int
\cs_new:Npn \__pdfmanagement_EmbeddedFiles_name:
 {
   (
    l3ef
    \int_compare:nNnT {\g__pdfmanagement_EmbeddedFiles_int} < {10}
     {0}
    \int_compare:nNnT {\g__pdfmanagement_EmbeddedFiles_int} < {100}
     {0}
    \int_compare:nNnT {\g__pdfmanagement_EmbeddedFiles_int} < {1000}
     {0}
    \int_use:N \g__pdfmanagement_EmbeddedFiles_int
   )
 }
\pdfdict_new:n { g__pdf_Core/Catalog/Names }

\cs_new_protected:cpn { __pdfmanagement_handler/Catalog/Names/EmbeddedFiles_gput:n } #1
  {
    \int_gincr:N \g__pdfmanagement_EmbeddedFiles_int
    \exp_args:Nnx
    \prop_gput:cnn
      { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/Names/EmbeddedFiles }}
      { \__pdfmanagement_EmbeddedFiles_name: }
      { #1 }
     \exp_args:Nx
     \__pdf_backend_NamesEmbeddedFiles_add:nn {\__pdfmanagement_EmbeddedFiles_name:} { #1 }
  }
\cs_new_protected:cpn  { __pdfmanagement_/Catalog/Names_gpush:n } #1 %#1 name of name tree
 {
   \pdfdict_if_empty:nF { g__pdf_Core/Catalog/Names/#1 }
     {
       \seq_clear:N \l__pdfmanagement_tmpa_seq
       \prop_map_inline:cn
         {\__kernel_pdfdict_name:n { g__pdf_Core/Catalog/Names/#1 }}
         { \seq_put_right:Nn \l__pdfmanagement_tmpa_seq {##1~##2}}
       \seq_sort:Nn  \l__pdfmanagement_tmpa_seq
         {
           \str_compare:nNnTF {##1} > {##2}
             { \sort_return_swapped: }
             { \sort_return_same: }
         }
       \exp_args:Nnx \__pdf_backend_Names_gpush:nn
         {#1}
         {
           \seq_use:Nn \l__pdfmanagement_tmpa_seq {~}
         }
     }
 }
\cs_new_protected:cpn {__pdfmanagement_handler/Catalog/?_show:}
  {
    \iow_term:x
      {
        \iow_newline:
        The~Catalog~contains~in~the~top~level~the~single~value~entries
        \prop_map_function:cN
          {\__kernel_pdfdict_name:n { g__pdf_Core/Catalog }}
          \msg_show_item:nn
      }
    \clist_map_inline:Nn \c__pdfmanagement_Catalog_seq_clist
     {
       \seq_if_empty:cF {  g__pdfmanagement_/Catalog/##1_seq }
         {
           \iow_term:x
             {
               The~'##1'~array~contains~the~entries
               \seq_map_function:cN { g__pdfmanagement_/Catalog/##1_seq } \msg_show_item:n
             }
         }
      }
    \clist_map_inline:Nn \c__pdfmanagement_Catalog_sub_clist
      {
        \prop_if_empty:cF { \__kernel_pdfdict_name:n { g__pdf_Core/Catalog/##1 } }
          {
            \iow_term:x
              {
                The~Catalog~subdirectory~'##1'~contains~the~single~value~entries
                \prop_map_function:cN
                  {\__kernel_pdfdict_name:n { g__pdf_Core/Catalog/##1 }}
                  \msg_show_item:nn
              }
          }
      }
    \tl_show:x {\tl_to_str:n{\pdfmanagement_show:n{Catalog}}}
  }
\pdfdict_new:n { g__pdf_Core/Xform/Resources/Properties}
%% File: ltdocinit.dtx
\clist_new:N \g__pdfmanagement_firstaidoff_clist
\tl_new:N \g__pdfmanagement_testphase_tl
\keys_define:nn { document / metadata }
  {
    ,testphase / new-or-1 .code:n =
      {
        \tl_gput_right:Nn\g__pdfmanagement_testphase_tl
           {
             \file_if_exist_input:nF {new-or-1-latex-lab-testphase.ltx}
               {
                \RequirePackage{output-patches-tmp-ltx}
               }
           }
      }
  }
\NewCommandCopy\DeclareDocumentMetadata\DocumentMetadata
\prop_new:N \g__pdfmanagement_documentproperties_prop %
\NewDocumentCommand\AddToDocumentProperties{O{\@currname}mm}
  {
    \exp_args:NNx
      \prop_gput:Nnn \g__pdfmanagement_documentproperties_prop
        {
          \tl_if_blank:eTF {#1}{top-level/}{#1/} #2
        }
        { #3}
  }
\NewExpandableDocumentCommand\GetDocumentProperties{m}
  {
    \prop_item:Nn \g__pdfmanagement_documentproperties_prop {#1}
  }
\cs_new:Npn\pdfmanagement_get_documentproperties:n #1
  {
    \prop_item:Nn \g__pdfmanagement_documentproperties_prop {#1}
  }
\prg_new_protected_conditional:Npnn
  \pdfmanagement_get_documentproperties:nN #1#2 { T , F , TF }
    {
     \prop_get:NnNTF \g__pdfmanagement_documentproperties_prop  {#1} #2
       {
        \prg_return_true:
       }
       {
        \prg_return_false:
       }
    }
\msg_new:nnn  { pdfmanagement } { show-properties }
  {
    The~following~document~properties~have~been~stored:
    #1
  }
\NewDocumentCommand\ShowDocumentProperties {}
  {
    \msg_show:nnx {pdfmanagement}{show-properties}
      {
        \prop_map_function:NN \g__pdfmanagement_documentproperties_prop \msg_show_item:nn
      }
  }
%% File: l3pdfannot.dtx
\RequirePackage{l3bitset}
\bitset_new:Nn \l_pdfannot_F_bitset
  {
    Invisible      = 1,
    Hidden         = 2,
    Print          = 3,
    NoZoom         = 4,
    NoRotate       = 5,
    NoView         = 6,
    ReadOnly       = 7,
    Locked         = 8,
    ToggleNoView   = 9,
    LockedContents = 10
  }
\bool_new:N \g__pdfannot_use_lastlink_bool
\cs_new_protected:Npn \pdfannot_box:nnnn #1 #2 #3 #4
  {
    \__pdf_backend_annotation:nnnn {#1}{#2}{#3}{#4}
    \bool_gset_false:N\g__pdfannot_use_lastlink_bool
  }
\cs_generate_variant:Nn \pdfannot_box:nnnn {nnnx}
\cs_new:Npn \pdfannot_box_ref_last:
  {
    \__pdf_backend_annotation_last:
  }

 \pdfdict_new:n   { l__pdfannot/widget }
 \pdfdict_new:n   { l__pdfannot/widget/AA }
 \pdfdict_new:n   { l__pdfannot/widget/AP }
 \pdfdict_new:n   { l__pdfannot/widget/MK }
 \pdfdict_new:n   { l__pdfannot/widget/BS }
 \pdfdict_put:nnn { l__pdfannot/widget }{ Subtype }{ /Widget }
 \hook_new_pair:nn
   {pdfannot/widget/before}
   {pdfannot/widget/after}
\cs_new_protected:Npn \pdfannot_widget_box:nnn #1 #2 #3
  {
    \hook_use:n { pdfannot/widget/before }
    \group_begin:
    \pdfmeta_standard_verify:nT
      {annot_widget_no_AA}
      {
        \pdfdict_if_empty:nF { l__pdfannot/widget/AA }
          {
            \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n{l__pdfannot/widget/AA}}
            \pdfdict_put:nnx { l__pdfannot/widget }
              {AA}
              {\pdf_object_ref_last:}
          }
      }
    \pdfdict_if_empty:nF { l__pdfannot/widget/AP }
      {
        \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n{l__pdfannot/widget/AP}}
        \pdfdict_put:nnx { l__pdfannot/widget }
             {AP}
             {\pdf_object_ref_last:}
      }
    \pdfdict_if_empty:nF { l__pdfannot/widget/MK }
      {
        \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n{l__pdfannot/widget/MK}}
        \pdfdict_put:nnx { l__pdfannot/widget }
             {MK}
             {\pdf_object_ref_last:}
      }
    \pdfdict_if_empty:nF { l__pdfannot/widget/BS }
      {
        \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n{l__pdfannot/widget/BS}}
        \pdfdict_put:nnx { l__pdfannot/widget }
             {BS}
             {\pdf_object_ref_last:}
      }
    \pdfannot_box:nnnx {#1}{#2}{#3}
      {
        \pdfdict_use:n { l__pdfannot/widget}
      }
    \hook_use:n { pdfannot/widget/end }
    \group_end:
    \bool_gset_false:N\g__pdfannot_use_lastlink_bool
  }
\seq_const_from_clist:Nn \c_pdfannot_link_types_seq { URI , GoToR , Launch , GoTo, Named }
\seq_map_inline:Nn \c_pdfannot_link_types_seq
  {
    \pdfdict_new:n { l__pdfannot/link/#1 }
    \pdfdict_put:nnn { l__pdfannot/link/#1 }{ Subtype }{ /Link }
    \hook_new_pair:nn
      {pdfannot/link/#1/before}
      {pdfannot/link/#1/after}
    \hook_new_pair:nn
      {pdfannot/link/#1/begin}
      {pdfannot/link/#1/end}
   }
\cs_new_protected:Nn \pdfannot_link_off: { \__pdf_backend_link_off: }
\cs_new_protected:Nn \pdfannot_link_on:  { \__pdf_backend_link_on: }
\cs_new_protected:Nn \pdfannot_link:nnn %#1 type (URI, GoTo etc),
                                        %#2 action spec, #3 link text
  {
    \hook_use:n { pdfannot/link/#1/before}
    \mode_leave_vertical:
    \exp_args:Nxx %xetex needs expansion
    \__pdf_backend_link_begin_user:nnw
      {
         \pdfdict_if_exist:nT { l__pdfannot/link/#1 }
          {
            \pdfdict_use:n { l__pdfannot/link/#1}
          }
      }
      {
        #2 %exp_not?
      }
    \bool_gset_true:N \g__pdfannot_use_lastlink_bool
    \hook_use:n { pdfannot/link/#1/begin}
    #3
    \hook_use:n { pdfannot/link/#1/end}
    \__pdf_backend_link_end:
    \bool_gset_true:N \g__pdfannot_use_lastlink_bool
    \hook_use:n { pdfannot/link/#1/after}
  }
\cs_generate_variant:Nn \pdfannot_link:nnn {nxn}
\cs_new_protected:Npn \pdfannot_link_begin:nnw #1 #2 %#1 type, #2 action spec
  {
    \hook_use:n { pdfannot/link/#1/before}
    \mode_leave_vertical:
    \exp_args:Nxx %xetex needs expansion
      \__pdf_backend_link_begin_user:nnw
        {
           \pdfdict_if_exist:nT { l__pdfannot/link/#1 }
            {
              \pdfdict_use:n { l__pdfannot/link/#1}
            }
        }
        { #2 }
      \bool_gset_true:N \g__pdfannot_use_lastlink_bool
      \hook_use:n { pdfannot/link/#1/begin}
  }

\cs_new_protected:Nn \pdfannot_link_end:n %#1 type, e.g. url
  {
    \hook_use:n { pdfannot/link/#1/end}
    \__pdf_backend_link_end:
    \bool_gset_true:N \g__pdfannot_use_lastlink_bool
    \hook_use:n { pdfannot/link/#1/after}
  }
\cs_generate_variant:Nn \pdfannot_link_begin:nnw {nxw}
\cs_new_protected:Npn \pdfannot_link_goto_begin:nw #1 %#1 destination
  {
    \pdfdict_remove:nn { l__pdfannot/link/GoTo} {Subtype}
    \hook_use:n { pdfannot/link/GoTo/before} %the backend add it too
    \mode_leave_vertical:
    \exp_args:Nxx %xetex needs expansion
    \__pdf_backend_link_begin_goto:nnw
      {
        \pdfdict_use:n { l__pdfannot/link/GoTo}
      }
      { #1 }
     \bool_gset_true:N \g__pdfannot_use_lastlink_bool
    \pdfdict_put:nnn { l__pdfannot/link/GoTo} {Subtype}{GoTo}
     \hook_use:n { pdfannot/link/GoTo/begin}
  }

\cs_new_protected:Nn \pdfannot_link_goto_end:
  {
    \hook_use:n { pdfannot/link/GoTo/end}
    \__pdf_backend_link_end:
    \bool_gset_true:N \g__pdfannot_use_lastlink_bool
     \hook_use:n { pdfannot/link/GoTo/after}
  }
\cs_new:Nn \pdfannot_link_ref_last: { \__pdf_backend_link_last: }
\cs_new:Npn \pdfannot_ref_last:
  {
    \bool_if:NTF \g__pdfannot_use_lastlink_bool
      {
        \__pdf_backend_link_last:
      }
      {
        \__pdf_backend_annotation_last:
      }
  }
\cs_new_protected:Npn \pdfannot_link_margin:n #1
  {
    \__pdf_backend_link_margin:n { #1 }
  }
\cs_new_protected:Npn \pdfannot_dict_put:nnn #1 #2 #3
  {
    \pdfdict_put:nnn { l__pdfannot/#1 } { #2 }{ #3 }
  }
\cs_generate_variant:Nn \pdfannot_dict_put:nnn {nnx}
\cs_new_protected:Npn \pdfannot_dict_remove:nn #1 #2
  {
    \pdfdict_remove:nn { l__pdfannot/#1 } { #2 }
  }
\cs_new_protected:Npn \pdfannot_dict_show:n #1
  {
    \pdfdict_show:n { l__pdfannot/#1 }
  }

\cs_new:Npn \pdfannot_dict_use:n #1
  {
    \pdfdict_use:n { l__pdfannot/#1 }
  }
%% File: l3pdfxform.dtx
\cs_new_protected:Npn  \pdfxform_new:nnn #1 #2 #3
  {
    \__pdf_backend_xform_new:nnnn { #1 } { #2 } {  } { #3 }
  }
\cs_new_protected:Npn \pdfxform_use:n #1
  {
    \__pdf_backend_xform_use:n { #1 }
  }
\cs_new:Npn \pdfxform_ref:n #1
  {
    \__pdf_backend_xform_ref:n { #1 }
  }

\cs_generate_variant:Nn \pdfxform_ref:n {o}
\cs_new:Npn \pdfxform_wd:n #1
  {
    \tl_use:c { c__pdf_backend_xform_wd_ \tl_to_str:n { #1 } _tl }
  }

\cs_new:Npn \pdfxform_ht:n #1
  {
    \tl_use:c { c__pdf_backend_xform_ht_ \tl_to_str:n { #1 } _tl }
  }

\cs_new:Npn \pdfxform_dp:n #1
  {
    \tl_use:c { c__pdf_backend_xform_dp_ \tl_to_str:n { #1 } _tl }
  }
%% File: l3pdfmeta.dtx


\msg_new:nnn  {pdf }{unknown-standard}{The~standard~'#1'~is~unknown~and~has~been~ignored}
\msg_new:nnn  {pdf }{wrong-pdfversion}
  {PDF~version~#1~is~too~#2~for~standard~'#3'.}
\tl_new:N  \l__pdfmeta_tmpa_tl
\tl_new:N  \l__pdfmeta_tmpb_tl
\str_new:N \l__pdfmeta_tmpa_str
\str_new:N \g__pdfmeta_tmpa_str
\seq_new:N \l__pdfmeta_tmpa_seq
\seq_new:N \l__pdfmeta_tmpb_seq
\prop_new:N \g__pdfmeta_standard_prop
\cs_new:Npn \pdfmeta_standard_item:n #1
 {
   \prop_item:Nn \g__pdfmeta_standard_prop {#1}
 }
\cs_new_protected:Npn \pdfmeta_standard_get:nN #1 #2
 {
   \prop_get:NnN \g__pdfmeta_standard_prop {#1} #2
 }
\prg_new_conditional:Npnn \pdfmeta_standard_verify:n #1 {T,F,TF}
  {
     \prop_if_in:NnTF \g__pdfmeta_standard_prop {#1}
       {
         \prg_return_false:
       }
       {
         \prg_return_true:
       }
  }
\prg_new_protected_conditional:Npnn \pdfmeta_standard_verify:nn #1 #2  {T,F,TF}
  {
    \prop_if_in:NnTF \g__pdfmeta_standard_prop {#1}
      {
        \cs_if_exist:cTF {__pdfmeta_standard_verify_handler_#1:nn}
          {
            \exp_args:Nnnx
            \use:c
              {__pdfmeta_standard_verify_handler_#1:nn}
              { #2 }
              { \prop_item:Nn \g__pdfmeta_standard_prop {#1} }
          }
          {
            \prg_return_false:
          }
      }
      {
        \prg_return_true:
      }
   }
\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_min_pdf_version:nn #1 #2
 {
   \pdf_version_compare:NnTF <
     { #2 }
     {\prg_return_false:}
     {\prg_return_true:}
 }
\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_max_pdf_version:nn #1 #2
 {
   \pdf_version_compare:NnTF >
     { #2 }
     {\prg_return_false:}
     {\prg_return_true:}
 }

\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_named_actions:nn #1 #2
 {
   \tl_if_in:nnTF { #2 }{ #1 }
     {\prg_return_true:}
     {\prg_return_false:}
 }
\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_annot_action_A:nn #1 #2
 {
   \tl_if_in:nnTF { #2 }{ #1 }
     {\prg_return_true:}
     {\prg_return_false:}
 }
\cs_new_protected:Npn \__pdfmeta_standard_verify_handler_outputintent_subtype:nn #1 #2
 {
   \tl_if_eq:nnTF { #2 }{ #1 }
     {\prg_return_true:}
     {\prg_return_false:}
 }
\cs_new_protected:Npn \__pdfmeta_verify_pdfa_annot_flags:
  {
    \bitset_set_true:Nn  \l_pdfannot_F_bitset {Print}
    \bitset_set_false:Nn \l_pdfannot_F_bitset {Hidden}
    \bitset_set_false:Nn \l_pdfannot_F_bitset {Invisible}
    \bitset_set_false:Nn \l_pdfannot_F_bitset {NoView}
    \pdfannot_dict_put:nnn {link/URI}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
    \pdfannot_dict_put:nnn {link/GoTo}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
    \pdfannot_dict_put:nnn {link/GoToR}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
    \pdfannot_dict_put:nnn {link/Launch}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
    \pdfannot_dict_put:nnn {link/Named}{F}{ \bitset_to_arabic:N \l_pdfannot_F_bitset }
  }
\hook_gput_code:nnn {begindocument} {pdf}
  {
    \pdfmeta_standard_verify:nF { annot_flags }
     { \__pdfmeta_verify_pdfa_annot_flags: }
    \pdfmeta_standard_verify:nF { Trailer_no_Info }
     { \__pdf_backend_omit_info:n {1} }
    \pdfmeta_standard_verify:nF { no_CharSet }
     { \__pdf_backend_omit_charset:n {1} }
    \pdfmeta_standard_verify:nnF { min_pdf_version }
     { \pdf_version: }
     { \msg_warning:nnxxx {pdf}{wrong-pdfversion}
       {\pdf_version:}{low}
       {
        \pdfmeta_standard_item:n{type}
        -
        \pdfmeta_standard_item:n{level}
       }
     }
    \pdfmeta_standard_verify:nnF { max_pdf_version }
     { \pdf_version: }
     { \msg_warning:nnxxx {pdf}{wrong-pdfversion}
       {\pdf_version:}{high}
       {
        \pdfmeta_standard_item:n{type}
        -
        \pdfmeta_standard_item:n{level}
       }
     }
  }
\prop_new:c { g__pdfmeta_standard_pdf/A-1B_prop }
\prop_gset_from_keyval:cn { g__pdfmeta_standard_pdf/A-1B_prop }
  {
    ,name             = pdf/A-1B
    ,type             = A
    ,level            = 1
    ,conformance      = B
    ,year             = 2005
    ,min_pdf_version  = 1.4        %minimum
    ,max_pdf_version  = 1.4        %minimum
    ,no_encryption    =
    ,no_external_content =  % no F, FFilter, or FDecodeParms in stream dicts
    ,no_embed_content = % no EF key in filespec, no /Type/EmbeddedFiles
    ,max_string_size  = 65535
    ,max_array_size   = 8191
    ,max_dict_size    = 4095
    ,max_obj_num      = 8388607
    ,max_nest_qQ      = 28
    ,named_actions    = {NextPage, PrevPage, FirstPage, LastPage}
    ,annot_flags      =
    %booleans. Only the existence of the key matter.
    %If the entry is added it means a requirements is there
    %(in most cases "don't use ...")
    %
    %===============
    % Rule 6.1.13-1 CosDocument, isOptionalContentPresent == false
      ,Catalog_no_OCProperties =
    %===============
    % Rule 6.6.1-1: PDAction, S == "GoTo" || S == "GoToR" || S == "Thread"
    %               || S == "URI" || S == "Named" || S == "SubmitForm"
    % means: no /S/Launch, /S/Sound, /S/Movie, /S/ResetForm, /S/ImportData,
    %        /S/JavaScript, /S/Hide
      ,annot_action_A        = {GoTo,GoToR,Thread,URI,Named,SubmitForm}
    %===============
    % Rule 6.6.2-1: PDAnnot, Subtype != "Widget" || AA_size == 0
    % means: no AA dictionary
      ,annot_widget_no_AA      =
    %===============
    % Rule 6.9-2: PDAnnot, Subtype != "Widget" || (A_size == 0 && AA_size == 0)
    % (looks like a tightening of the previous rule)
      ,annot_widget_no_A_AA    =
    %===============
    % Rule 6.9-1 PDAcroForm, NeedAppearances == null || NeedAppearances == false
    ,form_no_NeedAppearances =
    %===============
    %Rule 6.9-3 PDFormField, AA_size == 0
    ,form_no_AA              =
    %===============
    % to be continued https://docs.verapdf.org/validation/pdfa-part1/
    % - Outputintent/colorprofiles requirements
    % an outputintent should be loaded and is unique.
    ,outputintent_A         = {GTS_PDFA1}
    % - no Alternates key in image dictionaries
    % - no OPI, Ref, Subtype2 with PS key in xobjects
    % - Interpolate  = false in images
    % - no TR, TR2 in ExtGstate
  }

\prop_new:c { g__pdfmeta_standard_pdf/A-2B_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-2B_prop }
  { g__pdfmeta_standard_pdf/A-1B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2B_prop }{name}{pdf/A-2B}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2B_prop }{year}{2011}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2B_prop }{level}{2}
\prop_gremove:cn
  { g__pdfmeta_standard_pdf/A-2B_prop }
  { embed_content}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2B_prop }{max_pdf_version}{1.7}
\prop_new:c { g__pdfmeta_standard_pdf/A-2U_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-2U_prop }
  { g__pdfmeta_standard_pdf/A-2B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2U_prop }{name}{pdf/A-2U}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2U_prop }{conformance}{U}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2U_prop }{unicode}{}

\prop_new:c { g__pdfmeta_standard_pdf/A-2A_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-2A_prop }
  { g__pdfmeta_standard_pdf/A-2B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2A_prop }{name}{pdf/A-2A}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2A_prop }{conformance}{A}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-2A_prop }{tagged}{}

\prop_new:c { g__pdfmeta_standard_pdf/A-3B_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-3B_prop }
  { g__pdfmeta_standard_pdf/A-2B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3B_prop }{name}{pdf/A-3B}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3B_prop }{year}{2012}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3B_prop }{level}{3}
\prop_gremove:cn
  { g__pdfmeta_standard_pdf/A-3B_prop }
  { embed_content}
\prop_new:c { g__pdfmeta_standard_pdf/A-3U_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-3U_prop }
  { g__pdfmeta_standard_pdf/A-3B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3U_prop }{name}{pdf/A-3U}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3U_prop }{conformance}{U}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3U_prop }{unicode}{}

\prop_new:c { g__pdfmeta_standard_pdf/A-3A_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-3A_prop }
  { g__pdfmeta_standard_pdf/A-3B_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3A_prop }{name}{pdf/A-3A}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3A_prop }{conformance}{A}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-3A_prop }{tagged}{}

\prop_new:c { g__pdfmeta_standard_pdf/A-4_prop }
\prop_gset_eq:cc
  { g__pdfmeta_standard_pdf/A-4_prop }
  { g__pdfmeta_standard_pdf/A-3U_prop }
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-4_prop }{name}{pdf/A-4}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-4_prop }{level}{4}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-4_prop }{min_pdf_version}{2.0}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-4_prop }{year}{2020}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-4_prop }{no_CharSet}{}
\prop_gput:cnn
  { g__pdfmeta_standard_pdf/A-4_prop }{Trailer_no_Info}{}
\prop_gremove:cn
  { g__pdfmeta_standard_pdf/A-4_prop }{conformance}
\prop_gremove:cn
  { g__pdfmeta_standard_pdf/A-4_prop }{max_pdf_version}
\prop_new:N \g__pdfmeta_outputintents_prop
\keys_define:nn { document / metadata }
  {
    colorprofiles .code:n =
     {
       \keys_set:nn { document / metadata / colorprofiles }{#1}
     }
  }
\keys_define:nn { document / metadata / colorprofiles }
 {
   ,A .code:n =
      {
        \tl_if_blank:nF {#1}
          {
            \prop_gput:Nnn \g__pdfmeta_outputintents_prop
             { GTS_PDFA1  } {#1}
          }
      }
   ,a .code:n =
      {
        \tl_if_blank:nF {#1}
          {
            \prop_gput:Nnn \g__pdfmeta_outputintents_prop
              { GTS_PDFA1  } {#1}
          }
      }
   ,X .code:n =
      {
        \tl_if_blank:nF {#1}
          {
             \prop_gput:Nnn \g__pdfmeta_outputintents_prop
              { GTS_PDFX  } {#1}
          }
      }
   ,x .code:n =
      {
        \tl_if_blank:nF {#1}
          {
            \prop_gput:Nnn \g__pdfmeta_outputintents_prop
              { GTS_PDFX  } {#1}
          }
      }
   ,unknown .code:n =
     {
       \tl_if_blank:nF {#1}
          {
           \exp_args:NNo
            \prop_gput:Nnn \g__pdfmeta_outputintents_prop
              { \l_keys_key_str  } {#1}
          }
     }
 }
\pdfdict_new:n   {l_pdfmeta/outputintent}
\pdfdict_put:nnn {l_pdfmeta/outputintent}
  {Type}{/OutputIntent}
\prop_const_from_keyval:cn { c__pdfmeta_colorprofile_sRGB.icc}
  {
    ,OutputConditionIdentifier=IEC~sRGB
    ,Info=IEC~61966-2.1~Default~RGB~colour~space~-~sRGB
    ,RegistryName=http://www.iec.ch
    ,N = 3
  }
\prop_const_from_keyval:cn { c__pdfmeta_colorprofile_FOGRA39L_coated.icc}
  {
    ,OutputConditionIdentifier=FOGRA39L~Coated
    ,Info={Offset~printing,~according~to~ISO~12647-2:2004/Amd~1,~OFCOM,~ %
           paper~type~1~or~2~=~coated~art,~115~g/m2,~tone~value~increase~
           curves~A~(CMY)~and~B~(K)}
    ,RegistryName=http://www.fogra.org
    ,N = 4
  }
\cs_new_protected:Npn \__pdfmeta_embed_colorprofile:n #1%#1 file name
  {
    \pdf_object_if_exist:nF { __color_icc_ #1 }
      {
        \pdf_object_new:n  { __color_icc_ #1 }
        \pdf_object_write:nnx { __color_icc_ #1 } { fstream }
         {
           {/N\c_space_tl
             \prop_item:cn{c__pdfmeta_colorprofile_#1}{N}
           }
           {#1}
         }
      }
  }

\cs_new_protected:Npn \__pdfmeta_write_outputintent:nn #1 #2 %#1 file name, #2 subtype
  {
    \group_begin:
     \pdfdict_put:nnx {l_pdfmeta/outputintent}{S}{/\str_convert_pdfname:n{#2}}
     \pdfdict_put:nnx {l_pdfmeta/outputintent}
       {DestOutputProfile}
       {\pdf_object_ref:n{ __color_icc_ #1 }}
     \clist_map_inline:nn { OutputConditionIdentifier, Info, RegistryName }
       {
         \prop_get:cnNT
          { c__pdfmeta_colorprofile_#1}
          { ##1 }
          \l__pdfmeta_tmpa_tl
          {
            \pdf_string_from_unicode:nVN {utf8/string}\l__pdfmeta_tmpa_tl\l__pdfmeta_tmpa_str
            \pdfdict_put:nnx
              {l_pdfmeta/outputintent}{##1}{\l__pdfmeta_tmpa_str}
          }
       }
     \pdf_object_unnamed_write:nx {dict}{\pdfdict_use:n {l_pdfmeta/outputintent} }
     \pdfmanagement_add:nnx {Catalog}{OutputIntents}{\pdf_object_ref_last:}
    \group_end:
  }

\AddToHook{begindocument/end}
  {
    \pdfmeta_standard_verify:nTF {outputintent_A}
      {
         \prop_map_inline:Nn \g__pdfmeta_outputintents_prop
           {
             \__pdfmeta_embed_colorprofile:n
               {#2}
             \__pdfmeta_write_outputintent:nn
               {#2}
               {#1}
           }
      }
      {
         \exp_args:NNx
         \prop_if_in:NnF
           \g__pdfmeta_outputintents_prop
           { \pdfmeta_standard_item:n { outputintent_A } }
           {
             \exp_args:NNx
             \prop_gput:Nnn
               \g__pdfmeta_outputintents_prop
               { \pdfmeta_standard_item:n { outputintent_A } }
               { sRGB.icc }
           }
         \exp_args:NNx
         \prop_get:NnN
           \g__pdfmeta_outputintents_prop
           { \pdfmeta_standard_item:n { outputintent_A } }
           \l__pdfmeta_tmpb_tl
         \exp_args:NV \__pdfmeta_embed_colorprofile:n \l__pdfmeta_tmpb_tl
         \prop_map_inline:Nn \g__pdfmeta_outputintents_prop
           {
             \exp_args:NV
             \__pdfmeta_write_outputintent:nn
               \l__pdfmeta_tmpb_tl
               { #1 }
           }
       }
   }
\cs_new_protected:Npn \pdfmeta_set_regression_data:
   { \__pdf_backend_set_regression_data: }

\bool_new:N\g__pdfmeta_xmp_bool
\bool_gset_true:N \g__pdfmeta_xmp_bool
\hook_gput_code:nnn{pdfmanagement/add}{pdfmanagement}
  {
   \pdfmanagement_add:nnx {Info}{Producer}{(\c_sys_engine_exec_str-\c_sys_engine_version_str)}
   \pdfmanagement_add:nnx {Info}{Creator}{(LaTeX)}
  }
\keys_define:nn { document / metadata }
 {
   _pdfstandard / X-4 .code:n =
    {\AddToDocumentProperties [document]{pdfstandard-X}{PDF/X-4}},
   _pdfstandard / X-4p .code:n =
    {\AddToDocumentProperties [document]{pdfstandard-X}{PDF/X-4p}},
   _pdfstandard / X-5g .code:n =
    {\AddToDocumentProperties [document]{pdfstandard-X}{PDF/X-5g}},
   _pdfstandard / X-5n .code:n =
    {\AddToDocumentProperties [document]{pdfstandard-X}{PDF/X-5n}},
   _pdfstandard / X-5pg .code:n =
    {\AddToDocumentProperties [document]{pdfstandard-X}{PDF/X-5pg}},
   _pdfstandard / X-6 .code:n =
    {\AddToDocumentProperties [document]{pdfstandard-X}{PDF/X-6p}},
   _pdfstandard / X-6n .code:n =
    {\AddToDocumentProperties [document]{pdfstandard-X}{PDF/X-6n}},
   _pdfstandard / X-6p .code:n =
    {\AddToDocumentProperties [document]{pdfstandard-X}{PDF/X-6p}},
   _pdfstandard / UA-1 .code:n =
    {\AddToDocumentProperties [document]{pdfstandard-UA}{1}},
   xmp  .bool_gset:N = \g__pdfmeta_xmp_bool
 }
\bool_new:N \g__pdfmeta_xmp_export_bool
\str_new:N  \g__pdfmeta_xmp_export_str

\keys_define:nn { document / metadata }
  {
    ,debug / xmp-export .choice:
    ,debug / xmp-export / true .code:n=
      {
        \bool_gset_true:N \g__pdfmeta_xmp_export_bool
        \str_gset_eq:NN \g__pdfmeta_xmp_export_str \c_sys_jobname_str
      }
    ,debug / xmp-export / false .code:n =
      {
        \bool_gset_false:N \g__pdfmeta_xmp_export_bool
      }
    ,debug / xmp-export /unknown .code:n =
      {
        \bool_gset_true:N \g__pdfmeta_xmp_export_bool
        \str_gset:Nn \g__pdfmeta_xmp_export_str { #1 }
      }
    ,debug / xmp-export .default:n = true
  }
\msg_new:nnn{pdfmeta}{namespace-defined}{The~xmlns~namespace~`#1`~is~already~declared}
\bool_lazy_or:nnTF
  { \sys_if_engine_luatex_p: }
  { \sys_if_engine_xetex_p: }
  {
    \cs_new:Npn \__pdfmeta_xmp_generate_bom:
      { \char_generate:nn {"FEFF}{12} }
  }
  {
    \cs_new:Npn \__pdfmeta_xmp_generate_bom:
      {
        \char_generate:nn {"EF}{12}
        \char_generate:nn {"BB}{12}
        \char_generate:nn {"BF}{12}
      }
  }
\int_new:N  \l__pdfmeta_xmp_indent_int
\cs_new:Npn \__pdfmeta_xmp_indent:
  {
    \iow_newline:
    \prg_replicate:nn {\l__pdfmeta_xmp_indent_int}{\c_space_tl}
  }

\cs_new:Npn \__pdfmeta_xmp_indent:n #1
  {
    \iow_newline:
    \prg_replicate:nn {#1}{\c_space_tl}
  }

\cs_new_protected:Npn \__pdfmeta_xmp_incr_indent:
  {
    \int_incr:N \l__pdfmeta_xmp_indent_int
  }

\cs_new_protected:Npn \__pdfmeta_xmp_decr_indent:
  {
    \int_decr:N \l__pdfmeta_xmp_indent_int
  }
\regex_new:N \l__pdfmeta_xmp_date_regex
\regex_set:Nn \l__pdfmeta_xmp_date_regex
 {D:(\d{4})(\d{2})(\d{2})(\d{2})?(\d{2})?(\d{2})?([Z\+\-])?(?:(\d{2})\')?(?:(\d{2})\')?}
\cs_new_protected:Npn \__pdfmeta_xmp_date_split:nN #1 #2 %#1 date, #2 seq
  {
    \regex_split:NnN \l__pdfmeta_xmp_date_regex {#1} #2
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_date_split:nN {VN,eN}

\cs_new:Npn\__pdfmeta_xmp_print_date:N #1 % seq
  {
    \tl_if_blank:eTF { \seq_item:Nn #1 {1} }
     {
       \seq_item:Nn #1 {2} %year
        -
       \seq_item:Nn #1 {3} %month
        -
       \seq_item:Nn #1 {4} % day
       \tl_if_blank:eF
         { \seq_item:Nn #1 {5} }
         { T \seq_item:Nn #1 {5} } %hour
       \tl_if_blank:eF
         { \seq_item:Nn #1 {6} }
         { : \seq_item:Nn #1 {6} } %minutes
       \tl_if_blank:eF
         { \seq_item:Nn #1 {7} }
         { : \seq_item:Nn #1 {7} } %seconds
       \seq_item:Nn #1 {8}  %Z,+,-
       \seq_item:Nn #1 {9}
       \tl_if_blank:eF
         { \seq_item:Nn #1 {10} }
         { : \seq_item:Nn #1 {10} }
      }
      {
        \seq_item:Nn #1 {1}
      }
  }
\tl_new:N  \l__pdfmeta_xmp_currentdate_tl
\seq_new:N \l__pdfmeta_xmp_currentdate_seq
\cs_new_protected:Npn \__pdfmeta_xmp_date_get:nNN #1 #2 #3
  %#1 property, #2 tl var with PDF date, #3 seq for splitted date
  {
    \tl_set:Nx #2 { \GetDocumentProperties{#1} }
    \tl_if_blank:VTF #2
      {
        \seq_set_eq:NN #3 \l__pdfmeta_xmp_currentdate_seq
        \tl_set_eq:NN  #2 \l__pdfmeta_xmp_currentdate_tl
      }
      {
        \__pdfmeta_xmp_date_split:VN #2 #3
      }
  }
\cs_new_protected:Npn \__pdfmeta_xmp_create_uuid:nN #1 #2
  {
    \str_set:Nx#2 {\str_lowercase:f{\tex_mdfivesum:D{#1}}}
    \str_set:Nx#2
      { uuid:
        \str_range:Nnn #2{1}{8}
        -\str_range:Nnn#2{9}{12}
        -4\str_range:Nnn#2{13}{15}
        -8\str_range:Nnn#2{16}{18}
        -\str_range:Nnn#2{19}{30}
      }
  }
\cs_new_protected:Npn \__pdfmeta_xmp_sanitize:nN #1 #2
  {
    \group_begin:
     \text_declare_purify_equivalent:Nn \& {\tl_to_str:N & }
     \text_declare_purify_equivalent:Nn \texttilde {\c_tilde_str}
     \tl_set:Nx \l__pdfmeta_tmpa_tl { \text_purify:n {#1} }
     \str_gset:Nx \g__pdfmeta_tmpa_str { \tl_to_str:N \l__pdfmeta_tmpa_tl }
     \str_greplace_all:Nnn\g__pdfmeta_tmpa_str {&}{&amp;}
     \str_greplace_all:Nnn\g__pdfmeta_tmpa_str {<}{&lt;}
     \str_greplace_all:Nnn\g__pdfmeta_tmpa_str {>}{&gt;}
     \str_greplace_all:Nnn\g__pdfmeta_tmpa_str {"}{&quot;}
    \group_end:
     \str_set_eq:NN #2 \g__pdfmeta_tmpa_str
  }

\cs_generate_variant:Nn\__pdfmeta_xmp_sanitize:nN {VN}
\tl_new:N \l__pdfmeta_xmp_doclang_tl
\tl_new:N \l__pdfmeta_xmp_metalang_tl
\regex_new:N\l__pdfmeta_xmp_lang_regex
\regex_set:Nn\l__pdfmeta_xmp_lang_regex {\A\[([A-Za-z\-]+)\](.*)}
\cs_new_protected:Npn \__pdfmeta_xmp_lang_get:nNN #1 #2 #3
  {
    \regex_extract_once:NnN \l__pdfmeta_xmp_lang_regex {#1}\l__pdfmeta_tmpa_seq
    \seq_if_empty:NTF \l__pdfmeta_tmpa_seq
      {
        \tl_set:Nn #2 \l__pdfmeta_xmp_metalang_tl
        \tl_set:Nn #3 {#1}
      }
      {
        \tl_set:Nx #2 {\seq_item:Nn\l__pdfmeta_tmpa_seq{2}}
        \tl_set:Nx #3 {\seq_item:Nn\l__pdfmeta_tmpa_seq{3}}
      }
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_lang_get:nNN {eNN,VNN}

\tl_new:N \g__pdfmeta_xmp_packet_tl
\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_chunk:n #1
  {
    \tl_gput_right:Nx\g__pdfmeta_xmp_packet_tl
      {
        \__pdfmeta_xmp_indent:  \exp_not:n{#1}
      }
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_chunk:n {e}

\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_chunk:nN #1 #2
  {
    \tl_put_right:Nx#2
      {
        \__pdfmeta_xmp_indent:  \exp_not:n{#1}
      }
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_chunk:nN {eN}

\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_open:nn #1 #2 %#1 prefix #2 name
  {
    \__pdfmeta_xmp_add_packet_chunk:n {<#1:#2>}
    \__pdfmeta_xmp_incr_indent:
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_open:nn  {ne}

\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_open_attr:nnn #1 #2 #3
  %#1 prefix #2 name #3 attr
  {
    \__pdfmeta_xmp_add_packet_chunk:n {<#1:#2~#3>}
    \__pdfmeta_xmp_incr_indent:
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_open_attr:nnn  {nne}

\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_close:nn #1 #2 %#1 prefix #2:name
  {
    \__pdfmeta_xmp_decr_indent:
    \__pdfmeta_xmp_add_packet_chunk:n {</#1:#2>}
  }
\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_line:nnn #1 #2 #3
 %#1 prefix #2 name #3 content
  {
    \tl_if_blank:nF {#3}
     {
      \__pdfmeta_xmp_sanitize:nN {#3}\l__pdfmeta_tmpa_str
      \__pdfmeta_xmp_add_packet_chunk:e {<#1:#2>\l__pdfmeta_tmpa_str</#1:#2>}
     }
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_line:nnn {nne,nnV,nee}
\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_line:nnnN #1 #2 #3 #4
 %#1 prefix #2 name #3 content #4 tl_var to prebuilt.
  {
    \tl_if_blank:nF {#3}
     {
      \__pdfmeta_xmp_sanitize:nN {#3}\l__pdfmeta_tmpa_str
      \__pdfmeta_xmp_add_packet_chunk:eN {<#1:#2>\l__pdfmeta_tmpa_str</#1:#2>} #4
     }
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_line:nnnN {nneN}
\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_line_attr:nnnn #1 #2 #3 #4
 %#1 prefix #2 name #3 attribute #4 content
  {
    \tl_if_blank:nF {#4}
     {
      \__pdfmeta_xmp_sanitize:nN {#4}\l__pdfmeta_tmpa_str
      \__pdfmeta_xmp_add_packet_chunk:e {<#1:#2~#3>\l__pdfmeta_tmpa_str</#1:#2>}
     }
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_line_attr:nnnn {nnee,nneV}
 \cs_new_protected:Npn \__pdfmeta_xmp_add_packet_line_default:nnnn #1 #2 #3 #4
   % #1 prefix #2 name #3 default #4 content
   {
     \tl_if_blank:nTF { #4 }
      {
       \tl_set:Nn  \l__pdfmeta_tmpa_tl  {#3}
      }
      {
        \tl_set:Nn \l__pdfmeta_tmpa_tl  {#4}
      }
     \__pdfmeta_xmp_add_packet_line:nnV {#1}{#2}\l__pdfmeta_tmpa_tl
   }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_line_default:nnnn {nnee}
\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_list_simple:nnnn #1 #2 #3 #4
  %#1 prefix, #2 name,  #3 type (Seq/Bag/Alt) #4 a clist
  {
    \clist_if_empty:nF { #4 }
      {
        \__pdfmeta_xmp_add_packet_open:nn {#1}{#2}
         \__pdfmeta_xmp_add_packet_open:nn {rdf}{#3}
          \clist_map_inline:nn {#4}
            {
              \__pdfmeta_xmp_add_packet_line:nnn
               {rdf}{li}{##1}
            }
         \__pdfmeta_xmp_add_packet_close:nn{rdf}{#3}
        \__pdfmeta_xmp_add_packet_close:nn {#1}{#2}
     }
   }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_list_simple:nnnn {nnnV,nnne}
\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_list:nnnn #1 #2 #3 #4
  %#1 prefix, #2 name,  #3 type (Seq/Bag/Alt) #4 a clist
  {
    \clist_if_empty:nF { #4 }
      {
        \__pdfmeta_xmp_add_packet_open:nn {#1}{#2}
         \__pdfmeta_xmp_add_packet_open:nn {rdf}{#3}
          \clist_map_inline:nn {#4}
            {
              \__pdfmeta_xmp_lang_get:nNN {##1}\l__pdfmeta_tmpa_tl\l__pdfmeta_tmpb_tl
              \__pdfmeta_xmp_add_packet_line_attr:nneV
               {rdf}{li}{xml:lang="\l__pdfmeta_tmpa_tl" }\l__pdfmeta_tmpb_tl
            }
         \__pdfmeta_xmp_add_packet_close:nn{rdf}{#3}
        \__pdfmeta_xmp_add_packet_close:nn {#1}{#2}
     }
   }
\cs_generate_variant:Nn \__pdfmeta_xmp_add_packet_list:nnnn {nnne}
\cs_new_protected:Npn \__pdfmeta_xmp_build_packet:
  {
   \tl_set:Nx \l__pdfmeta_xmp_doclang_tl  {\GetDocumentProperties{document/lang}}
   \tl_set:Nx \l__pdfmeta_xmp_metalang_tl {\GetDocumentProperties{hyperref/pdfmetalang}}
   \tl_if_blank:VT \l__pdfmeta_xmp_metalang_tl
    { \cs_set_eq:NN \l__pdfmeta_xmp_metalang_tl\l__pdfmeta_xmp_doclang_tl}
   \__pdfmeta_xmp_build_iptc_data:N \l__pdfmeta_xmp_iptc_data_tl
   \tl_if_empty:NT \l__pdfmeta_xmp_iptc_data_tl
     {
       \seq_remove_all:Nn \l__pdfmeta_xmp_schema_seq { Iptc4xmpCore }
     }
     \__pdfmeta_xmp_add_packet_chunk:e
      {<?xpacket~begin="\__pdfmeta_xmp_generate_bom:"~id="W5M0MpCehiHzreSzNTczkc9d"?>}
     \__pdfmeta_xmp_add_packet_open:nn{x}{xmpmeta~xmlns:x="adobe:ns:meta/"}
      \__pdfmeta_xmp_add_packet_open:ne{rdf}
        {RDF~xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns\c_hash_str"}
       \__pdfmeta_xmp_add_packet_open_attr:nne
         {rdf}{Description}{rdf:about="" \g__pdfmeta_xmp_xmlns_tl}
        \__pdfmeta_xmp_add_packet_open:nn{pdfaExtension}{schemas}
         \__pdfmeta_xmp_add_packet_open:nn {rdf}{Bag}
           \seq_map_inline:Nn \l__pdfmeta_xmp_schema_seq
              {
                \tl_use:c { g__pdfmeta_xmp_schema_##1_tl }
              }
         \__pdfmeta_xmp_add_packet_close:nn {rdf}{Bag}
        \__pdfmeta_xmp_add_packet_close:nn {pdfaExtension}{schemas}
    % data
        \__pdfmeta_xmp_build_pdf:
        \__pdfmeta_xmp_build_xmpRights:
        \__pdfmeta_xmp_build_standards: %pdfaid,pdfxid,pdfuaid
        \__pdfmeta_xmp_build_dc:
        \__pdfmeta_xmp_build_photoshop:
        \__pdfmeta_xmp_build_xmp:
        \__pdfmeta_xmp_build_xmpMM:
        \__pdfmeta_xmp_build_prism:
        \__pdfmeta_xmp_build_iptc:
        \__pdfmeta_xmp_build_user: %user additions
    % end
      \__pdfmeta_xmp_add_packet_close:nn {rdf}{Description}
     \__pdfmeta_xmp_add_packet_close:nn {rdf}{RDF}
    \__pdfmeta_xmp_add_packet_close:nn {x}{xmpmeta}
    \int_set:Nn  \l__pdfmeta_xmp_indent_int{20}
    \prg_replicate:nn{10}{\__pdfmeta_xmp_add_packet_chunk:n {}}
    \int_zero:N \l__pdfmeta_xmp_indent_int
    \__pdfmeta_xmp_add_packet_chunk:n {<?xpacket~end="w"?>}
 }


\str_new:N  \g__pdfmeta_xmp_xmlns_tl
\prop_new:N \g__pdfmeta_xmp_xmlns_prop
\cs_new_protected:Npn \__pdfmeta_xmp_xmlns_new:nn #1 #2
  {
    \prop_gput:Nnn \g__pdfmeta_xmp_xmlns_prop {#1}{#2}
    \tl_gput_right:Nx \g__pdfmeta_xmp_xmlns_tl
      {
        \__pdfmeta_xmp_indent:n{4} xmlns:\exp_not:n{#1="#2"}
      }
  }
\cs_generate_variant:Nn \__pdfmeta_xmp_xmlns_new:nn {nx}
\__pdfmeta_xmp_xmlns_new:nn {pdf}      {http://ns.adobe.com/pdf/1.3/}
\__pdfmeta_xmp_xmlns_new:nn {xmpRights}{http://ns.adobe.com/xap/1.0/rights/}
\__pdfmeta_xmp_xmlns_new:nn {dc}       {http://purl.org/dc/elements/1.1/}
\__pdfmeta_xmp_xmlns_new:nn {photoshop}{http://ns.adobe.com/photoshop/1.0/}
\__pdfmeta_xmp_xmlns_new:nn {xmp}      {http://ns.adobe.com/xap/1.0/}
\__pdfmeta_xmp_xmlns_new:nn {xmpMM}    {http://ns.adobe.com/xap/1.0/mm/}
\__pdfmeta_xmp_xmlns_new:nx {stEvt}
  {http://ns.adobe.com/xap/1.0/sType/ResourceEvent\c_hash_str}
\__pdfmeta_xmp_xmlns_new:nn {pdfaid}   {http://www.aiim.org/pdfa/ns/id/}
\__pdfmeta_xmp_xmlns_new:nn {pdfuaid}  {http://www.aiim.org/pdfua/ns/id/}
\__pdfmeta_xmp_xmlns_new:nn {pdfx}     {http://ns.adobe.com/pdfx/1.3/}
\__pdfmeta_xmp_xmlns_new:nn {pdfxid}   {http://www.npes.org/pdfx/ns/id/}
\__pdfmeta_xmp_xmlns_new:nn {prism}    {http://prismstandard.org/namespaces/basic/3.0/}
\__pdfmeta_xmp_xmlns_new:nx {stFnt}    {http://ns.adobe.com/xap/1.0/sType/Font\c_hash_str}
\__pdfmeta_xmp_xmlns_new:nn {Iptc4xmpCore}{http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/}
\__pdfmeta_xmp_xmlns_new:nn {pdfaExtension}{http://www.aiim.org/pdfa/ns/extension/}
\__pdfmeta_xmp_xmlns_new:nx {pdfaSchema}{http://www.aiim.org/pdfa/ns/schema\c_hash_str}
\__pdfmeta_xmp_xmlns_new:nx {pdfaProperty}{http://www.aiim.org/pdfa/ns/property\c_hash_str}
\__pdfmeta_xmp_xmlns_new:nx {pdfaType} {http://www.aiim.org/pdfa/ns/type\c_hash_str}
\__pdfmeta_xmp_xmlns_new:nx {pdfaField}{http://www.aiim.org/pdfa/ns/field\c_hash_str}

\seq_new:N \l__pdfmeta_xmp_schema_seq
\cs_new_protected:Npn \__pdfmeta_xmp_schema_new:nnn #1 #2 #3
  %#1 name #2 prefix, #3 text
  {
    \seq_put_right:Nn \l__pdfmeta_xmp_schema_seq { #2 }
    \tl_new:c { g__pdfmeta_xmp_schema_#2_tl }
    \tl_new:c { g__pdfmeta_xmp_schema_#2_properties_tl }
    \tl_gput_right:cn { g__pdfmeta_xmp_schema_#2_tl }
      {
        \__pdfmeta_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"}
         \__pdfmeta_xmp_add_packet_line:nnn {pdfaSchema}{schema}{#1}
         \__pdfmeta_xmp_add_packet_line:nnn {pdfaSchema}{prefix}{#2}
         \__pdfmeta_xmp_add_packet_line:nnn {pdfaSchema}{namespaceURI}{#3}
         \__pdfmeta_xmp_add_packet_open:nn {pdfaSchema}{property}
          \__pdfmeta_xmp_add_packet_open:nn{rdf}{Seq}
              \tl_use:c { g__pdfmeta_xmp_schema_#2_properties_tl }
          \__pdfmeta_xmp_add_packet_close:nn{rdf}{Seq}
         \__pdfmeta_xmp_add_packet_close:nn {pdfaSchema}{property}
        \cs_if_exist_use:c {__pdfmeta_xmp_schema_#2_additions:}
        \__pdfmeta_xmp_add_packet_close:nn{rdf}{li}
      }
  }

\cs_new_protected:Npn \__pdfmeta_xmp_property_new:nnnnn #1 #2 #3 #4 #5 %
    %#1 schema #2 name, #3 type, #4 category #5 description
  {
    \tl_gput_right:cn { g__pdfmeta_xmp_schema_#1_properties_tl }
      {
        \__pdfmeta_xmp_add_packet_open:nn {rdf}{li~rdf:parseType="Resource"}
          \__pdfmeta_xmp_add_packet_line:nnn {pdfaProperty}{name}{#2}
          \__pdfmeta_xmp_add_packet_line:nnn {pdfaProperty}{valueType}{#3}
          \__pdfmeta_xmp_add_packet_line:nnn {pdfaProperty}{category}{#4}
          \__pdfmeta_xmp_add_packet_line:nnn {pdfaProperty}{description}{#5}
        \__pdfmeta_xmp_add_packet_close:nn{rdf}{li}
     }
  }

\cs_new_protected:Npn \__pdfmeta_xmp_add_packet_field:nnn #1 #2 #3 %
  %#1 name #2 valuetype #3 description
  {
    \__pdfmeta_xmp_add_packet_open_attr:nnn {rdf}{li}{rdf:parseType="Resource"}
          \__pdfmeta_xmp_add_packet_line:nnn {pdfaField}{name}{#1}
          \__pdfmeta_xmp_add_packet_line:nnn {pdfaField}{valueType}{#2}
          \__pdfmeta_xmp_add_packet_line:nnn {pdfaField}{description}{#3}
    \__pdfmeta_xmp_add_packet_close:nn{rdf}{li}
  }
\__pdfmeta_xmp_schema_new:nnn
   {XMP~Media~Management~Schema}
   {xmpMM}
   {http://ns.adobe.com/xap/1.0/mm/}
\__pdfmeta_xmp_property_new:nnnnn
   {xmpMM}
   {OriginalDocumentID}
   {URI}
   {internal}
   {The~common~identifier~for~all~versions~and~renditions~of~a~document.}
\__pdfmeta_xmp_schema_new:nnn
   {PDF/A~Identification~Schema}
   {pdfaid}
   {http://www.aiim.org/pdfa/ns/id/}
\__pdfmeta_xmp_property_new:nnnnn
   {pdfaid}
   {year}
   {Integer}
   {internal}
   {Year~of~standard}
\__pdfmeta_xmp_schema_new:nnn
   {PDF/UA~Universal~Accessibility~Schema}
   {pdfuaid}
   {http://www.aiim.org/pdfua/ns/id/}
\__pdfmeta_xmp_property_new:nnnnn
   {pdfuaid}
   {part}
   {Integer}
   {internal}
   {Part~of~ISO~14289~standard}
\__pdfmeta_xmp_schema_new:nnn
    {PDF/X~ID~Schema}
    {pdfxid}
    {http://www.npes.org/pdfx/ns/id/}
\__pdfmeta_xmp_property_new:nnnnn
    {pdfxid}
    {GTS_PDFXVersion}
    {Text}
    {internal}
    {ID~of~PDF/X~standard}

\__pdfmeta_xmp_schema_new:nnn
  {PRISM~Basic~Metadata}
  {prism}
  {http://prismstandard.org/namespaces/basic/3.0/}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {complianceProfile}
  {Text}
  {internal}
  {PRISM~specification~compliance~profile~to~which~this~document~adheres}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {publicationName}
  {Text}
  {external}
  {Publication name}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {aggregationType}
  {Text}
  {external}
  {Publication type}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {bookEdition}
  {Text}
  {external}
  {Edition~of~the~book~in~which~the~document~was~published}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {volume}
  {Text}
  {external}
  {Publication~volume~number}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {number}
  {Text}
  {external}
  {Publication~issue~number~within~a~volume}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {pageRange}
  {Text}
  {external}
  {Page~range~for~the~document~within~the~print~version~of~its~publication}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {issn}
  {Text}
  {external}
  {ISSN~for~the~printed~publication~in~which~the~document~was~published}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {eIssn}
  {Text}
  {external}
  {ISSN~for~the~electronic~publication~in~which~the~document~was~published}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {isbn}
  {Text}
  {external}
  {ISBN for the publication in which the document was published}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {doi}
  {Text}
  {external}
  {Digital~Object~Identifier~for~the~document}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {url}
  {URL}
  {external}
  {URL~at~which~the~document~can~be~found}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {byteCount}
  {Integer}
  {internal}
  {Approximate~file~size~in~octets}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {pageCount}
  {Integer}
  {internal}
  {Number~of~pages~in~the~print~version~of~the~document}
\__pdfmeta_xmp_property_new:nnnnn
  {prism}
  {subtitle}
  {Text}
  {external}
  {Document's subtitle}
\__pdfmeta_xmp_schema_new:nnn
  {IPTC~Core~Schema}
  {Iptc4xmpCore}
  {http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/}
\__pdfmeta_xmp_property_new:nnnnn
  {Iptc4xmpCore}
  {CreatorContactInfo}
  {ContactInfo}
  {external}
  {Document~creator's~contact~information}
\cs_new_protected:cpn { __pdfmeta_xmp_schema_Iptc4xmpCore_additions: }
  {
    \__pdfmeta_xmp_add_packet_open:nn{pdfaSchema}{valueType}
      \__pdfmeta_xmp_add_packet_open:nn{rdf}{Seq}
        \__pdfmeta_xmp_add_packet_open_attr:nnn{rdf}{li}{rdf:parseType="Resource"}
          \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{type}{ContactInfo}
          \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{namespaceURI}
             {http://iptc.org/std/Iptc4xmpCore/1.0/xmlns/}
          \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{prefix}{Iptc4xmpCore}
          \__pdfmeta_xmp_add_packet_line:nnn{pdfaType}{description}
            {Basic~set~of~information~to~get~in~contact~with~a~person}
          \__pdfmeta_xmp_add_packet_open:nn{pdfaType}{field}
           \__pdfmeta_xmp_add_packet_open:nn{rdf}{Seq}
            \__pdfmeta_xmp_add_packet_field:nnn{CiAdrCity}{Text}
              {Contact~information~city}
            \__pdfmeta_xmp_add_packet_field:nnn{CiAdrCtry}{Text}
              {Contact~information~country}
            \__pdfmeta_xmp_add_packet_field:nnn{CiAdrExtadr}{Text}
              {Contact~information~address}
            \__pdfmeta_xmp_add_packet_field:nnn{CiAdrPcode}{Text}
              {Contact~information~local~postal~code}
            \__pdfmeta_xmp_add_packet_field:nnn{CiAdrRegion}{Text}
              {Contact~information~regional~information~such~as~state~or~province}
            \__pdfmeta_xmp_add_packet_field:nnn{CiEmailWork}{Text}
              {Contact~information~email~address(es)}
            \__pdfmeta_xmp_add_packet_field:nnn{CiTelWork}{Text}
              {Contact~information~telephone~number(s)}
            \__pdfmeta_xmp_add_packet_field:nnn{CiUrlWork}{Text}
              {Contact~information~Web~URL(s)}
           \__pdfmeta_xmp_add_packet_close:nn{rdf}{Seq}
         \__pdfmeta_xmp_add_packet_close:nn{pdfaType}{field}
        \__pdfmeta_xmp_add_packet_close:nn{rdf}{li}
      \__pdfmeta_xmp_add_packet_close:nn{rdf}{Seq}
    \__pdfmeta_xmp_add_packet_close:nn{pdfaSchema}{valueType}
  }

\cs_new_protected:Npn \__pdfmeta_xmp_build_pdf:
  {
  \__pdfmeta_xmp_add_packet_line_default:nnee
    {pdf}{Producer}
    {\c_sys_engine_exec_str-\c_sys_engine_version_str}
    {\GetDocumentProperties{hyperref/pdfproducer}}
   \__pdfmeta_xmp_add_packet_line:nne{pdf}{PDFVersion}{\pdf_version:}
  }
\cs_new_protected:Npn \__pdfmeta_xmp_build_xmp:
  {
  \__pdfmeta_xmp_add_packet_line_default:nnee
    {xmp}{CreatorTool}
    {LaTeX}
    { \GetDocumentProperties{hyperref/pdfcreator} }
   \__pdfmeta_xmp_add_packet_line_default:nnee
     {xmp}{BaseURL}{}
     { \GetDocumentProperties{hyperref/baseurl} }
    \__pdfmeta_xmp_date_get:nNN
      {document/creationdate}\l__pdfmeta_tmpa_tl\l__pdfmeta_tmpa_seq
    \__pdfmeta_xmp_add_packet_line:nne{xmp}{CreateDate}{\__pdfmeta_xmp_print_date:N\l__pdfmeta_tmpa_seq}
    \pdfmanagement_add:nnx{Info}{CreationDate}{(\l__pdfmeta_tmpa_tl)}
    \__pdfmeta_xmp_date_get:nNN
      {document/moddate}\l__pdfmeta_tmpa_tl\l__pdfmeta_tmpa_seq
    \__pdfmeta_xmp_add_packet_line:nne{xmp}{ModifyDate}{\__pdfmeta_xmp_print_date:N\l__pdfmeta_tmpa_seq}
    \pdfmanagement_add:nnx{Info}{ModDate}{(\l__pdfmeta_tmpa_tl)}
    \__pdfmeta_xmp_date_get:nNN
      {hyperref/pdfmetadate}\l__pdfmeta_tmpa_tl\l__pdfmeta_tmpa_seq
    \__pdfmeta_xmp_add_packet_line:nne{xmp}{MetadataDate}{\__pdfmeta_xmp_print_date:N\l__pdfmeta_tmpa_seq}
  }
\cs_new_protected:Npn \__pdfmeta_xmp_build_standards:
  {
    \__pdfmeta_xmp_add_packet_line:nne {pdfaid}{part}{\pdfmeta_standard_item:n{level}}
    \__pdfmeta_xmp_add_packet_line:nne
      {pdfaid}{conformance}{\pdfmeta_standard_item:n{conformance}}
    \int_compare:nNnTF {0\pdfmeta_standard_item:n{level}}<{4}
     {\__pdfmeta_xmp_add_packet_line:nne {pdfaid}{year} {\pdfmeta_standard_item:n{year}}}
     {\__pdfmeta_xmp_add_packet_line:nne {pdfaid}{rev}  {\pdfmeta_standard_item:n{year}}}
    \__pdfmeta_xmp_add_packet_line:nne
      {pdfxid}{GTS_PDFXVersion}{\GetDocumentProperties{document/pdfstandard-X}}
    \__pdfmeta_xmp_add_packet_line:nne
      {pdfuaid}{part}{\GetDocumentProperties{document/pdfstandard-UA}}
  }

\cs_new_protected:Npn \__pdfmeta_xmp_build_photoshop:
  {
   \__pdfmeta_xmp_add_packet_line:nne{photoshop}{AuthorsPosition}
     { \GetDocumentProperties{hyperref/pdfauthortitle} }
   \__pdfmeta_xmp_add_packet_line:nne{photoshop}{CaptionWriter}
     { \GetDocumentProperties{hyperref/pdfcaptionwriter} }
  }


\cs_new_protected:Npn \__pdfmeta_xmp_build_xmpMM:
  {
    \str_set:Nx\l__pdfmeta_tmpa_str {\GetDocumentProperties{hyperref/pdfdocumentid}}
    \str_if_empty:NT \l__pdfmeta_tmpa_str
      {
        \__pdfmeta_xmp_create_uuid:nN
          {\jobname\GetDocumentProperties{hyperref/pdftitle}}
          \l__pdfmeta_tmpa_str
      }
    \__pdfmeta_xmp_add_packet_line:nnV{xmpMM}{DocumentID}
      \l__pdfmeta_tmpa_str
    \str_set:Nx\l__pdfmeta_tmpa_str {\GetDocumentProperties{hyperref/pdfinstanceid}}
    \str_if_empty:NT \l__pdfmeta_tmpa_str
      {
        \__pdfmeta_xmp_create_uuid:nN
          {\jobname\l__pdfmeta_xmp_currentdate_tl}
          \l__pdfmeta_tmpa_str
      }
    \__pdfmeta_xmp_add_packet_line:nnV{xmpMM}{InstanceID}
      \l__pdfmeta_tmpa_str
   \__pdfmeta_xmp_add_packet_line:nne{xmpMM}{VersionID}
     { \GetDocumentProperties{hyperref/pdfversionid} }
   \__pdfmeta_xmp_add_packet_line:nne{xmpMM}{RenditionClass}
     { \GetDocumentProperties{hyperref/pdfrendition} }
  }
\cs_new_protected:Npn \__pdfmeta_xmp_build_dc:
  {
    \__pdfmeta_xmp_add_packet_list:nnne {dc}{creator}{Seq}
       { \GetDocumentProperties{hyperref/pdfauthor} }
    \int_compare:nNnT {0\pdfmeta_standard_item:n{level}}={1}
       { \pdfmanagement_remove:nn{Info}{Author} }
    \__pdfmeta_xmp_add_packet_list:nnne {dc}{title}{Alt}
       { \GetDocumentProperties{hyperref/pdftitle} }
    \__pdfmeta_xmp_add_packet_list:nnne {dc}{subject}{Bag}
       { \GetDocumentProperties{hyperref/pdfkeywords} }
    \int_compare:nNnT {0\pdfmeta_standard_item:n{level}}={1}
       { \pdfmanagement_remove:nn{Info}{Keywords} }
  \pdfmanagement_get_documentproperties:nNTF { hyperref/pdftype } \l__pdfmeta_tmpa_tl
    {
      \__pdfmeta_xmp_add_packet_list_simple:nnnV {dc}{type}{Bag}\l__pdfmeta_tmpa_tl
    }
    {
      \__pdfmeta_xmp_add_packet_list_simple:nnnn {dc}{type}{Bag}{Text}
    }
   \__pdfmeta_xmp_add_packet_list:nnne {dc}{publisher}{Bag}
     { \GetDocumentProperties{hyperref/pdfpublisher} }
   \__pdfmeta_xmp_add_packet_list:nnne
    {dc}{description}{Alt}
    {\GetDocumentProperties{hyperref/pdfsubject}}
   \__pdfmeta_xmp_add_packet_list_simple:nnnV
     {dc}{language}{Bag}\l__pdfmeta_xmp_doclang_tl
   \__pdfmeta_xmp_add_packet_line:nne{dc}{identifier}
     { \GetDocumentProperties{hyperref/pdfidentifier} }
   \__pdfmeta_xmp_date_get:nNN {hyperref/pdfdate}\l__pdfmeta_tmpa_tl\l__pdfmeta_tmpa_seq
    \__pdfmeta_xmp_add_packet_list_simple:nnne
     {dc}{date}{Seq}{\__pdfmeta_xmp_print_date:N\l__pdfmeta_tmpa_seq}
   \__pdfmeta_xmp_add_packet_line:nnn{dc}{format}{application/pdf}
    \__pdfmeta_xmp_add_packet_line_default:nnee
     {dc}{source}
     { \c_sys_jobname_str.tex }
     { \GetDocumentProperties{hyperref/pdfsource} }
    \__pdfmeta_xmp_add_packet_list:nnne{dc}{rights}{Alt}
     {\GetDocumentProperties{hyperref/pdfcopyright}}
  }
\cs_new_protected:Npn \__pdfmeta_xmp_build_xmpRights:
  {
    \__pdfmeta_xmp_add_packet_line:nne
      {xmpRights}
      {WebStatement}
      {\GetDocumentProperties{hyperref/pdflicenseurl}}
  }
\tl_new:N\l__pdfmeta_xmp_iptc_data_tl
\cs_new_protected:Npn \__pdfmeta_xmp_build_iptc_data:N #1
  {
     \tl_clear:N #1
     \__pdfmeta_xmp_incr_indent:\__pdfmeta_xmp_incr_indent:\__pdfmeta_xmp_incr_indent:\__pdfmeta_xmp_incr_indent:
     \__pdfmeta_xmp_add_packet_line:nneN
       {Iptc4xmpCore}{CiAdrExtadr}
       {\GetDocumentProperties{hyperref/pdfcontactaddress}}
       #1
     \__pdfmeta_xmp_add_packet_line:nneN
       {Iptc4xmpCore}{CiAdrCity}
       {\GetDocumentProperties{hyperref/pdfcontactcity}}
       #1
     \__pdfmeta_xmp_add_packet_line:nneN
       {Iptc4xmpCore}{CiAdrPcode}
       {\GetDocumentProperties{hyperref/pdfcontactpostcode}}
       #1
     \__pdfmeta_xmp_add_packet_line:nneN
       {Iptc4xmpCore}{CiAdrCtry}
       {\GetDocumentProperties{hyperref/pdfcontactcountry}}
       #1
     \__pdfmeta_xmp_add_packet_line:nneN
       {Iptc4xmpCore}{CiTelWork}
       {\GetDocumentProperties{hyperref/pdfcontactphone}}
       #1
     \__pdfmeta_xmp_add_packet_line:nneN
       {Iptc4xmpCore}{CiEmailWork}
       {\GetDocumentProperties{hyperref/pdfcontactemail}}
       #1
     \__pdfmeta_xmp_add_packet_line:nneN
       {Iptc4xmpCore}{CiUrlWork}
       {\GetDocumentProperties{hyperref/pdfcontacturl}}
       #1
     \__pdfmeta_xmp_decr_indent:\__pdfmeta_xmp_decr_indent:\__pdfmeta_xmp_decr_indent:\__pdfmeta_xmp_decr_indent:
  }
\cs_new_protected:Npn \__pdfmeta_xmp_build_iptc:
  {
    \tl_if_empty:NF\l__pdfmeta_xmp_iptc_data_tl
     {
       \__pdfmeta_xmp_add_packet_open_attr:nnn
        {Iptc4xmpCore}{CreatorContactInfo}{rdf:parseType="Resource"}
       \tl_gput_right:Nx\g__pdfmeta_xmp_packet_tl { \l__pdfmeta_xmp_iptc_data_tl }
       \__pdfmeta_xmp_add_packet_close:nn
        {Iptc4xmpCore}{CreatorContactInfo}
    }
  }
\cs_new_protected:Npn \__pdfmeta_xmp_build_prism:
  {
    \__pdfmeta_xmp_add_packet_line:nnn
      {prism}{complianceProfile}
      {three}
    \__pdfmeta_xmp_lang_get:eNN
     {\GetDocumentProperties{hyperref/pdfsubtitle}}
     \l__pdfmeta_tmpa_tl\l__pdfmeta_tmpb_tl
    \__pdfmeta_xmp_add_packet_line_attr:nneV
      {prism}{subtitle}
      {xml:lang="\l__pdfmeta_tmpa_tl"}
      \l__pdfmeta_tmpb_tl
    \__pdfmeta_xmp_lang_get:eNN
     {\GetDocumentProperties{hyperref/pdfpublication}}
     \l__pdfmeta_tmpa_tl\l__pdfmeta_tmpb_tl
    \__pdfmeta_xmp_add_packet_line_attr:nneV
      {prism}{publicationName}
      {xml:lang="\l__pdfmeta_tmpa_tl"}
      \l__pdfmeta_tmpb_tl
    \__pdfmeta_xmp_add_packet_line:nne
      {prism}{bookEdition}
      {\GetDocumentProperties{hyperref/pdfbookedition}}
    \__pdfmeta_xmp_add_packet_line:nne
      {prism}{aggregationType}
      {\GetDocumentProperties{hyperref/pdfpubtype}}
    \__pdfmeta_xmp_add_packet_line:nne
      {prism}{volume}
      {\GetDocumentProperties{hyperref/pdfvolumenum}}
    \__pdfmeta_xmp_add_packet_line:nne
      {prism}{number}
      {\GetDocumentProperties{hyperref/pdfissuenum}}
    \__pdfmeta_xmp_add_packet_line:nne
      {prism}{pageRange}
      {\GetDocumentProperties{hyperref/pdfpagerange}}
    \__pdfmeta_xmp_add_packet_line:nne
      {prism}{issn}
      {\GetDocumentProperties{hyperref/pdfissn}}
    \__pdfmeta_xmp_add_packet_line:nne
      {prism}{eIssn}
      {\GetDocumentProperties{hyperref/pdfeissn}}
    \__pdfmeta_xmp_add_packet_line:nne
      {prism}{doi}
      {\GetDocumentProperties{hyperref/pdfdoi}}
    \__pdfmeta_xmp_add_packet_line:nne
      {prism}{url}
      {\GetDocumentProperties{hyperref/pdfurl}}
     \tl_set:Nx \l__pdfmeta_tmpa_tl { \GetDocumentProperties{hyperref/pdfnumpages} }
     \__pdfmeta_xmp_add_packet_line:nne
      {prism}{pageCount}
      {\tl_if_blank:VTF \l__pdfmeta_tmpa_tl {\PreviousTotalPages}{\l__pdfmeta_tmpa_tl}}
  }
\tl_new:N \g__pdfmeta_xmp_user_packet_tl
\cs_new_protected:Npn \__pdfmeta_xmp_build_user:
 {
   \int_zero:N \l__pdfmeta_xmp_indent_int
   \g__pdfmeta_xmp_user_packet_tl
   \int_set:Nn \l__pdfmeta_xmp_indent_int {3}
 }
\AddToHook{shipout/lastpage}
  {
    \bool_if:NT\g__pdfmeta_xmp_bool
     {
       \file_get_timestamp:nN{\jobname.log}\l__pdfmeta_xmp_currentdate_tl
       \__pdfmeta_xmp_date_split:VN\l__pdfmeta_xmp_currentdate_tl\l__pdfmeta_xmp_currentdate_seq
       \__pdfmeta_xmp_build_packet:
       \exp_args:No
       \__pdf_backend_metadata_stream:n {\g__pdfmeta_xmp_packet_tl}
        \pdfmanagement_add:nnx {Catalog} {Metadata}{\pdf_object_ref_last:}
       \bool_if:NT \g__pdfmeta_xmp_export_bool
        {
          \iow_open:Nn\g_tmpa_iow{\g__pdfmeta_xmp_export_str.xmpi}
          \exp_args:NNo\iow_now:Nn\g_tmpa_iow{\g__pdfmeta_xmp_packet_tl}
          \iow_close:N\g_tmpa_iow
        }
     }
  }


\cs_new_protected:Npn \pdfmeta_xmp_add:n #1
  {
    \tl_gput_right:Nn \g__pdfmeta_xmp_user_packet_tl
      {
        \__pdfmeta_xmp_add_packet_chunk:n { #1 }
      }
  }
\cs_new_protected:Npn \pdfmeta_xmp_xmlns_new:nn #1 #2
  {
    \prop_if_in:NnTF \g__pdfmeta_xmp_xmlns_prop {#1}
      {\msg_warning:nnn{pdfmeta}{namespace-defined}{#1}}
      {\__pdfmeta_xmp_xmlns_new:nn {#1}{#2}}
  }
%% File: l3pdftools.dtx
\cs_generate_variant:Nn \str_convert_pdfname:n { e }

\cs_new:Npn \pdf_name_from_unicode_e:n #1
  {
    \__kernel_pdf_name_from_unicode_e:n { #1 }
  }

\cs_generate_variant:Nn \pdf_name_from_unicode_e:n {V}
\bool_lazy_any:nTF
  {
    \sys_if_engine_luatex_p:
    \sys_if_engine_xetex_p:
  }
  {
    \prop_gput:Nnn \g__str_alias_prop { default } {  }
  }
  {
    \prop_gput:Nnn \g__str_alias_prop { default } { utf8 }
  }
\cs_new:Npn \pdf_string_from_unicode:nnN #1 #2 #3
  {
    \cs_if_exist_use:cF { __pdf_string_from_unicode_#1:nN }
      {
        \__kernel_msg_error:nnn { pdf } { unknown-convert } {#1}
        \use_none:nn
      }
    { #2 } #3
  }

\cs_generate_variant:Nn \pdf_string_from_unicode:nnN {nVN}
%% TODO Names need a review when it is clear which converters
%% are actually needed
%% string conversions and printing
%% we assume here that the text purify step has been done. The input is
%% a list of (utf8) chars.
%% str convert, not expandable.


\cs_new_protected:cpn { __pdf_string_from_unicode_utf8/string-raw:nN }  #1 #2
  {
     \str_set_convert:Nnnn #2
        { #1 }
        { default }
        {utf8/string}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf8/string:nN } #1 #2
  {
    \use:c { __pdf_string_from_unicode_utf8/string-raw:nN } { #1 } #2
    \str_put_left:Nn #2  {(}
    \str_put_right:Nn #2 {)}
  }
\cs_new_protected:cpx { __pdf_string_from_unicode_utf8/URI-raw:nN }  #1 #2
  {
     \exp_not:N \str_set_convert:Nnnn #2
       { #1 }
       { default }
       {utf8/url}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3A} {:}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2F} {/}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 23} {\c_hash_str}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 5B} {[}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 5D} {]}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 40} {\c_atsign_str}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 21} {!}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 24} {\c_dollar_str}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 26} {\c_ampersand_str}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 27} {'}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2A} {*}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2B} {+}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 2C} {,}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3B} {;}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3D} {=}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 3F} {?}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 30} {0}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 31} {1}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 32} {2}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 33} {3}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 34} {4}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 35} {5}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 36} {6}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 37} {7}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 38} {8}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 39} {9}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 28} {\c_backslash_str(}
     \exp_not:N \str_replace_all:Nnn #2 {\c_percent_str 29} {\c_backslash_str)}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf8/URI:nN } #1 #2
  {
     \use:c { __pdf_string_from_unicode_utf8/URI-raw:nN } {#1} #2
     \str_put_left:Nn #2  {(}
     \str_put_right:Nn #2 {)}
  }
\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/string-raw:nN }  #1 #2
  {
    \str_set_convert:Nnnn #2
      { #1 }
      { default }
      {utf16/string}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/string:nN } #1 #2
  {
    \use:c { __pdf_string_from_unicode_utf16/string-raw:nN } {#1} #2
    \str_put_left:Nn #2  {(}
    \str_put_right:Nn #2 {)}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/hex-raw:nN } #1 #2
  {
     \str_set_convert:Nnnn #2
       { #1 }
       { default }
       {utf16/hex}
  }

\cs_new_protected:cpn { __pdf_string_from_unicode_utf16/hex:nN } #1 #2
  {
    \use:c { __pdf_string_from_unicode_utf16/hex-raw:nN } {#1} #2
    \str_put_left:Nn #2  {<}
    \str_put_right:Nn #2 {>}
  }

\cs_new_protected:Npn  \pdf_bdc:nn #1 #2 { \__pdf_backend_bdc:nn { #1 }{ #2 } }
\cs_new_protected:Npn  \pdf_bdcobject:nn #1 #2 { \__pdf_backend_bdcobject:nn { #1 }{ #2 } }
\cs_new_protected:Npn  \pdf_bdcobject:n #1     { \__pdf_backend_bdcobject:n  { #1 } }
\cs_new_protected:Npn  \pdf_bmc:n #1     { \__pdf_backend_bmc:n  { #1 } }
\cs_new_protected:Npn  \pdf_emc:         { \__pdf_backend_emc: }
%% File: l3pdffile.dtx

\cs_new_protected:Npn \__pdffile_filename_convert_to_print:nN #1 #2
  {\pdf_string_from_unicode:nnN {utf16/hex}{#1}{#2}}
\msg_new:nnn { pdffile } { file-not-found }
  {
    File~'\tl_to_str:n{#1}'~not~found
  }

\msg_new:nnn { pdffile } { mimetype-missing }
  {
    Mime~type~not~set~for~file~'\tl_to_str:n{#1}'
  }

\msg_new:nnn { pdffile } { target-name-missing }
  {
    a~target~name~for~the~/Filespec~dictionary~is~missing.
  }

\msg_new:nnn { pdffile } { object-exists }
  {
    object~name~'#1'~is~already~used.
  }

\msg_new:nnn  { pdffile } { show-files }
  {
    The~following~files~have~been~embedded\\
     #1
  }
\tl_new:N  \l__pdffile_tmpa_tl
\tl_new:N  \l__pdffile_tmpb_tl
\tl_new:N  \g__pdffile_tmpa_tl
\str_new:N \l__pdffile_tmpa_str
\str_new:N \l__pdffile_tmpb_str
\str_new:N \l__pdffile_ext_str
\tl_new:N  \l__pdffile_automimetype_tl
\tl_new:N  \l__pdffile_embed_ref_tl
\prop_new:N \g_pdffile_mimetypes_prop
\prop_gset_from_keyval:Nn \g_pdffile_mimetypes_prop
  {
    ,.css = text/css
    ,.csv = text/csv
    ,.html= text/html
    ,.dtx = text/plain %or application/x-tex, not in iana.org list
    ,.eps = application/postscript
    ,.jpg = image/jpeg
    ,.mp4 = video/mp4
    ,.pdf = application/pdf
    ,.png = image/png
    ,.tex = application/x-tex %not in iana.org list but probably better
    ,.txt = text/plain
    ,.sty = text/plain
    ,.xml = text/xml
  }
\str_new:N  \l_pdffile_source_name_str
\pdfdict_new:n { l_pdffile }
\pdfdict_put:nnn { l_pdffile }{Type}{/EmbeddedFile}
\pdfdict_new:n { l_pdffile/Params }
\pdfdict_put:nnn { l_pdffile/Params }
  {ModDate}  { (\file_timestamp:n { \l_pdffile_source_name_str }) }
\pdfdict_put:nnn { l_pdffile/Params }
  {Size}     { \file_size:n { \l_pdffile_source_name_str } }
\pdfdict_put:nnn { l_pdffile/Params }
  {CheckSum} { (\file_mdfive_hash:n { \l_pdffile_source_name_str }) }
\pdfdict_new:n { l_pdffile/streamParams }
\pdfdict_put:nnn { l_pdffile/streamParams }
  {ModDate}  {
               (
                 D:\int_use:N\c_sys_year_int
                  \int_compare:nNnT{\c_sys_month_int}<{10}{0}
                  \int_use:N\c_sys_month_int
                  \int_compare:nNnT{\c_sys_day_int}<{10}{0}
                  \int_use:N\c_sys_day_int
               )
             }
\pdfdict_new:n { l_pdffile/Filespec }
\pdfdict_put:nnn { l_pdffile/Filespec }
  {Type} { /Filespec }
\pdfdict_put:nnn { l_pdffile/Filespec }
  {AFRelationship} { /Unspecified }

\prop_new:N \g_pdffile_embed_prop
\cs_new_protected:Npn \pdffile_embed_show:
  {
    \msg_show:nnx
     {pdffile}{show-files}
     {
       \prop_map_function:NN {\g_pdffile_embed_prop} \msg_show_item:nn
     }
  }
\cs_new_protected:Npn \__pdffile_mimetype_set:nN #1 #2
  {
    \file_parse_full_name:nNNN
          {#1}
          \l__pdffile_tmpa_str %unused
          \l__pdffile_tmpb_str %unused
          \l__pdffile_ext_str
        %check if Subtype has been set
        \pdfdict_get:nnN { l_pdffile}{Subtype}\l__pdffile_tmpa_tl
        %if not look up in the prop:
        \quark_if_no_value:NT \l__pdffile_tmpa_tl
          {
            \prop_get:NVNTF
              \g_pdffile_mimetypes_prop
              \l__pdffile_ext_str
              \l__pdffile_tmpb_tl
              {
                \tl_set:Nx #2 {/Subtype~\pdf_name_from_unicode_e:V \l__pdffile_tmpb_tl}
              }
              {
                \msg_warning:nnx { pdffile }{ mimetype-missing} {#1}
                \tl_clear:N #2
              }
          }
    }

\cs_generate_variant:Nn \__pdffile_mimetype_set:nN {VN}

\cs_new_protected:Npn \__pdffile_fstream_write:nN #1 #2
  {
    \pdf_object_unnamed_write:nx { fstream }
      {
        {
          #2
          \pdfdict_use:n { l_pdffile}
          \pdfdict_if_empty:nF { l_pdffile/Params}
            {
              /Params
                <<
                  \pdfdict_use:n { l_pdffile/Params}
                >>
            }
        }
        { #1 }
      }
     \tl_clear:N \l__pdffile_automimetype_tl
   }

\cs_generate_variant:Nn \__pdffile_fstream_write:nN {VN}

\cs_new_protected:Npn \__pdffile_stream_write:nN #1 #2
  {
    \pdf_object_unnamed_write:nx { stream }
      {
        {
          #2
          \pdfdict_use:n { l_pdffile}
          \pdfdict_if_empty:nF { l_pdffile/streamParams}
            {
              /Params
                <<
                  \pdfdict_use:n { l_pdffile/streamParams}
                >>
            }
        }
        { \exp_not:n { #1 } }
      }
     \tl_clear:N \l__pdffile_automimetype_tl
   }

\cs_generate_variant:Nn \__pdffile_stream_write:nN {VN}

\cs_new_protected:Npn \__pdffile_filespec_write:nnn #1 #2 #3
  {
    \tl_if_blank:nTF { #2 }
      {
        \msg_error:nn {pdffile}{target-name-missing}
      }
      {
        \group_begin:
          \__pdffile_filename_convert_to_print:nN  { #2 } \l__pdffile_tmpa_str
          \pdfdict_put:nnx {l_pdffile/Filespec}{F} { \l__pdffile_tmpa_str }
          \pdfdict_put:nnx {l_pdffile/Filespec}{UF}{ \l__pdffile_tmpa_str }
          \pdf_object_write:nnx { #1 } { dict }
            {
              \pdfdict_use:n { l_pdffile/Filespec}
              \tl_if_empty:nF { #3 }
                {
                  /EF <</F~#3 /UF~#3>>
                }
            }
        \group_end:
      }
  }

\cs_new_protected:Npn \__pdffile_filespec_write:nnN #1 #2 #3
  {
    \tl_if_blank:nTF { #1 }
      {
        \msg_error:nn {pdffile}{target-name-missing}
      }
      {
        \group_begin:
          \__pdffile_filename_convert_to_print:nN  { #1 } \l__pdffile_tmpa_str
          \pdfdict_put:nnx {l_pdffile/Filespec}{F} { \l__pdffile_tmpa_str }
          \pdfdict_put:nnx {l_pdffile/Filespec}{UF}{ \l__pdffile_tmpa_str }
          \pdf_object_unnamed_write:nx {dict}
            {
              \pdfdict_use:n { l_pdffile/Filespec}
              \tl_if_empty:nF { #2 }
                {
                  /EF <</F~#2 /UF~#2>>
                }
            }
        \tl_gset:Nx\g__pdffile_tmpa_tl{\pdf_object_ref_last:}
        \group_end:
        \tl_set_eq:NN#3\g__pdffile_tmpa_tl
      }
  }

\cs_set_eq:NN \pdffile_filespec:nnn \__pdffile_filespec_write:nnn
\cs_generate_variant:Nn \pdffile_filespec:nnn {nnx}
\cs_new_protected:Npn \pdffile_embed_file:nnn #1 #2 #3
  { %               if #1 empty => only filespec
    %               if #2 empty => = #1
    \pdf_object_if_exist:nTF { #3 }
      {
        \msg_error:nnn { pdffile }{ object-exists } { #3 }
      }
      {
        \tl_if_blank:nTF { #1 }
          {
            \tl_set:Nn \l__pdffile_embed_ref_tl {}
          }
          {
            \file_get_full_name:nNTF {#1} \l_pdffile_source_name_str
              {
                \__pdffile_mimetype_set:VN
                  \l_pdffile_source_name_str
                  \l__pdffile_automimetype_tl
                \__pdffile_fstream_write:VN
                  \l_pdffile_source_name_str
                  \l__pdffile_automimetype_tl
                \tl_set:Nx \l__pdffile_embed_ref_tl { \pdf_object_ref_last: }
              }
              {
                \msg_error:nnn { pdffile }{ file-not-found }{ #1 }
              }

           }
        \prop_gput:Nnx
           \g_pdffile_embed_prop
           { #3 }
           {
             { \tl_if_blank:nTF { #1 } {filespec}{file} }
             {\l_pdffile_source_name_str}
             {
               \tl_if_blank:nTF { #2 }
                 { \l_pdffile_source_name_str }
                 { \tl_to_str:n{#2}}
             }
           }
        \tl_if_blank:nTF { #2 }
          {
            \pdf_object_new:n   { #3 }
            \exp_args:Nnnx
              \__pdffile_filespec_write:nnn
                %#1 dict, #2 target file name, #3 object ref
                { #3 }
                { #1 }
                {\l__pdffile_embed_ref_tl}
          }
          {
            \pdf_object_new:n   { #3 }
            \exp_args:Nnnx
              \__pdffile_filespec_write:nnn
                %#1 dict, #2 target file name, #3 object ref
                { #3 }
                { #2 }
                {\l__pdffile_embed_ref_tl}
          }
      }
  }

\cs_new_protected:Npn \pdffile_embed_stream:nnn #1 #2 #3
  {
    %               if #2 empty => error
    \pdf_object_if_exist:nTF { #3 }
      {
         \msg_error:nnn { pdffile }{ object-exists } { #3 }
      }
      {
         \prop_gput:Nnx
            \g_pdffile_embed_prop
            { #3 }
            {{stream}{}{\tl_if_blank:nTF {#2}{stream.txt}{\exp_not:n{#2}}}}
         \tl_if_blank:nTF {#2}
          { \__pdffile_mimetype_set:nN {stream.txt}\l__pdffile_automimetype_tl}
          { \__pdffile_mimetype_set:nN { #2 } \l__pdffile_automimetype_tl }
         \__pdffile_stream_write:nN
           { #1 }
           \l__pdffile_automimetype_tl
         \tl_set:Nx \l__pdffile_embed_ref_tl { \pdf_object_ref_last: }
         \pdf_object_new:n   { #3 }
         \exp_args:Nnxx
           \__pdffile_filespec_write:nnn
             %#1 dict, #2 target file name, #3 object ref
             { #3 }
             { \tl_if_blank:nTF {#2}{stream.txt}{\exp_not:n{#2}} }
             {\l__pdffile_embed_ref_tl}
     }
  }

\cs_new_protected:Npn \pdffile_embed_stream:nnN #1 #2 #3
  {
     \tl_if_blank:nTF {#2}
      { \__pdffile_mimetype_set:nN {stream.txt}\l__pdffile_automimetype_tl}
      { \__pdffile_mimetype_set:nN { #2 } \l__pdffile_automimetype_tl }
     \__pdffile_stream_write:nN
       { #1 }
       \l__pdffile_automimetype_tl
     \tl_set:Nx \l__pdffile_embed_ref_tl { \pdf_object_ref_last: }
     \exp_args:Nxx
       \__pdffile_filespec_write:nnN
         %#1 target file name, #2 object ref of stream, #3 object ref of filespec
         { \tl_if_blank:nTF {#2}{stream.txt}{\exp_not:n{#2}} }
         {\l__pdffile_embed_ref_tl}
         #3
     \prop_gput:Nxx
        \g_pdffile_embed_prop
        { #3 }
        {{stream}{}{\tl_if_blank:nTF {#2}{stream.txt}{\exp_not:n{#2}}}}
  }

%% 
%%
%% End of file `pdfmanagement-testphase.ltx'.
